mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-13 00:17:23 +00:00
spl: Set FAT bl_len to ARCH_DMA_MINALIGN
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>
This commit is contained in:
parent
73c40fcb73
commit
b63664be6a
4 changed files with 9 additions and 27 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue