> > 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

Reply via email to