From: Jiang Liu <jiang.liu@linux.intel.com> To: Marc Zyngier <marc.zyngier@arm.com>, Thomas Gleixner <tglx@linutronix.de>, Bjorn Helgaas <bhelgaas@google.com> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>, Andre Przywara <andre.przywara@arm.com>, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] PCI: Fix pcibios_update_irq misuse of irq number Date: Wed, 28 Jan 2015 23:21:05 +0800 [thread overview] Message-ID: <54C8FE61.1030304@linux.intel.com> (raw) In-Reply-To: <1422456683-797-1-git-send-email-marc.zyngier@arm.com> 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@arm.com> > Tested-by: Andre Przywara <andre.przywara@arm.com> > Signed-off-by: Marc Zyngier <marc.zyngier@arm.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, >
WARNING: multiple messages have this Message-ID (diff)
From: jiang.liu@linux.intel.com (Jiang Liu) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH] PCI: Fix pcibios_update_irq misuse of irq number Date: Wed, 28 Jan 2015 23:21:05 +0800 [thread overview] Message-ID: <54C8FE61.1030304@linux.intel.com> (raw) In-Reply-To: <1422456683-797-1-git-send-email-marc.zyngier@arm.com> 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@arm.com> > Tested-by: Andre Przywara <andre.przywara@arm.com> > Signed-off-by: Marc Zyngier <marc.zyngier@arm.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, >
next prev parent reply other threads:[~2015-01-29 2:03 UTC|newest] Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-01-28 14:51 [PATCH] PCI: Fix pcibios_update_irq misuse of irq number Marc Zyngier 2015-01-28 14:51 ` Marc Zyngier 2015-01-28 15:21 ` Jiang Liu [this message] 2015-01-28 15:21 ` Jiang Liu 2015-01-28 15:27 ` Marc Zyngier 2015-01-28 15:27 ` Marc Zyngier 2015-01-28 15:27 ` Marc Zyngier 2015-01-28 15:43 ` Bjorn Helgaas 2015-01-28 15:43 ` Bjorn Helgaas 2015-01-28 15:43 ` Bjorn Helgaas 2015-02-02 16:15 ` Marc Zyngier 2015-02-02 16:15 ` Marc Zyngier 2015-02-02 16:15 ` Marc Zyngier 2015-02-02 16:22 ` Bjorn Helgaas 2015-02-02 16:22 ` Bjorn Helgaas 2015-02-02 16:22 ` Bjorn Helgaas 2015-02-02 15:57 ` Bjorn Helgaas 2015-02-02 15:57 ` Bjorn Helgaas 2015-02-02 16:06 ` Jiang Liu 2015-02-02 16:06 ` Jiang Liu 2015-02-02 16:23 ` Marc Zyngier 2015-02-02 16:23 ` Marc Zyngier 2015-02-02 16:33 ` Russell King - ARM Linux 2015-02-02 16:33 ` Russell King - ARM Linux 2015-02-02 18:08 ` Marc Zyngier 2015-02-02 18:08 ` Marc Zyngier 2015-02-02 18:08 ` Marc Zyngier 2015-02-02 18:20 ` Russell King - ARM Linux 2015-02-02 18:20 ` Russell King - ARM Linux 2015-02-02 18:20 ` Russell King - ARM Linux 2015-02-02 17:02 ` Arnd Bergmann 2015-02-02 17:02 ` Arnd Bergmann 2015-02-03 10:38 ` Marc Zyngier 2015-02-03 10:38 ` Marc Zyngier 2015-02-03 10:38 ` Marc Zyngier 2015-02-03 11:31 ` Arnd Bergmann 2015-02-03 11:31 ` Arnd Bergmann 2015-02-03 11:31 ` Arnd Bergmann 2015-02-03 11:37 ` Marc Zyngier 2015-02-03 11:37 ` Marc Zyngier 2015-02-03 11:37 ` Marc Zyngier 2015-02-03 12:57 ` Arnd Bergmann 2015-02-03 12:57 ` Arnd Bergmann 2015-02-03 12:57 ` Arnd Bergmann 2015-02-04 15:39 ` [PATCH] kvmtool: don't use PCI config space IRQ line field Andre Przywara 2015-02-04 15:39 ` Andre Przywara 2015-02-06 18:55 ` Will Deacon 2015-02-06 18:55 ` Will Deacon 2015-02-06 19:02 ` Peter Maydell 2015-02-06 19:02 ` Peter Maydell 2015-02-06 19:07 ` Will Deacon 2015-02-06 19:07 ` Will Deacon 2015-02-07 21:24 ` arnd 2015-02-07 21:24 ` arnd at arndb.de
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=54C8FE61.1030304@linux.intel.com \ --to=jiang.liu@linux.intel.com \ --cc=andre.przywara@arm.com \ --cc=bhelgaas@google.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pci@vger.kernel.org \ --cc=lorenzo.pieralisi@arm.com \ --cc=marc.zyngier@arm.com \ --cc=tglx@linutronix.de \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.