diff options
author | Stefan Roese <sr@denx.de> | 2012-08-27 12:50:58 +0200 |
---|---|---|
committer | Tom Rini <trini@ti.com> | 2012-09-27 11:20:27 -0700 |
commit | 022b4975c8dd304fa9f949594784f78601ae07c2 (patch) | |
tree | 680432c4f03492bbc801550721e4205e424e959b | |
parent | 33d346464adb8dc206d1f9adf73bdfe2ed959502 (diff) |
SPL: Add option to skip copying of the mkimage header
On some system (e.g. powerpc), the load-address and entry-point is
located at address 0. So the current approach to load the image
(payload) including the header to the address "load-address - 64"
can't work here.
This patch adds an flag to skip this copying including header to
the SPL framework. By setting SPL_COPY_PAYLOAD_ONLY, only the
playload will be copied. This will be used by the SPL NOR flash
driver on powerpc.
Signed-off-by: Stefan Roese <sr@denx.de>
Signed-off-by: Tom Rini <trini@ti.com>
-rw-r--r-- | common/spl/spl.c | 21 | ||||
-rw-r--r-- | include/spl.h | 3 |
2 files changed, 20 insertions, 4 deletions
diff --git a/common/spl/spl.c b/common/spl/spl.c index 3156401fd52..95dd9d50ccf 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -76,10 +76,23 @@ void spl_parse_image_header(const struct image_header *header) u32 header_size = sizeof(struct image_header); if (image_get_magic(header) == IH_MAGIC) { - spl_image.size = image_get_data_size(header) + header_size; - spl_image.entry_point = image_get_load(header); - /* Load including the header */ - spl_image.load_addr = spl_image.entry_point - header_size; + if (spl_image.flags & SPL_COPY_PAYLOAD_ONLY) { + /* + * On some system (e.g. powerpc), the load-address and + * entry-point is located at address 0. We can't load + * to 0-0x40. So skip header in this case. + */ + spl_image.load_addr = image_get_load(header); + spl_image.entry_point = image_get_ep(header); + spl_image.size = image_get_data_size(header); + } else { + spl_image.entry_point = image_get_load(header); + /* Load including the header */ + spl_image.load_addr = spl_image.entry_point - + header_size; + spl_image.size = image_get_data_size(header) + + header_size; + } spl_image.os = image_get_os(header); spl_image.name = image_get_name(header); debug("spl: payload image: %s load addr: 0x%x size: %d\n", diff --git a/include/spl.h b/include/spl.h index e40538600ee..cf441a16b5a 100644 --- a/include/spl.h +++ b/include/spl.h @@ -38,8 +38,11 @@ struct spl_image_info { u32 load_addr; u32 entry_point; u32 size; + u32 flags; }; +#define SPL_COPY_PAYLOAD_ONLY 1 + extern struct spl_image_info spl_image; extern u32 *boot_params_ptr; |