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 <a...@ozlabs.ru> --- hw/xics.c | 13 +++++++++++++ hw/xics.h | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/hw/xics.c b/hw/xics.c index 668a0d6..d36d62c 100644 --- a/hw/xics.c +++ b/hw/xics.c @@ -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); +} + diff --git a/hw/xics.h b/hw/xics.h index 2080159..ca75fac 100644 --- a/hw/xics.h +++ b/hw/xics.h @@ -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__ */ -- 1.7.10.4