summaryrefslogtreecommitdiff
path: root/boot/bootmeth_extlinux.c
diff options
context:
space:
mode:
authorNam Cao <namcao@linutronix.de>2024-11-07 16:01:05 +0100
committerTom Rini <trini@konsulko.com>2024-11-18 08:23:56 -0600
commit5efd63c93c4546978c6a3a8e83c61011721b73b6 (patch)
treefeedea62e36f6fba66909d11cd5e9e33ad2b8471 /boot/bootmeth_extlinux.c
parenta38390284ad4261723d3a2411ba988828e994535 (diff)
boot: extlinux: Fix unaligned buffer for reading data from file system
extlinux_read_bootflow() allocates a buffer to read from file system without any alignment. But for some block devices which transfer data via DMA, ARCH_DMA_MINALIGN alignment is required. For example, due to misaligned buffer, the below boot failure is observed. => boot CACHE: Misaligned operation at range [9efa25f8, 9efa27f8] CACHE: Misaligned operation at range [9efa25f8, 9efa27f8] CACHE: Misaligned operation at range [9efa25f8, 9efa27f8] CACHE: Misaligned operation at range [9efa25f8, 9efa27f8] ** Booting bootflow 'mmc@2194000.bootdev.part_1' with extlinux Ignoring unknown command: �D���D�� Boot failed (err=-14) Change the buffer alignment to ARCH_DMA_MINALIGN. Fixes: 31aefaf89a5b ("bootstd: Add an implementation of distro boot") Signed-off-by: Nam Cao <namcao@linutronix.de> Tested-by: Javier Fernandez Pastrana <javier.pastrana@linutronix.de>
Diffstat (limited to 'boot/bootmeth_extlinux.c')
-rw-r--r--boot/bootmeth_extlinux.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/boot/bootmeth_extlinux.c b/boot/bootmeth_extlinux.c
index be8fbf4df63..c6ae6dffcb7 100644
--- a/boot/bootmeth_extlinux.c
+++ b/boot/bootmeth_extlinux.c
@@ -8,6 +8,7 @@
#define LOG_CATEGORY UCLASS_BOOTSTD
+#include <asm/cache.h>
#include <bootdev.h>
#include <bootflow.h>
#include <bootmeth.h>
@@ -159,7 +160,7 @@ static int extlinux_read_bootflow(struct udevice *dev, struct bootflow *bflow)
return log_msg_ret("try", ret);
size = bflow->size;
- ret = bootmeth_alloc_file(bflow, 0x10000, 1);
+ ret = bootmeth_alloc_file(bflow, 0x10000, ARCH_DMA_MINALIGN);
if (ret)
return log_msg_ret("read", ret);