|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] xen/riscv: introduce init interrupt controller operations
commit c91771c85cec5f79a88cbc7912a27e9cb3507fdb
Author: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
AuthorDate: Wed Sep 9 17:07:26 2026 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Mon Sep 21 10:07:42 2026 +0200
xen/riscv: introduce init interrupt controller operations
Introduce intc_hw_init_ops structure to avoid risky mix of init
function and non-init function.
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
---
xen/arch/riscv/aplic.c | 8 ++++++--
xen/arch/riscv/include/asm/intc.h | 10 +++++++---
xen/arch/riscv/intc.c | 11 ++++++++---
3 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/xen/arch/riscv/aplic.c b/xen/arch/riscv/aplic.c
index 9f023db5d5..d08401db46 100644
--- a/xen/arch/riscv/aplic.c
+++ b/xen/arch/riscv/aplic.c
@@ -325,12 +325,16 @@ static const hw_irq_controller aplic_xen_irq_type = {
static const struct intc_hw_operations aplic_ops = {
.info = &aplic_info,
- .init = aplic_init,
.host_irq_type = &aplic_xen_irq_type,
.handle_interrupt = aplic_handle_interrupt,
.set_irq_type = aplic_set_irq_type,
};
+static const struct intc_hw_init_ops __initconstrel aplic_init_ops = {
+ .ops = &aplic_ops,
+ .init = aplic_init,
+};
+
static int cf_check aplic_irq_xlate(const uint32_t *intspec,
unsigned int intsize,
unsigned int *out_hwirq,
@@ -366,7 +370,7 @@ static int __init aplic_preinit(struct dt_device_node
*node, const void *dat)
dt_irq_xlate = aplic_irq_xlate;
- register_intc_ops(&aplic_ops);
+ register_intc_ops(&aplic_init_ops);
/* Enable supervisor external interrupt */
csr_set(CSR_SIE, BIT(IRQ_S_EXT, UL));
diff --git a/xen/arch/riscv/include/asm/intc.h
b/xen/arch/riscv/include/asm/intc.h
index 675f703ec9..d7b34fc15a 100644
--- a/xen/arch/riscv/include/asm/intc.h
+++ b/xen/arch/riscv/include/asm/intc.h
@@ -28,8 +28,6 @@ struct intc_info {
struct intc_hw_operations {
/* Hold intc hw information */
const struct intc_info *info;
- /* Initialize the intc and the boot CPU */
- int (*init)(void);
/* hw_irq_controller to enable/disable/eoi host irq */
const struct hw_interrupt_type *host_irq_type;
@@ -43,9 +41,15 @@ struct intc_hw_operations {
void (*handle_interrupt)(struct cpu_user_regs *regs);
};
+struct intc_hw_init_ops {
+ const struct intc_hw_operations *ops;
+ /* Initialize the intc and the boot CPU */
+ int (*init)(void);
+};
+
void intc_preinit(void);
-void register_intc_ops(const struct intc_hw_operations *ops);
+void register_intc_ops(const struct intc_hw_init_ops *init_ops);
void intc_init(void);
diff --git a/xen/arch/riscv/intc.c b/xen/arch/riscv/intc.c
index ea317aea5a..3600d23bdb 100644
--- a/xen/arch/riscv/intc.c
+++ b/xen/arch/riscv/intc.c
@@ -12,9 +12,12 @@
static const struct intc_hw_operations *__ro_after_init intc_hw_ops;
-void __init register_intc_ops(const struct intc_hw_operations *ops)
+static const struct intc_hw_init_ops *__initdata intc_hw_init_ops;
+
+void __init register_intc_ops(const struct intc_hw_init_ops *init_ops)
{
- intc_hw_ops = ops;
+ intc_hw_ops = init_ops->ops;
+ intc_hw_init_ops = init_ops;
}
void __init intc_preinit(void)
@@ -27,7 +30,9 @@ void __init intc_preinit(void)
void __init intc_init(void)
{
- if ( intc_hw_ops->init() )
+ ASSERT(intc_hw_init_ops && intc_hw_init_ops->init);
+
+ if ( intc_hw_init_ops->init() )
panic("Failed to initialize the interrupt controller drivers\n");
}
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |