qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RESEND PATCH v2 2/2] seabios q35: Add new PCI slot to


From: Kevin O'Connor
Subject: Re: [Qemu-devel] [RESEND PATCH v2 2/2] seabios q35: Add new PCI slot to irq routing function
Date: Wed, 20 Feb 2013 23:29:45 -0500
User-agent: Mutt/1.5.21 (2010-09-15)

On Fri, Feb 15, 2013 at 02:11:41PM -0700, Alex Williamson wrote:
> q35/ich9 doesn't use the same interrupt mapping function as
> i440fx/piix.  PIRQA:D and PIRQE:H are programmed identically, but we
> start at index 0, not index -1.  Slots 25 through 31 are also
> programmed independently.
> 
> When running qemu w/o this patch, a device at address 0:6.0 will have
> its PCI interrupt line register programmed with irq 10 (as seen by
> info pci), but it actually uses irq 11 (as reported the guest).  Half
> of the interrupt lines are misprogrammedi like this.  Functionally, a
> fully emulated qemu guest doesn't care much, but when we try to use
> device assignment, we really need to know the correct irqs.

Thanks.  Before committing this, I have a couple of questions.

[...]
> --- a/src/pciinit.c
> +++ b/src/pciinit.c
> @@ -91,8 +91,10 @@ const u8 pci_irqs[4] = {
>      10, 10, 11, 11
>  };
>  
> +static int (*pci_slot_get_irq)(struct pci_device *pci, int pin);

This looks like it will cause a null pointer dereference if (for what
ever odd reason) neither the piix nor mch chipset is detected.

[...]
> +static int mch_pci_slot_get_irq(struct pci_device *pci, int pin)
> +{
> +    int irq, slot, pin_addend = 0;
> +
> +    while (pci->parent != NULL) {
> +        pin_addend += pci_bdf_to_dev(pci->bdf);
> +        pci = pci->parent;
> +    }
> +    slot = pci_bdf_to_dev(pci->bdf);
> +
> +    switch (slot) {
> +    /* Slots 0-24 rotate slot:pin mapping similar to piix above, but
> +       with a different starting index - see q35-acpi-dsdt.dsl */ 
> +    case 0 ... 24:
> +        irq = pci_irqs[(pin - 1 + pin_addend + slot) & 3];
> +        break;
> +    /* Slots 25-31 all use LNKA mapping (or LNKE, but A:D = E:H) */
> +    case 25 ... 31:
> +        irq = pci_irqs[(pin - 1 + pin_addend) & 3];
> +        break;
> +    }

I'm not sure I understand this.  Since the pin to irq mapping for each
pci slot is motherboard dependent (and not chipset dependent), why
would the qemu "motherboard" use such a weird mapping?  Why wouldn't
we just have qemu do something more consistent?

-Kevin



reply via email to

[Prev in Thread] Current Thread [Next in Thread]