diff options
Diffstat (limited to 'arch/powerpc/sysdev/fsl_pci.c')
-rw-r--r-- | arch/powerpc/sysdev/fsl_pci.c | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 4ae933225251..818f7c6c8fa1 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * MPC83xx/85xx/86xx PCI/PCIE support routing. | 2 | * MPC83xx/85xx/86xx PCI/PCIE support routing. |
3 | * | 3 | * |
4 | * Copyright 2007-2009 Freescale Semiconductor, Inc. | 4 | * Copyright 2007-2010 Freescale Semiconductor, Inc. |
5 | * Copyright 2008-2009 MontaVista Software, Inc. | 5 | * Copyright 2008-2009 MontaVista Software, Inc. |
6 | * | 6 | * |
7 | * Initial author: Xianghua Xiao <x.xiao@freescale.com> | 7 | * Initial author: Xianghua Xiao <x.xiao@freescale.com> |
@@ -34,7 +34,7 @@ | |||
34 | #include <sysdev/fsl_soc.h> | 34 | #include <sysdev/fsl_soc.h> |
35 | #include <sysdev/fsl_pci.h> | 35 | #include <sysdev/fsl_pci.h> |
36 | 36 | ||
37 | static int fsl_pcie_bus_fixup; | 37 | static int fsl_pcie_bus_fixup, is_mpc83xx_pci; |
38 | 38 | ||
39 | static void __init quirk_fsl_pcie_header(struct pci_dev *dev) | 39 | static void __init quirk_fsl_pcie_header(struct pci_dev *dev) |
40 | { | 40 | { |
@@ -407,10 +407,18 @@ DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010E, quirk_fsl_pcie_header); | |||
407 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010, quirk_fsl_pcie_header); | 407 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010, quirk_fsl_pcie_header); |
408 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020E, quirk_fsl_pcie_header); | 408 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020E, quirk_fsl_pcie_header); |
409 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020, quirk_fsl_pcie_header); | 409 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2020, quirk_fsl_pcie_header); |
410 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2040E, quirk_fsl_pcie_header); | ||
411 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2040, quirk_fsl_pcie_header); | ||
412 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P3041E, quirk_fsl_pcie_header); | ||
413 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P3041, quirk_fsl_pcie_header); | ||
410 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040E, quirk_fsl_pcie_header); | 414 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040E, quirk_fsl_pcie_header); |
411 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040, quirk_fsl_pcie_header); | 415 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4040, quirk_fsl_pcie_header); |
412 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080E, quirk_fsl_pcie_header); | 416 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080E, quirk_fsl_pcie_header); |
413 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080, quirk_fsl_pcie_header); | 417 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P4080, quirk_fsl_pcie_header); |
418 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P5010E, quirk_fsl_pcie_header); | ||
419 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P5010, quirk_fsl_pcie_header); | ||
420 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P5020E, quirk_fsl_pcie_header); | ||
421 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P5020, quirk_fsl_pcie_header); | ||
414 | #endif /* CONFIG_FSL_SOC_BOOKE || CONFIG_PPC_86xx */ | 422 | #endif /* CONFIG_FSL_SOC_BOOKE || CONFIG_PPC_86xx */ |
415 | 423 | ||
416 | #if defined(CONFIG_PPC_83xx) || defined(CONFIG_PPC_MPC512x) | 424 | #if defined(CONFIG_PPC_83xx) || defined(CONFIG_PPC_MPC512x) |
@@ -430,6 +438,13 @@ struct mpc83xx_pcie_priv { | |||
430 | u32 dev_base; | 438 | u32 dev_base; |
431 | }; | 439 | }; |
432 | 440 | ||
441 | struct pex_inbound_window { | ||
442 | u32 ar; | ||
443 | u32 tar; | ||
444 | u32 barl; | ||
445 | u32 barh; | ||
446 | }; | ||
447 | |||
433 | /* | 448 | /* |
434 | * With the convention of u-boot, the PCIE outbound window 0 serves | 449 | * With the convention of u-boot, the PCIE outbound window 0 serves |
435 | * as configuration transactions outbound. | 450 | * as configuration transactions outbound. |
@@ -437,6 +452,8 @@ struct mpc83xx_pcie_priv { | |||
437 | #define PEX_OUTWIN0_BAR 0xCA4 | 452 | #define PEX_OUTWIN0_BAR 0xCA4 |
438 | #define PEX_OUTWIN0_TAL 0xCA8 | 453 | #define PEX_OUTWIN0_TAL 0xCA8 |
439 | #define PEX_OUTWIN0_TAH 0xCAC | 454 | #define PEX_OUTWIN0_TAH 0xCAC |
455 | #define PEX_RC_INWIN_BASE 0xE60 | ||
456 | #define PEX_RCIWARn_EN 0x1 | ||
440 | 457 | ||
441 | static int mpc83xx_pcie_exclude_device(struct pci_bus *bus, unsigned int devfn) | 458 | static int mpc83xx_pcie_exclude_device(struct pci_bus *bus, unsigned int devfn) |
442 | { | 459 | { |
@@ -604,6 +621,8 @@ int __init mpc83xx_add_bridge(struct device_node *dev) | |||
604 | const int *bus_range; | 621 | const int *bus_range; |
605 | int primary; | 622 | int primary; |
606 | 623 | ||
624 | is_mpc83xx_pci = 1; | ||
625 | |||
607 | if (!of_device_is_available(dev)) { | 626 | if (!of_device_is_available(dev)) { |
608 | pr_warning("%s: disabled by the firmware.\n", | 627 | pr_warning("%s: disabled by the firmware.\n", |
609 | dev->full_name); | 628 | dev->full_name); |
@@ -683,3 +702,40 @@ err0: | |||
683 | return ret; | 702 | return ret; |
684 | } | 703 | } |
685 | #endif /* CONFIG_PPC_83xx */ | 704 | #endif /* CONFIG_PPC_83xx */ |
705 | |||
706 | u64 fsl_pci_immrbar_base(struct pci_controller *hose) | ||
707 | { | ||
708 | #ifdef CONFIG_PPC_83xx | ||
709 | if (is_mpc83xx_pci) { | ||
710 | struct mpc83xx_pcie_priv *pcie = hose->dn->data; | ||
711 | struct pex_inbound_window *in; | ||
712 | int i; | ||
713 | |||
714 | /* Walk the Root Complex Inbound windows to match IMMR base */ | ||
715 | in = pcie->cfg_type0 + PEX_RC_INWIN_BASE; | ||
716 | for (i = 0; i < 4; i++) { | ||
717 | /* not enabled, skip */ | ||
718 | if (!in_le32(&in[i].ar) & PEX_RCIWARn_EN) | ||
719 | continue; | ||
720 | |||
721 | if (get_immrbase() == in_le32(&in[i].tar)) | ||
722 | return (u64)in_le32(&in[i].barh) << 32 | | ||
723 | in_le32(&in[i].barl); | ||
724 | } | ||
725 | |||
726 | printk(KERN_WARNING "could not find PCI BAR matching IMMR\n"); | ||
727 | } | ||
728 | #endif | ||
729 | |||
730 | #if defined(CONFIG_FSL_SOC_BOOKE) || defined(CONFIG_PPC_86xx) | ||
731 | if (!is_mpc83xx_pci) { | ||
732 | u32 base; | ||
733 | |||
734 | pci_bus_read_config_dword(hose->bus, | ||
735 | PCI_DEVFN(0, 0), PCI_BASE_ADDRESS_0, &base); | ||
736 | return base; | ||
737 | } | ||
738 | #endif | ||
739 | |||
740 | return 0; | ||
741 | } | ||