|
@@ -461,6 +461,53 @@ static long pseries_little_endian_exceptions(void)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+static void __init find_and_init_phbs(void)
|
|
|
+{
|
|
|
+ struct device_node *node;
|
|
|
+ struct pci_controller *phb;
|
|
|
+ struct device_node *root = of_find_node_by_path("/");
|
|
|
+
|
|
|
+ for_each_child_of_node(root, node) {
|
|
|
+ if (node->type == NULL || (strcmp(node->type, "pci") != 0 &&
|
|
|
+ strcmp(node->type, "pciex") != 0))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ phb = pcibios_alloc_controller(node);
|
|
|
+ if (!phb)
|
|
|
+ continue;
|
|
|
+ rtas_setup_phb(phb);
|
|
|
+ pci_process_bridge_OF_ranges(phb, node, 0);
|
|
|
+ isa_bridge_find_early(phb);
|
|
|
+ }
|
|
|
+
|
|
|
+ of_node_put(root);
|
|
|
+ pci_devs_phb_init();
|
|
|
+
|
|
|
+ /*
|
|
|
+ * PCI_PROBE_ONLY and PCI_REASSIGN_ALL_BUS can be set via properties
|
|
|
+ * in chosen.
|
|
|
+ */
|
|
|
+ if (of_chosen) {
|
|
|
+ const int *prop;
|
|
|
+
|
|
|
+ prop = of_get_property(of_chosen,
|
|
|
+ "linux,pci-probe-only", NULL);
|
|
|
+ if (prop) {
|
|
|
+ if (*prop)
|
|
|
+ pci_add_flags(PCI_PROBE_ONLY);
|
|
|
+ else
|
|
|
+ pci_clear_flags(PCI_PROBE_ONLY);
|
|
|
+ }
|
|
|
+
|
|
|
+#ifdef CONFIG_PPC32 /* Will be made generic soon */
|
|
|
+ prop = of_get_property(of_chosen,
|
|
|
+ "linux,pci-assign-all-buses", NULL);
|
|
|
+ if (prop && *prop)
|
|
|
+ pci_add_flags(PCI_REASSIGN_ALL_BUS);
|
|
|
+#endif /* CONFIG_PPC32 */
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void __init pSeries_setup_arch(void)
|
|
|
{
|
|
|
set_arch_panic_timeout(10, ARCH_PANIC_TIMEOUT);
|