Skip to content

Commit 62e6f92

Browse files
committed
[ot] hw/riscv: ot_earlgrey: add JTAG support to LC Ctrl
Signed-off-by: Luís Marques <[email protected]>
1 parent bbb60d2 commit 62e6f92

File tree

1 file changed

+96
-4
lines changed

1 file changed

+96
-4
lines changed

hw/riscv/ot_earlgrey.c

Lines changed: 96 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,15 @@
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);
101103
static 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);
103107
static void ot_eg_soc_spi_device_configure(
104108
DeviceState *dev, const IbexDeviceDef *def, DeviceState *parent);
105109
static 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+
114126
enum 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

201231
static 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+
16191694
static 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

Comments
 (0)