> > Makes sense, but it is also abstraction time. :) What if instead there > > was a function > > > > void msi_allocate_irqs(PCIDevice *pdev, int num, bool fallback_to_intx); > > > > and then ich.c did > > > > irqs = msi_allocate_irqs(pdev, 1, true); > > s->irq = irqs[0]; > > g_free(irqs); > > > > ? "if msi_enabled raise MSI else raise INTX" is really a common idiom. > > > > Thanks, > > > > Paolo > > Maybe it is but the specific issue is not about fallback to INTX of PCI > (is the fallback broken for ahci? I don't know).
It works, the above is just a new abstraction. > The trick is there's no pdev at all. The trick :) is that in ich.c there is a pdev. Right now we are assigning to s->irq either the INTX irq (if PCI) or a sysbus irq (if sysbus), but then we need to know about MSI with a wrapper around s->irq. Instead, my suggestion is to put the wrapper in the PCI core as a qemu_irq callback---or perhaps in ich.c, but anyway ahci.c should not care that there could be a PCI AHCI device and it would have two different interrupt modes. In fact, doing this would also remove the need for s->container, I think. Paolo