From 042a8336f3eb7c7ed4358a100fae23967346e7a2 Mon Sep 17 00:00:00 2001 From: Jonathan Neuschäfer Date: Fri, 16 Feb 2018 13:36:47 +0100 Subject: arch/riscv: Pass the bootrom-provided FDT to the payload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The RISC-V boot protocol foresees that at every stage boundary (bootrom to boot loader, boot loader -> OS), register a0 contains the Hart ID and a1 contains the physical address of the Flattened Device Tree that the stage shall use. As a first step, pass the bootrom-provided FDT to the payload, unmodified. Change-Id: I468bc64a47153d564087235f1c7e2d10e3d7a658 Signed-off-by: Jonathan Neuschäfer Reviewed-on: https://review.coreboot.org/23797 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich --- src/arch/riscv/boot.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'src/arch/riscv/boot.c') diff --git a/src/arch/riscv/boot.c b/src/arch/riscv/boot.c index b73f3cade4..d7233fe3da 100644 --- a/src/arch/riscv/boot.c +++ b/src/arch/riscv/boot.c @@ -15,20 +15,35 @@ #include #include +#include #include #include #include +/* + * A pointer to the Flattened Device Tree passed to coreboot by the boot ROM. + * Presumably this FDT is also in ROM. + * + * This pointer is only used in ramstage! + */ +const void *rom_fdt; + void arch_prog_run(struct prog *prog) { void (*doit)(void *) = prog_entry(prog); - void riscvpayload(const char *configstring, void *payload); - const char *config = NULL; + void riscvpayload(const void *fdt, void *payload); if (ENV_RAMSTAGE && prog_type(prog) == PROG_PAYLOAD) { - printk(BIOS_SPEW, "Config string: '%s'\n", config); + /* + * FIXME: This is wrong and will crash. Linux can't (in early + * boot) access memory that's before its own loading address. + * We need to copy the FDT to a place where Linux can access it. + */ + const void *fdt = rom_fdt; + + printk(BIOS_SPEW, "FDT is at %p\n", fdt); printk(BIOS_SPEW, "OK, let's go\n"); - riscvpayload(config, doit); + riscvpayload(fdt, doit); } doit(prog_entry_arg(prog)); -- cgit v1.2.3