[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <54C8FE61.1030304@linux.intel.com>
Date: Wed, 28 Jan 2015 23:21:05 +0800
From: Jiang Liu <jiang.liu@...ux.intel.com>
To: Marc Zyngier <marc.zyngier@....com>,
Thomas Gleixner <tglx@...utronix.de>,
Bjorn Helgaas <bhelgaas@...gle.com>
CC: Lorenzo Pieralisi <lorenzo.pieralisi@....com>,
Andre Przywara <andre.przywara@....com>,
linux-pci@...r.kernel.org, linux-arm-kernel@...ts.infradead.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH] PCI: Fix pcibios_update_irq misuse of irq number
On 2015/1/28 22:51, Marc Zyngier wrote:
> pcibios_update_irq writes an irq number into the config space
> of a given PCI device, but ignores the fact that this number
> is a virtual interrupt number, which might be a very different
> value from what the underlying hardware is using.
>
> The obvious fix is to fetch the HW interrupt number from the
> corresponding irq_data structure. This is slightly complicated
> by the fact that this interrupt might be services by a stacked
> domain.
>
> This has been tested on KVM with kvmtool.
>
> Reported-by: Lorenzo Pieralisi <lorenzo.pieralisi@....com>
> Tested-by: Andre Przywara <andre.przywara@....com>
> Signed-off-by: Marc Zyngier <marc.zyngier@....com>
> ---
> drivers/pci/setup-irq.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/pci/setup-irq.c b/drivers/pci/setup-irq.c
> index 4e2d595..828cbc9 100644
> --- a/drivers/pci/setup-irq.c
> +++ b/drivers/pci/setup-irq.c
> @@ -15,11 +15,19 @@
> #include <linux/errno.h>
> #include <linux/ioport.h>
> #include <linux/cache.h>
> +#include <linux/irq.h>
>
> void __weak pcibios_update_irq(struct pci_dev *dev, int irq)
> {
> - dev_dbg(&dev->dev, "assigning IRQ %02d\n", irq);
> - pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
> + struct irq_data *d;
> +
> + d = irq_get_irq_data(irq);
> +#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
> + while (d->parent_data)
> + d = d->parent_data;
> +#endif
> + dev_dbg(&dev->dev, "assigning IRQ %02ld\n", d->hwirq);
> + pci_write_config_byte(dev, PCI_INTERRUPT_LINE, d->hwirq);
> }
Hi Mark,
Instead of modifying the common version, how about
implementing an arch specific version? Arch may have different
way to determine the irq number. Above implementation doesn't
work with x86, for example.
Regards!
Gerry
>
> static void pdev_fixup_irq(struct pci_dev *dev,
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists