[PATCH v5 05/11] spl: Convert mmc to spl_load
Sean Anderson
sean.anderson at seco.com
Thu Aug 3 18:11:52 CEST 2023
On 8/3/23 04:31, Xavier Drudis Ferran wrote:
> El Mon, Jul 31, 2023 at 06:42:57PM -0400, Sean Anderson deia:
>> This converts the mmc loader to spl_load. Legacy images are handled by
>> spl_load (via spl_parse_image_header), so mmc_load_legacy can be
>> omitted.
>>
>
> Yes. I haven't used the legacy case, but by looking at the code, it
> seems to me that mmc_load_legacy left the image at some mapped memory
> at [ spl_image->load_addr, spl_image->load_addr + size )
> and the new code does too, but when the image is not aligned, the
> memory that gets written to
> was at [ spl_image->load_addr, spl_image->load_addr + size + spl_image->offset % mmc->read_bl_len )
> and it will
> be at [ spl_image->load_addr - spl_image->offset % mmc->read_bl_len, spl_image->load_addr + size )
> after this patch.
>
> Meaning both with or without this patch some memory outside the image
> gets written when the image is not aligned on media, but before it was
> some part of a block at the end and now is that part before the
> beginning.
>
> Whether that's better or worse I don't know. It depends on whether
> it's a problem to write in non mapped memory, whether there's
> something worth preserving there, and whether some SOC has some sort
> of special behaving memory just there, like it happened with the issue
> Jerome Forissier found (note in this case it wasn't legacy, it was
> simple fit)
Fundamentally, we can't really deal with unaligned images without a
bounce-buffer. The method used by SPL_LOAD_FIT_IMAGE_BUFFER_SIZE will
continue working, since we call into the FIT routines to load the image.
I would like to defer bounce buffering for other images until someone
actually needs it.
Note that in the FIT case, you can also do `mkimage -EB`, at least if
you aren't using FIT_LOAD_FULL.
--Sean
> https://cas5-0-urlprotect.trendmicro.com:443/wis/clicktime/v1/query?url=https%3a%2f%2fpatchwork.ozlabs.org%2fproject%2fuboot%2fpatch%2fc941d835a85255ff81a21c72069c3a9fc9a8a255.1656489154.git.jerome.forissier%40linaro.org%2f&umid=1ca400c8-7d50-4ae9-9abc-31dac6468719&auth=d807158c60b7d2502abde8a2fc01f40662980862-09f1f8fbc507564d04c74bc07523f5da694b0761
>
>> Signed-off-by: Sean Anderson <sean.anderson at seco.com>
>> ---
>>
>> Changes in v5:
>> - Rework to load header in spl_load
>>
>> common/spl/spl_mmc.c | 91 ++++----------------------------------------
>> 1 file changed, 8 insertions(+), 83 deletions(-)
>>
>> diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
>> index a665091b00..c926a42c0f 100644
>> --- a/common/spl/spl_mmc.c
>> +++ b/common/spl/spl_mmc.c
>> @@ -17,48 +17,6 @@
>> #include <mmc.h>
>> #include <image.h>
>>
>> -static int mmc_load_legacy(struct spl_image_info *spl_image,
>> - struct spl_boot_device *bootdev,
>> - struct mmc *mmc,
>> - ulong sector, struct legacy_img_hdr *header)
>> -{
>> - u32 image_offset_sectors;
>> - u32 image_size_sectors;
>> - unsigned long count;
>> - u32 image_offset;
>> - int ret;
>> -
>> - ret = spl_parse_image_header(spl_image, bootdev, header);
>> - if (ret)
>> - return ret;
>> -
>> - /* convert offset to sectors - round down */
>> - image_offset_sectors = spl_image->offset / mmc->read_bl_len;
>> - /* calculate remaining offset */
>> - image_offset = spl_image->offset % mmc->read_bl_len;
>> -
>> - /* convert size to sectors - round up */
>> - image_size_sectors = (spl_image->size + mmc->read_bl_len - 1) /
>> - mmc->read_bl_len;
>> -
>> - /* Read the header too to avoid extra memcpy */
>> - count = blk_dread(mmc_get_blk_desc(mmc),
>> - sector + image_offset_sectors,
>> - image_size_sectors,
>> - (void *)(ulong)spl_image->load_addr);
>> - debug("read %x sectors to %lx\n", image_size_sectors,
>> - spl_image->load_addr);
>> - if (count != image_size_sectors)
>> - return -EIO;
>> -
>> - if (image_offset)
>> - memmove((void *)(ulong)spl_image->load_addr,
>> - (void *)(ulong)spl_image->load_addr + image_offset,
>> - spl_image->size);
>> -
>> - return 0;
>> -}
>> -
>> static ulong h_spl_load_read(struct spl_load_info *load, ulong sector,
>> ulong count, void *buf)
>> {
>> @@ -82,47 +40,14 @@ int mmc_load_image_raw_sector(struct spl_image_info *spl_image,
>> struct spl_boot_device *bootdev,
>> struct mmc *mmc, unsigned long sector)
>> {
>> - unsigned long count;
>> - struct legacy_img_hdr *header;
>> - struct blk_desc *bd = mmc_get_blk_desc(mmc);
>> - int ret = 0;
>> -
>> - header = spl_get_load_buffer(-sizeof(*header), bd->blksz);
>> -
>> - /* read image header to find the image size & load address */
>> - count = blk_dread(bd, sector, 1, header);
>> - debug("hdr read sector %lx, count=%lu\n", sector, count);
>> - if (count == 0) {
>> - ret = -EIO;
>> - goto end;
>> - }
>> -
>> - if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
>> - image_get_magic(header) == FDT_MAGIC) {
>> - struct spl_load_info load;
>> -
>> - debug("Found FIT\n");
>> - load.dev = mmc;
>> - load.priv = NULL;
>> - load.filename = NULL;
>> - load.bl_len = mmc->read_bl_len;
>> - load.read = h_spl_load_read;
>> - ret = spl_load_simple_fit(spl_image, &load, sector, header);
>> - } else if (IS_ENABLED(CONFIG_SPL_LOAD_IMX_CONTAINER)) {
>> - struct spl_load_info load;
>> -
>> - load.dev = mmc;
>> - load.priv = NULL;
>> - load.filename = NULL;
>> - load.bl_len = mmc->read_bl_len;
>> - load.read = h_spl_load_read;
>> -
>> - ret = spl_load_imx_container(spl_image, &load, sector);
>> - } else {
>> - ret = mmc_load_legacy(spl_image, bootdev, mmc, sector, header);
>> - }
>> -
>> -end:
>> + int ret;
>> + struct spl_load_info load = {
>> + .dev = mmc,
>> + .bl_len = mmc->read_bl_len,
>> + .read = h_spl_load_read,
>> + };
>> +
>> + ret = spl_load(spl_image, bootdev, &load, 0, sector);
>> if (ret) {
>> #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
>> puts("mmc_load_image_raw_sector: mmc block read error\n");
>> --
>> 2.40.1
>>
More information about the U-Boot
mailing list