arm/arm64: implement a boot header capability
authorAndre Przywara <andre.przywara@arm.com>
Tue, 31 May 2016 17:45:06 +0000 (10:45 -0700)
committerTom Rini <trini@konsulko.com>
Mon, 6 Jun 2016 17:39:19 +0000 (13:39 -0400)
Some SPL loaders (like Allwinner's boot0, and Broadcom's boot0)
require a header before the actual U-Boot binary to both check its
validity and to find other data to load. Sometimes this header may
only be a few bytes of information, and sometimes this might simply
be space that needs to be reserved for a post-processing tool.

Introduce a config option to allow assembler preprocessor commands
to be inserted into the code at the appropriate location; typical
assembler preprocessor commands might be:
  .space 1000
  .word 0x12345678

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Steve Rae <srae@broadcom.com>
Commit Notes:
Please note that the current code:
  start.S (arm64) and
  vectors.S (arm)
already jumps over some portion of data already, so this option basically
just increases the size of this region (and the resulting binary).

For use with Allwinner's boot0 blob there is a tool called boot0img[1],
which fills the header to allow booting A64 based boards.
For the Pine64 we need a 1536 byte header (including the branch
instruction) at the moment, so we add this to the defconfig.

[1] https://github.com/apritzel/pine64/tree/master/tools
END
Reviewed-by: Tom Rini <trini@konsulko.com>
arch/arm/Kconfig
arch/arm/cpu/armv8/start.S
arch/arm/include/asm/arch-bcm281xx/boot0.h [new file with mode: 0644]
arch/arm/include/asm/arch-sunxi/boot0.h [new file with mode: 0644]
arch/arm/lib/vectors.S
configs/bcm28155_ap_defconfig
configs/bcm28155_w1d_defconfig
configs/pine64_plus_defconfig

index 72b0aa78a56a7b779e38dd5328c62b0c9841dd91..0805fa41ac9b7224d97a57cfd968840125732831 100644 (file)
@@ -91,6 +91,14 @@ config SYS_L2CACHE_OFF
          If SoC does not support L2CACHE or one do not want to enable
          L2CACHE, choose this option.
 
+config ENABLE_ARM_SOC_BOOT0_HOOK
+       bool "prepare BOOT0 header"
+       help
+         If the SoC's BOOT0 requires a header area filled with (magic)
+         values, then choose this option, and create a define called
+         ARM_SOC_BOOT0_HOOK which contains the required assembler
+         preprocessor code.
+
 choice
        prompt "Target select"
        default TARGET_HIKEY
index e933021a17ebe78de0a7a6150e248fe414d8bbdf..c1a2f456d532597b3083e3ece2bdf38bfb66eaec 100644 (file)
 _start:
        b       reset
 
+#ifdef CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK
+/*
+ * Various SoCs need something special and SoC-specific up front in
+ * order to boot, allow them to set that in their boot0.h file and then
+ * use it here.
+ */
+#include <asm/arch/boot0.h>
+ARM_SOC_BOOT0_HOOK
+#endif
+
        .align 3
 
 .globl _TEXT_BASE
diff --git a/arch/arm/include/asm/arch-bcm281xx/boot0.h b/arch/arm/include/asm/arch-bcm281xx/boot0.h
new file mode 100644 (file)
index 0000000..7e72882
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * Copyright 2016 Broadcom Corporation.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __BOOT0_H
+#define __BOOT0_H
+
+/* BOOT0 header information */
+#define ARM_SOC_BOOT0_HOOK     \
+       .word   0xbabeface;     \
+       .word   _end - _start
+
+#endif /* __BOOT0_H */
diff --git a/arch/arm/include/asm/arch-sunxi/boot0.h b/arch/arm/include/asm/arch-sunxi/boot0.h
new file mode 100644 (file)
index 0000000..ea5675e
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * Configuration settings for the Allwinner A64 (sun50i) CPU
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __BOOT0_H
+#define __BOOT0_H
+
+/* reserve space for BOOT0 header information */
+#define ARM_SOC_BOOT0_HOOK     \
+       .space  1532
+
+#endif /* __BOOT0_H */
index 49238ed21ed83766fe207c1060cef4e5b2d4257d..5cc132b7b844c5324dbdc0122a0bb0cb98aabcef 100644 (file)
@@ -60,6 +60,16 @@ _start:
        ldr     pc, _irq
        ldr     pc, _fiq
 
+#ifdef CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK
+/*
+ * Various SoCs need something special and SoC-specific up front in
+ * order to boot, allow them to set that in their boot0.h file and then
+ * use it here.
+ */
+#include <asm/arch/boot0.h>
+ARM_SOC_BOOT0_HOOK
+#endif
+
 /*
  *************************************************************************
  *
index bfd519ec13bad225a37733e0833a0146d6984dae..4404f321536e61df9e2cc3803988a75b785f822b 100644 (file)
@@ -22,3 +22,4 @@ CONFIG_G_DNL_MANUFACTURER="Broadcom Corporation"
 CONFIG_G_DNL_VENDOR_NUM=0x18d1
 CONFIG_G_DNL_PRODUCT_NUM=0x0d02
 CONFIG_OF_LIBFDT=y
+CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK=y
index 19111226d5262f5fd5edf0df4ebed5ca11a004ca..60eb3281b65ccb010bfe12c250f457d64bb7e9af 100644 (file)
@@ -22,3 +22,4 @@ CONFIG_USB_GADGET_DOWNLOAD=y
 CONFIG_G_DNL_MANUFACTURER="Broadcom Corporation"
 CONFIG_G_DNL_VENDOR_NUM=0x18d1
 CONFIG_G_DNL_PRODUCT_NUM=0x0d02
+CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK=y
index 489b75c3bfa158042184da77c066f257ea8472a6..0bf79bfd3346f7e5e978ff7057923af39cfe511a 100644 (file)
@@ -9,3 +9,4 @@ CONFIG_DEFAULT_DEVICE_TREE="sun50i-a64-pine64-plus"
 # CONFIG_CMD_IMLS is not set
 # CONFIG_CMD_FLASH is not set
 # CONFIG_CMD_FPGA is not set
+CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK=y