From ea7db5c21e98d39c95dd520b864c0b69e8f0e65d Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 20 Jul 2023 19:47:31 +0200 Subject: Add basic DSU support present on GR712RC Only the time tag counter register is implemented so far. It may be used by clock drivers as a free-running counter to measure time. --- grlib.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ grlib.h | 3 ++- leon3.c | 1 + 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/grlib.c b/grlib.c index 29785d3..a1ef781 100644 --- a/grlib.c +++ b/grlib.c @@ -1784,3 +1784,60 @@ s5test_add (int irq, uint32 addr, uint32 mask) const struct grlib_ipcore s5test = { NULL, NULL, NULL, s5test_write, s5test_add }; + + +/* ------------------- Debug Support Unit (DSU) -----------------------*/ + +#define DSU_TIME_TAG_COUNTER 0x08 + +static void +dsu_init (void) +{ +} + +static void +dsu_add (int irq, uint32 addr, uint32 mask) +{ + grlib_ahbspp_add (GRLIB_PP_ID (VENDOR_GAISLER, GAISLER_DSU, 0, 0), + GRLIB_PP_AHBADDR (addr, mask, 1, 1, 2), 0, 0, 0); + if (sis_verbose) + printf (" DSU 0x%08x\n", addr); +} + +static void +dsu_reset (void) +{ +} + +static int +dsu_read (uint32 addr, uint32 * data) +{ + switch (addr & 0xff) + { + case DSU_TIME_TAG_COUNTER: /* 0x08 */ + /* + * On some implementations, a number of upper bits are zero. For + * example, the GR712RC time tag has only 30 bits implemented. Assume + * that the software knows how many bits are present and performs the + * necessary masking operations. + */ + *data = sregs[cpu].simtime; + break; + + default: + *data = 0; + break; + } + + return 1; +} + +static int +dsu_write (uint32 addr, uint32 * data, uint32 sz) +{ + return 1; +} + +const struct grlib_ipcore dsu = { + dsu_init, dsu_reset, dsu_read, dsu_write, dsu_add +}; diff --git a/grlib.h b/grlib.h index b182884..a88cb6b 100644 --- a/grlib.h +++ b/grlib.h @@ -32,6 +32,7 @@ /* Devices */ #define GAISLER_LEON3 0x003 +#define GAISLER_DSU 0x004 #define GAISLER_APBMST 0x006 #define GAISLER_SRCTRL 0x008 #define GAISLER_SDCTRL 0x009 @@ -105,4 +106,4 @@ extern void apbuart_restore_stdio (void); extern void apbuart_close_port (void); extern void apbuart_flush (void); extern const struct grlib_ipcore gptimer, irqmp, apbuart, apbmst, - greth, l2c, leon3s, srctrl, ns16550, clint, plic, sdctrl, s5test; + dsu, greth, l2c, leon3s, srctrl, ns16550, clint, plic, sdctrl, s5test; diff --git a/leon3.c b/leon3.c index d833689..0bf6cbe 100644 --- a/leon3.c +++ b/leon3.c @@ -65,6 +65,7 @@ init_sim (void) grlib_ahbs_add (&apbmst, 0, APBSTART, 0xFFF); grlib_ahbs_add (&sdctrl, 0, RAM_START, RAM_MASKPP); + grlib_ahbs_add (&dsu, 0, 0x90000000, 0xFFF); grlib_apb_add (&apbuart, 3, APBSTART + 0x100, 0xFFF); grlib_apb_add (&irqmp, 0, APBSTART + 0x200, 0xFFF); -- cgit v1.2.3