> --- a/hw/ppc/spapr_vio.c > +++ b/hw/ppc/spapr_vio.c > @@ -436,6 +436,9 @@ static void spapr_vio_busdev_reset(DeviceState *qdev) > } > } > > +/* TODO : poor VIO device indexing ... */ > +static uint32_t vio_index;
I think we could also use (dev->reg & 0xff) as an index for the VIO devices. The unit address of the virtual IOA is simply allocated using an increment of bus->next_reg, next_reg being initialized at 0x71000000. I did not see any restrictions in the PAPR specs or in QEMU that would break the above. C. > static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp) > { > sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine()); > @@ -476,10 +479,18 @@ static void spapr_vio_busdev_realize(DeviceState *qdev, > Error **errp) > } > > if (!dev->irq) { > - dev->irq = spapr_irq_findone(spapr, &local_err); > - if (local_err) { > - error_propagate(errp, local_err); > - return; > + if (SPAPR_MACHINE_GET_CLASS(spapr)->legacy_irq_allocation) { > + dev->irq = spapr_irq_findone(spapr, &local_err); > + if (local_err) { > + error_propagate(errp, local_err); > + return; > + } > + } else { > + dev->irq = SPAPR_IRQ_VIO + vio_index++; > + if (dev->irq == SPAPR_IRQ_PCI_LSI) { > + error_setg(errp, "Too many VIO devices"); > + return; > + }