提交 917bfd93 编写于 作者: A Alex Williamson 提交者: Bjorn Helgaas

ACPI / PCI: Account for ARI in _PRT lookups

The PCIe specification, rev 3.0, section 2.2.8.1, contains the following
implementation note:

  Virtual Wire Mapping for INTx Interrupts From ARI Devices

  The implied Device Number for an ARI Device is 0.  When ARI-aware
  software (including BIOS and operating system) enables ARI Forwarding in
  the Downstream Port immediately above an ARI Device in order to access
  its Extended Functions, software must comprehend that the Downstream Port
  will use Device Number 0 for the virtual wire mappings of INTx interrupts
  coming from all Functions of the ARI Device.  If non-ARI-aware software
  attempts to determine the virtual wire mappings for Extended Functions,
  it can come up with incorrect mappings by examining the traditional
  Device Number field and finding it to be non-0.

We account for this in pci_swizzle_interrupt_pin(), but it looks like we
miss it here, looking for a _PRT entry with a slot matching the ARI device
slot number.  This can cause errors like:

  pcieport 0000:80:03.0: can't derive routing for PCI INT B
  sfc 0000:82:01.1: PCI INT B: no GSI

pci_dev.irq is then invalid, resulting in errors for drivers that attempt
to enable INTx on the device.  Fix by using slot 0 for ARI enabled devices.
Signed-off-by: NAlex Williamson <alex.williamson@redhat.com>
Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
Reviewed-by: NDon Dutile <ddutile@redhat.com>
Acked-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
上级 19bdb6e4
...@@ -163,7 +163,7 @@ static int acpi_pci_irq_check_entry(acpi_handle handle, struct pci_dev *dev, ...@@ -163,7 +163,7 @@ static int acpi_pci_irq_check_entry(acpi_handle handle, struct pci_dev *dev,
{ {
int segment = pci_domain_nr(dev->bus); int segment = pci_domain_nr(dev->bus);
int bus = dev->bus->number; int bus = dev->bus->number;
int device = PCI_SLOT(dev->devfn); int device = pci_ari_enabled(dev->bus) ? 0 : PCI_SLOT(dev->devfn);
struct acpi_prt_entry *entry; struct acpi_prt_entry *entry;
if (((prt->address >> 16) & 0xffff) != device || if (((prt->address >> 16) & 0xffff) != device ||
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册