Skip to content

Commit

Permalink
ACPI: PCI: always use the PCI INTx pin values, not the _PRT ones
Browse files Browse the repository at this point in the history
This patch changes pci_irq.c to always use PCI INTx pin encodings
instead of a mix of PCI and _PRT encodings.

The PCI INTx pin numbers from the PCI_INTERRUPT_PIN config register
are 0=device doesn't use interrupts, 1=INTA, ..., 4=INTD.  But the
_PRT table uses 0=INTA, ..., 3=INTD.

This patch converts the _PRT encoding to the PCI encoding immediately
when we add a _PRT entry to the global list.  All the rest of the
code can then use the PCI encoding consistently.

The point of this is to make the interrupt swizzling look the same
as on other architectures, so someday we can unify them.

Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Len Brown <len.brown@intel.com>
  • Loading branch information
Bjorn Helgaas authored and Len Brown committed Dec 31, 2008
1 parent cf68b80 commit e64e9db
Showing 1 changed file with 8 additions and 7 deletions.
15 changes: 8 additions & 7 deletions drivers/acpi/pci_irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ static DEFINE_SPINLOCK(acpi_prt_lock);

static inline char pin_name(int pin)
{
return 'A' + pin;
return 'A' + pin - 1;
}

/* --------------------------------------------------------------------------
Expand Down Expand Up @@ -203,10 +203,15 @@ acpi_pci_irq_add_entry(acpi_handle handle,
if (!entry)
return -ENOMEM;

/*
* Note that the _PRT uses 0=INTA, 1=INTB, etc, while PCI uses
* 1=INTA, 2=INTB. We use the PCI encoding throughout, so convert
* it here.
*/
entry->id.segment = segment;
entry->id.bus = bus;
entry->id.device = (prt->address >> 16) & 0xFFFF;
entry->pin = prt->pin;
entry->pin = prt->pin + 1;

do_prt_fixups(entry, prt);

Expand Down Expand Up @@ -425,7 +430,7 @@ acpi_pci_irq_derive(struct pci_dev *dev,
* PCI interrupt routing entry (eg. yenta bridge and add-in card bridge).
*/
while (irq < 0 && bridge->bus->self) {
pin = (pin + PCI_SLOT(bridge->devfn)) % 4;
pin = (((pin - 1) + PCI_SLOT(bridge->devfn)) % 4) + 1;
bridge = bridge->bus->self;

if ((bridge->class >> 8) == PCI_CLASS_BRIDGE_CARDBUS) {
Expand All @@ -437,8 +442,6 @@ acpi_pci_irq_derive(struct pci_dev *dev,
pci_name(bridge)));
return -1;
}
/* Pin is from 0 to 3 */
bridge_pin--;
pin = bridge_pin;
}

Expand Down Expand Up @@ -483,7 +486,6 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
pci_name(dev)));
return 0;
}
pin--;

/*
* First we check the PCI IRQ routing table (PRT) for an IRQ. PRT
Expand Down Expand Up @@ -566,7 +568,6 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
pin = dev->pin;
if (!pin)
return;
pin--;

/*
* First we check the PCI IRQ routing table (PRT) for an IRQ.
Expand Down

0 comments on commit e64e9db

Please sign in to comment.