[POWERPC] Fixup resources on pci_bus for PCIe PHB when no device is connected
authorKumar Gala <galak@kernel.crashing.org>
Thu, 19 Jul 2007 20:29:53 +0000 (15:29 -0500)
committerKumar Gala <galak@kernel.crashing.org>
Mon, 23 Jul 2007 15:27:08 +0000 (10:27 -0500)
On the 85xx/86xx PCIe controllers if there is no device connected to the
PHB we will still allocate a pci_bus for downstream bus of the virtual
P2P bridge. However the resources allocated to the downstream bus are not
correct and so we just mimic the resources from the upstream pci_bus.

Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
arch/powerpc/platforms/85xx/mpc85xx_cds.c
arch/powerpc/platforms/86xx/mpc86xx_hpcn.c
arch/powerpc/sysdev/fsl_pci.c
arch/powerpc/sysdev/fsl_pci.h

index 2539bb56069428f302f99ba1e5e9b0ee3908799d..9b559ebc66f845609e6baa295319b03cf8526c93 100644 (file)
@@ -272,4 +272,5 @@ define_machine(mpc85xx_cds) {
        .restart        = mpc85xx_restart,
        .calibrate_decr = generic_calibrate_decr,
        .progress       = udbg_progress,
+       .pcibios_fixup_bus      = fsl_pcibios_fixup_bus,
 };
index e67e10d3272f31d97c5c2e41080291b238e31a73..e9eaa0749ae6405912d7d18fdd6615d75c412ff4 100644 (file)
@@ -431,7 +431,6 @@ mpc86xx_time_init(void)
        return 0;
 }
 
-
 define_machine(mpc86xx_hpcn) {
        .name                   = "MPC86xx HPCN",
        .probe                  = mpc86xx_hpcn_probe,
@@ -443,4 +442,5 @@ define_machine(mpc86xx_hpcn) {
        .time_init              = mpc86xx_time_init,
        .calibrate_decr         = generic_calibrate_decr,
        .progress               = udbg_progress,
+       .pcibios_fixup_bus      = fsl_pcibios_fixup_bus,
 };
index 2eefcde5b0da8d228b94c1615afe761de0de4946..faafae601a728c05e6a0f199e3d23a17fc684752 100644 (file)
@@ -142,6 +142,20 @@ int __init fsl_pcie_check_link(struct pci_controller *hose)
        return 0;
 }
 
+void fsl_pcibios_fixup_bus(struct pci_bus *bus)
+{
+       struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
+       int i;
+
+       /* deal with bogus pci_bus when we don't have anything connected on PCIe */
+       if (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK) {
+               if (bus->parent) {
+                       for (i = 0; i < 4; ++i)
+                               bus->resource[i] = bus->parent->resource[i];
+               }
+       }
+}
+
 int __init fsl_add_bridge(struct device_node *dev, int is_primary)
 {
        int len;
index 700d4782799485b3371b48b973d402bbc6809e3e..37b04ad26571cd4fc59920ba615a4ed869428646 100644 (file)
@@ -82,6 +82,7 @@ struct ccsr_pci {
 };
 
 extern int fsl_add_bridge(struct device_node *dev, int is_primary);
+extern void fsl_pcibios_fixup_bus(struct pci_bus *bus);
 
 #endif /* __POWERPC_FSL_PCI_H */
 #endif /* __KERNEL__ */