3838#include "hw/jtag/tap_ctrl.h"
3939#include "hw/jtag/tap_ctrl_rbb.h"
4040#include "hw/misc/pulp_rv_dm.h"
41+ #include "hw/opentitan/ot_address_space.h"
4142#include "hw/opentitan/ot_aes.h"
4243#include "hw/opentitan/ot_alert.h"
4344#include "hw/opentitan/ot_aon_timer.h"
4445#include "hw/opentitan/ot_ast_eg.h"
4546#include "hw/opentitan/ot_clkmgr.h"
4647#include "hw/opentitan/ot_common.h"
4748#include "hw/opentitan/ot_csrng.h"
49+ #include "hw/opentitan/ot_dm_tl.h"
4850#include "hw/opentitan/ot_edn.h"
4951#include "hw/opentitan/ot_entropy_src.h"
5052#include "hw/opentitan/ot_flash.h"
@@ -100,6 +102,8 @@ static void ot_eg_soc_otp_ctrl_configure(
100102 DeviceState * dev , const IbexDeviceDef * def , DeviceState * parent );
101103static void ot_eg_soc_tap_ctrl_configure (
102104 DeviceState * dev , const IbexDeviceDef * def , DeviceState * parent );
105+ static void ot_eg_soc_lc_ctrl_tap_ctrl_configure (
106+ DeviceState * dev , const IbexDeviceDef * def , DeviceState * parent );
103107static void ot_eg_soc_spi_device_configure (
104108 DeviceState * dev , const IbexDeviceDef * def , DeviceState * parent );
105109static void ot_eg_soc_uart_configure (DeviceState * dev , const IbexDeviceDef * def ,
@@ -111,6 +115,14 @@ static void ot_eg_soc_usbdev_configure(
111115/* Constants */
112116/* ------------------------------------------------------------------------ */
113117
118+ enum OtEgMemoryRegion {
119+ OT_EG_DEFAULT_MEMORY_REGION ,
120+ OT_EG_LC_CTRL_TAP_MEMORY_REGION ,
121+ };
122+
123+ #define LC_CTRL_TAP_MEMORY (_addr_ ) \
124+ IBEX_MEMMAP_MAKE_REG((_addr_), OT_EG_LC_CTRL_TAP_MEMORY_REGION)
125+
114126enum OtEGSocDevice {
115127 OT_EG_SOC_DEV_ADC_CTRL ,
116128 OT_EG_SOC_DEV_AES ,
@@ -121,6 +133,7 @@ enum OtEGSocDevice {
121133 OT_EG_SOC_DEV_CSRNG ,
122134 OT_EG_SOC_DEV_DM ,
123135 OT_EG_SOC_DEV_DTM ,
136+ OT_EG_SOC_DEV_LC_CTRL_DTM ,
124137 OT_EG_SOC_DEV_EDN0 ,
125138 OT_EG_SOC_DEV_EDN1 ,
126139 OT_EG_SOC_DEV_ENTROPY_SRC ,
@@ -148,13 +161,15 @@ enum OtEGSocDevice {
148161 OT_EG_SOC_DEV_ROM_CTRL ,
149162 OT_EG_SOC_DEV_RSTMGR ,
150163 OT_EG_SOC_DEV_RV_DM ,
164+ OT_EG_SOC_DEV_DM_LC_CTRL ,
151165 OT_EG_SOC_DEV_SENSOR_CTRL ,
152166 OT_EG_SOC_DEV_SPI_DEVICE ,
153167 OT_EG_SOC_DEV_SPI_HOST0 ,
154168 OT_EG_SOC_DEV_SPI_HOST1 ,
155169 OT_EG_SOC_DEV_SRAM_MAIN_CTRL ,
156170 OT_EG_SOC_DEV_SYSRST_CTRL ,
157171 OT_EG_SOC_DEV_TAP_CTRL ,
172+ OT_EG_SOC_DEV_LC_CTRL_TAP_CTRL ,
158173 OT_EG_SOC_DEV_TIMER ,
159174 OT_EG_SOC_DEV_UART0 ,
160175 OT_EG_SOC_DEV_UART1 ,
@@ -196,6 +211,21 @@ enum OtEGBoardDevice {
196211 OT_EG_BOARD_DEV_COUNT ,
197212};
198213
214+ /*
215+ * <opentitan>/hw/ip/lc_ctrl/rtl/lc_ctrl.sv instantiates a DMI module (with
216+ * abits=7) and a DMI to TL-UL adapter. Together, they create a private bus,
217+ * exposing the LC Ctrl registers over JTAG <-> DTM <-> DMI <-> TL-UL. On the
218+ * DMI side, we have an address space [0 .. 2^7); those addresses are mapped to
219+ * words on the TL-UL side, addressing [0 .. 2^7*4) bytes, and accessing the LC
220+ * Ctrl registers at the appropriate (documented) offset.
221+ */
222+ #define OT_EG_LC_CTRL_TAP_DMI_ABIS 7u
223+ #define OT_EG_LC_CTRL_TAP_DMI_ADDR 0x0u
224+ #define OT_EG_LC_CTRL_TAP_DMI_SIZE (1u << OT_EG_LC_CTRL_TAP_DMI_ABIS)
225+ #define OT_EG_LC_CTRL_TAP_TL_ADDR 0x0u
226+ #define OT_EG_LC_CTRL_TAP_TL_SIZE ((1u << OT_EG_LC_CTRL_TAP_DMI_ABIS) * 4u)
227+ #define OT_EG_LC_CTRL_TAP_ADDR_SPACE "ot-lc-ctrl-tap-as"
228+
199229#define OT_EG_IBEX_WRAPPER_NUM_REGIONS 2u
200230
201231static const uint8_t ot_eg_pmp_cfgs [] = {
@@ -361,6 +391,14 @@ static const IbexDeviceDef ot_eg_soc_devices[] = {
361391 IBEX_DEV_UINT_PROP ("idcode" , EG_RV_DM_TAP_IDCODE )
362392 ),
363393 },
394+ [OT_EG_SOC_DEV_LC_CTRL_TAP_CTRL ] = {
395+ .type = TYPE_TAP_CTRL_RBB ,
396+ .cfg = & ot_eg_soc_lc_ctrl_tap_ctrl_configure ,
397+ .prop = IBEXDEVICEPROPDEFS (
398+ IBEX_DEV_UINT_PROP ("ir_length" , IBEX_TAP_IR_LENGTH ),
399+ IBEX_DEV_UINT_PROP ("idcode" , EG_LC_CTRL_TAP_IDCODE )
400+ ),
401+ },
364402 [OT_EG_SOC_DEV_DTM ] = {
365403 .type = TYPE_RISCV_DTM ,
366404 .link = IBEXDEVICELINKDEFS (
@@ -370,6 +408,15 @@ static const IbexDeviceDef ot_eg_soc_devices[] = {
370408 IBEX_DEV_UINT_PROP ("abits" , 7u )
371409 ),
372410 },
411+ [OT_EG_SOC_DEV_LC_CTRL_DTM ] = {
412+ .type = TYPE_RISCV_DTM ,
413+ .link = IBEXDEVICELINKDEFS (
414+ OT_EG_SOC_DEVLINK ("tap-ctrl" , LC_CTRL_TAP_CTRL )
415+ ),
416+ .prop = IBEXDEVICEPROPDEFS (
417+ IBEX_DEV_UINT_PROP ("abits" , OT_EG_LC_CTRL_TAP_DMI_ABIS )
418+ ),
419+ },
373420 [OT_EG_SOC_DEV_DM ] = {
374421 .type = TYPE_RISCV_DM ,
375422 .cfg = & ot_eg_soc_dm_configure ,
@@ -742,7 +789,8 @@ static const IbexDeviceDef ot_eg_soc_devices[] = {
742789 [OT_EG_SOC_DEV_LC_CTRL ] = {
743790 .type = TYPE_OT_LC_CTRL ,
744791 .memmap = MEMMAPENTRIES (
745- { .base = 0x40140000u }
792+ { .base = 0x40140000u },
793+ { .base = LC_CTRL_TAP_MEMORY (OT_EG_LC_CTRL_TAP_TL_ADDR ) }
746794 ),
747795 .gpio = IBEXGPIOCONNDEFS (
748796 OT_EG_SOC_RSP (OT_PWRMGR_LC , PWRMGR ),
@@ -1371,6 +1419,19 @@ static const IbexDeviceDef ot_eg_soc_devices[] = {
13711419 OT_EG_SOC_GPIO_ALERT (0 , 40 )
13721420 ),
13731421 },
1422+ [OT_EG_SOC_DEV_DM_LC_CTRL ] = {
1423+ .type = TYPE_OT_DM_TL ,
1424+ .link = IBEXDEVICELINKDEFS (
1425+ OT_EG_SOC_DEVLINK ("dtm" , LC_CTRL_DTM ),
1426+ OT_EG_SOC_DEVLINK ("tl_dev" , LC_CTRL )
1427+ ),
1428+ .prop = IBEXDEVICEPROPDEFS (
1429+ IBEX_DEV_UINT_PROP ("dmi_addr" , OT_EG_LC_CTRL_TAP_DMI_ADDR ),
1430+ IBEX_DEV_UINT_PROP ("dmi_size" , OT_EG_LC_CTRL_TAP_DMI_SIZE ),
1431+ IBEX_DEV_UINT_PROP ("tl_addr" , OT_EG_LC_CTRL_TAP_TL_ADDR ),
1432+ IBEX_DEV_STRING_PROP ("tl_as_name" , OT_EG_LC_CTRL_TAP_ADDR_SPACE )
1433+ )
1434+ },
13741435 [OT_EG_SOC_DEV_PLIC ] = {
13751436 .type = TYPE_SIFIVE_PLIC ,
13761437 .memmap = MEMMAPENTRIES (
@@ -1616,6 +1677,20 @@ static void ot_eg_soc_tap_ctrl_configure(
16161677 }
16171678}
16181679
1680+ static void ot_eg_soc_lc_ctrl_tap_ctrl_configure (
1681+ DeviceState * dev , const IbexDeviceDef * def , DeviceState * parent )
1682+ {
1683+ (void )parent ;
1684+ (void )def ;
1685+
1686+ Chardev * chr ;
1687+
1688+ chr = ibex_get_chardev_by_id ("taprbb-lc-ctrl" );
1689+ if (chr ) {
1690+ qdev_prop_set_chr (dev , "chardev" , chr );
1691+ }
1692+ }
1693+
16191694static void ot_eg_soc_spi_device_configure (
16201695 DeviceState * dev , const IbexDeviceDef * def , DeviceState * parent )
16211696{
@@ -1761,9 +1836,26 @@ static void ot_eg_soc_realize(DeviceState *dev, Error **errp)
17611836 ot_eg_soc_devices ,
17621837 ARRAY_SIZE (ot_eg_soc_devices ));
17631838
1764- MemoryRegion * mrs [] = { get_system_memory (), NULL , NULL , NULL };
1765- ibex_map_devices (s -> devices , mrs , ot_eg_soc_devices ,
1766- ARRAY_SIZE (ot_eg_soc_devices ));
1839+ MemoryRegion * lc_ctrl_tap_mr = g_new0 (MemoryRegion , 1u );
1840+ memory_region_init (lc_ctrl_tap_mr , OBJECT (dev ), TYPE_OT_LC_CTRL ".xbar" ,
1841+ OT_EG_LC_CTRL_TAP_TL_SIZE );
1842+
1843+ MemoryRegion * mrs [IBEX_MEMMAP_REGIDX_COUNT ] = {
1844+ [OT_EG_DEFAULT_MEMORY_REGION ] = get_system_memory (),
1845+ [OT_EG_LC_CTRL_TAP_MEMORY_REGION ] = lc_ctrl_tap_mr ,
1846+ };
1847+ ibex_map_devices_mask (s -> devices , mrs , ot_eg_soc_devices ,
1848+ ARRAY_SIZE (ot_eg_soc_devices ),
1849+ IBEX_MEMMAP_MAKE_REG_MASK (
1850+ OT_EG_DEFAULT_MEMORY_REGION ) |
1851+ IBEX_MEMMAP_MAKE_REG_MASK (
1852+ OT_EG_LC_CTRL_TAP_MEMORY_REGION ));
1853+ Object * oas ;
1854+ AddressSpace * as = g_new0 (AddressSpace , 1u );
1855+ address_space_init (as , lc_ctrl_tap_mr , TYPE_OT_LC_CTRL ".as" );
1856+ oas = object_new (TYPE_OT_ADDRESS_SPACE );
1857+ object_property_add_child (OBJECT (dev ), OT_EG_LC_CTRL_TAP_ADDR_SPACE , oas );
1858+ ot_address_space_set (OT_ADDRESS_SPACE (oas ), as );
17671859
17681860 qdev_connect_gpio_out_named (DEVICE (s -> devices [OT_EG_SOC_DEV_RSTMGR ]),
17691861 OT_RSTMGR_SOC_RST , 0 ,
0 commit comments