diff options
Diffstat (limited to 'arch/powerpc/sysdev/fsl_pci.c')
-rw-r--r-- | arch/powerpc/sysdev/fsl_pci.c | 27 |
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) |
60 | static int __init setup_one_atmu(struct ccsr_pci __iomem *pci, | 61 | static 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); | |||
392 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header); | 393 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header); |
393 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header); | 394 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header); |
394 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header); | 395 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header); |
396 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1011E, quirk_fsl_pcie_header); | ||
397 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1011, quirk_fsl_pcie_header); | ||
398 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013E, quirk_fsl_pcie_header); | ||
399 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013, quirk_fsl_pcie_header); | ||
400 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020E, quirk_fsl_pcie_header); | ||
401 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020, quirk_fsl_pcie_header); | ||
402 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022E, quirk_fsl_pcie_header); | ||
403 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022, quirk_fsl_pcie_header); | ||
404 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010E, quirk_fsl_pcie_header); | ||
405 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010, quirk_fsl_pcie_header); | ||
395 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020E, quirk_fsl_pcie_header); | 406 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020E, quirk_fsl_pcie_header); |
396 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020, quirk_fsl_pcie_header); | 407 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020, quirk_fsl_pcie_header); |
397 | #endif /* CONFIG_PPC_85xx || CONFIG_PPC_86xx */ | 408 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040E, quirk_fsl_pcie_header); |
409 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040, quirk_fsl_pcie_header); | ||
410 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080E, quirk_fsl_pcie_header); | ||
411 | DECLARE_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) |
400 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8314E, quirk_fsl_pcie_header); | 415 | DECLARE_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, | |||
501 | static int mpc83xx_pcie_write_config(struct pci_bus *bus, unsigned int devfn, | 515 | static 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); |