diff options
Diffstat (limited to 'arch/x86_64/kernel/pci-calgary.c')
-rw-r--r-- | arch/x86_64/kernel/pci-calgary.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/arch/x86_64/kernel/pci-calgary.c b/arch/x86_64/kernel/pci-calgary.c index 1100031528dc..3c0c7fde09d8 100644 --- a/arch/x86_64/kernel/pci-calgary.c +++ b/arch/x86_64/kernel/pci-calgary.c | |||
@@ -790,7 +790,16 @@ static inline unsigned int __init locate_register_space(struct pci_dev *dev) | |||
790 | int rionodeid; | 790 | int rionodeid; |
791 | u32 address; | 791 | u32 address; |
792 | 792 | ||
793 | rionodeid = (dev->bus->number % 15 > 4) ? 3 : 2; | 793 | /* |
794 | * Each Calgary has four busses. The first four busses (first Calgary) | ||
795 | * have RIO node ID 2, then the next four (second Calgary) have RIO | ||
796 | * node ID 3, the next four (third Calgary) have node ID 2 again, etc. | ||
797 | * We use a gross hack - relying on the dev->bus->number ordering, | ||
798 | * modulo 14 - to decide which Calgary a given bus is on. Busses 0, 1, | ||
799 | * 2 and 4 are on the first Calgary (id 2), 6, 8, a and c are on the | ||
800 | * second (id 3), and then it repeats modulo 14. | ||
801 | */ | ||
802 | rionodeid = (dev->bus->number % 14 > 4) ? 3 : 2; | ||
794 | /* | 803 | /* |
795 | * register space address calculation as follows: | 804 | * register space address calculation as follows: |
796 | * FE0MB-8MB*OneBasedChassisNumber+1MB*(RioNodeId-ChassisBase) | 805 | * FE0MB-8MB*OneBasedChassisNumber+1MB*(RioNodeId-ChassisBase) |
@@ -798,7 +807,7 @@ static inline unsigned int __init locate_register_space(struct pci_dev *dev) | |||
798 | * RioNodeId is 2 for first Calgary, 3 for second Calgary | 807 | * RioNodeId is 2 for first Calgary, 3 for second Calgary |
799 | */ | 808 | */ |
800 | address = START_ADDRESS - | 809 | address = START_ADDRESS - |
801 | (0x800000 * (ONE_BASED_CHASSIS_NUM + dev->bus->number / 15)) + | 810 | (0x800000 * (ONE_BASED_CHASSIS_NUM + dev->bus->number / 14)) + |
802 | (0x100000) * (rionodeid - CHASSIS_BASE); | 811 | (0x100000) * (rionodeid - CHASSIS_BASE); |
803 | return address; | 812 | return address; |
804 | } | 813 | } |