Message ID | 1488954262-5046-3-git-send-email-Zhiqiang.Hou@nxp.com |
---|---|
State | Superseded |
Delegated to: | York Sun |
Headers | show |
Hi, On 03/08/2017 03:24 PM, Zhiqiang Hou wrote: > From: Hou Zhiqiang <Zhiqiang.Hou@nxp.com> > > Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com> > --- > V2: > - added flush cache operation after nand read > > arch/arm/cpu/armv8/fsl-layerscape/ppa.c | 122 +++++++++++++++++++++++++++++++- > 1 file changed, 121 insertions(+), 1 deletion(-) > > diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ppa.c b/arch/arm/cpu/armv8/fsl-layerscape/ppa.c > index b68e87d..4df70aa 100644 > --- a/arch/arm/cpu/armv8/fsl-layerscape/ppa.c > +++ b/arch/arm/cpu/armv8/fsl-layerscape/ppa.c > @@ -4,6 +4,7 @@ > * SPDX-License-Identifier: GPL-2.0+ > */ > #include <common.h> > +#include <malloc.h> > #include <config.h> > #include <errno.h> > #include <asm/system.h> > @@ -21,9 +22,17 @@ > #include <fsl_validate.h> > #endif > > +#ifdef CONFIG_SYS_LS_PPA_FW_IN_NAND > +#include <nand.h> > +#elif defined(CONFIG_SYS_LS_PPA_FW_IN_MMC) > +#include <mmc.h> > +#endif > + > +DECLARE_GLOBAL_DATA_PTR; > + > int ppa_init(void) > { > - const void *ppa_fit_addr; > + void *ppa_fit_addr; > u32 *boot_loc_ptr_l, *boot_loc_ptr_h; > int ret; > > @@ -34,10 +43,116 @@ int ppa_init(void) > > #ifdef CONFIG_SYS_LS_PPA_FW_IN_XIP > ppa_fit_addr = (void *)CONFIG_SYS_LS_PPA_FW_ADDR; > + debug("%s: PPA image load from XIP\n", __func__); > +#else /* !CONFIG_SYS_LS_PPA_FW_IN_XIP */ > + size_t fw_length, fdt_header_len = sizeof(struct fdt_header); > + > + /* Copy PPA image from MMC/SD/NAND to allocated memory */ > +#ifdef CONFIG_SYS_LS_PPA_FW_IN_MMC > + struct mmc *mmc; > + int dev = CONFIG_SYS_MMC_ENV_DEV; > + struct fdt_header *fitp; > + u32 cnt; > + u32 blk = CONFIG_SYS_LS_PPA_FW_ADDR / 512; > + > + debug("%s: PPA image load from eMMC/SD\n", __func__); > + > + mmc_initialize(gd->bd); It should be failed. need to check the return value. > + mmc = find_mmc_device(dev); > + if (!mmc) { > + printf("PPA: MMC cannot find device for PPA firmware\n"); > + return -ENODEV; > + } > + > + mmc_init(mmc); ditto. > + > + fitp = malloc(roundup(fdt_header_len, 512)); > + if (!fitp) { > + printf("PPA: malloc failed for FIT header(size 0x%zx)\n", > + roundup(fdt_header_len, 512)); > + return -ENOMEM; > + } > + > + cnt = DIV_ROUND_UP(fdt_header_len, 512); > + debug("%s: MMC read PPA FIT header: dev # %u, block # %u, count %u\n", > + __func__, dev, blk, cnt); > + ret = mmc->block_dev.block_read(&mmc->block_dev, blk, cnt, fitp); > + if (ret != cnt) { > + free(fitp); > + printf("MMC/SD read of PPA FIT header at offset 0x%x failed\n", > + CONFIG_SYS_LS_PPA_FW_ADDR); > + return -EIO; > + } > + > + /* flush cache after read */ > + flush_cache((ulong)fitp, cnt * 512); > + > + fw_length = fdt_totalsize(fitp); > + free(fitp); > + > + fw_length = roundup(fw_length, 512); > + ppa_fit_addr = malloc(fw_length); > + if (!ppa_fit_addr) { > + printf("PPA: malloc failed for PPA image(size 0x%zx)\n", > + fw_length); > + return -ENOMEM; > + } > + > + cnt = DIV_ROUND_UP(fw_length, 512); > + debug("%s: MMC read PPA FIT image: dev # %u, block # %u, count %u\n", > + __func__, dev, blk, cnt); > + ret = mmc->block_dev.block_read(&mmc->block_dev, > + blk, cnt, ppa_fit_addr); > + if (ret != cnt) { > + free(ppa_fit_addr); > + printf("MMC/SD read of PPA FIT header at offset 0x%x failed\n", > + CONFIG_SYS_LS_PPA_FW_ADDR); > + return -EIO; > + } > + > + /* flush cache after read */ > + flush_cache((ulong)ppa_fit_addr, cnt * 512); > + > +#elif defined(CONFIG_SYS_LS_PPA_FW_IN_NAND) > + struct fdt_header fit; > + > + debug("%s: PPA image load from NAND\n", __func__); > + > + nand_init(); > + ret = nand_read(nand_info[0], (loff_t)CONFIG_SYS_LS_PPA_FW_ADDR, > + &fdt_header_len, (u_char *)&fit); > + if (ret == -EUCLEAN) { > + printf("NAND read of PPA FIT header at offset 0x%x failed\n", > + CONFIG_SYS_LS_PPA_FW_ADDR); > + return -EIO; > + } > + > + fw_length = fdt_totalsize(&fit); > + > + ppa_fit_addr = malloc(fw_length); > + if (!ppa_fit_addr) { > + printf("PPA: malloc failed for PPA image(size 0x%zx)\n", > + fw_length); > + return -ENOMEM; > + } > + > + ret = nand_read(nand_info[0], (loff_t)CONFIG_SYS_LS_PPA_FW_ADDR, > + &fw_length, (u_char *)ppa_fit_addr); > + if (ret == -EUCLEAN) { > + free(ppa_fit_addr); > + printf("NAND read of PPA firmware at offset 0x%x failed\n", > + CONFIG_SYS_LS_PPA_FW_ADDR); > + return -EIO; > + } > + > + /* flush cache after read */ > + flush_cache((ulong)ppa_fit_addr, fw_length); > #else > #error "No CONFIG_SYS_LS_PPA_FW_IN_xxx defined" > #endif > > +#endif > + > #ifdef CONFIG_CHAIN_OF_TRUST > ppa_img_addr = (uintptr_t)ppa_fit_addr; > if (fsl_check_boot_mode_secure() != 0) { > @@ -65,5 +180,10 @@ int ppa_init(void) > boot_loc_ptr_l, boot_loc_ptr_h); > ret = sec_firmware_init(ppa_fit_addr, boot_loc_ptr_l, boot_loc_ptr_h); > > +#if defined(CONFIG_SYS_LS_PPA_FW_IN_MMC) || \ > + defined(CONFIG_SYS_LS_PPA_FW_IN_NAND) > + free(ppa_fit_addr); > +#endif > + > return ret; > } >
Hi Jaehoon, Thanks a lot for your comments! > -----Original Message----- > From: Jaehoon Chung [mailto:jh80.chung@samsung.com] > Sent: 2017年3月8日 19:06 > To: Z.Q. Hou <zhiqiang.hou@nxp.com>; u-boot@lists.denx.de; > oss@buserror.net; york sun <york.sun@nxp.com>; Mingkai.hu@freescale.com; > sjg@chromium.org; Xiaobo Xie <xiaobo.xie@nxp.com> > Subject: Re: [U-Boot] [PATCHv2 3/5] fsl PPA: add support PPA image loading > from NAND and SD > > Hi, > > On 03/08/2017 03:24 PM, Zhiqiang Hou wrote: > > From: Hou Zhiqiang <Zhiqiang.Hou@nxp.com> > > > > Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com> > > --- > > V2: > > - added flush cache operation after nand read > > > > arch/arm/cpu/armv8/fsl-layerscape/ppa.c | 122 > > +++++++++++++++++++++++++++++++- > > 1 file changed, 121 insertions(+), 1 deletion(-) > > > > diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ppa.c > > b/arch/arm/cpu/armv8/fsl-layerscape/ppa.c > > index b68e87d..4df70aa 100644 > > --- a/arch/arm/cpu/armv8/fsl-layerscape/ppa.c > > +++ b/arch/arm/cpu/armv8/fsl-layerscape/ppa.c > > @@ -4,6 +4,7 @@ > > * SPDX-License-Identifier: GPL-2.0+ > > */ > > #include <common.h> > > +#include <malloc.h> > > #include <config.h> > > #include <errno.h> > > #include <asm/system.h> > > @@ -21,9 +22,17 @@ > > #include <fsl_validate.h> > > #endif > > > > +#ifdef CONFIG_SYS_LS_PPA_FW_IN_NAND > > +#include <nand.h> > > +#elif defined(CONFIG_SYS_LS_PPA_FW_IN_MMC) > > +#include <mmc.h> > > +#endif > > + > > +DECLARE_GLOBAL_DATA_PTR; > > + > > int ppa_init(void) > > { > > - const void *ppa_fit_addr; > > + void *ppa_fit_addr; > > u32 *boot_loc_ptr_l, *boot_loc_ptr_h; > > int ret; > > > > @@ -34,10 +43,116 @@ int ppa_init(void) > > > > #ifdef CONFIG_SYS_LS_PPA_FW_IN_XIP > > ppa_fit_addr = (void *)CONFIG_SYS_LS_PPA_FW_ADDR; > > + debug("%s: PPA image load from XIP\n", __func__); #else /* > > +!CONFIG_SYS_LS_PPA_FW_IN_XIP */ > > + size_t fw_length, fdt_header_len = sizeof(struct fdt_header); > > + > > + /* Copy PPA image from MMC/SD/NAND to allocated memory */ #ifdef > > +CONFIG_SYS_LS_PPA_FW_IN_MMC > > + struct mmc *mmc; > > + int dev = CONFIG_SYS_MMC_ENV_DEV; > > + struct fdt_header *fitp; > > + u32 cnt; > > + u32 blk = CONFIG_SYS_LS_PPA_FW_ADDR / 512; > > + > > + debug("%s: PPA image load from eMMC/SD\n", __func__); > > + > > + mmc_initialize(gd->bd); > > It should be failed. need to check the return value. Yes, will add the return value check next version. > > + mmc = find_mmc_device(dev); > > + if (!mmc) { > > + printf("PPA: MMC cannot find device for PPA firmware\n"); > > + return -ENODEV; > > + } > > + > > + mmc_init(mmc); > > ditto. Yes, will add. > > + > > + fitp = malloc(roundup(fdt_header_len, 512)); > > + if (!fitp) { > > + printf("PPA: malloc failed for FIT header(size 0x%zx)\n", > > + roundup(fdt_header_len, 512)); > > + return -ENOMEM; > > + } > > + > > + cnt = DIV_ROUND_UP(fdt_header_len, 512); > > + debug("%s: MMC read PPA FIT header: dev # %u, block # %u, > count %u\n", > > + __func__, dev, blk, cnt); > > + ret = mmc->block_dev.block_read(&mmc->block_dev, blk, cnt, fitp); > > + if (ret != cnt) { > > + free(fitp); > > + printf("MMC/SD read of PPA FIT header at offset 0x%x failed\n", > > + CONFIG_SYS_LS_PPA_FW_ADDR); > > + return -EIO; > > + } > > + > > + /* flush cache after read */ > > + flush_cache((ulong)fitp, cnt * 512); > > + > > + fw_length = fdt_totalsize(fitp); > > + free(fitp); > > + > > + fw_length = roundup(fw_length, 512); > > + ppa_fit_addr = malloc(fw_length); > > + if (!ppa_fit_addr) { > > + printf("PPA: malloc failed for PPA image(size 0x%zx)\n", > > + fw_length); > > + return -ENOMEM; > > + } > > + > > + cnt = DIV_ROUND_UP(fw_length, 512); > > + debug("%s: MMC read PPA FIT image: dev # %u, block # %u, count %u\n", > > + __func__, dev, blk, cnt); > > + ret = mmc->block_dev.block_read(&mmc->block_dev, > > + blk, cnt, ppa_fit_addr); > > + if (ret != cnt) { > > + free(ppa_fit_addr); > > + printf("MMC/SD read of PPA FIT header at offset 0x%x failed\n", > > + CONFIG_SYS_LS_PPA_FW_ADDR); > > + return -EIO; > > + } > > + > > + /* flush cache after read */ > > + flush_cache((ulong)ppa_fit_addr, cnt * 512); > > + > > +#elif defined(CONFIG_SYS_LS_PPA_FW_IN_NAND) > > + struct fdt_header fit; > > + > > + debug("%s: PPA image load from NAND\n", __func__); > > + > > + nand_init(); > > + ret = nand_read(nand_info[0], (loff_t)CONFIG_SYS_LS_PPA_FW_ADDR, > > + &fdt_header_len, (u_char *)&fit); > > + if (ret == -EUCLEAN) { > > + printf("NAND read of PPA FIT header at offset 0x%x failed\n", > > + CONFIG_SYS_LS_PPA_FW_ADDR); > > + return -EIO; > > + } > > + > > + fw_length = fdt_totalsize(&fit); > > + > > + ppa_fit_addr = malloc(fw_length); > > + if (!ppa_fit_addr) { > > + printf("PPA: malloc failed for PPA image(size 0x%zx)\n", > > + fw_length); > > + return -ENOMEM; > > + } > > + > > + ret = nand_read(nand_info[0], (loff_t)CONFIG_SYS_LS_PPA_FW_ADDR, > > + &fw_length, (u_char *)ppa_fit_addr); > > + if (ret == -EUCLEAN) { > > + free(ppa_fit_addr); > > + printf("NAND read of PPA firmware at offset 0x%x failed\n", > > + CONFIG_SYS_LS_PPA_FW_ADDR); > > + return -EIO; > > + } > > + > > + /* flush cache after read */ > > + flush_cache((ulong)ppa_fit_addr, fw_length); > > #else > > #error "No CONFIG_SYS_LS_PPA_FW_IN_xxx defined" > > #endif > > > > +#endif > > + > > #ifdef CONFIG_CHAIN_OF_TRUST > > ppa_img_addr = (uintptr_t)ppa_fit_addr; > > if (fsl_check_boot_mode_secure() != 0) { @@ -65,5 +180,10 @@ int > > ppa_init(void) > > boot_loc_ptr_l, boot_loc_ptr_h); > > ret = sec_firmware_init(ppa_fit_addr, boot_loc_ptr_l, > > boot_loc_ptr_h); > > > > +#if defined(CONFIG_SYS_LS_PPA_FW_IN_MMC) || \ > > + defined(CONFIG_SYS_LS_PPA_FW_IN_NAND) > > + free(ppa_fit_addr); > > +#endif > > + > > return ret; > > } > > Thanks, Zhiqiang
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ppa.c b/arch/arm/cpu/armv8/fsl-layerscape/ppa.c index b68e87d..4df70aa 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/ppa.c +++ b/arch/arm/cpu/armv8/fsl-layerscape/ppa.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: GPL-2.0+ */ #include <common.h> +#include <malloc.h> #include <config.h> #include <errno.h> #include <asm/system.h> @@ -21,9 +22,17 @@ #include <fsl_validate.h> #endif +#ifdef CONFIG_SYS_LS_PPA_FW_IN_NAND +#include <nand.h> +#elif defined(CONFIG_SYS_LS_PPA_FW_IN_MMC) +#include <mmc.h> +#endif + +DECLARE_GLOBAL_DATA_PTR; + int ppa_init(void) { - const void *ppa_fit_addr; + void *ppa_fit_addr; u32 *boot_loc_ptr_l, *boot_loc_ptr_h; int ret; @@ -34,10 +43,116 @@ int ppa_init(void) #ifdef CONFIG_SYS_LS_PPA_FW_IN_XIP ppa_fit_addr = (void *)CONFIG_SYS_LS_PPA_FW_ADDR; + debug("%s: PPA image load from XIP\n", __func__); +#else /* !CONFIG_SYS_LS_PPA_FW_IN_XIP */ + size_t fw_length, fdt_header_len = sizeof(struct fdt_header); + + /* Copy PPA image from MMC/SD/NAND to allocated memory */ +#ifdef CONFIG_SYS_LS_PPA_FW_IN_MMC + struct mmc *mmc; + int dev = CONFIG_SYS_MMC_ENV_DEV; + struct fdt_header *fitp; + u32 cnt; + u32 blk = CONFIG_SYS_LS_PPA_FW_ADDR / 512; + + debug("%s: PPA image load from eMMC/SD\n", __func__); + + mmc_initialize(gd->bd); + mmc = find_mmc_device(dev); + if (!mmc) { + printf("PPA: MMC cannot find device for PPA firmware\n"); + return -ENODEV; + } + + mmc_init(mmc); + + fitp = malloc(roundup(fdt_header_len, 512)); + if (!fitp) { + printf("PPA: malloc failed for FIT header(size 0x%zx)\n", + roundup(fdt_header_len, 512)); + return -ENOMEM; + } + + cnt = DIV_ROUND_UP(fdt_header_len, 512); + debug("%s: MMC read PPA FIT header: dev # %u, block # %u, count %u\n", + __func__, dev, blk, cnt); + ret = mmc->block_dev.block_read(&mmc->block_dev, blk, cnt, fitp); + if (ret != cnt) { + free(fitp); + printf("MMC/SD read of PPA FIT header at offset 0x%x failed\n", + CONFIG_SYS_LS_PPA_FW_ADDR); + return -EIO; + } + + /* flush cache after read */ + flush_cache((ulong)fitp, cnt * 512); + + fw_length = fdt_totalsize(fitp); + free(fitp); + + fw_length = roundup(fw_length, 512); + ppa_fit_addr = malloc(fw_length); + if (!ppa_fit_addr) { + printf("PPA: malloc failed for PPA image(size 0x%zx)\n", + fw_length); + return -ENOMEM; + } + + cnt = DIV_ROUND_UP(fw_length, 512); + debug("%s: MMC read PPA FIT image: dev # %u, block # %u, count %u\n", + __func__, dev, blk, cnt); + ret = mmc->block_dev.block_read(&mmc->block_dev, + blk, cnt, ppa_fit_addr); + if (ret != cnt) { + free(ppa_fit_addr); + printf("MMC/SD read of PPA FIT header at offset 0x%x failed\n", + CONFIG_SYS_LS_PPA_FW_ADDR); + return -EIO; + } + + /* flush cache after read */ + flush_cache((ulong)ppa_fit_addr, cnt * 512); + +#elif defined(CONFIG_SYS_LS_PPA_FW_IN_NAND) + struct fdt_header fit; + + debug("%s: PPA image load from NAND\n", __func__); + + nand_init(); + ret = nand_read(nand_info[0], (loff_t)CONFIG_SYS_LS_PPA_FW_ADDR, + &fdt_header_len, (u_char *)&fit); + if (ret == -EUCLEAN) { + printf("NAND read of PPA FIT header at offset 0x%x failed\n", + CONFIG_SYS_LS_PPA_FW_ADDR); + return -EIO; + } + + fw_length = fdt_totalsize(&fit); + + ppa_fit_addr = malloc(fw_length); + if (!ppa_fit_addr) { + printf("PPA: malloc failed for PPA image(size 0x%zx)\n", + fw_length); + return -ENOMEM; + } + + ret = nand_read(nand_info[0], (loff_t)CONFIG_SYS_LS_PPA_FW_ADDR, + &fw_length, (u_char *)ppa_fit_addr); + if (ret == -EUCLEAN) { + free(ppa_fit_addr); + printf("NAND read of PPA firmware at offset 0x%x failed\n", + CONFIG_SYS_LS_PPA_FW_ADDR); + return -EIO; + } + + /* flush cache after read */ + flush_cache((ulong)ppa_fit_addr, fw_length); #else #error "No CONFIG_SYS_LS_PPA_FW_IN_xxx defined" #endif +#endif + #ifdef CONFIG_CHAIN_OF_TRUST ppa_img_addr = (uintptr_t)ppa_fit_addr; if (fsl_check_boot_mode_secure() != 0) { @@ -65,5 +180,10 @@ int ppa_init(void) boot_loc_ptr_l, boot_loc_ptr_h); ret = sec_firmware_init(ppa_fit_addr, boot_loc_ptr_l, boot_loc_ptr_h); +#if defined(CONFIG_SYS_LS_PPA_FW_IN_MMC) || \ + defined(CONFIG_SYS_LS_PPA_FW_IN_NAND) + free(ppa_fit_addr); +#endif + return ret; }