diff mbox

[U-Boot,3/5] fsl PPA: add support PPA image loading from NAND and SD

Message ID 1488547861-33169-3-git-send-email-Zhiqiang.Hou@nxp.com
State Superseded
Delegated to: York Sun
Headers show

Commit Message

Z.Q. Hou March 3, 2017, 1:30 p.m. UTC
From: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>

Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
---
 arch/arm/cpu/armv8/fsl-layerscape/ppa.c | 118 +++++++++++++++++++++++++++++++-
 1 file changed, 117 insertions(+), 1 deletion(-)

Comments

York Sun March 3, 2017, 4:50 p.m. UTC | #1
On 03/03/2017 05:45 AM, Zhiqiang Hou wrote:
> From: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
>
> Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@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
Z.Q. Hou March 6, 2017, 3:07 a.m. UTC | #2
Hi York,

Thanks a lot for your comments!

> -----Original Message-----
> From: york sun
> Sent: Saturday, March 04, 2017 12:51 AM
> To: Z.Q. Hou <zhiqiang.hou@nxp.com>; u-boot@lists.denx.de;
> oss@buserror.net; Mingkai.hu@freescale.com; sjg@chromium.org; Xiaobo
> Xie <xiaobo.xie@nxp.com>
> Subject: Re: [PATCH 3/5] fsl PPA: add support PPA image loading from NAND
> and SD
> 
> On 03/03/2017 05:45 AM, Zhiqiang Hou wrote:
> > From: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> >
> > Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@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?

Added the flush operation because I referred to the FMan ucode loading process.
It works well when loading from SD without the flush cache action, will remove the flush action.

Thanks,
Zhiqiang
York Sun March 6, 2017, 4:36 a.m. UTC | #3
Sorry for top posting (using my phone).
I think we should flush the cache by range. If you are relying on PPA flushing the cache for you (it is the case now), it's better to put a comment there.

York


-------- Original Message --------
From: "Z.Q. Hou" <zhiqiang.hou@nxp.com>

Sent: Sunday, March 5, 2017 07:07 PM
To: york sun <york.sun@nxp.com>,u-boot@lists.denx.de,oss@buserror.net,Mingkai.hu@freescale.com,sjg@chromium.org,Xiaobo Xie <xiaobo.xie@nxp.com>
Subject: RE: [PATCH 3/5] fsl PPA: add support PPA image loading from NAND and SD


Hi York,

Thanks a lot for your comments!

> -----Original Message-----

> From: york sun

> Sent: Saturday, March 04, 2017 12:51 AM

> To: Z.Q. Hou <zhiqiang.hou@nxp.com>; u-boot@lists.denx.de;

> oss@buserror.net; Mingkai.hu@freescale.com; sjg@chromium.org; Xiaobo

> Xie <xiaobo.xie@nxp.com>

> Subject: Re: [PATCH 3/5] fsl PPA: add support PPA image loading from NAND

> and SD

>

> On 03/03/2017 05:45 AM, Zhiqiang Hou wrote:

> > From: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>

> >

> > Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@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?


Added the flush operation because I referred to the FMan ucode loading process.
It works well when loading from SD without the flush cache action, will remove the flush action.

Thanks,
Zhiqiang
Z.Q. Hou March 6, 2017, 8 a.m. UTC | #4
Hi York,

Thanks so much for your suggestion! Will add a comment there.

Thanks,
Zhiqiang

From: york sun

Sent: Monday, March 06, 2017 12:36 PM
To: Z.Q. Hou <zhiqiang.hou@nxp.com>; u-boot@lists.denx.de; oss@buserror.net; Mingkai.hu@freescale.com; sjg@chromium.org; Xiaobo Xie <xiaobo.xie@nxp.com>
Subject: RE: [PATCH 3/5] fsl PPA: add support PPA image loading from NAND and SD


Sorry for top posting (using my phone).
I think we should flush the cache by range. If you are relying on PPA flushing the cache for you (it is the case now), it's better to put a comment there.

York


-------- Original Message --------
From: "Z.Q. Hou" <zhiqiang.hou@nxp.com<mailto:zhiqiang.hou@nxp.com>>

Sent: Sunday, March 5, 2017 07:07 PM
To: york sun <york.sun@nxp.com<mailto:york.sun@nxp.com>>,u-boot@lists.denx.de,oss@buserror.net,Mingkai.hu@freescale.com,sjg@chromium.org,Xiaobo Xie <xiaobo.xie@nxp.com<mailto:xiaobo.xie@nxp.com>>
Subject: RE: [PATCH 3/5] fsl PPA: add support PPA image loading from NAND and SD

Hi York,

Thanks a lot for your comments!

> -----Original Message-----

> From: york sun

> Sent: Saturday, March 04, 2017 12:51 AM

> To: Z.Q. Hou <zhiqiang.hou@nxp.com<mailto:zhiqiang.hou@nxp.com>>; u-boot@lists.denx.de<mailto:u-boot@lists.denx.de>;

> oss@buserror.net<mailto:oss@buserror.net>; Mingkai.hu@freescale.com<mailto:Mingkai.hu@freescale.com>; sjg@chromium.org<mailto:sjg@chromium.org>; Xiaobo

> Xie <xiaobo.xie@nxp.com<mailto:xiaobo.xie@nxp.com>>

> Subject: Re: [PATCH 3/5] fsl PPA: add support PPA image loading from NAND

> and SD

>

> On 03/03/2017 05:45 AM, Zhiqiang Hou wrote:

> > From: Hou Zhiqiang <Zhiqiang.Hou@nxp.com<mailto:Zhiqiang.Hou@nxp.com>>

> >

> > Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com<mailto:Zhiqiang.Hou@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?


Added the flush operation because I referred to the FMan ucode loading process.
It works well when loading from SD without the flush cache action, will remove the flush action.

Thanks,
Zhiqiang
diff mbox

Patch

diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ppa.c b/arch/arm/cpu/armv8/fsl-layerscape/ppa.c
index b68e87d..322432b 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,112 @@  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((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
 
+#endif
+
 #ifdef CONFIG_CHAIN_OF_TRUST
 	ppa_img_addr = (uintptr_t)ppa_fit_addr;
 	if (fsl_check_boot_mode_secure() != 0) {
@@ -65,5 +176,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;
 }