fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / powerpc / platforms / pseries / pci_dlpar.c
index 44abdeb..ac56b86 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/pci.h>
 #include <asm/pci-bridge.h>
 #include <asm/ppc-pci.h>
+#include <asm/firmware.h>
 
 static struct pci_bus *
 find_bus_among_children(struct pci_bus *bus,
@@ -92,8 +93,8 @@ pcibios_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus)
                if (list_empty(&dev->global_list)) {
                        int i;
 
-                       /* Need to setup IOMMU tables */
-                       ppc_md.iommu_dev_setup(dev);
+                       /* Fill device archdata and setup iommu table */
+                       pcibios_setup_new_device(dev);
 
                        if(fix_bus)
                                pcibios_fixup_device_resources(dev, bus);
@@ -152,20 +153,24 @@ pcibios_pci_config_bridge(struct pci_dev *dev)
 void
 pcibios_add_pci_devices(struct pci_bus * bus)
 {
-       int slotno, num;
+       int slotno, num, mode;
        struct pci_dev *dev;
        struct device_node *dn = pci_bus_to_OF_node(bus);
 
        eeh_add_device_tree_early(dn);
 
-       if (_machine == PLATFORM_PSERIES_LPAR) {
+       mode = PCI_PROBE_NORMAL;
+       if (ppc_md.pci_probe_mode)
+               mode = ppc_md.pci_probe_mode(bus);
+
+       if (mode == PCI_PROBE_DEVTREE) {
                /* use ofdt-based probe */
                of_scan_bus(dn, bus);
                if (!list_empty(&bus->devices)) {
                        pcibios_fixup_new_pci_devices(bus, 0);
                        pci_bus_add_devices(bus);
                }
-       } else {
+       } else if (mode == PCI_PROBE_NORMAL) {
                /* use legacy probe */
                slotno = PCI_SLOT(PCI_DN(dn->child)->devfn);
                num = pci_scan_slot(bus, PCI_DEVFN(slotno, 0));
@@ -190,7 +195,7 @@ struct pci_controller * __devinit init_phb_dynamic(struct device_node *dn)
        phb = pcibios_alloc_controller(dn);
        if (!phb)
                return NULL;
-       setup_phb(dn, phb);
+       rtas_setup_phb(phb);
        pci_process_bridge_OF_ranges(phb, dn, 0);
 
        pci_setup_phb_io_dynamic(phb, primary);