summaryrefslogtreecommitdiffstats
path: root/arch/arm/cpu
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2015-10-30 20:12:22 -0700
committerSascha Hauer <s.hauer@pengutronix.de>2015-11-02 08:31:58 +0100
commit2c68f4e53c964059a77121f2089d1326a641b9cd (patch)
tree9787f5ad466119660b9a8ffe0541c5ebdf160f12 /arch/arm/cpu
parent48d61510290ea3380e4987d38e512d2d8304849a (diff)
downloadbarebox-2c68f4e53c964059a77121f2089d1326a641b9cd.tar.gz
barebox-2c68f4e53c964059a77121f2089d1326a641b9cd.tar.xz
arm/cpu/start.c: Distil some common code in __start().
Both barebox_boarddata and barebox_boot_dtb perform essentially the same function -- hold a pointer to a chunk of private data. Since only one variable is ever used at any given time we may as well merge those two variable into one. This also allows us to share more code between two boot paths (board data vs. device tree) Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/cpu')
-rw-r--r--arch/arm/cpu/start.c60
1 files changed, 36 insertions, 24 deletions
diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
index 8e5097b560..e6f5e186bd 100644
--- a/arch/arm/cpu/start.c
+++ b/arch/arm/cpu/start.c
@@ -34,23 +34,34 @@
unsigned long arm_stack_top;
static void *barebox_boarddata;
-u32 barebox_arm_machine(void)
+static bool blob_is_fdt(const void *blob)
{
- struct barebox_arm_boarddata *bd;
-
- if (!barebox_boarddata)
- return 0;
+ return get_unaligned_be32(blob) == FDT_MAGIC;
+}
- bd = barebox_boarddata;
+static bool blob_is_arm_boarddata(const void *blob)
+{
+ const struct barebox_arm_boarddata *bd = blob;
- return bd->machine;
+ return bd->magic == BAREBOX_ARM_BOARDDATA_MAGIC;
}
-static void *barebox_boot_dtb;
+u32 barebox_arm_machine(void)
+{
+ if (barebox_boarddata && blob_is_arm_boarddata(barebox_boarddata)) {
+ const struct barebox_arm_boarddata *bd = barebox_boarddata;
+ return bd->machine;
+ } else {
+ return 0;
+ }
+}
void *barebox_arm_boot_dtb(void)
{
- return barebox_boot_dtb;
+ if (barebox_boarddata && blob_is_fdt(barebox_boarddata))
+ return barebox_boarddata;
+ else
+ return NULL;
}
static noinline __noreturn void __start(unsigned long membase,
@@ -70,7 +81,6 @@ static noinline __noreturn void __start(unsigned long membase,
pr_debug("memory at 0x%08lx, size 0x%08lx\n", membase, memsize);
- barebox_boarddata = boarddata;
arm_stack_top = endmem;
endmem -= STACK_SIZE; /* Stack */
@@ -89,21 +99,23 @@ static noinline __noreturn void __start(unsigned long membase,
}
if (boarddata) {
- if (get_unaligned_be32(boarddata) == FDT_MAGIC) {
- uint32_t totalsize = get_unaligned_be32(boarddata + 4);
+ uint32_t totalsize = 0;
+ const char *name;
+
+ if (blob_is_fdt(boarddata)) {
+ totalsize = get_unaligned_be32(boarddata + 4);
+ name = "DTB";
+ } else if (blob_is_arm_boarddata(boarddata)) {
+ totalsize = sizeof(struct barebox_arm_boarddata);
+ name = "machine type";
+ }
+
+ if (totalsize) {
endmem -= ALIGN(totalsize, 64);
- barebox_boot_dtb = (void *)endmem;
- pr_debug("found DTB in boarddata, copying to 0x%p\n",
- barebox_boot_dtb);
- memcpy(barebox_boot_dtb, boarddata, totalsize);
- } else if (((struct barebox_arm_boarddata *)boarddata)->magic ==
- BAREBOX_ARM_BOARDDATA_MAGIC) {
- endmem -= ALIGN(sizeof(struct barebox_arm_boarddata), 64);
- barebox_boarddata = (void *)endmem;
- pr_debug("found machine type in boarddata, copying to 0x%p\n",
- barebox_boarddata);
- memcpy(barebox_boarddata, boarddata,
- sizeof(struct barebox_arm_boarddata));
+ pr_debug("found %s in boarddata, copying to 0x%lu\n",
+ name, endmem);
+ barebox_boarddata = memcpy((void *)endmem,
+ boarddata, totalsize);
}
}