On 8/3/23 04:30, Xavier Drudis Ferran wrote: > El Mon, Jul 31, 2023 at 06:42:56PM -0400, Sean Anderson deia: >> This converts the fat loader to use spl_load. Some platforms are very >> tight on space, so we take care to only include the code we really need. >> >> Signed-off-by: Sean Anderson <sean.ander...@seco.com> >> --- >> >> Changes in v5: >> - Rework to load header in spl_load >> >> Changes in v3: >> - Fix failing on success >> >> common/spl/spl_fat.c | 55 +++++++++++++++----------------------------- >> 1 file changed, 19 insertions(+), 36 deletions(-) >> >> diff --git a/common/spl/spl_fat.c b/common/spl/spl_fat.c >> index f8a5b80a3b..6530bcd5a7 100644 >> --- a/common/spl/spl_fat.c >> +++ b/common/spl/spl_fat.c >> @@ -60,57 +60,40 @@ int spl_load_image_fat(struct spl_image_info *spl_image, >> const char *filename) >> { >> int err; >> - struct legacy_img_hdr *header; >> + loff_t size; >> + struct spl_load_info load; >> + >> + /* This generates smaller code than using a compound literal */ >> + load.read = spl_fit_read; >> + load.bl_len = 1; >> + load.filename = filename; >> >> err = spl_register_fat_device(block_dev, partition); >> if (err) >> goto end; >> >> - header = spl_get_load_buffer(-sizeof(*header), sizeof(*header)); >> - >> - err = file_fat_read(filename, header, sizeof(struct legacy_img_hdr)); >> - if (err <= 0) >> - goto end; >> - >> - if (IS_ENABLED(CONFIG_SPL_LOAD_FIT_FULL) && >> - image_get_magic(header) == FDT_MAGIC) { >> - err = file_fat_read(filename, (void *)CONFIG_SYS_LOAD_ADDR, 0); >> - if (err <= 0) >> - goto end; >> - err = spl_parse_image_header(spl_image, bootdev, >> - (struct legacy_img_hdr *)CONFIG_SYS_LOAD_ADDR); > > So this used to load to CONFIG_SYS_LOAD_ADDR and will now load to > CONFIG_TEXT_BASE, or whatever the applicable spl_get_load_buffer() > uses. Is this OK ? or do we need a new parameter for the buffer or > something ?
It's worked OK in my testing. Typically, CONFIG_SYS_LOAD_ADDR is just CONFIG_TEXT_BASE plus some offset. If there's a discontinuity such as: TEXT_BASE - 0x000000000 RAM_TOP - 0x07fffffff LOAD_ADDR - 0x800000000 RAM2_TOP - 0xfffffffff then this only matters if we load something larger than 2G. Obviously not every RAM layout looks like this, but Most of the Time (TM) the memory set aside for U-Boot to run in can hold the FIT that holds U-Boot. If this ends up being a problem, we can add a config to load things in a malloc'd buffer. This change could be moved to a prep commit to aid bisecting. --Sean >> - if (err == -EAGAIN) >> - return err; >> - if (err == 0) >> - err = 1; >> - } else if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) && >> - image_get_magic(header) == FDT_MAGIC) { >> - struct spl_load_info load; >> - >> - debug("Found FIT\n"); >> - load.read = spl_fit_read; >> - load.bl_len = 1; >> - load.filename = (void *)filename; >> - load.priv = NULL; >> - >> - return spl_load_simple_fit(spl_image, &load, 0, header); >> - } else { >> - err = spl_parse_image_header(spl_image, bootdev, header); >> + /* >> + * Avoid pulling in this function for other image types since we are >> + * very short on space on some boards. >> + */ >> + if (IS_ENABLED(CONFIG_SPL_LOAD_FIT_FULL)) { >> + err = fat_size(filename, &size); >> if (err) >> goto end; >> - >> - err = file_fat_read(filename, >> - (u8 *)(uintptr_t)spl_image->load_addr, 0); >> + } else { >> + size = 0; >> } >> >> + err = spl_load(spl_image, bootdev, &load, 0, size); >> + >> end: >> #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT >> - if (err <= 0) >> + if (err < 0) >> printf("%s: error reading image %s, err - %d\n", >> __func__, filename, err); >> #endif >> >> - return (err <= 0); >> + return err; >> } >> >> #if CONFIG_IS_ENABLED(OS_BOOT) >> -- >> 2.40.1 >>