On 03/03/2017 05:45 AM, Zhiqiang Hou wrote: > From: Hou Zhiqiang <zhiqiang....@nxp.com> > > Signed-off-by: Hou Zhiqiang <zhiqiang....@nxp.com> > --- > arch/arm/cpu/armv8/fsl-layerscape/ppa.c | 118 > +++++++++++++++++++++++++++++++- > 1 file changed, 117 insertions(+), 1 deletion(-)
<snip> > > #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((ulong)ppa_fit_addr, cnt * 512); > + > +#elif 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; > + } > #else > #error "No CONFIG_SYS_LS_PPA_FW_IN_xxx defined" > #endif > Why do you flush the cache after reading from SD but not from NAND? York _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/listinfo/u-boot