Hi Jaehoon, Thanks a lot for your review!
- Zhiqiang > -----Original Message----- > From: Jaehoon Chung [mailto:jh80.ch...@samsung.com] > Sent: 2017年3月22日 6:35 > To: Z.Q. Hou <zhiqiang....@nxp.com>; u-boot@lists.denx.de; > o...@buserror.net; york sun <york....@nxp.com>; mingkai...@freescale.com; > s...@chromium.org; Xiaobo Xie <xiaobo....@nxp.com> > Subject: Re: [PATCHv3 3/5] fsl PPA: add support PPA image loading from NAND > and SD > > On 03/17/2017 05:12 PM, Zhiqiang Hou wrote: > > From: Hou Zhiqiang <zhiqiang....@nxp.com> > > > > Signed-off-by: Hou Zhiqiang <zhiqiang....@nxp.com> > > Reviewed-by: Jaehoon Chung <jh80.ch...@samsung.com> > > > --- > > V3: > > - Added checking for return value of mmc initialization. > > - Added checking the fdt header before getting the size of PPA image. > > > > arch/arm/cpu/armv8/fsl-layerscape/ppa.c | 143 > > +++++++++++++++++++++++++++++++- > > 1 file changed, 142 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..b35ad5f 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,137 @@ 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__); > > + > > + ret = mmc_initialize(gd->bd); > > + if (ret) { > > + printf("%s: mmc_initialize() failed\n", __func__); > > + return ret; > > + } > > + mmc = find_mmc_device(dev); > > + if (!mmc) { > > + printf("PPA: MMC cannot find device for PPA firmware\n"); > > + return -ENODEV; > > + } > > + > > + ret = mmc_init(mmc); > > + if (ret) { > > + printf("%s: mmc_init() failed\n", __func__); > > + return ret; > > + } > > + > > + 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); > > + > > + ret = fdt_check_header(fitp); > > + if (ret) { > > + free(fitp); > > + printf("%s: fdt_check_header() failed\n", __func__); > > + return ret; > > + } > > + > > + 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; > > + } > > + > > + ret = fdt_check_header(&fit); > > + if (ret) { > > + printf("%s: fdt_check_header() failed\n", __func__); > > + return ret; > > + } > > + > > + 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 +201,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; > > } > > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot