]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
spl: Set FAT bl_len to ARCH_DMA_MINALIGN
authorSean Anderson <seanga2@gmail.com>
Wed, 8 Nov 2023 16:48:41 +0000 (11:48 -0500)
committerTom Rini <trini@konsulko.com>
Thu, 16 Nov 2023 18:49:14 +0000 (13:49 -0500)
Instead of relying on the presence of filename to determine whether we are
dealing with a FAT filesystem (and should DMA-align the buffer), have FAT set
bl_len to ARCH_DMA_MINALIGN instead. With this done, we can remove the
special-case logic checking for the presence of filename.

Because filesystems are not block-based, we may read less than the size passed
to spl_load_info.read. This can happen if the file size is not DMA-aligned. This
is fine as long as we read the amount we originally wanted to. Modify the
conditions for callers of spl_load_info.read to check against the original,
unaligned size to avoid failing spuriously.

Signed-off-by: Sean Anderson <seanga2@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
common/spl/spl_blk_fs.c
common/spl/spl_fat.c
common/spl/spl_fit.c
common/spl/spl_imx_container.c

index 144c8a65b5dde5fb9bfc1770bdfd3d1162785f5c..c105c55877af4de86417eda4331639f3e682caf1 100644 (file)
@@ -9,6 +9,7 @@
 #include <spl.h>
 #include <image.h>
 #include <fs.h>
+#include <asm/cache.h>
 #include <asm/io.h>
 
 struct blk_dev {
@@ -85,7 +86,7 @@ int spl_blk_load_image(struct spl_image_info *spl_image,
 
                debug("Found FIT\n");
                load.read = spl_fit_read;
-               load.bl_len = 1;
+               load.bl_len = ARCH_DMA_MINALIGN;
                load.filename = (void *)filename;
                load.priv = &dev;
 
index 6172e7bcd48f02e56d8d0f0ce23f49173e4bee1b..5b723456478996de4e533f43647b392b669580d1 100644 (file)
@@ -97,7 +97,7 @@ int spl_load_image_fat(struct spl_image_info *spl_image,
 
                debug("Found FIT\n");
                load.read = spl_fit_read;
-               load.bl_len = 1;
+               load.bl_len = ARCH_DMA_MINALIGN;
                load.filename = (void *)filename;
 
                return spl_load_simple_fit(spl_image, &load, 0, header);
index ce7ef0efd0d52b2d71d549e3a0963f060c37b887..0df4e6d1484787a7a44c12ce2999523819d842ed 100644 (file)
@@ -14,7 +14,6 @@
 #include <mapmem.h>
 #include <spl.h>
 #include <sysinfo.h>
-#include <asm/cache.h>
 #include <asm/global_data.h>
 #include <asm/io.h>
 #include <linux/libfdt.h>
@@ -172,28 +171,11 @@ static int spl_fit_get_image_node(const struct spl_fit_info *ctx,
 
 static int get_aligned_image_offset(struct spl_load_info *info, int offset)
 {
-       /*
-        * If it is a FS read, get the first address before offset which is
-        * aligned to ARCH_DMA_MINALIGN. If it is raw read return the
-        * block number to which offset belongs.
-        */
-       if (info->filename)
-               return offset & ~(ARCH_DMA_MINALIGN - 1);
-
        return ALIGN_DOWN(offset, info->bl_len);
 }
 
 static int get_aligned_image_overhead(struct spl_load_info *info, int offset)
 {
-       /*
-        * If it is a FS read, get the difference between the offset and
-        * the first address before offset which is aligned to
-        * ARCH_DMA_MINALIGN. If it is raw read return the offset within the
-        * block.
-        */
-       if (info->filename)
-               return offset & (ARCH_DMA_MINALIGN - 1);
-
        return offset & (info->bl_len - 1);
 }
 
@@ -202,9 +184,6 @@ static int get_aligned_image_size(struct spl_load_info *info, int data_size,
 {
        data_size = data_size + get_aligned_image_overhead(info, offset);
 
-       if (info->filename)
-               return data_size;
-
        return ALIGN(data_size, info->bl_len);
 }
 
@@ -295,7 +274,7 @@ static int load_simple_fit(struct spl_load_info *info, ulong fit_offset,
                if (info->read(info,
                               fit_offset +
                               get_aligned_image_offset(info, offset), size,
-                              src_ptr) != size)
+                              src_ptr) < length)
                        return -EIO;
 
                debug("External data: dst=%p, offset=%x, size=%lx\n",
index ad89a99fb23ff7edf04b59a99d40985a0e29b3db..7cd674f835f622de75d331fcc81fcfb3f9c166c7 100644 (file)
@@ -45,7 +45,8 @@ static struct boot_img_t *read_auth_image(struct spl_image_info *spl_image,
              container, offset, size);
        if (info->read(info, offset, size,
                       map_sysmem(images[image_index].dst - overhead,
-                                 images[image_index].size)) != size) {
+                                 images[image_index].size)) <
+           images[image_index].size) {
                printf("%s wrong\n", __func__);
                return NULL;
        }
@@ -77,7 +78,8 @@ static int read_auth_container(struct spl_image_info *spl_image,
 
        debug("%s: container: %p offset: %lu size: %u\n", __func__,
              container, offset, size);
-       if (info->read(info, offset, size, container) != size) {
+       if (info->read(info, offset, size, container) <
+           CONTAINER_HDR_ALIGNMENT) {
                ret = -EIO;
                goto end;
        }
@@ -107,7 +109,7 @@ static int read_auth_container(struct spl_image_info *spl_image,
 
                debug("%s: container: %p offset: %lu size: %u\n",
                      __func__, container, offset, size);
-               if (info->read(info, offset, size, container) != size) {
+               if (info->read(info, offset, size, container) < length) {
                        ret = -EIO;
                        goto end;
                }