@@ -170,6 +170,7 @@ struct ics_irq_state {
int sent:1;
int rejected:1;
int masked_pending:1;
+ NotifierList eoi_notifier;
};
struct ics_state {
@@ -309,6 +310,8 @@ static void ics_eoi(struct ics_state *ics, int nr)
if (irq->type == XICS_LSI) {
irq->sent = 0;
}
+
+ notifier_list_notify(&irq->eoi_notifier, NULL);
}
/*
@@ -536,6 +539,7 @@ struct icp_state *xics_system_init(int nr_irqs)
for (i = 0; i < nr_irqs; i++) {
ics->irqs[i].priority = 0xff;
ics->irqs[i].saved_priority = 0xff;
+ notifier_list_init(&ics->irqs[i].eoi_notifier);
}
ics->qirqs = qemu_allocate_irqs(ics_set_irq, ics, nr_irqs);
@@ -552,3 +556,12 @@ struct icp_state *xics_system_init(int nr_irqs)
return icp;
}
+
+void xics_add_eoi_notifier(Notifier *notify, uint32_t srcno)
+{
+ struct ics_state *ics = spapr->icp->ics;
+ struct ics_irq_state *irq = &ics->irqs[srcno - ics->offset];
+
+ notifier_list_add(&irq->eoi_notifier, notify);
+}
+
@@ -27,6 +27,8 @@
#if !defined(__XICS_H__)
#define __XICS_H__
+#include "notify.h"
+
#define XICS_IPI 0x2
struct icp_state;
@@ -41,4 +43,6 @@ qemu_irq xics_assign_irq(struct icp_state *icp, int irq,
struct icp_state *xics_system_init(int nr_irqs);
+void xics_add_eoi_notifier(Notifier *notify, uint32_t srcno);
+
#endif /* __XICS_H__ */
The patch adds EOI handler to process h_eoi RTAS call correctly for PCI legacy interrupts. This functionality is going to be used in VFIO later. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> --- hw/xics.c | 13 +++++++++++++ hw/xics.h | 4 ++++ 2 files changed, 17 insertions(+)