matcha/tock: add hal support for rv_core_ibex
Change-Id: I804da6fa4217d22eb87338917c46c35127b43cb5
diff --git a/config/src/lib.rs b/config/src/lib.rs
index 08308c6..636ef84 100644
--- a/config/src/lib.rs
+++ b/config/src/lib.rs
@@ -38,5 +38,7 @@
pub const MAILBOX_RTIRQ: u32 = 188; // kTopMatchaPlicIrqIdMailboxSecRtirq
pub const MAILBOX_EIRQ: u32 = 189; // kTopMatchaPlicIrqIdMailboxSecEirq
+pub const RV_CORE_IBEX_SEC_CFG_BASE_ADDRESS: u32 = 0x411F_0000; // TOP_MATCHA_RV_CORE_IBEX_SEC_CFG_BASE_ADDRESS
+
pub const UART0_BASE_ADDRESS: u32 = 0x40000000; // TOP_MATCHA_UART0_BASE_ADDR
pub const UART0_BAUDRATE: u32 = 115200;
diff --git a/hal/src/lib.rs b/hal/src/lib.rs
index 4cd367b..20c518c 100644
--- a/hal/src/lib.rs
+++ b/hal/src/lib.rs
@@ -9,6 +9,7 @@
pub mod mailbox_hal;
pub mod plic_constants;
pub mod plic_hal;
+pub mod rv_core_ibex_hal;
pub mod timer_hal;
pub mod uart_hal;
diff --git a/hal/src/rv_core_ibex_hal.rs b/hal/src/rv_core_ibex_hal.rs
new file mode 100644
index 0000000..a2eeecb
--- /dev/null
+++ b/hal/src/rv_core_ibex_hal.rs
@@ -0,0 +1,155 @@
+// Generated register constants for RV_CORE_IBEX.
+// This file is licensed under either of:
+// Apache License, Version 2.0 (LICENSE-APACHE <http://www.apache.org/licenses/LICENSE-2.0>)
+// MIT License (LICENSE-MIT <http://opensource.org/licenses/MIT>)
+
+// Build date: 2023-02-22T20:24:05.302615
+
+// Original reference file: ./hw/opentitan-upstream/hw/ip/rv_core_ibex/data/rv_core_ibex.hjson
+use kernel::common::registers::{
+ register_bitfields, register_structs, ReadWrite
+};
+use kernel::common::StaticRef;
+// Number of software triggerable alerts
+pub const RV_CORE_IBEX_PARAM_NUM_SW_ALERTS: u32 = 2;
+// Number of translatable regions per ibex bus
+pub const RV_CORE_IBEX_PARAM_NUM_REGIONS: u32 = 2;
+// Number of scratch words maintained.
+pub const RV_CORE_IBEX_PARAM_NUM_SCRATCH_WORDS: u32 = 8;
+// Number of alerts
+pub const RV_CORE_IBEX_PARAM_NUM_ALERTS: u32 = 4;
+// Register width
+pub const RV_CORE_IBEX_PARAM_REG_WIDTH: u32 = 32;
+
+pub const RV_CORE_IBEX_SEC_REGISTERS: StaticRef<RvCoreIbexRegisters> =
+ unsafe { StaticRef::new(matcha_config::RV_CORE_IBEX_SEC_CFG_BASE_ADDRESS as *const RvCoreIbexRegisters) };
+pub static mut RV_CORE_IBEX_SEC: RvCoreIbex = RvCoreIbex::new(RV_CORE_IBEX_SEC_REGISTERS);
+
+register_structs! {
+ pub RvCoreIbexRegisters {
+ // Alert Test Register
+ (0x0000 => pub(crate) alert_test: ReadWrite<u32, ALERT_TEST::Register>),
+ // Software recoverable error
+ (0x0004 => pub(crate) sw_recov_err: ReadWrite<u32, SW_RECOV_ERR::Register>),
+ // Software fatal error
+ (0x0008 => pub(crate) sw_fatal_err: ReadWrite<u32, SW_FATAL_ERR::Register>),
+ // Ibus address control regwen.
+ (0x000c => pub(crate) ibus_regwen: [ReadWrite<u32, IBUS_REGWEN::Register>; 2]),
+ // Enable Ibus address matching
+ (0x0014 => pub(crate) ibus_addr_en: [ReadWrite<u32, IBUS_ADDR_EN::Register>; 2]),
+ // Matching region programming for ibus.
+ (0x001c => pub(crate) ibus_addr_matching: [ReadWrite<u32, IBUS_ADDR_MATCHING::Register>; 2]),
+ // The remap address after a match has been made.
+ (0x0024 => pub(crate) ibus_remap_addr: [ReadWrite<u32, IBUS_REMAP_ADDR::Register>; 2]),
+ // Dbus address control regwen.
+ (0x002c => pub(crate) dbus_regwen: [ReadWrite<u32, DBUS_REGWEN::Register>; 2]),
+ // Enable dbus address matching
+ (0x0034 => pub(crate) dbus_addr_en: [ReadWrite<u32, DBUS_ADDR_EN::Register>; 2]),
+ // See !!IBUS_ADDR_MATCHING_0 for detailed description.
+ (0x003c => pub(crate) dbus_addr_matching: [ReadWrite<u32, DBUS_ADDR_MATCHING::Register>; 2]),
+ // See !!IBUS_REMAP_ADDR_0 for a detailed description.
+ (0x0044 => pub(crate) dbus_remap_addr: [ReadWrite<u32, DBUS_REMAP_ADDR::Register>; 2]),
+ // Enable mask for NMI.
+ (0x004c => pub(crate) nmi_enable: ReadWrite<u32, NMI_ENABLE::Register>),
+ // Current NMI state
+ (0x0050 => pub(crate) nmi_state: ReadWrite<u32, NMI_STATE::Register>),
+ // error status
+ (0x0054 => pub(crate) err_status: ReadWrite<u32, ERR_STATUS::Register>),
+ // Random data from EDN
+ (0x0058 => pub(crate) rnd_data: ReadWrite<u32, RND_DATA::Register>),
+ // Status of random data in !!RND_DATA
+ (0x005c => pub(crate) rnd_status: ReadWrite<u32, RND_STATUS::Register>),
+ // FPGA build timestamp info.
+ (0x0060 => pub(crate) fpga_info: ReadWrite<u32, FPGA_INFO::Register>),
+ // Memory area: Exposed tlul window for DV only purposes.
+ (0x0080 => pub(crate) dv_sim_window: [ReadWrite<u32>; 8]),
+ (0x00a0 => @END),
+ }
+}
+
+register_bitfields![u32,
+ pub(crate) ALERT_TEST [
+ FATAL_SW_ERR OFFSET(0) NUMBITS(1) [],
+ RECOV_SW_ERR OFFSET(1) NUMBITS(1) [],
+ FATAL_HW_ERR OFFSET(2) NUMBITS(1) [],
+ RECOV_HW_ERR OFFSET(3) NUMBITS(1) []
+ ],
+ pub(crate) SW_RECOV_ERR [
+ VAL OFFSET(0) NUMBITS(4) []
+ ],
+ pub(crate) SW_FATAL_ERR [
+ VAL OFFSET(0) NUMBITS(4) []
+ ],
+ pub(crate) IBUS_REGWEN [
+ EN_0 OFFSET(0) NUMBITS(1) [
+ LOCKED = 0,
+ ENABLED = 1
+ ]
+ ],
+ pub(crate) IBUS_ADDR_EN [
+ IBUS_ADDR_EN OFFSET(0) NUMBITS(1) []
+ ],
+ pub(crate) IBUS_ADDR_MATCHING [
+ IBUS_ADDR_MATCHING OFFSET(0) NUMBITS(32) []
+ ],
+ pub(crate) IBUS_REMAP_ADDR [
+ IBUS_REMAP_ADDR OFFSET(0) NUMBITS(32) []
+ ],
+ pub(crate) DBUS_REGWEN [
+ EN_0 OFFSET(0) NUMBITS(1) [
+ LOCKED = 0,
+ ENABLED = 1
+ ]
+ ],
+ pub(crate) DBUS_ADDR_EN [
+ EN_0 OFFSET(0) NUMBITS(1) []
+ ],
+ pub(crate) DBUS_ADDR_MATCHING [
+ DEBUS_ADDR_MATCHING OFFSET(0) NUMBITS(32) []
+ ],
+ pub(crate) DBUS_REMAP_ADDR [
+ DBUS_REMAP_ADDR OFFSET(0) NUMBITS(32) []
+ ],
+ pub(crate) NMI_ENABLE [
+ ALERT_EN OFFSET(0) NUMBITS(1) [],
+ WDOG_EN OFFSET(1) NUMBITS(1) []
+ ],
+ pub(crate) NMI_STATE [
+ ALERT OFFSET(0) NUMBITS(1) [],
+ WDOG OFFSET(1) NUMBITS(1) []
+ ],
+ pub(crate) ERR_STATUS [
+ REG_INTG_ERR OFFSET(0) NUMBITS(1) [],
+ FATAL_INTG_ERR OFFSET(8) NUMBITS(1) [],
+ FATAL_CORE_ERR OFFSET(9) NUMBITS(1) [],
+ RECOV_CORE_ERR OFFSET(10) NUMBITS(1) []
+ ],
+ pub(crate) RND_DATA [
+ RND_DATA OFFSET(0) NUMBITS(32) []
+ ],
+ pub(crate) RND_STATUS [
+ RND_DATA_VALID OFFSET(0) NUMBITS(1) [],
+ RND_DATA_FIPS OFFSET(1) NUMBITS(1) []
+ ],
+ pub(crate) FPGA_INFO [
+ FPGA_INFO OFFSET(0) NUMBITS(32) []
+ ]
+];
+
+// End generated register constants for RV_CORE_IBEX
+
+pub struct RvCoreIbex {
+ registers: StaticRef<RvCoreIbexRegisters>,
+}
+
+impl RvCoreIbex {
+ pub const fn new(base: StaticRef<RvCoreIbexRegisters>) -> RvCoreIbex {
+ RvCoreIbex {
+ registers: base,
+ }
+ }
+
+ pub fn fpga_version(&self) -> u32 {
+ self.registers.fpga_info.get()
+ }
+}