Jonathan Neuschäfer (j.neuschaefer@gmx.net) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/15510
-gerrit
commit 6417d8d426d976730fa03b502dcfa431d837e9d9 Author: Jonathan Neuschäfer j.neuschaefer@gmx.net Date: Thu Jun 30 22:58:53 2016 +0200
[WIP] arch/riscv: Make SBI support optional
I'm posting this patch early so I can link to it from the wiki.
Change-Id: I5cbfc90afd3febab33835935f08005136a3f47e9 Signed-off-by: Jonathan Neuschäfer j.neuschaefer@gmx.net --- payloads/Kconfig | 12 ++++++++++++ src/arch/riscv/boot.c | 4 ++++ src/arch/riscv/virtual_memory.c | 1 + 3 files changed, 17 insertions(+)
diff --git a/payloads/Kconfig b/payloads/Kconfig index 8cce778..69d2e41 100644 --- a/payloads/Kconfig +++ b/payloads/Kconfig @@ -47,6 +47,18 @@ config COMPRESSED_PAYLOAD_LZMA In order to reduce the size payloads take up in the ROM chip coreboot can compress them using the LZMA algorithm.
+config PAYLOAD_RISCV_SMODE + bool "Run payload in S-mode and provide SBI" + depends on ARCH_RISCV + default y + help + If Y is selected, coreboot will start the payload in supervisor mode + (S-mode) and provide a an implementation of the System Binary + Interface (SBI). + + Otherwise, the payload will be run in M-mode and will have to provide + its own SBI implementation, if it needs one. + config PAYLOAD_OPTIONS string default "" diff --git a/src/arch/riscv/boot.c b/src/arch/riscv/boot.c index 96526bf..5830ac4 100644 --- a/src/arch/riscv/boot.c +++ b/src/arch/riscv/boot.c @@ -22,6 +22,7 @@ void arch_prog_run(struct prog *prog) { void (*doit)(void *) = prog_entry(prog);
+#if IS_ENABLED(CONFIG_PAYLOAD_RISCV_SMODE) if (ENV_RAMSTAGE && prog_type(prog) == PROG_PAYLOAD) { initVirtualMemory(); write_csr(mepc, doit); @@ -29,6 +30,9 @@ void arch_prog_run(struct prog *prog) } else { doit(prog_entry_arg(prog)); } +#else + doit(prog_entry_arg(prog)); +#endif }
int arch_supports_bounce_buffer(void) diff --git a/src/arch/riscv/virtual_memory.c b/src/arch/riscv/virtual_memory.c index 64ea2b1..dce0887 100644 --- a/src/arch/riscv/virtual_memory.c +++ b/src/arch/riscv/virtual_memory.c @@ -101,6 +101,7 @@ void init_vm(uintptr_t virtMemStart, uintptr_t physMemStart, uintptr_t pageTable
void initVirtualMemory(void) { printk(BIOS_DEBUG, "Initializing virtual memory...\n"); + return; uintptr_t physicalStart = 0x1000000; // TODO: Figure out how to grab this from cbfs uintptr_t virtualStart = 0xffffffff81000000; uintptr_t pageTableStart = 0x1400000;