[U-Boot] SPL NAND FIT support working?
Tim Harvey
tharvey at gateworks.com
Thu Nov 14 23:42:38 UTC 2019
On Thu, Nov 14, 2019 at 2:02 PM Tim Harvey <tharvey at gateworks.com> wrote:
>
> Lokesh,
>
> I'm trying to convert the imx6 Gateworks Ventana boards to DM which
> requires using NAND based FIT images for the multiple DTB's.
>
> You apparently added support for this in
> 8bd887727913e9393ef467cdf8b0146babb2673d but I find it fails because
> the raw nand read functions take byte offset/size yet read
> page-aligned. Because bl_len=1 the buffer pointer is not adjusted in
> spl_load_fit_image to the proper position in the buffer. Thus raw
> page-aligned image load works but as soon as you start parsing a FIT
> Image and need to load elements that are not page-aligned things go
> wrong.
>
> How did you test this?
>
> I'm not sure what the best approach is to fix this. Any ideas?
>
The following addresses this issue but perhaps only for MXS_NAND as it
doesn't appear that get_nand_dev_by_index() is supported by all raw
nand drivers and likely should be handled by some dm variant:
Author: Tim Harvey <tharvey at gateworks.com>
Date: Thu Nov 14 13:01:17 2019 -0800
spl: nand: use nand pagesize to fix loading FIT images
The nand read functions are page-aligned to the writesize of the NAND
device. This fixes loading non-page-aligned elements.
Signed-off-by: Tim Harvey <tharvey at gateworks.com>
diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
index 5f8a111..280ee3b 100644
--- a/common/spl/spl_nand.c
+++ b/common/spl/spl_nand.c
@@ -36,14 +36,16 @@ static int spl_nand_load_image(struct
spl_image_info *spl_image,
}
#else
-static ulong spl_nand_fit_read(struct spl_load_info *load, ulong offs,
- ulong size, void *dst)
+static ulong spl_nand_fit_read(struct spl_load_info *load, ulong page,
+ ulong pages, void *dst)
{
int ret;
+ ulong offs = page * load->bl_len;
+ ulong size = pages * load->bl_len;
ret = nand_spl_load_image(offs, size, dst);
if (!ret)
- return size;
+ return pages;
else
return 0;
}
@@ -51,6 +53,7 @@ static ulong spl_nand_fit_read(struct spl_load_info
*load, ulong offs,
static int spl_nand_load_element(struct spl_image_info *spl_image,
int offset, struct image_header *header)
{
+ struct mtd_info *mtd = get_nand_dev_by_index(0);
int err;
err = nand_spl_load_image(offset, sizeof(*header), (void *)header);
@@ -65,9 +68,10 @@ static int spl_nand_load_element(struct
spl_image_info *spl_image,
load.dev = NULL;
load.priv = NULL;
load.filename = NULL;
- load.bl_len = 1;
+ load.bl_len = mtd->writesize;
load.read = spl_nand_fit_read;
- return spl_load_simple_fit(spl_image, &load, offset, header);
+ return spl_load_simple_fit(spl_image, &load,
+ offset / load.bl_len, header);
} else if (IS_ENABLED(CONFIG_SPL_LOAD_IMX_CONTAINER)) {
struct spl_load_info load;
diff --git a/drivers/mtd/nand/raw/mxs_nand_spl.c
b/drivers/mtd/nand/raw/mxs_nand_spl.c
index 975a91a..222fa5c 100644
--- a/drivers/mtd/nand/raw/mxs_nand_spl.c
+++ b/drivers/mtd/nand/raw/mxs_nand_spl.c
@@ -11,6 +11,10 @@
static struct mtd_info *mtd;
static struct nand_chip nand_chip;
+struct mtd_info *get_nand_dev_by_index(int dev) {
+ return mtd;
+}
+
static void mxs_nand_command(struct mtd_info *mtd, unsigned int command,
int column, int page_addr)
{
Tim
More information about the U-Boot
mailing list