aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/sysdev/fsl_pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/sysdev/fsl_pci.c')
-rw-r--r--arch/powerpc/sysdev/fsl_pci.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c
index ae88b1448018..a14760fe513a 100644
--- a/arch/powerpc/sysdev/fsl_pci.c
+++ b/arch/powerpc/sysdev/fsl_pci.c
@@ -25,6 +25,7 @@
25#include <linux/bootmem.h> 25#include <linux/bootmem.h>
26#include <linux/lmb.h> 26#include <linux/lmb.h>
27#include <linux/log2.h> 27#include <linux/log2.h>
28#include <linux/slab.h>
28 29
29#include <asm/io.h> 30#include <asm/io.h>
30#include <asm/prom.h> 31#include <asm/prom.h>
@@ -56,7 +57,7 @@ static int __init fsl_pcie_check_link(struct pci_controller *hose)
56 return 0; 57 return 0;
57} 58}
58 59
59#if defined(CONFIG_PPC_85xx) || defined(CONFIG_PPC_86xx) 60#if defined(CONFIG_FSL_SOC_BOOKE) || defined(CONFIG_PPC_86xx)
60static int __init setup_one_atmu(struct ccsr_pci __iomem *pci, 61static int __init setup_one_atmu(struct ccsr_pci __iomem *pci,
61 unsigned int index, const struct resource *res, 62 unsigned int index, const struct resource *res,
62 resource_size_t offset) 63 resource_size_t offset)
@@ -392,9 +393,23 @@ DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8536, quirk_fsl_pcie_header);
392DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header); 393DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header);
393DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header); 394DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header);
394DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header); 395DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header);
396DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1011E, quirk_fsl_pcie_header);
397DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1011, quirk_fsl_pcie_header);
398DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013E, quirk_fsl_pcie_header);
399DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013, quirk_fsl_pcie_header);
400DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020E, quirk_fsl_pcie_header);
401DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020, quirk_fsl_pcie_header);
402DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022E, quirk_fsl_pcie_header);
403DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022, quirk_fsl_pcie_header);
404DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010E, quirk_fsl_pcie_header);
405DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010, quirk_fsl_pcie_header);
395DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020E, quirk_fsl_pcie_header); 406DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020E, quirk_fsl_pcie_header);
396DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020, quirk_fsl_pcie_header); 407DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020, quirk_fsl_pcie_header);
397#endif /* CONFIG_PPC_85xx || CONFIG_PPC_86xx */ 408DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040E, quirk_fsl_pcie_header);
409DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040, quirk_fsl_pcie_header);
410DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080E, quirk_fsl_pcie_header);
411DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080, quirk_fsl_pcie_header);
412#endif /* CONFIG_FSL_SOC_BOOKE || CONFIG_PPC_86xx */
398 413
399#if defined(CONFIG_PPC_83xx) || defined(CONFIG_PPC_MPC512x) 414#if defined(CONFIG_PPC_83xx) || defined(CONFIG_PPC_MPC512x)
400DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8314E, quirk_fsl_pcie_header); 415DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8314E, quirk_fsl_pcie_header);
@@ -450,8 +465,7 @@ static void __iomem *mpc83xx_pcie_remap_cfg(struct pci_bus *bus,
450{ 465{
451 struct pci_controller *hose = pci_bus_to_host(bus); 466 struct pci_controller *hose = pci_bus_to_host(bus);
452 struct mpc83xx_pcie_priv *pcie = hose->dn->data; 467 struct mpc83xx_pcie_priv *pcie = hose->dn->data;
453 u8 bus_no = bus->number - hose->first_busno; 468 u32 dev_base = bus->number << 24 | devfn << 16;
454 u32 dev_base = bus_no << 24 | devfn << 16;
455 int ret; 469 int ret;
456 470
457 ret = mpc83xx_pcie_exclude_device(bus, devfn); 471 ret = mpc83xx_pcie_exclude_device(bus, devfn);
@@ -501,12 +515,17 @@ static int mpc83xx_pcie_read_config(struct pci_bus *bus, unsigned int devfn,
501static int mpc83xx_pcie_write_config(struct pci_bus *bus, unsigned int devfn, 515static int mpc83xx_pcie_write_config(struct pci_bus *bus, unsigned int devfn,
502 int offset, int len, u32 val) 516 int offset, int len, u32 val)
503{ 517{
518 struct pci_controller *hose = pci_bus_to_host(bus);
504 void __iomem *cfg_addr; 519 void __iomem *cfg_addr;
505 520
506 cfg_addr = mpc83xx_pcie_remap_cfg(bus, devfn, offset); 521 cfg_addr = mpc83xx_pcie_remap_cfg(bus, devfn, offset);
507 if (!cfg_addr) 522 if (!cfg_addr)
508 return PCIBIOS_DEVICE_NOT_FOUND; 523 return PCIBIOS_DEVICE_NOT_FOUND;
509 524
525 /* PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS */
526 if (offset == PCI_PRIMARY_BUS && bus->number == hose->first_busno)
527 val &= 0xffffff00;
528
510 switch (len) { 529 switch (len) {
511 case 1: 530 case 1:
512 out_8(cfg_addr, val); 531 out_8(cfg_addr, val);