5 #include "sw/device/silicon_creator/lib/drivers/ibex.h"
7 #include "dt/dt_rv_core_ibex.h"
13 #include "rv_core_ibex_regs.h"
15 static const dt_rv_core_ibex_t kRvCoreIbexDt = kDtRvCoreIbex;
21 static inline uint32_t rv_core_ibex_base(
void) {
22 return dt_rv_core_ibex_reg_block(kRvCoreIbexDt, kDtRvCoreIbexRegBlockCfg);
25 uint32_t ibex_fpga_version(
void) {
26 const uint32_t kBase = rv_core_ibex_base();
27 return abs_mmio_read32(kBase + RV_CORE_IBEX_FPGA_INFO_REG_OFFSET);
30 void ibex_addr_remap_0_set(uint32_t matching_addr, uint32_t remap_addr,
32 const uint32_t kBase = rv_core_ibex_base();
36 uint32_t match = (matching_addr & ~size) | size >> 1;
39 sec_mmio_write32(kBase + RV_CORE_IBEX_IBUS_ADDR_MATCHING_0_REG_OFFSET, match);
40 sec_mmio_write32(kBase + RV_CORE_IBEX_DBUS_ADDR_MATCHING_0_REG_OFFSET, match);
52 void ibex_addr_remap_1_set(uint32_t matching_addr, uint32_t remap_addr,
54 const uint32_t kBase = rv_core_ibex_base();
58 uint32_t match = (matching_addr & ~size) | size >> 1;
61 sec_mmio_write32(kBase + RV_CORE_IBEX_IBUS_ADDR_MATCHING_1_REG_OFFSET, match);
62 sec_mmio_write32(kBase + RV_CORE_IBEX_DBUS_ADDR_MATCHING_1_REG_OFFSET, match);
74 uint32_t ibex_addr_remap_get(uint32_t index) {
75 const uint32_t kBase = rv_core_ibex_base();
76 HARDENED_CHECK_LT(index, 2);
77 index *=
sizeof(uint32_t);
78 if (abs_mmio_read32(kBase + RV_CORE_IBEX_IBUS_ADDR_EN_0_REG_OFFSET + index)) {
79 return abs_mmio_read32(kBase + RV_CORE_IBEX_IBUS_REMAP_ADDR_0_REG_OFFSET +
86 void ibex_addr_remap_lockdown(uint32_t index) {
87 const uint32_t kBase = rv_core_ibex_base();
88 HARDENED_CHECK_LT(index, 2);
89 index *=
sizeof(uint32_t);
96 extern void ibex_mcycle_zero(
void);
97 extern uint32_t ibex_mcycle32(
void);
98 extern uint64_t ibex_mcycle(
void);
99 extern uint64_t ibex_time_to_cycles(uint64_t time_us);