Skip to content

Commit b408a44

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

File tree

1 file changed

+86
-4
lines changed

1 file changed

+86
-4
lines changed

hw/riscv/ot_earlgrey.c

Lines changed: 86 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"
@@ -99,6 +101,8 @@ static void ot_eg_soc_otp_ctrl_configure(
99101
DeviceState *dev, const IbexDeviceDef *def, DeviceState *parent);
100102
static 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);
102106
static void ot_eg_soc_spi_device_configure(
103107
DeviceState *dev, const IbexDeviceDef *def, DeviceState *parent);
104108
static 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+
113125
enum 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 0x0u
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

200220
static 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+
16121677
static 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

Comments
 (0)