firmware: Add common FW_FDT_PATH compile-time option
authorAnup Patel <anup.patel@wdc.com>
Wed, 14 Oct 2020 10:33:35 +0000 (16:03 +0530)
committerAnup Patel <anup@brainfault.org>
Sun, 18 Oct 2020 04:58:26 +0000 (10:28 +0530)
Currently, only FW_PAYLOAD has mechanism to embed external
FDT using FW_PAYLOAD_FDT_PATH compile-time option.

This patch adds a common FW_FDT_PATH compile-time option to
embed external FDT for all OpenSBI firmwares (i.e FW_JUMP,
FW_PAYLOAD, and FW_DYNAMIC).

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
docs/firmware/fw.md
firmware/external_deps.mk
firmware/fw_base.S
firmware/objects.mk

index 4133c23..cc0cc9e 100644 (file)
@@ -51,11 +51,17 @@ case, a *FW_PAYLOAD* firmware allows embedding a flattened device tree in the
 Firmware Configuration and Compilation
 --------------------------------------
 
-All firmware types mandate the definition of the following compile time
-configuration parameter.
-
-* **FW_TEXT_ADDR** - Defines the address at which the previous booting stage
-  loads OpenSBI firmware.
+All firmware types support the following common compile time configuration
+parameters:
+
+* **FW_TEXT_ADDR** - Defines the execution address of the OpenSBI firmware.
+  This configuration parameter is mandatory.
+* **FW_FDT_PATH** - Path to an external flattened device tree binary file to
+  be embedded in the *.rodata* section of the final firmware. If this option
+  is not provided then the firmware will expect the FDT to be passed as an
+  argument by the prior booting stage.
+* **FW_FDT_PADDING** - Optional zero bytes padding to the embedded flattened
+  device tree binary file specified by **FW_FDT_PATH** option.
 
 Additionally, each firmware type as a set of type specific configuration
 parameters. Detailed information for each firmware type can be found in the
index 2b8f9f6..f43ac06 100644 (file)
@@ -7,5 +7,9 @@
 #   Anup Patel <anup.patel@wdc.com>
 #
 
+$(platform_build_dir)/firmware/fw_dynamic.o: $(FW_FDT_PATH)
+$(platform_build_dir)/firmware/fw_jump.o: $(FW_FDT_PATH)
+$(platform_build_dir)/firmware/fw_payload.o: $(FW_FDT_PATH)
+
 $(platform_build_dir)/firmware/fw_payload.o: $(FW_PAYLOAD_PATH_FINAL)
 $(platform_build_dir)/firmware/fw_payload.o: $(FW_PAYLOAD_FDT_PATH)
index 0271d9a..95197da 100644 (file)
@@ -182,6 +182,11 @@ _bss_zero:
        call    fw_save_info
        MOV_5R  a0, s0, a1, s1, a2, s2, a3, s3, a4, s4
 
+#ifdef FW_FDT_PATH
+       /* Override previous arg1 */
+       la      a1, fw_fdt_bin
+#endif
+
        /* Override previous arg1 */
        MOV_3R  s0, a0, s1, a1, s2, a2
        call    fw_prev_arg1
@@ -668,3 +673,14 @@ _reset_regs:
        csrw CSR_MSCRATCH, 0
 
        ret
+
+#ifdef FW_FDT_PATH
+       .section .rodata
+       .align 4
+       .globl fw_fdt_bin
+fw_fdt_bin:
+       .incbin FW_FDT_PATH
+#ifdef FW_FDT_PADDING
+       .fill FW_FDT_PADDING, 1, 0
+#endif
+#endif
index c980362..2eea54c 100644 (file)
@@ -17,6 +17,13 @@ ifdef FW_TEXT_START
 firmware-genflags-y += -DFW_TEXT_START=$(FW_TEXT_START)
 endif
 
+ifdef FW_FDT_PATH
+firmware-genflags-y += -DFW_FDT_PATH=\"$(FW_FDT_PATH)\"
+ifdef FW_FDT_PADDING
+firmware-genflags-y += -DFW_FDT_PADDING=$(FW_FDT_PADDING)
+endif
+endif
+
 firmware-bins-$(FW_DYNAMIC) += fw_dynamic.bin
 
 firmware-bins-$(FW_JUMP) += fw_jump.bin