From: Nikolai Zhubr <zhubr.2@gmail.com>
To: "Maciej W. Rozycki" <macro@orcam.me.uk>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
"H. Peter Anvin" <hpa@zytor.com>, Arnd Bergmann <arnd@kernel.org>,
x86@kernel.org, linux-pci@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] x86/PCI: Handle PIRQ routing tables with no router device given
Date: Tue, 06 Jul 2021 13:28:34 +0300 [thread overview]
Message-ID: <60E43052.8040802@gmail.com> (raw)
In-Reply-To: <alpine.DEB.2.21.2107051133010.33206@angie.orcam.me.uk>
Hello Maciej,
05.07.2021 13:46, Maciej W. Rozycki:
> PIRQ routing tables provided by the PCI BIOS usually specify the PCI
> vendor:device ID as well as the bus address of the device implementing
> the PIRQ router, e.g.:
[...]
> linux-x86-pirq-router-nodev.diff
This one throws a panic in bus_find_device() here.
I can not yet get a good printout because scrollback does not work.
Maybe it is because of 4.14 kernel, and in order to apply it I had to
change pci_get_domain_bus_and_slot back to pci_get_bus_and_slot.
I'll try to also test with 5.x kernel later today.
Thank you,
Regards,
Nikolai
> Index: linux-macro-ide-tty/arch/x86/pci/irq.c
> ===================================================================
> --- linux-macro-ide-tty.orig/arch/x86/pci/irq.c
> +++ linux-macro-ide-tty/arch/x86/pci/irq.c
> @@ -908,10 +908,32 @@ static struct pci_dev *pirq_router_dev;
> * chipset" ?
> */
>
> +static bool __init pirq_try_router(struct irq_router *r,
> + struct irq_routing_table *rt,
> + struct pci_dev *dev)
> +{
> + struct irq_router_handler *h;
> +
> + DBG(KERN_DEBUG "PCI: Trying IRQ router for [%04x:%04x]\n",
> + dev->vendor, dev->device);
> +
> + for (h = pirq_routers; h->vendor; h++) {
> + /* First look for a router match */
> + if (rt->rtr_vendor == h->vendor&&
> + h->probe(r, dev, rt->rtr_device))
> + return true;
> + /* Fall back to a device match */
> + if (dev->vendor == h->vendor&&
> + h->probe(r, dev, dev->device))
> + return true;
> + }
> + return false;
> +}
> +
> static void __init pirq_find_router(struct irq_router *r)
> {
> struct irq_routing_table *rt = pirq_table;
> - struct irq_router_handler *h;
> + struct pci_dev *dev;
>
> #ifdef CONFIG_PCI_BIOS
> if (!rt->signature) {
> @@ -930,27 +952,28 @@ static void __init pirq_find_router(stru
> DBG(KERN_DEBUG "PCI: Attempting to find IRQ router for [%04x:%04x]\n",
> rt->rtr_vendor, rt->rtr_device);
>
> - pirq_router_dev = pci_get_domain_bus_and_slot(0, rt->rtr_bus,
> - rt->rtr_devfn);
> - if (!pirq_router_dev) {
> - DBG(KERN_DEBUG "PCI: Interrupt router not found at "
> - "%02x:%02x\n", rt->rtr_bus, rt->rtr_devfn);
> - return;
> + /* Use any vendor:device provided by the routing table or try all. */
> + if (rt->rtr_vendor) {
> + dev = pci_get_domain_bus_and_slot(0, rt->rtr_bus,
> + rt->rtr_devfn);
> + if (pirq_try_router(r, rt, dev))
> + pirq_router_dev = dev;
> + } else {
> + for_each_pci_dev(dev) {
> + if (pirq_try_router(r, rt, dev)) {
> + pirq_router_dev = dev;
> + break;
> + }
> + }
> }
>
> - for (h = pirq_routers; h->vendor; h++) {
> - /* First look for a router match */
> - if (rt->rtr_vendor == h->vendor&&
> - h->probe(r, pirq_router_dev, rt->rtr_device))
> - break;
> - /* Fall back to a device match */
> - if (pirq_router_dev->vendor == h->vendor&&
> - h->probe(r, pirq_router_dev, pirq_router_dev->device))
> - break;
> - }
> - dev_info(&pirq_router_dev->dev, "%s IRQ router [%04x:%04x]\n",
> - pirq_router.name,
> - pirq_router_dev->vendor, pirq_router_dev->device);
> + if (pirq_router_dev)
> + dev_info(&pirq_router_dev->dev, "%s IRQ router [%04x:%04x]\n",
> + pirq_router.name,
> + pirq_router_dev->vendor, pirq_router_dev->device);
> + else
> + DBG(KERN_DEBUG "PCI: Interrupt router not found at "
> + "%02x:%02x\n", rt->rtr_bus, rt->rtr_devfn);
>
> /* The device remains referenced for the kernel lifetime */
> }
>
next prev parent reply other threads:[~2021-07-06 10:17 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-05 10:46 [PATCH] x86/PCI: Handle PIRQ routing tables with no router device given Maciej W. Rozycki
2021-07-06 10:28 ` Nikolai Zhubr [this message]
2021-07-06 11:35 ` Maciej W. Rozycki
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=60E43052.8040802@gmail.com \
--to=zhubr.2@gmail.com \
--cc=arnd@kernel.org \
--cc=bhelgaas@google.com \
--cc=bp@alien8.de \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=macro@orcam.me.uk \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox