|
@@ -3227,12 +3227,49 @@ static void pnv_pci_ioda_create_dbgfs(void)
|
|
|
#endif /* CONFIG_DEBUG_FS */
|
|
|
}
|
|
|
|
|
|
+static void pnv_pci_enable_bridge(struct pci_bus *bus)
|
|
|
+{
|
|
|
+ struct pci_dev *dev = bus->self;
|
|
|
+ struct pci_bus *child;
|
|
|
+
|
|
|
+ /* Empty bus ? bail */
|
|
|
+ if (list_empty(&bus->devices))
|
|
|
+ return;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If there's a bridge associated with that bus enable it. This works
|
|
|
+ * around races in the generic code if the enabling is done during
|
|
|
+ * parallel probing. This can be removed once those races have been
|
|
|
+ * fixed.
|
|
|
+ */
|
|
|
+ if (dev) {
|
|
|
+ int rc = pci_enable_device(dev);
|
|
|
+ if (rc)
|
|
|
+ pci_err(dev, "Error enabling bridge (%d)\n", rc);
|
|
|
+ pci_set_master(dev);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Perform the same to child busses */
|
|
|
+ list_for_each_entry(child, &bus->children, node)
|
|
|
+ pnv_pci_enable_bridge(child);
|
|
|
+}
|
|
|
+
|
|
|
+static void pnv_pci_enable_bridges(void)
|
|
|
+{
|
|
|
+ struct pci_controller *hose;
|
|
|
+
|
|
|
+ list_for_each_entry(hose, &hose_list, list_node)
|
|
|
+ pnv_pci_enable_bridge(hose->bus);
|
|
|
+}
|
|
|
+
|
|
|
static void pnv_pci_ioda_fixup(void)
|
|
|
{
|
|
|
pnv_pci_ioda_setup_PEs();
|
|
|
pnv_pci_ioda_setup_iommu_api();
|
|
|
pnv_pci_ioda_create_dbgfs();
|
|
|
|
|
|
+ pnv_pci_enable_bridges();
|
|
|
+
|
|
|
#ifdef CONFIG_EEH
|
|
|
pnv_eeh_post_init();
|
|
|
#endif
|