diff mbox

[v3,10/24] ppc/xics: use the QOM interface to resend irqs

Message ID 1487931503-10607-11-git-send-email-clg@kaod.org
State New
Headers show

Commit Message

Cédric Le Goater Feb. 24, 2017, 10:18 a.m. UTC
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 hw/intc/xics.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)
diff mbox

Patch

diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index fbd76b24f51c..92bf44a1a82b 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -229,16 +229,15 @@  static void icp_check_ipi(ICPState *ss)
     qemu_irq_raise(ss->output);
 }
 
-static void icp_resend(ICPState *ss)
+static void icp_resend(XICSFabric *xi, ICPState *ss)
 {
-    ICSState *ics;
+    XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(xi);
 
     if (ss->mfrr < CPPR(ss)) {
         icp_check_ipi(ss);
     }
-    QLIST_FOREACH(ics, &ss->xics->ics, list) {
-        ics_resend(ics);
-    }
+
+    xic->ics_resend(xi);
 }
 
 void icp_set_cppr(ICPState *ss, uint8_t cppr)
@@ -262,7 +261,7 @@  void icp_set_cppr(ICPState *ss, uint8_t cppr)
         }
     } else {
         if (!XISR(ss)) {
-            icp_resend(ss);
+            icp_resend(XICS_FABRIC(qdev_get_machine()), ss);
         }
     }
 }
@@ -299,6 +298,8 @@  uint32_t icp_ipoll(ICPState *ss, uint32_t *mfrr)
 
 void icp_eoi(ICPState *ss, uint32_t xirr)
 {
+    XICSFabric *xi = XICS_FABRIC(qdev_get_machine());
+    XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(xi);
     ICSState *ics;
     uint32_t irq;
 
@@ -306,13 +307,13 @@  void icp_eoi(ICPState *ss, uint32_t xirr)
     ss->xirr = (ss->xirr & ~CPPR_MASK) | (xirr & CPPR_MASK);
     trace_xics_icp_eoi(ss->cs->cpu_index, xirr, ss->xirr);
     irq = xirr & XISR_MASK;
-    QLIST_FOREACH(ics, &ss->xics->ics, list) {
-        if (ics_valid_irq(ics, irq)) {
-            ics_eoi(ics, irq);
-        }
+
+    ics = xic->ics_get(xi, irq);
+    if (ics) {
+        ics_eoi(ics, irq);
     }
     if (!XISR(ss)) {
-        icp_resend(ss);
+        icp_resend(xi, ss);
     }
 }
 
@@ -592,10 +593,11 @@  static void ics_simple_reset(DeviceState *dev)
 
 static int ics_simple_post_load(ICSState *ics, int version_id)
 {
+    XICSFabric *xi = XICS_FABRIC(qdev_get_machine());
     int i;
 
     for (i = 0; i < ics->xics->nr_servers; i++) {
-        icp_resend(&ics->xics->ss[i]);
+        icp_resend(xi, &ics->xics->ss[i]);
     }
 
     return 0;