diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/arm/mach-tegra/pcie.c | 12 | ||||
| -rw-r--r-- | arch/frv/mb93090-mb00/pci-vdk.c | 4 | ||||
| -rw-r--r-- | arch/mips/pci/pci-octeon.c | 15 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/machdep.h | 3 | ||||
| -rw-r--r-- | arch/powerpc/kernel/pci-common.c | 20 | ||||
| -rw-r--r-- | arch/powerpc/platforms/powernv/pci-ioda.c | 41 | ||||
| -rw-r--r-- | arch/tile/kernel/pci.c | 26 |
7 files changed, 76 insertions, 45 deletions
diff --git a/arch/arm/mach-tegra/pcie.c b/arch/arm/mach-tegra/pcie.c index d3ad5150d660..c25a2a4f2e3d 100644 --- a/arch/arm/mach-tegra/pcie.c +++ b/arch/arm/mach-tegra/pcie.c | |||
| @@ -367,17 +367,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf1, tegra_pcie_fixup_class); | |||
| 367 | /* Tegra PCIE requires relaxed ordering */ | 367 | /* Tegra PCIE requires relaxed ordering */ |
| 368 | static void __devinit tegra_pcie_relax_enable(struct pci_dev *dev) | 368 | static void __devinit tegra_pcie_relax_enable(struct pci_dev *dev) |
| 369 | { | 369 | { |
| 370 | u16 val16; | 370 | pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_RELAX_EN); |
| 371 | int pos = pci_find_capability(dev, PCI_CAP_ID_EXP); | ||
| 372 | |||
| 373 | if (pos <= 0) { | ||
| 374 | dev_err(&dev->dev, "skipping relaxed ordering fixup\n"); | ||
| 375 | return; | ||
| 376 | } | ||
| 377 | |||
| 378 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &val16); | ||
| 379 | val16 |= PCI_EXP_DEVCTL_RELAX_EN; | ||
| 380 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, val16); | ||
| 381 | } | 371 | } |
| 382 | DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, tegra_pcie_relax_enable); | 372 | DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, tegra_pcie_relax_enable); |
| 383 | 373 | ||
diff --git a/arch/frv/mb93090-mb00/pci-vdk.c b/arch/frv/mb93090-mb00/pci-vdk.c index d04ed14bbf0c..71e9bcf58105 100644 --- a/arch/frv/mb93090-mb00/pci-vdk.c +++ b/arch/frv/mb93090-mb00/pci-vdk.c | |||
| @@ -330,10 +330,8 @@ void __init pcibios_fixup_bus(struct pci_bus *bus) | |||
| 330 | pci_read_bridge_bases(bus); | 330 | pci_read_bridge_bases(bus); |
| 331 | 331 | ||
| 332 | if (bus->number == 0) { | 332 | if (bus->number == 0) { |
| 333 | struct list_head *ln; | ||
| 334 | struct pci_dev *dev; | 333 | struct pci_dev *dev; |
| 335 | for (ln=bus->devices.next; ln != &bus->devices; ln=ln->next) { | 334 | list_for_each_entry(dev, &bus->devices, bus_list) { |
| 336 | dev = pci_dev_b(ln); | ||
| 337 | if (dev->devfn == 0) { | 335 | if (dev->devfn == 0) { |
| 338 | dev->resource[0].start = 0; | 336 | dev->resource[0].start = 0; |
| 339 | dev->resource[0].end = 0; | 337 | dev->resource[0].end = 0; |
diff --git a/arch/mips/pci/pci-octeon.c b/arch/mips/pci/pci-octeon.c index 52a1ba70b3b6..c5dfb2c87d44 100644 --- a/arch/mips/pci/pci-octeon.c +++ b/arch/mips/pci/pci-octeon.c | |||
| @@ -117,16 +117,11 @@ int pcibios_plat_dev_init(struct pci_dev *dev) | |||
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | /* Enable the PCIe normal error reporting */ | 119 | /* Enable the PCIe normal error reporting */ |
| 120 | pos = pci_find_capability(dev, PCI_CAP_ID_EXP); | 120 | config = PCI_EXP_DEVCTL_CERE; /* Correctable Error Reporting */ |
| 121 | if (pos) { | 121 | config |= PCI_EXP_DEVCTL_NFERE; /* Non-Fatal Error Reporting */ |
| 122 | /* Update Device Control */ | 122 | config |= PCI_EXP_DEVCTL_FERE; /* Fatal Error Reporting */ |
| 123 | pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &config); | 123 | config |= PCI_EXP_DEVCTL_URRE; /* Unsupported Request */ |
| 124 | config |= PCI_EXP_DEVCTL_CERE; /* Correctable Error Reporting */ | 124 | pcie_capability_set_word(dev, PCI_EXP_DEVCTL, config); |
| 125 | config |= PCI_EXP_DEVCTL_NFERE; /* Non-Fatal Error Reporting */ | ||
| 126 | config |= PCI_EXP_DEVCTL_FERE; /* Fatal Error Reporting */ | ||
| 127 | config |= PCI_EXP_DEVCTL_URRE; /* Unsupported Request */ | ||
| 128 | pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, config); | ||
| 129 | } | ||
| 130 | 125 | ||
| 131 | /* Find the Advanced Error Reporting capability */ | 126 | /* Find the Advanced Error Reporting capability */ |
| 132 | pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR); | 127 | pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR); |
diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h index 42ce570812c1..f7706d722b39 100644 --- a/arch/powerpc/include/asm/machdep.h +++ b/arch/powerpc/include/asm/machdep.h | |||
| @@ -214,6 +214,9 @@ struct machdep_calls { | |||
| 214 | /* Called after scan and before resource survey */ | 214 | /* Called after scan and before resource survey */ |
| 215 | void (*pcibios_fixup_phb)(struct pci_controller *hose); | 215 | void (*pcibios_fixup_phb)(struct pci_controller *hose); |
| 216 | 216 | ||
| 217 | /* Called during PCI resource reassignment */ | ||
| 218 | resource_size_t (*pcibios_window_alignment)(struct pci_bus *, unsigned long type); | ||
| 219 | |||
| 217 | /* Called to shutdown machine specific hardware not already controlled | 220 | /* Called to shutdown machine specific hardware not already controlled |
| 218 | * by other drivers. | 221 | * by other drivers. |
| 219 | */ | 222 | */ |
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 2aa04f29e1de..43fea543d686 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
| @@ -99,6 +99,26 @@ void pcibios_free_controller(struct pci_controller *phb) | |||
| 99 | kfree(phb); | 99 | kfree(phb); |
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | /* | ||
| 103 | * The function is used to return the minimal alignment | ||
| 104 | * for memory or I/O windows of the associated P2P bridge. | ||
| 105 | * By default, 4KiB alignment for I/O windows and 1MiB for | ||
| 106 | * memory windows. | ||
| 107 | */ | ||
| 108 | resource_size_t pcibios_window_alignment(struct pci_bus *bus, | ||
| 109 | unsigned long type) | ||
| 110 | { | ||
| 111 | if (ppc_md.pcibios_window_alignment) | ||
| 112 | return ppc_md.pcibios_window_alignment(bus, type); | ||
| 113 | |||
| 114 | /* | ||
| 115 | * PCI core will figure out the default | ||
| 116 | * alignment: 4KiB for I/O and 1MiB for | ||
| 117 | * memory window. | ||
| 118 | */ | ||
| 119 | return 1; | ||
| 120 | } | ||
| 121 | |||
| 102 | static resource_size_t pcibios_io_size(const struct pci_controller *hose) | 122 | static resource_size_t pcibios_io_size(const struct pci_controller *hose) |
| 103 | { | 123 | { |
| 104 | #ifdef CONFIG_PPC64 | 124 | #ifdef CONFIG_PPC64 |
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 9cda6a1ad0cf..0e7eccc0f88d 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | |||
| @@ -855,7 +855,7 @@ static void __devinit pnv_ioda_setup_PEs(struct pci_bus *bus) | |||
| 855 | if (pe == NULL) | 855 | if (pe == NULL) |
| 856 | continue; | 856 | continue; |
| 857 | /* Leaving the PCIe domain ... single PE# */ | 857 | /* Leaving the PCIe domain ... single PE# */ |
| 858 | if (dev->pcie_type == PCI_EXP_TYPE_PCI_BRIDGE) | 858 | if (pci_pcie_type(dev) == PCI_EXP_TYPE_PCI_BRIDGE) |
| 859 | pnv_ioda_setup_bus_PE(dev, pe); | 859 | pnv_ioda_setup_bus_PE(dev, pe); |
| 860 | else if (dev->subordinate) | 860 | else if (dev->subordinate) |
| 861 | pnv_ioda_setup_PEs(dev->subordinate); | 861 | pnv_ioda_setup_PEs(dev->subordinate); |
| @@ -1139,6 +1139,44 @@ static void __devinit pnv_pci_ioda_fixup_phb(struct pci_controller *hose) | |||
| 1139 | } | 1139 | } |
| 1140 | } | 1140 | } |
| 1141 | 1141 | ||
| 1142 | /* | ||
| 1143 | * Returns the alignment for I/O or memory windows for P2P | ||
| 1144 | * bridges. That actually depends on how PEs are segmented. | ||
| 1145 | * For now, we return I/O or M32 segment size for PE sensitive | ||
| 1146 | * P2P bridges. Otherwise, the default values (4KiB for I/O, | ||
| 1147 | * 1MiB for memory) will be returned. | ||
| 1148 | * | ||
| 1149 | * The current PCI bus might be put into one PE, which was | ||
| 1150 | * create against the parent PCI bridge. For that case, we | ||
| 1151 | * needn't enlarge the alignment so that we can save some | ||
| 1152 | * resources. | ||
| 1153 | */ | ||
| 1154 | static resource_size_t pnv_pci_window_alignment(struct pci_bus *bus, | ||
| 1155 | unsigned long type) | ||
| 1156 | { | ||
| 1157 | struct pci_dev *bridge; | ||
| 1158 | struct pci_controller *hose = pci_bus_to_host(bus); | ||
| 1159 | struct pnv_phb *phb = hose->private_data; | ||
| 1160 | int num_pci_bridges = 0; | ||
| 1161 | |||
| 1162 | bridge = bus->self; | ||
| 1163 | while (bridge) { | ||
| 1164 | if (pci_pcie_type(bridge) == PCI_EXP_TYPE_PCI_BRIDGE) { | ||
| 1165 | num_pci_bridges++; | ||
| 1166 | if (num_pci_bridges >= 2) | ||
| 1167 | return 1; | ||
| 1168 | } | ||
| 1169 | |||
| 1170 | bridge = bridge->bus->self; | ||
| 1171 | } | ||
| 1172 | |||
| 1173 | /* We need support prefetchable memory window later */ | ||
| 1174 | if (type & IORESOURCE_MEM) | ||
| 1175 | return phb->ioda.m32_segsize; | ||
| 1176 | |||
| 1177 | return phb->ioda.io_segsize; | ||
| 1178 | } | ||
| 1179 | |||
| 1142 | /* Prevent enabling devices for which we couldn't properly | 1180 | /* Prevent enabling devices for which we couldn't properly |
| 1143 | * assign a PE | 1181 | * assign a PE |
| 1144 | */ | 1182 | */ |
| @@ -1306,6 +1344,7 @@ void __init pnv_pci_init_ioda1_phb(struct device_node *np) | |||
| 1306 | */ | 1344 | */ |
| 1307 | ppc_md.pcibios_fixup_phb = pnv_pci_ioda_fixup_phb; | 1345 | ppc_md.pcibios_fixup_phb = pnv_pci_ioda_fixup_phb; |
| 1308 | ppc_md.pcibios_enable_device_hook = pnv_pci_enable_device_hook; | 1346 | ppc_md.pcibios_enable_device_hook = pnv_pci_enable_device_hook; |
| 1347 | ppc_md.pcibios_window_alignment = pnv_pci_window_alignment; | ||
| 1309 | pci_add_flags(PCI_PROBE_ONLY | PCI_REASSIGN_ALL_RSRC); | 1348 | pci_add_flags(PCI_PROBE_ONLY | PCI_REASSIGN_ALL_RSRC); |
| 1310 | 1349 | ||
| 1311 | /* Reset IODA tables to a clean state */ | 1350 | /* Reset IODA tables to a clean state */ |
diff --git a/arch/tile/kernel/pci.c b/arch/tile/kernel/pci.c index 33c10864d2f7..d2292be6fb90 100644 --- a/arch/tile/kernel/pci.c +++ b/arch/tile/kernel/pci.c | |||
| @@ -246,16 +246,13 @@ static void __devinit fixup_read_and_payload_sizes(void) | |||
| 246 | 246 | ||
| 247 | /* Scan for the smallest maximum payload size. */ | 247 | /* Scan for the smallest maximum payload size. */ |
| 248 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | 248 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { |
| 249 | int pcie_caps_offset; | ||
| 250 | u32 devcap; | 249 | u32 devcap; |
| 251 | int max_payload; | 250 | int max_payload; |
| 252 | 251 | ||
| 253 | pcie_caps_offset = pci_find_capability(dev, PCI_CAP_ID_EXP); | 252 | if (!pci_is_pcie(dev)) |
| 254 | if (pcie_caps_offset == 0) | ||
| 255 | continue; | 253 | continue; |
| 256 | 254 | ||
| 257 | pci_read_config_dword(dev, pcie_caps_offset + PCI_EXP_DEVCAP, | 255 | pcie_capability_read_dword(dev, PCI_EXP_DEVCAP, &devcap); |
| 258 | &devcap); | ||
| 259 | max_payload = devcap & PCI_EXP_DEVCAP_PAYLOAD; | 256 | max_payload = devcap & PCI_EXP_DEVCAP_PAYLOAD; |
| 260 | if (max_payload < smallest_max_payload) | 257 | if (max_payload < smallest_max_payload) |
| 261 | smallest_max_payload = max_payload; | 258 | smallest_max_payload = max_payload; |
| @@ -263,21 +260,10 @@ static void __devinit fixup_read_and_payload_sizes(void) | |||
| 263 | 260 | ||
| 264 | /* Now, set the max_payload_size for all devices to that value. */ | 261 | /* Now, set the max_payload_size for all devices to that value. */ |
| 265 | new_values = (max_read_size << 12) | (smallest_max_payload << 5); | 262 | new_values = (max_read_size << 12) | (smallest_max_payload << 5); |
| 266 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | 263 | while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) |
| 267 | int pcie_caps_offset; | 264 | pcie_capability_clear_and_set_word(dev, PCI_EXP_DEVCTL, |
| 268 | u16 devctl; | 265 | PCI_EXP_DEVCTL_PAYLOAD | PCI_EXP_DEVCTL_READRQ, |
| 269 | 266 | new_values); | |
| 270 | pcie_caps_offset = pci_find_capability(dev, PCI_CAP_ID_EXP); | ||
| 271 | if (pcie_caps_offset == 0) | ||
| 272 | continue; | ||
| 273 | |||
| 274 | pci_read_config_word(dev, pcie_caps_offset + PCI_EXP_DEVCTL, | ||
| 275 | &devctl); | ||
| 276 | devctl &= ~(PCI_EXP_DEVCTL_PAYLOAD | PCI_EXP_DEVCTL_READRQ); | ||
| 277 | devctl |= new_values; | ||
| 278 | pci_write_config_word(dev, pcie_caps_offset + PCI_EXP_DEVCTL, | ||
| 279 | devctl); | ||
| 280 | } | ||
| 281 | } | 267 | } |
| 282 | 268 | ||
| 283 | 269 | ||
