Hi, On 03/08/2017 03:24 PM, Zhiqiang Hou wrote: > From: Hou Zhiqiang <zhiqiang....@nxp.com> > > Signed-off-by: Hou Zhiqiang <zhiqiang....@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; > } > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot