diff options
author | Anup Patel <anup.patel@wdc.com> | 2018-12-19 18:32:49 +0530 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2018-12-19 18:32:49 +0530 |
commit | bc4d6108f4d43996e3d7a74e026fb4f2c4e25ca5 (patch) | |
tree | d33f43288abbf43351007a54839a7e9225e82c0c | |
parent | bc99e707cd84f5aedf82409ebbaed15353e49f95 (diff) |
blob: payload: Add FW_PAYLOAD_FDT_PATH option
This patch extends fw_payload blob to provide FW_PAYLOAD_FDT_PATH
option using which we can embed custom FDT in .text section of
fw_payload blob. In other words, FW_PAYLOAD_FDT_PATH is an option
to forcefully override FDT passed by previous booting stage in
a1 register.
Signed-off-by: Anup Patel <anup.patel@wdc.com>
-rw-r--r-- | blob/fw_common.S | 19 | ||||
-rw-r--r-- | blob/fw_jump.S | 11 | ||||
-rw-r--r-- | blob/fw_payload.S | 25 | ||||
-rw-r--r-- | blob/objects.mk | 3 |
4 files changed, 51 insertions, 7 deletions
diff --git a/blob/fw_common.S b/blob/fw_common.S index 7faa59a..25bdd55 100644 --- a/blob/fw_common.S +++ b/blob/fw_common.S @@ -27,15 +27,30 @@ _bss_zero: add a4, a4, __SIZEOF_POINTER__ blt a4, a5, _bss_zero + /* Override pervious arg1 */ + add s0, a0, zero + add s1, a1, zero + call fw_prev_arg1 + add t1, a0, zero + add a0, s0, zero + add a1, s1, zero + beqz t1, _prev_arg1_override_done + add a1, t1, zero +_prev_arg1_override_done: + /* * Relocate FDT + * source FDT address = previous arg1 + * destination FDT address = next arg1 + * * Note: We will preserve a0 and a1 passed by * previous booting stage. */ + beqz a1, _fdt_reloc_done /* Mask values in a3 and a4 */ li a3, ~0xf li a4, 0xff - /* t1 = destinetion FDT start address */ + /* t1 = destination FDT start address */ add s0, a0, zero add s1, a1, zero call fw_next_arg1 @@ -70,7 +85,7 @@ _bss_zero: or t2, t2, t3 or t2, t2, t4 or t2, t2, t5 - /* t2 = destinetion FDT end address */ + /* t2 = destination FDT end address */ add t2, t1, t2 /* FDT copy loop */ ble t2, t1, _fdt_reloc_done diff --git a/blob/fw_jump.S b/blob/fw_jump.S index e11a8a9..d05d87f 100644 --- a/blob/fw_jump.S +++ b/blob/fw_jump.S @@ -11,11 +11,18 @@ .align 3 .section .entry, "ax", %progbits + .global fw_prev_arg1 +fw_prev_arg1: + /* We return previous arg1 in 'a0' */ + add a0, zero, zero + ret + + .align 3 + .section .entry, "ax", %progbits .global fw_next_arg1 fw_next_arg1: - /* We return FDT destination address in 'a0' */ + /* We return next arg1 in 'a0' */ #ifdef FW_JUMP_FDT_ADDR - /* a0 = destination FDT start address */ li a0, FW_JUMP_FDT_ADDR #else add a0, zero, zero diff --git a/blob/fw_payload.S b/blob/fw_payload.S index c601529..b6f3cb9 100644 --- a/blob/fw_payload.S +++ b/blob/fw_payload.S @@ -11,11 +11,22 @@ .align 3 .section .entry, "ax", %progbits + .global fw_prev_arg1 +fw_prev_arg1: + /* We return previous arg1 in 'a0' */ +#ifdef FW_PAYLOAD_FDT_PATH + la a0, fdt_bin +#else + add a0, zero, zero +#endif + ret + + .align 3 + .section .entry, "ax", %progbits .global fw_next_arg1 fw_next_arg1: - /* We return FDT destination address in 'a0' */ + /* We return next arg1 in 'a0' */ #ifdef FW_PAYLOAD_FDT_ADDR - /* a0 = destination FDT start address */ li a0, FW_PAYLOAD_FDT_ADDR #else add a0, zero, zero @@ -33,8 +44,16 @@ fw_next_addr: #define str(s) #s #define stringify(s) str(s) +#ifdef FW_PAYLOAD_FDT_PATH + .align 3 + .section .text, "ax", %progbits + .globl fdt_bin +fdt_bin: + .incbin stringify(FW_PAYLOAD_FDT_PATH) +#endif + .section .payload, "ax", %progbits - .globl payload_bin + .globl payload_bin payload_bin: #ifndef FW_PAYLOAD_PATH wfi diff --git a/blob/objects.mk b/blob/objects.mk index 57ed467..717f455 100644 --- a/blob/objects.mk +++ b/blob/objects.mk @@ -31,6 +31,9 @@ endif ifdef FW_PAYLOAD_OFFSET blob-cppflags-$(FW_PAYLOAD) += -DFW_PAYLOAD_OFFSET=$(FW_PAYLOAD_OFFSET) endif +ifdef FW_PAYLOAD_FDT_PATH +blob-cppflags-$(FW_PAYLOAD) += -DFW_PAYLOAD_FDT_PATH=$(FW_PAYLOAD_FDT_PATH) +endif ifdef FW_PAYLOAD_FDT_ADDR blob-cppflags-$(FW_PAYLOAD) += -DFW_PAYLOAD_FDT_ADDR=$(FW_PAYLOAD_FDT_ADDR) endif |