Xiang Wang has uploaded this change for review.

View Change

riscv: add support to boot linux kernel binary using opensbi

Change-Id: I2a178595bd2aa2e1f114cbc69e8eadd46955b54d
Signed-off-by: Xiang Wang <wxjstz@126.com>
---
M payloads/Kconfig
M payloads/external/Makefile.inc
M src/arch/riscv/Makefile.inc
M src/arch/riscv/boot.c
M src/soc/sifive/fu540/Kconfig
5 files changed, 49 insertions(+), 1 deletion(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/94/32394/1
diff --git a/payloads/Kconfig b/payloads/Kconfig
index d0f8a44..4cf9d1e 100644
--- a/payloads/Kconfig
+++ b/payloads/Kconfig
@@ -28,6 +28,18 @@
You will be able to specify the location and file name of the
payload image later.

+config PAYLOAD_RISCV_LINUX_BINARY
+ bool "An linux binary payload"
+ depends on ARCH_RISCV
+ help
+ Select this option if you have a payload image (an binary file)
+ which coreboot should run as soon as the basic hardware
+ initialization is completed. This image will be used as the
+ payload of opensbi and will be started by coreboot.
+
+ You will be able to specify the location and file name of the
+ payload image later.
+
config PAYLOAD_FIT
bool "A FIT payload"
depends on ARCH_ARM64
@@ -57,9 +69,10 @@

config PAYLOAD_FILE
string "Payload path and filename"
- depends on PAYLOAD_ELF || PAYLOAD_FIT
+ depends on PAYLOAD_ELF || PAYLOAD_FIT || PAYLOAD_RISCV_LINUX_BINARY
default "payload.elf" if PAYLOAD_ELF
default "uImage" if PAYLOAD_FIT
+ default "payload.bin" if PAYLOAD_RISCV_LINUX_BINARY
help
The path and filename of the ELF executable file to use as payload.

diff --git a/payloads/external/Makefile.inc b/payloads/external/Makefile.inc
index 5f9d800..3b29b41 100644
--- a/payloads/external/Makefile.inc
+++ b/payloads/external/Makefile.inc
@@ -48,7 +48,11 @@
endif

cbfs-files-y += $(CONFIG_CBFS_PREFIX)/payload
+ifeq ($(CONFIG_PAYLOAD_RISCV_LINUX_BINARY),y)
+$(CONFIG_CBFS_PREFIX)/payload-file := $(obj)/opensbi.elf
+else
$(CONFIG_CBFS_PREFIX)/payload-file := $(CONFIG_PAYLOAD_FILE)
+endif
ifeq ($(CONFIG_PAYLOAD_IS_FLAT_BINARY),y)
$(CONFIG_CBFS_PREFIX)/payload-type := flat-binary
else
diff --git a/src/arch/riscv/Makefile.inc b/src/arch/riscv/Makefile.inc
index d5f6295..d4d362b 100644
--- a/src/arch/riscv/Makefile.inc
+++ b/src/arch/riscv/Makefile.inc
@@ -174,4 +174,27 @@
endif #CONFIG_ARCH_RISCV_RV32

endif #CONFIG_ARCH_RAMSTAGE_RISCV
+
+ifeq ($(CONFIG_PAYLOAD_RISCV_LINUX_BINARY),y)
+
+OPENSBI := $(obj)/opensbi.elf
+OPENSBI_SOURCE := $(top)/payloads/external/opensbi
+OPENSBI_BUILD := $(abspath $(obj)/payloads/external/opensbi)
+OPENSBI_TARGET := $(OPENSBI_BUILD)/platform/$(CONFIG_OPENSBI_PLATFORM)/firmware/fw_payload.elf
+
+$(OPENSBI):$(obj)/build.h
+ printf " MAKE $(subst $(obj)/,,$(@))\n"
+ mkdir -p $(OPENSBI_BUILD)
+ $(MAKE) \
+ -C $(OPENSBI_SOURCE) \
+ CROSS_COMPILE=riscv64-elf- \
+ PLATFORM=$(CONFIG_OPENSBI_PLATFORM) \
+ O=$(OPENSBI_BUILD) \
+ FW_PAYLOAD_PATH=$(abspath $(CONFIG_PAYLOAD_FILE))
+ cp $(OPENSBI_TARGET) $(abspath $@)
+
+.PHONY: $(OPENSBI)
+
+endif #CONFIG_PAYLOAD_RISCV_LINUX_BINARY
+
endif #CONFIG_ARCH_RISCV
diff --git a/src/arch/riscv/boot.c b/src/arch/riscv/boot.c
index 535067e..9998255 100644
--- a/src/arch/riscv/boot.c
+++ b/src/arch/riscv/boot.c
@@ -49,7 +49,11 @@
fdt = HLS()->fdt;

if (ENV_RAMSTAGE && prog_type(prog) == PROG_PAYLOAD) {
+#if CONFIG(PAYLOAD_RISCV_LINUX_BINARY)
+ run_payload(prog, fdt, RISCV_PAYLOAD_MODE_M);
+#else
run_payload(prog, fdt, RISCV_PAYLOAD_MODE_S);
+#endif
return;
}

diff --git a/src/soc/sifive/fu540/Kconfig b/src/soc/sifive/fu540/Kconfig
index 6ebde33..2e88150 100644
--- a/src/soc/sifive/fu540/Kconfig
+++ b/src/soc/sifive/fu540/Kconfig
@@ -49,4 +49,8 @@
int
default 0

+config OPENSBI_PLATFORM
+ string
+ default "sifive/fu540"
+
endif

To view, visit change 32394. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I2a178595bd2aa2e1f114cbc69e8eadd46955b54d
Gerrit-Change-Number: 32394
Gerrit-PatchSet: 1
Gerrit-Owner: Xiang Wang <wxjstz@126.com>
Gerrit-MessageType: newchange