Lines 708-714
static unsigned int __init pci_irq_swizzle(struct device_node *dp,
Link Here
|
708 |
unsigned int irq) |
708 |
unsigned int irq) |
709 |
{ |
709 |
{ |
710 |
struct linux_prom_pci_registers *regs; |
710 |
struct linux_prom_pci_registers *regs; |
711 |
unsigned int devfn, slot, ret; |
711 |
unsigned int bus, devfn, slot, ret; |
712 |
|
712 |
|
713 |
if (irq < 1 || irq > 4) |
713 |
if (irq < 1 || irq > 4) |
714 |
return irq; |
714 |
return irq; |
Lines 717-726
static unsigned int __init pci_irq_swizzle(struct device_node *dp,
Link Here
|
717 |
if (!regs) |
717 |
if (!regs) |
718 |
return irq; |
718 |
return irq; |
719 |
|
719 |
|
|
|
720 |
bus = (regs->phys_hi >> 16) & 0xff; |
720 |
devfn = (regs->phys_hi >> 8) & 0xff; |
721 |
devfn = (regs->phys_hi >> 8) & 0xff; |
721 |
slot = (devfn >> 3) & 0x1f; |
722 |
slot = (devfn >> 3) & 0x1f; |
722 |
|
723 |
|
723 |
ret = ((irq - 1 + (slot & 3)) & 3) + 1; |
724 |
if (pp->irq_trans) { |
|
|
725 |
/* Derived from Table 8-3, U2P User's Manual. This branch |
726 |
* is handling a PCI controller that lacks a proper set of |
727 |
* interrupt-map and interrupt-map-mask properties. The |
728 |
* Ultra-E450 is one example. |
729 |
* |
730 |
* The bit layout is BSSLL, where: |
731 |
* B: 0 on bus A, 1 on bus B |
732 |
* D: 2-bit slot number, derived from PCI device number as |
733 |
* (dev - 1) for bus A, or (dev - 2) for bus B |
734 |
* L: 2-bit line number |
735 |
* |
736 |
* Actually, more "portable" way to calculate the funky |
737 |
* slot number is to subtract pbm->pci_first_slot from the |
738 |
* device number, and that's exactly what the pre-OF |
739 |
* sparc64 code did, but we're building this stuff generically |
740 |
* using the OBP tree, not in the PCI controller layer. |
741 |
*/ |
742 |
if (bus & 0x80) { |
743 |
/* PBM-A */ |
744 |
bus = 0x00; |
745 |
slot = (slot - 1) << 2; |
746 |
} else { |
747 |
/* PBM-B */ |
748 |
bus = 0x10; |
749 |
slot = (slot - 2) << 2; |
750 |
} |
751 |
irq -= 1; |
752 |
|
753 |
ret = (bus | slot | irq); |
754 |
} else { |
755 |
/* Going through a PCI-PCI bridge that lacks a set of |
756 |
* interrupt-map and interrupt-map-mask properties. |
757 |
*/ |
758 |
ret = ((irq - 1 + (slot & 3)) & 3) + 1; |
759 |
} |
724 |
|
760 |
|
725 |
return ret; |
761 |
return ret; |
726 |
} |
762 |
} |