Message ID | cover.1590704015.git.alistair.francis@wdc.com |
---|---|
Headers | show |
Series | RISC-V Add the OpenTitan Machine | expand |
Hi Alistair, [Old patch] On 29/5/20 00:14, Alistair Francis wrote: > This adds a barebone OpenTitan machine to QEMU. > > Signed-off-by: Alistair Francis <alistair.francis@wdc.com> > Reviewed-by: Bin Meng <bin.meng@windriver.com> > --- > default-configs/riscv32-softmmu.mak | 1 + > default-configs/riscv64-softmmu.mak | 11 +- > include/hw/riscv/opentitan.h | 68 ++++++++++ > hw/riscv/opentitan.c | 184 ++++++++++++++++++++++++++++ > MAINTAINERS | 9 ++ > hw/riscv/Kconfig | 5 + > hw/riscv/Makefile.objs | 1 + > 7 files changed, 278 insertions(+), 1 deletion(-) > create mode 100644 include/hw/riscv/opentitan.h > create mode 100644 hw/riscv/opentitan.c > diff --git a/include/hw/riscv/opentitan.h b/include/hw/riscv/opentitan.h > new file mode 100644 > index 0000000000..a4b6499444 > --- /dev/null > +++ b/include/hw/riscv/opentitan.h > @@ -0,0 +1,68 @@ > +/* > + * QEMU RISC-V Board Compatible with OpenTitan FPGA platform > + * > + * Copyright (c) 2020 Western Digital > + * > + * This program is free software; you can redistribute it and/or modify it > + * under the terms and conditions of the GNU General Public License, > + * version 2 or later, as published by the Free Software Foundation. > + * > + * This program is distributed in the hope it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > + * more details. > + * > + * You should have received a copy of the GNU General Public License along with > + * this program. If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#ifndef HW_OPENTITAN_H > +#define HW_OPENTITAN_H > + > +#include "hw/riscv/riscv_hart.h" > + > +#define TYPE_RISCV_IBEX_SOC "riscv.lowrisc.ibex.soc" > +#define RISCV_IBEX_SOC(obj) \ > + OBJECT_CHECK(LowRISCIbexSoCState, (obj), TYPE_RISCV_IBEX_SOC) > + > +typedef struct LowRISCIbexSoCState { > + /*< private >*/ > + SysBusDevice parent_obj; > + > + /*< public >*/ > + RISCVHartArrayState cpus; > + MemoryRegion flash_mem; > + MemoryRegion rom; > +} LowRISCIbexSoCState; > + > +typedef struct OpenTitanState { > + /*< private >*/ > + SysBusDevice parent_obj; Shouldn't this object inheritate from MachineState ...? > + /*< public >*/ > + LowRISCIbexSoCState soc; > +} OpenTitanState; > diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c > new file mode 100644 > index 0000000000..b4fb836466 > --- /dev/null > +++ b/hw/riscv/opentitan.c > @@ -0,0 +1,184 @@ > +/* > + * QEMU RISC-V Board Compatible with OpenTitan FPGA platform > + * > + * Copyright (c) 2020 Western Digital > + * > + * Provides a board compatible with the OpenTitan FPGA platform: > + * > + * This program is free software; you can redistribute it and/or modify it > + * under the terms and conditions of the GNU General Public License, > + * version 2 or later, as published by the Free Software Foundation. > + * > + * This program is distributed in the hope it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > + * more details. > + * > + * You should have received a copy of the GNU General Public License along with > + * this program. If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include "qemu/osdep.h" > +#include "hw/riscv/opentitan.h" > +#include "qapi/error.h" > +#include "hw/boards.h" > +#include "hw/misc/unimp.h" > +#include "hw/riscv/boot.h" > +#include "exec/address-spaces.h" > + > +static const struct MemmapEntry { > + hwaddr base; > + hwaddr size; > +} ibex_memmap[] = { > + [IBEX_ROM] = { 0x00008000, 0xc000 }, > + [IBEX_RAM] = { 0x10000000, 0x10000 }, > + [IBEX_FLASH] = { 0x20000000, 0x80000 }, > + [IBEX_UART] = { 0x40000000, 0x10000 }, > + [IBEX_GPIO] = { 0x40010000, 0x10000 }, > + [IBEX_SPI] = { 0x40020000, 0x10000 }, > + [IBEX_FLASH_CTRL] = { 0x40030000, 0x10000 }, > + [IBEX_PINMUX] = { 0x40070000, 0x10000 }, > + [IBEX_RV_TIMER] = { 0x40080000, 0x10000 }, > + [IBEX_PLIC] = { 0x40090000, 0x10000 }, > + [IBEX_PWRMGR] = { 0x400A0000, 0x10000 }, > + [IBEX_RSTMGR] = { 0x400B0000, 0x10000 }, > + [IBEX_CLKMGR] = { 0x400C0000, 0x10000 }, > + [IBEX_AES] = { 0x40110000, 0x10000 }, > + [IBEX_HMAC] = { 0x40120000, 0x10000 }, > + [IBEX_ALERT_HANDLER] = { 0x40130000, 0x10000 }, > + [IBEX_NMI_GEN] = { 0x40140000, 0x10000 }, > + [IBEX_USBDEV] = { 0x40150000, 0x10000 }, > + [IBEX_PADCTRL] = { 0x40160000, 0x10000 } > +}; > + > +static void riscv_opentitan_init(MachineState *machine) > +{ > + const struct MemmapEntry *memmap = ibex_memmap; > + OpenTitanState *s = g_new0(OpenTitanState, 1); ... because looking at QOM design issue, this line looks dubious. > + MemoryRegion *sys_mem = get_system_memory(); > + MemoryRegion *main_mem = g_new(MemoryRegion, 1); > + > + /* Initialize SoC */ > + object_initialize_child(OBJECT(machine), "soc", &s->soc, > + sizeof(s->soc), TYPE_RISCV_IBEX_SOC, > + &error_abort, NULL); > + object_property_set_bool(OBJECT(&s->soc), true, "realized", > + &error_abort); > + > + memory_region_init_ram(main_mem, NULL, "riscv.lowrisc.ibex.ram", > + memmap[IBEX_RAM].size, &error_fatal); > + memory_region_add_subregion(sys_mem, > + memmap[IBEX_RAM].base, main_mem); > + > + > + if (machine->firmware) { > + riscv_load_firmware(machine->firmware, memmap[IBEX_RAM].base, NULL); > + } > + > + if (machine->kernel_filename) { > + riscv_load_kernel(machine->kernel_filename, NULL); > + } > +}