From: Raymond Mao <raymondmaoca@gmail.com>
To: opensbi@lists.infradead.org
Cc: scott@riscstar.com, dave.patel@riscstar.com,
raymond.mao@riscstar.com, robin.randhawa@sifive.com,
samuel.holland@sifive.com, anup.patel@qti.qualcomm.com,
anuppate@qti.qualcomm.com, dhaval@rivosinc.com,
peter.lin@sifive.com
Subject: [PATCH 3/3][NOT-FOR-UPSTREAM] lib: utils: irqchip: add QEMU virt test for APLIC wired IRQs
Date: Wed, 11 Feb 2026 17:20:25 -0500 [thread overview]
Message-ID: <20260211222025.2463312-4-raymondmaoca@gmail.com> (raw)
In-Reply-To: <20260211222025.2463312-1-raymondmaoca@gmail.com>
From: Raymond Mao <raymond.mao@riscstar.com>
Add a QEMU virt specific test for APLIC wired external interrupt
handling.
When APLIC_QEMU_WIRED_TEST is enabled, this adds a small test hook as
a bring-up aid for validating the wired interrupt path.
Signed-off-by: Raymond Mao <raymond.mao@riscstar.com>
---
Makefile | 3 +++
lib/utils/irqchip/aplic.c | 44 +++++++++++++++++++++++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/Makefile b/Makefile
index 46541063..418ee1aa 100644
--- a/Makefile
+++ b/Makefile
@@ -399,6 +399,9 @@ CFLAGS += $(GENFLAGS)
CFLAGS += $(platform-cflags-y)
CFLAGS += -fPIE -pie
CFLAGS += $(firmware-cflags-y)
+ifeq ($(APLIC_QEMU_WIRED_TEST),y)
+CFLAGS += -DAPLIC_QEMU_WIRED_TEST
+endif
CPPFLAGS += $(GENFLAGS)
CPPFLAGS += $(platform-cppflags-y)
diff --git a/lib/utils/irqchip/aplic.c b/lib/utils/irqchip/aplic.c
index f0ecef42..63697e14 100644
--- a/lib/utils/irqchip/aplic.c
+++ b/lib/utils/irqchip/aplic.c
@@ -119,6 +119,41 @@ static SBI_LIST_HEAD(aplic_list);
static void aplic_writel_msicfg(struct aplic_msicfg_data *msicfg,
void *msicfgaddr, void *msicfgaddrH);
+#ifdef APLIC_QEMU_WIRED_TEST
+
+#define UART_QEMU_MMIO 0x10000000UL
+
+static void aplic_test_uart_handler(void)
+{
+ volatile u8 *uart = (volatile u8 *)UART_QEMU_MMIO;
+
+ /* Drain RX FIFO to clear the interrupt source */
+ while (uart[0x05] & 0x01) { /* LSR.DR */
+ u8 ch = uart[0x00]; /* RBR */
+
+ sbi_printf("[APLIC TEST] UART got '%c'(0x%02x)\n",
+ (ch >= 32 && ch < 127) ? ch : '.', ch);
+ }
+
+ /* (Optional) read IIR to acknowledge on some models */
+ (void)uart[0x02]; /* IIR is at offset 2 when DLAB=0; */
+}
+
+static void aplic_hwirq_test_run(unsigned long aplic_addr)
+{
+ volatile u8 *uart = (volatile u8 *)UART_QEMU_MMIO;
+
+ /* UART: enable RX interrupt */
+ uart[0x02] = 0x07; /* FCR enable+clear */
+ uart[0x04] |= (1 << 3); /* MCR.OUT2 */
+ uart[0x01] |= 0x01; /* IER.ERBFI */
+ while (uart[0x05] & 0x01) /* drain */
+ (void)uart[0x00];
+
+ sbi_printf("[APLIC TEST] Setup done. Type keys now.\n");
+}
+#endif
+
static void aplic_init(struct aplic_data *aplic)
{
struct aplic_delegate_data *deleg;
@@ -245,6 +280,7 @@ static int aplic_check_msicfg(struct aplic_msicfg_data *msicfg)
return 0;
}
+#ifdef APLIC_QEMU_WIRED_TEST
static int aplic_hwirq_handler(u32 hwirq, void *opaque)
{
(void)opaque;
@@ -252,8 +288,12 @@ static int aplic_hwirq_handler(u32 hwirq, void *opaque)
sbi_printf("[APLIC] Enter registered hwirq %u raw handler callback\n",
hwirq);
+ if (hwirq == 10)
+ aplic_test_uart_handler();
+
return SBI_OK;
}
+#endif
static inline void *aplic_idc_base(unsigned long aplic_addr, u32 idc_index)
{
@@ -501,10 +541,14 @@ int aplic_cold_irqchip_init(struct aplic_data *aplic)
/* Attach to the aplic list */
sbi_list_add_tail(&aplic->node, &aplic_list);
+#ifdef APLIC_QEMU_WIRED_TEST
rc = sbi_irqchip_register_handler(&aplic->irqchip, 1, aplic->num_source,
aplic_hwirq_handler, NULL);
if (rc)
return rc;
+ /* Enable test in M-mode before jumping to any payload */
+ aplic_hwirq_test_run(aplic->addr);
+#endif
return 0;
}
--
2.25.1
--
opensbi mailing list
opensbi@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/opensbi
prev parent reply other threads:[~2026-02-11 22:20 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-11 22:20 [PATCH 0/3] APLIC hwirq implementation for irqchip Raymond Mao
2026-02-11 22:20 ` [PATCH 1/3] lib: sbi_irqchip: Add irqchip private context pointer in sbi_irqchip_device Raymond Mao
2026-04-07 12:11 ` Anup Patel
2026-02-11 22:20 ` [PATCH 2/3] lib: utils: irqchip: implement APLIC hwirq operation hooks Raymond Mao
2026-04-07 12:08 ` Anup Patel
2026-04-07 12:10 ` Anup Patel
2026-02-11 22:20 ` Raymond Mao [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260211222025.2463312-4-raymondmaoca@gmail.com \
--to=raymondmaoca@gmail.com \
--cc=anup.patel@qti.qualcomm.com \
--cc=anuppate@qti.qualcomm.com \
--cc=dave.patel@riscstar.com \
--cc=dhaval@rivosinc.com \
--cc=opensbi@lists.infradead.org \
--cc=peter.lin@sifive.com \
--cc=raymond.mao@riscstar.com \
--cc=robin.randhawa@sifive.com \
--cc=samuel.holland@sifive.com \
--cc=scott@riscstar.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox