@@ -685,13 +685,8 @@ static const TypeInfo xics_fabric_info = {
qemu_irq xics_get_qirq(XICSFabric *xi, int irq)
{
XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(xi);
- ICSState *ics = xic->ics_get(xi, irq);
- if (ics) {
- return ics->qirqs[irq - ics->offset];
- }
-
- return NULL;
+ return xic->qirq_get(xi, irq);
}
ICPState *xics_icp_get(XICSFabric *xi, int server)
@@ -3455,6 +3455,17 @@ static void spapr_phb_placement(sPAPRMachineState *spapr, uint32_t index,
*mmio64 = SPAPR_PCI_BASE + (index + 1) * SPAPR_PCI_MEM64_WIN_SIZE;
}
+static qemu_irq spapr_qirq_get(XICSFabric *dev, int irq)
+{
+ sPAPRMachineState *spapr = SPAPR_MACHINE(dev);
+
+ if (!ics_valid_irq(spapr->ics, irq)) {
+ return NULL;
+ }
+
+ return spapr->ics->qirqs[irq - spapr->ics->offset];
+}
+
static ICSState *spapr_ics_get(XICSFabric *dev, int irq)
{
sPAPRMachineState *spapr = SPAPR_MACHINE(dev);
@@ -3539,6 +3550,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
vhc->unmap_hptes = spapr_unmap_hptes;
vhc->store_hpte = spapr_store_hpte;
vhc->get_patbe = spapr_get_patbe;
+ xic->qirq_get = spapr_qirq_get;
xic->ics_get = spapr_ics_get;
xic->ics_resend = spapr_ics_resend;
xic->icp_get = spapr_icp_get;
@@ -178,6 +178,7 @@ struct XICSFabric {
typedef struct XICSFabricClass {
InterfaceClass parent;
+ qemu_irq (*qirq_get)(XICSFabric *xi, int irq);
ICSState *(*ics_get)(XICSFabric *xi, int irq);
void (*ics_resend)(XICSFabric *xi);
ICPState *(*icp_get)(XICSFabric *xi, int server);
It will be used to choose the appropriate set of qirqs when XIVE is activated. Signed-off-by: Cédric Le Goater <clg@kaod.org> --- hw/intc/xics.c | 7 +------ hw/ppc/spapr.c | 12 ++++++++++++ include/hw/ppc/xics.h | 1 + 3 files changed, 14 insertions(+), 6 deletions(-)