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"
@@ -99,6 +101,8 @@ static void ot_eg_soc_otp_ctrl_configure(
99101 DeviceState * dev , const IbexDeviceDef * def , DeviceState * parent );
100102static void ot_eg_soc_tap_ctrl_configure (
101103 DeviceState * dev , const IbexDeviceDef * def , DeviceState * parent );
104+ static void ot_eg_soc_lc_ctrl_tap_ctrl_configure (
105+ DeviceState * dev , const IbexDeviceDef * def , DeviceState * parent );
102106static void ot_eg_soc_spi_device_configure (
103107 DeviceState * dev , const IbexDeviceDef * def , DeviceState * parent );
104108static void ot_eg_soc_uart_configure (DeviceState * dev , const IbexDeviceDef * def ,
@@ -110,6 +114,14 @@ static void ot_eg_soc_usbdev_configure(
110114/* Constants */
111115/* ------------------------------------------------------------------------ */
112116
117+ enum OtEgMemoryRegion {
118+ OT_EG_DEFAULT_MEMORY_REGION ,
119+ OT_EG_LC_CTRL_MEMORY_REGION ,
120+ };
121+
122+ #define LC_CTRL_MEMORY (_addr_ ) \
123+ IBEX_MEMMAP_MAKE_REG((_addr_), OT_EG_LC_CTRL_MEMORY_REGION)
124+
113125enum OtEGSocDevice {
114126 OT_EG_SOC_DEV_ADC_CTRL ,
115127 OT_EG_SOC_DEV_AES ,
@@ -120,6 +132,7 @@ enum OtEGSocDevice {
120132 OT_EG_SOC_DEV_CSRNG ,
121133 OT_EG_SOC_DEV_DM ,
122134 OT_EG_SOC_DEV_DTM ,
135+ OT_EG_SOC_DEV_LC_CTRL_DTM ,
123136 OT_EG_SOC_DEV_EDN0 ,
124137 OT_EG_SOC_DEV_EDN1 ,
125138 OT_EG_SOC_DEV_ENTROPY_SRC ,
@@ -147,13 +160,15 @@ enum OtEGSocDevice {
147160 OT_EG_SOC_DEV_ROM_CTRL ,
148161 OT_EG_SOC_DEV_RSTMGR ,
149162 OT_EG_SOC_DEV_RV_DM ,
163+ OT_EG_SOC_DEV_DM_LC_CTRL ,
150164 OT_EG_SOC_DEV_SENSOR_CTRL ,
151165 OT_EG_SOC_DEV_SPI_DEVICE ,
152166 OT_EG_SOC_DEV_SPI_HOST0 ,
153167 OT_EG_SOC_DEV_SPI_HOST1 ,
154168 OT_EG_SOC_DEV_SRAM_MAIN_CTRL ,
155169 OT_EG_SOC_DEV_SYSRST_CTRL ,
156170 OT_EG_SOC_DEV_TAP_CTRL ,
171+ OT_EG_SOC_DEV_LC_CTRL_TAP_CTRL ,
157172 OT_EG_SOC_DEV_TIMER ,
158173 OT_EG_SOC_DEV_UART0 ,
159174 OT_EG_SOC_DEV_UART1 ,
@@ -195,6 +210,11 @@ enum OtEGBoardDevice {
195210 OT_EG_BOARD_DEV_COUNT ,
196211};
197212
213+ #define OT_EG_DEBUG_LC_CTRL_ADDR 0
214+ #define OT_EG_DEBUG_LC_CTRL_SIZE 0x200u
215+ #define OT_EG_DEBUG_LC_CTRL_DMI_ADDR (OT_EG_DEBUG_LC_CTRL_ADDR / 4)
216+ #define OT_EG_DEBUG_LC_CTRL_DMI_SIZE (OT_EG_DEBUG_LC_CTRL_SIZE / 4)
217+
198218#define OT_EG_IBEX_WRAPPER_NUM_REGIONS 2u
199219
200220static const uint8_t ot_eg_pmp_cfgs [] = {
@@ -360,6 +380,14 @@ static const IbexDeviceDef ot_eg_soc_devices[] = {
360380 IBEX_DEV_UINT_PROP ("idcode" , EG_RV_DM_TAP_IDCODE )
361381 ),
362382 },
383+ [OT_EG_SOC_DEV_LC_CTRL_TAP_CTRL ] = {
384+ .type = TYPE_TAP_CTRL_RBB ,
385+ .cfg = & ot_eg_soc_lc_ctrl_tap_ctrl_configure ,
386+ .prop = IBEXDEVICEPROPDEFS (
387+ IBEX_DEV_UINT_PROP ("ir_length" , IBEX_TAP_IR_LENGTH ),
388+ IBEX_DEV_UINT_PROP ("idcode" , EG_RV_DM_TAP_IDCODE )
389+ ),
390+ },
363391 [OT_EG_SOC_DEV_DTM ] = {
364392 .type = TYPE_RISCV_DTM ,
365393 .link = IBEXDEVICELINKDEFS (
@@ -369,6 +397,15 @@ static const IbexDeviceDef ot_eg_soc_devices[] = {
369397 IBEX_DEV_UINT_PROP ("abits" , 7u )
370398 ),
371399 },
400+ [OT_EG_SOC_DEV_LC_CTRL_DTM ] = {
401+ .type = TYPE_RISCV_DTM ,
402+ .link = IBEXDEVICELINKDEFS (
403+ OT_EG_SOC_DEVLINK ("tap-ctrl" , LC_CTRL_TAP_CTRL )
404+ ),
405+ .prop = IBEXDEVICEPROPDEFS (
406+ IBEX_DEV_UINT_PROP ("abits" , 7u )
407+ ),
408+ },
372409 [OT_EG_SOC_DEV_DM ] = {
373410 .type = TYPE_RISCV_DM ,
374411 .cfg = & ot_eg_soc_dm_configure ,
@@ -734,7 +771,8 @@ static const IbexDeviceDef ot_eg_soc_devices[] = {
734771 [OT_EG_SOC_DEV_LC_CTRL ] = {
735772 .type = TYPE_OT_LC_CTRL ,
736773 .memmap = MEMMAPENTRIES (
737- { .base = 0x40140000u }
774+ { .base = 0x40140000u },
775+ { .base = LC_CTRL_MEMORY (OT_EG_DEBUG_LC_CTRL_ADDR ) }
738776 ),
739777 .gpio = IBEXGPIOCONNDEFS (
740778 OT_EG_SOC_RSP (OT_PWRMGR_LC , PWRMGR ),
@@ -1364,6 +1402,19 @@ static const IbexDeviceDef ot_eg_soc_devices[] = {
13641402 OT_EG_SOC_GPIO_ALERT (0 , 40 )
13651403 ),
13661404 },
1405+ [OT_EG_SOC_DEV_DM_LC_CTRL ] = {
1406+ .type = TYPE_OT_DM_TL ,
1407+ .link = IBEXDEVICELINKDEFS (
1408+ OT_EG_SOC_DEVLINK ("dtm" , LC_CTRL_DTM ),
1409+ OT_EG_SOC_DEVLINK ("tl_dev" , LC_CTRL )
1410+ ),
1411+ .prop = IBEXDEVICEPROPDEFS (
1412+ IBEX_DEV_UINT_PROP ("dmi_addr" , OT_EG_DEBUG_LC_CTRL_DMI_ADDR ),
1413+ IBEX_DEV_UINT_PROP ("dmi_size" , OT_EG_DEBUG_LC_CTRL_DMI_SIZE ),
1414+ IBEX_DEV_UINT_PROP ("tl_addr" , OT_EG_DEBUG_LC_CTRL_ADDR ),
1415+ IBEX_DEV_STRING_PROP ("tl_as_name" , "ot-lc-ctrl-dmi-as" )
1416+ )
1417+ },
13671418 [OT_EG_SOC_DEV_PLIC ] = {
13681419 .type = TYPE_SIFIVE_PLIC ,
13691420 .memmap = MEMMAPENTRIES (
@@ -1609,6 +1660,20 @@ static void ot_eg_soc_tap_ctrl_configure(
16091660 }
16101661}
16111662
1663+ static void ot_eg_soc_lc_ctrl_tap_ctrl_configure (
1664+ DeviceState * dev , const IbexDeviceDef * def , DeviceState * parent )
1665+ {
1666+ (void )parent ;
1667+ (void )def ;
1668+
1669+ Chardev * chr ;
1670+
1671+ chr = ibex_get_chardev_by_id ("taprbb-lc-ctrl" );
1672+ if (chr ) {
1673+ qdev_prop_set_chr (dev , "chardev" , chr );
1674+ }
1675+ }
1676+
16121677static void ot_eg_soc_spi_device_configure (
16131678 DeviceState * dev , const IbexDeviceDef * def , DeviceState * parent )
16141679{
@@ -1754,9 +1819,26 @@ static void ot_eg_soc_realize(DeviceState *dev, Error **errp)
17541819 ot_eg_soc_devices ,
17551820 ARRAY_SIZE (ot_eg_soc_devices ));
17561821
1757- MemoryRegion * mrs [] = { get_system_memory (), NULL , NULL , NULL };
1758- ibex_map_devices (s -> devices , mrs , ot_eg_soc_devices ,
1759- ARRAY_SIZE (ot_eg_soc_devices ));
1822+ MemoryRegion * lc_ctrl_mr = g_new0 (MemoryRegion , 1u );
1823+ memory_region_init (lc_ctrl_mr , OBJECT (dev ), "lc-ctrl-dmi.xbar" ,
1824+ OT_EG_DEBUG_LC_CTRL_SIZE );
1825+
1826+ MemoryRegion * mrs [IBEX_MEMMAP_REGIDX_COUNT ] = {
1827+ [OT_EG_DEFAULT_MEMORY_REGION ] = get_system_memory (),
1828+ [OT_EG_LC_CTRL_MEMORY_REGION ] = lc_ctrl_mr ,
1829+ };
1830+ ibex_map_devices_mask (s -> devices , mrs , ot_eg_soc_devices ,
1831+ ARRAY_SIZE (ot_eg_soc_devices ),
1832+ IBEX_MEMMAP_MAKE_REG_MASK (
1833+ OT_EG_DEFAULT_MEMORY_REGION ) |
1834+ IBEX_MEMMAP_MAKE_REG_MASK (
1835+ OT_EG_LC_CTRL_MEMORY_REGION ));
1836+ Object * oas ;
1837+ AddressSpace * as = g_new0 (AddressSpace , 1u );
1838+ address_space_init (as , lc_ctrl_mr , "lc-ctrl.as" );
1839+ oas = object_new (TYPE_OT_ADDRESS_SPACE );
1840+ object_property_add_child (OBJECT (dev ), "ot-lc-ctrl-dmi-as" , oas );
1841+ ot_address_space_set (OT_ADDRESS_SPACE (oas ), as );
17601842
17611843 qdev_connect_gpio_out_named (DEVICE (s -> devices [OT_EG_SOC_DEV_RSTMGR ]),
17621844 OT_RSTMGR_SOC_RST , 0 ,
0 commit comments