OSDN Git Service

[POWERPC] Resolve the BUID for RTAS PCI config space accesses
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Sat, 11 Nov 2006 06:25:06 +0000 (17:25 +1100)
committerPaul Mackerras <paulus@samba.org>
Mon, 4 Dec 2006 09:38:45 +0000 (20:38 +1100)
The BUID is the first entry of a PCI host bridge "reg" property.

Now that PCI busses can be anywhere in the device-tree, we need to
fully translate the value there to a CPU physical address before
we can use it with RTAS.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/kernel/rtas_pci.c

index b4a0de7..2576e12 100644 (file)
@@ -231,32 +231,13 @@ void __init init_pci_config_tokens (void)
 
 unsigned long __devinit get_phb_buid (struct device_node *phb)
 {
-       int addr_cells;
-       const unsigned int *buid_vals;
-       unsigned int len;
-       unsigned long buid;
-
-       if (ibm_read_pci_config == -1) return 0;
+       struct resource r;
 
-       /* PHB's will always be children of the root node,
-        * or so it is promised by the current firmware. */
-       if (phb->parent == NULL)
+       if (ibm_read_pci_config == -1)
                return 0;
-       if (phb->parent->parent)
-               return 0;
-
-       buid_vals = get_property(phb, "reg", &len);
-       if (buid_vals == NULL)
+       if (of_address_to_resource(phb, 0, &r))
                return 0;
-
-       addr_cells = prom_n_addr_cells(phb);
-       if (addr_cells == 1) {
-               buid = (unsigned long) buid_vals[0];
-       } else {
-               buid = (((unsigned long)buid_vals[0]) << 32UL) |
-                       (((unsigned long)buid_vals[1]) & 0xffffffff);
-       }
-       return buid;
+       return r.start;
 }
 
 static int phb_set_bus_ranges(struct device_node *dev,