unsigned long pci_dram_offset = 0;
 int pcibios_assign_bus_offset = 1;
 
+/* Default PCI flags is 0 */
+unsigned int ppc_pci_flags;
+
 void pcibios_make_OF_bus_map(void);
 
 static void pcibios_fixup_resources(struct pci_dev* dev);
 /* By default, we don't re-assign bus numbers. We do this only on
  * some pmacs
  */
-int pci_assign_all_buses;
+static int pci_assign_all_buses;
 
 LIST_HEAD(hose_list);
 
 }
 EXPORT_SYMBOL(pcibios_bus_to_resource);
 
+static int skip_isa_ioresource_align(struct pci_dev *dev)
+{
+       if ((ppc_pci_flags & PPC_PCI_CAN_SKIP_ISA_ALIGN) &&
+           !(dev->bus->bridge_ctl & PCI_BRIDGE_CTL_ISA))
+               return 1;
+       return 0;
+}
+
 /*
  * We need to avoid collisions with `mirrored' VGA ports
  * and other strange ISA hardware, so we always want the
        if (res->flags & IORESOURCE_IO) {
                resource_size_t start = res->start;
 
+               if (skip_isa_ioresource_align(dev))
+                       return;
                if (start & 0x300) {
                        start = (start + 0x3ff) & ~0x3ff;
                        res->start = start;
                                continue;
                        if (bus->parent == NULL)
                                pr = (res->flags & IORESOURCE_IO)?
-                                       &ioport_resource: &iomem_resource;
+                                       &ioport_resource : &iomem_resource;
                        else {
+                               /* Don't bother with non-root busses when
+                                * re-assigning all resources.
+                                */
+                               if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)
+                                       continue;
                                pr = pci_find_parent_resource(bus->self, res);
                                if (pr == res) {
                                        /* this happens when the generic PCI
 
        printk(KERN_INFO "PCI: Probing PCI hardware\n");
 
+       if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_BUS)
+               pci_assign_all_buses = 1;
+
        /* Scan all of the recorded PCI controllers.  */
        list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
                if (pci_assign_all_buses)
        if (ppc_md.pcibios_fixup)
                ppc_md.pcibios_fixup();
 
-       /* Allocate and assign resources */
+       /* Allocate and assign resources. If we re-assign everything, then
+        * we skip the allocate phase
+        */
        pcibios_allocate_bus_resources(&pci_root_buses);
-       pcibios_allocate_resources(0);
-       pcibios_allocate_resources(1);
-
-       DBG("PCI: Assigning unassigned resouces...\n");
-       pci_assign_unassigned_resources();
+       if (!(ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)) {
+               pcibios_allocate_resources(0);
+               pcibios_allocate_resources(1);
+       }
+       if (!(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) {
+               DBG("PCI: Assigning unassigned resouces...\n");
+               pci_assign_unassigned_resources();
+       }
 
        /* Call machine dependent post-init code */
        if (ppc_md.pcibios_after_init)
 
 #endif
 
 unsigned long pci_probe_only = 1;
-int pci_assign_all_buses = 0;
 
 static void fixup_resource(struct resource *res, struct pci_dev *dev);
 static void do_bus_setup(struct pci_bus *bus);
 
                if (prop)
                        pci_probe_only = *prop;
 
+#ifdef CONFIG_PPC32 /* Will be made generic soon */
                prop = of_get_property(of_chosen,
                                "linux,pci-assign-all-buses", NULL);
-               if (prop)
-                       pci_assign_all_buses = *prop;
+               if (prop && *prop)
+                       ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
+#endif /* CONFIG_PPC32 */
        }
 }
 
 
 
        pr_debug("Adding MPC52xx PCI host bridge %s\n", node->full_name);
 
-       pci_assign_all_buses = 1;
+       ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
 
        if (of_address_to_resource(node, 0, &rsrc) != 0) {
                printk(KERN_ERR "Can't get %s resources\n", node->full_name);
 
        if (of_address_to_resource(np, 0, &r) || r.end - r.start < 0x10b)
                goto err;
 
-       pci_assign_all_buses = 1;
+       ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
 
        hose = pcibios_alloc_controller(np);
        if (!hose)
 
                       " bus 0\n", dev->full_name);
        }
 
-       pci_assign_all_buses = 1;
+       ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
        hose = pcibios_alloc_controller(dev);
        if (!hose)
                return -ENOMEM;
 
                printk ("RTAS supporting Pegasos OF not found, please upgrade"
                        " your firmware\n");
        }
-       pci_assign_all_buses = 1;
+       ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
        /* keep the reference to the root node */
 }
 
 
 static int __init setup_uninorth(struct pci_controller *hose,
                                 struct resource *addr)
 {
-       pci_assign_all_buses = 1;
+       ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
        has_uninorth = 1;
        hose->ops = ¯isc_pci_ops;
        hose->cfg_addr = ioremap(addr->start + 0x800000, 0x1000);
        struct device_node *np, *root;
        struct device_node *ht = NULL;
 
+#ifdef CONFIG_PPC32
+       ppc_pci_flags = PPC_PCI_CAN_SKIP_ISA_ALIGN;
+#endif
        root = of_find_node_by_path("/");
        if (root == NULL) {
                printk(KERN_CRIT "pmac_pci_init: can't find root "
         * some offset between bus number and domains for now when we
         * assign all busses should help for now
         */
-       if (pci_assign_all_buses)
+       if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_BUS)
                pcibios_assign_bus_offset = 0x10;
 #endif
 }
 
                printk(KERN_WARNING "Can't get bus-range for %s, assume"
                        " bus 0\n", dev->full_name);
 
-       pci_assign_all_buses = 1;
+       ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
        hose = pcibios_alloc_controller(dev);
        if (!hose)
                return -ENOMEM;
 
 {
        setup_indirect_pci(hose, 0xfec00000, 0xfee00000, 0);
        if (machine_is_compatible("PowerMac1,1"))
-               pci_assign_all_buses = 1;
+               ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
        if (machine_is_compatible("AAPL,PowerBook1998"))
                grackle_set_loop_snoop(hose, 1);
 #if 0  /* Disabled for now, HW problems ??? */
 
 
 struct device_node;
 
+extern unsigned int ppc_pci_flags;
+enum {
+       /* Force re-assigning all resources (ignore firmware
+        * setup completely)
+        */
+       PPC_PCI_REASSIGN_ALL_RSRC       = 0x00000001,
+
+       /* Re-assign all bus numbers */
+       PPC_PCI_REASSIGN_ALL_BUS        = 0x00000002,
+
+       /* Do not try to assign, just use existing setup */
+       PPC_PCI_PROBE_ONLY              = 0x00000004,
+
+       /* Don't bother with ISA alignment unless the bridge has
+        * ISA forwarding enabled
+        */
+       PPC_PCI_CAN_SKIP_ISA_ALIGN      = 0x00000008,
+};
+
+
 /*
  * Structure of a PCI controller (host bridge)
  */
 
  * Set this to 1 if you want the kernel to re-assign all PCI
  * bus numbers
  */
-extern int pci_assign_all_buses;
-#define pcibios_assign_all_busses()    (pci_assign_all_buses)
-
+#ifdef CONFIG_PPC64
+#define pcibios_assign_all_busses()    0
+#else
+#define pcibios_assign_all_busses()            (ppc_pci_flags & \
+                                        PPC_PCI_REASSIGN_ALL_BUS)
+#endif
 #define pcibios_scan_all_fns(a, b)     0
 
 static inline void pcibios_set_master(struct pci_dev *dev)