aboutsummaryrefslogtreecommitdiffstats
path: root/common/spl/spl_sata.c
diff options
context:
space:
mode:
authorPali Rohár <pali@kernel.org>2021-07-23 11:14:27 +0200
committerStefan Roese <sr@denx.de>2021-07-31 09:49:32 +0200
commit5fce2875569d6e859443af7af3477c3aebfee383 (patch)
tree1586a3eabedebae1d5af6d03a474f9a9cef49037 /common/spl/spl_sata.c
parentabbf2179b251493b09c08d90e46ca0de950b3410 (diff)
downloadu-boot-5fce2875569d6e859443af7af3477c3aebfee383.tar.gz
SPL: Add support for specifying offset between header and image
Some image types (e.g. kwbimage v1) store the offset to SPL binary and offset to U-Boot proper binary in their headers. To avoid reading SPL binary when loading U-Boot proper, add support for specifying offset in struct spl_image_info, which defines the offset from the beginning of the header and the beginning of the executable data. Initial support is added only for SPI, MMC and SATA code. We can extend it later if needed. Signed-off-by: Pali Rohár <pali@kernel.org> Reviewed-by: Marek Behún <marek.behun@nic.cz> Reviewed-by: Stefan Roese <sr@denx.de>
Diffstat (limited to 'common/spl/spl_sata.c')
-rw-r--r--common/spl/spl_sata.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/common/spl/spl_sata.c b/common/spl/spl_sata.c
index e108af0576a..535a9219efa 100644
--- a/common/spl/spl_sata.c
+++ b/common/spl/spl_sata.c
@@ -36,6 +36,8 @@ static int spl_sata_load_image_raw(struct spl_image_info *spl_image,
struct image_header *header;
unsigned long count;
u32 image_size_sectors;
+ u32 image_offset_sectors;
+ u32 image_offset;
int ret;
header = spl_get_load_buffer(-sizeof(*header), stor_dev->blksz);
@@ -48,11 +50,19 @@ static int spl_sata_load_image_raw(struct spl_image_info *spl_image,
return ret;
image_size_sectors = DIV_ROUND_UP(spl_image->size, stor_dev->blksz);
- count = blk_dread(stor_dev, sector, image_size_sectors,
+ image_offset_sectors = spl_image->offset / stor_dev->blksz;
+ image_offset = spl_image->offset % stor_dev->blksz;
+ count = blk_dread(stor_dev, sector + image_offset_sectors,
+ image_size_sectors,
(void *)spl_image->load_addr);
if (count != image_size_sectors)
return -EIO;
+ if (image_offset)
+ memmove((void *)spl_image->load_addr,
+ (void *)spl_image->load_addr + image_offset,
+ spl_image->size);
+
return 0;
}