summaryrefslogtreecommitdiffstats
path: root/arch/arm/lib/bootm.c
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2016-02-26 20:12:38 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2016-03-01 07:32:13 +0100
commita324fb5acec8a6889b7ca5f08e796eab17ea5f54 (patch)
treeb1ee02cd525435218aa58b6b52120abc777313b5 /arch/arm/lib/bootm.c
parentd7d0c7a0bb6cc3d9888a67ea6ebab10bd66350a5 (diff)
downloadbarebox-a324fb5acec8a6889b7ca5f08e796eab17ea5f54.tar.gz
barebox-a324fb5acec8a6889b7ca5f08e796eab17ea5f54.tar.xz
arm: bootm: unify kernel load address calculation
Instead of having the same logic for uImage and zImage types duplicated in the code, split it out into a separate function. This does not change the behavior of the calculation. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/lib/bootm.c')
-rw-r--r--arch/arm/lib/bootm.c74
1 files changed, 37 insertions, 37 deletions
diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
index 1913d5f97a..a18d14959c 100644
--- a/arch/arm/lib/bootm.c
+++ b/arch/arm/lib/bootm.c
@@ -67,6 +67,34 @@ static int sdram_start_and_size(unsigned long *start, unsigned long *size)
return 0;
}
+static void get_kernel_addresses(unsigned long mem_start, size_t image_size,
+ int verbose, unsigned long *load_address,
+ unsigned long *spacing)
+{
+ /*
+ * We don't know the exact decompressed size so just use a conservative
+ * default of 4 times the size of the compressed image.
+ */
+ size_t image_decomp_size = PAGE_ALIGN(image_size * 4);
+
+ /*
+ * By default put oftree/initrd close behind compressed kernel image to
+ * avoid placing it outside of the kernels lowmem region.
+ */
+ *spacing = SZ_1M;
+
+ if (*load_address == UIMAGE_INVALID_ADDRESS) {
+ /*
+ * Place the kernel at an address where it does not need to
+ * relocate itself before decompression.
+ */
+ *load_address = mem_start + image_decomp_size;
+ if (verbose)
+ printf("no OS load address, defaulting to 0x%08lx\n",
+ *load_address);
+ }
+}
+
static int __do_bootm_linux(struct image_data *data, unsigned long free_mem, int swap)
{
unsigned long kernel;
@@ -124,7 +152,7 @@ static int __do_bootm_linux(struct image_data *data, unsigned long free_mem, int
static int do_bootm_linux(struct image_data *data)
{
- unsigned long load_address, mem_start, mem_size, mem_free;
+ unsigned long load_address, mem_start, mem_size, mem_free, spacing;
int ret;
ret = sdram_start_and_size(&mem_start, &mem_size);
@@ -133,28 +161,14 @@ static int do_bootm_linux(struct image_data *data)
load_address = data->os_address;
- if (load_address == UIMAGE_INVALID_ADDRESS) {
- /*
- * Just use a conservative default of 4 times the size of the
- * compressed image, to avoid the need for the kernel to
- * relocate itself before decompression.
- */
- load_address = mem_start + PAGE_ALIGN(
- bootm_get_os_size(data) * 4);
- if (bootm_verbose(data))
- printf("no OS load address, defaulting to 0x%08lx\n",
- load_address);
- }
+ get_kernel_addresses(mem_start, bootm_get_os_size(data),
+ bootm_verbose(data), &load_address, &spacing);
ret = bootm_load_os(data, load_address);
if (ret)
return ret;
- /*
- * put oftree/initrd close behind compressed kernel image to avoid
- * placing it outside of the kernels lowmem.
- */
- mem_free = PAGE_ALIGN(data->os_res->end + SZ_1M);
+ mem_free = PAGE_ALIGN(data->os_res->end + spacing);
return __do_bootm_linux(data, mem_free, 0);
}
@@ -251,7 +265,7 @@ static int do_bootz_linux(struct image_data *data)
u32 end, start;
size_t image_size;
unsigned long load_address = data->os_address;
- unsigned long mem_start, mem_size, mem_free;
+ unsigned long mem_start, mem_size, mem_free, spacing;
ret = sdram_start_and_size(&mem_start, &mem_size);
if (ret)
@@ -291,20 +305,10 @@ static int do_bootz_linux(struct image_data *data)
}
image_size = end - start;
+ load_address = data->os_address;
- if (load_address == UIMAGE_INVALID_ADDRESS) {
- /*
- * Just use a conservative default of 4 times the size of the
- * compressed image, to avoid the need for the kernel to
- * relocate itself before decompression.
- */
- data->os_address = mem_start + PAGE_ALIGN(image_size * 4);
-
- load_address = data->os_address;
- if (bootm_verbose(data))
- printf("no OS load address, defaulting to 0x%08lx\n",
- load_address);
- }
+ get_kernel_addresses(mem_start, image_size, bootm_verbose(data),
+ &load_address, &spacing);
data->os_res = request_sdram_region("zimage", load_address, image_size);
if (!data->os_res) {
@@ -340,11 +344,7 @@ static int do_bootz_linux(struct image_data *data)
close(fd);
- /*
- * put oftree/initrd close behind compressed kernel image to avoid
- * placing it outside of the kernels lowmem.
- */
- mem_free = PAGE_ALIGN(data->os_res->end + SZ_1M);
+ mem_free = PAGE_ALIGN(data->os_res->end + spacing);
return __do_bootm_linux(data, mem_free, swap);