diff options
Diffstat (limited to 'arch/powerpc/kernel/pci-common.c')
-rw-r--r-- | arch/powerpc/kernel/pci-common.c | 101 |
1 files changed, 9 insertions, 92 deletions
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index cce98d76e905..8e78e93c8185 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -38,7 +38,6 @@ | |||
38 | #include <asm/byteorder.h> | 38 | #include <asm/byteorder.h> |
39 | #include <asm/machdep.h> | 39 | #include <asm/machdep.h> |
40 | #include <asm/ppc-pci.h> | 40 | #include <asm/ppc-pci.h> |
41 | #include <asm/firmware.h> | ||
42 | #include <asm/eeh.h> | 41 | #include <asm/eeh.h> |
43 | 42 | ||
44 | static DEFINE_SPINLOCK(hose_spinlock); | 43 | static DEFINE_SPINLOCK(hose_spinlock); |
@@ -50,9 +49,6 @@ static int global_phb_number; /* Global phb counter */ | |||
50 | /* ISA Memory physical address */ | 49 | /* ISA Memory physical address */ |
51 | resource_size_t isa_mem_base; | 50 | resource_size_t isa_mem_base; |
52 | 51 | ||
53 | /* Default PCI flags is 0 on ppc32, modified at boot on ppc64 */ | ||
54 | unsigned int pci_flags = 0; | ||
55 | |||
56 | 52 | ||
57 | static struct dma_map_ops *pci_dma_ops = &dma_direct_ops; | 53 | static struct dma_map_ops *pci_dma_ops = &dma_direct_ops; |
58 | 54 | ||
@@ -219,20 +215,6 @@ static int pci_read_irq_line(struct pci_dev *pci_dev) | |||
219 | struct of_irq oirq; | 215 | struct of_irq oirq; |
220 | unsigned int virq; | 216 | unsigned int virq; |
221 | 217 | ||
222 | /* The current device-tree that iSeries generates from the HV | ||
223 | * PCI informations doesn't contain proper interrupt routing, | ||
224 | * and all the fallback would do is print out crap, so we | ||
225 | * don't attempt to resolve the interrupts here at all, some | ||
226 | * iSeries specific fixup does it. | ||
227 | * | ||
228 | * In the long run, we will hopefully fix the generated device-tree | ||
229 | * instead. | ||
230 | */ | ||
231 | #ifdef CONFIG_PPC_ISERIES | ||
232 | if (firmware_has_feature(FW_FEATURE_ISERIES)) | ||
233 | return -1; | ||
234 | #endif | ||
235 | |||
236 | pr_debug("PCI: Try to map irq for %s...\n", pci_name(pci_dev)); | 218 | pr_debug("PCI: Try to map irq for %s...\n", pci_name(pci_dev)); |
237 | 219 | ||
238 | #ifdef DEBUG | 220 | #ifdef DEBUG |
@@ -849,60 +831,6 @@ int pci_proc_domain(struct pci_bus *bus) | |||
849 | return 1; | 831 | return 1; |
850 | } | 832 | } |
851 | 833 | ||
852 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | ||
853 | struct resource *res) | ||
854 | { | ||
855 | resource_size_t offset = 0, mask = (resource_size_t)-1; | ||
856 | struct pci_controller *hose = pci_bus_to_host(dev->bus); | ||
857 | |||
858 | if (!hose) | ||
859 | return; | ||
860 | if (res->flags & IORESOURCE_IO) { | ||
861 | offset = (unsigned long)hose->io_base_virt - _IO_BASE; | ||
862 | mask = 0xffffffffu; | ||
863 | } else if (res->flags & IORESOURCE_MEM) | ||
864 | offset = hose->pci_mem_offset; | ||
865 | |||
866 | region->start = (res->start - offset) & mask; | ||
867 | region->end = (res->end - offset) & mask; | ||
868 | } | ||
869 | EXPORT_SYMBOL(pcibios_resource_to_bus); | ||
870 | |||
871 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | ||
872 | struct pci_bus_region *region) | ||
873 | { | ||
874 | resource_size_t offset = 0, mask = (resource_size_t)-1; | ||
875 | struct pci_controller *hose = pci_bus_to_host(dev->bus); | ||
876 | |||
877 | if (!hose) | ||
878 | return; | ||
879 | if (res->flags & IORESOURCE_IO) { | ||
880 | offset = (unsigned long)hose->io_base_virt - _IO_BASE; | ||
881 | mask = 0xffffffffu; | ||
882 | } else if (res->flags & IORESOURCE_MEM) | ||
883 | offset = hose->pci_mem_offset; | ||
884 | res->start = (region->start + offset) & mask; | ||
885 | res->end = (region->end + offset) & mask; | ||
886 | } | ||
887 | EXPORT_SYMBOL(pcibios_bus_to_resource); | ||
888 | |||
889 | /* Fixup a bus resource into a linux resource */ | ||
890 | static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev) | ||
891 | { | ||
892 | struct pci_controller *hose = pci_bus_to_host(dev->bus); | ||
893 | resource_size_t offset = 0, mask = (resource_size_t)-1; | ||
894 | |||
895 | if (res->flags & IORESOURCE_IO) { | ||
896 | offset = (unsigned long)hose->io_base_virt - _IO_BASE; | ||
897 | mask = 0xffffffffu; | ||
898 | } else if (res->flags & IORESOURCE_MEM) | ||
899 | offset = hose->pci_mem_offset; | ||
900 | |||
901 | res->start = (res->start + offset) & mask; | ||
902 | res->end = (res->end + offset) & mask; | ||
903 | } | ||
904 | |||
905 | |||
906 | /* This header fixup will do the resource fixup for all devices as they are | 834 | /* This header fixup will do the resource fixup for all devices as they are |
907 | * probed, but not for bridge ranges | 835 | * probed, but not for bridge ranges |
908 | */ | 836 | */ |
@@ -942,18 +870,11 @@ static void __devinit pcibios_fixup_resources(struct pci_dev *dev) | |||
942 | continue; | 870 | continue; |
943 | } | 871 | } |
944 | 872 | ||
945 | pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] fixup...\n", | 873 | pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]\n", |
946 | pci_name(dev), i, | 874 | pci_name(dev), i, |
947 | (unsigned long long)res->start,\ | 875 | (unsigned long long)res->start,\ |
948 | (unsigned long long)res->end, | 876 | (unsigned long long)res->end, |
949 | (unsigned int)res->flags); | 877 | (unsigned int)res->flags); |
950 | |||
951 | fixup_resource(res, dev); | ||
952 | |||
953 | pr_debug("PCI:%s %016llx-%016llx\n", | ||
954 | pci_name(dev), | ||
955 | (unsigned long long)res->start, | ||
956 | (unsigned long long)res->end); | ||
957 | } | 878 | } |
958 | 879 | ||
959 | /* Call machine specific resource fixup */ | 880 | /* Call machine specific resource fixup */ |
@@ -1055,27 +976,18 @@ static void __devinit pcibios_fixup_bridge(struct pci_bus *bus) | |||
1055 | continue; | 976 | continue; |
1056 | } | 977 | } |
1057 | 978 | ||
1058 | pr_debug("PCI:%s Bus rsrc %d %016llx-%016llx [%x] fixup...\n", | 979 | pr_debug("PCI:%s Bus rsrc %d %016llx-%016llx [%x]\n", |
1059 | pci_name(dev), i, | 980 | pci_name(dev), i, |
1060 | (unsigned long long)res->start,\ | 981 | (unsigned long long)res->start,\ |
1061 | (unsigned long long)res->end, | 982 | (unsigned long long)res->end, |
1062 | (unsigned int)res->flags); | 983 | (unsigned int)res->flags); |
1063 | 984 | ||
1064 | /* Perform fixup */ | ||
1065 | fixup_resource(res, dev); | ||
1066 | |||
1067 | /* Try to detect uninitialized P2P bridge resources, | 985 | /* Try to detect uninitialized P2P bridge resources, |
1068 | * and clear them out so they get re-assigned later | 986 | * and clear them out so they get re-assigned later |
1069 | */ | 987 | */ |
1070 | if (pcibios_uninitialized_bridge_resource(bus, res)) { | 988 | if (pcibios_uninitialized_bridge_resource(bus, res)) { |
1071 | res->flags = 0; | 989 | res->flags = 0; |
1072 | pr_debug("PCI:%s (unassigned)\n", pci_name(dev)); | 990 | pr_debug("PCI:%s (unassigned)\n", pci_name(dev)); |
1073 | } else { | ||
1074 | |||
1075 | pr_debug("PCI:%s %016llx-%016llx\n", | ||
1076 | pci_name(dev), | ||
1077 | (unsigned long long)res->start, | ||
1078 | (unsigned long long)res->end); | ||
1079 | } | 991 | } |
1080 | } | 992 | } |
1081 | } | 993 | } |
@@ -1565,6 +1477,11 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) | |||
1565 | return pci_enable_resources(dev, mask); | 1477 | return pci_enable_resources(dev, mask); |
1566 | } | 1478 | } |
1567 | 1479 | ||
1480 | resource_size_t pcibios_io_space_offset(struct pci_controller *hose) | ||
1481 | { | ||
1482 | return (unsigned long) hose->io_base_virt - _IO_BASE; | ||
1483 | } | ||
1484 | |||
1568 | static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources) | 1485 | static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, struct list_head *resources) |
1569 | { | 1486 | { |
1570 | struct resource *res; | 1487 | struct resource *res; |
@@ -1589,7 +1506,7 @@ static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, s | |||
1589 | (unsigned long long)res->start, | 1506 | (unsigned long long)res->start, |
1590 | (unsigned long long)res->end, | 1507 | (unsigned long long)res->end, |
1591 | (unsigned long)res->flags); | 1508 | (unsigned long)res->flags); |
1592 | pci_add_resource(resources, res); | 1509 | pci_add_resource_offset(resources, res, pcibios_io_space_offset(hose)); |
1593 | 1510 | ||
1594 | /* Hookup PHB Memory resources */ | 1511 | /* Hookup PHB Memory resources */ |
1595 | for (i = 0; i < 3; ++i) { | 1512 | for (i = 0; i < 3; ++i) { |
@@ -1612,7 +1529,7 @@ static void __devinit pcibios_setup_phb_resources(struct pci_controller *hose, s | |||
1612 | (unsigned long long)res->start, | 1529 | (unsigned long long)res->start, |
1613 | (unsigned long long)res->end, | 1530 | (unsigned long long)res->end, |
1614 | (unsigned long)res->flags); | 1531 | (unsigned long)res->flags); |
1615 | pci_add_resource(resources, res); | 1532 | pci_add_resource_offset(resources, res, hose->pci_mem_offset); |
1616 | } | 1533 | } |
1617 | 1534 | ||
1618 | pr_debug("PCI: PHB MEM offset = %016llx\n", | 1535 | pr_debug("PCI: PHB MEM offset = %016llx\n", |