|
@@ -70,7 +70,7 @@ struct of_bus {
|
|
int *addrc, int *sizec);
|
|
int *addrc, int *sizec);
|
|
int (*map)(u32 *addr, const u32 *range,
|
|
int (*map)(u32 *addr, const u32 *range,
|
|
int na, int ns, int pna);
|
|
int na, int ns, int pna);
|
|
- unsigned int (*get_flags)(const u32 *addr);
|
|
|
|
|
|
+ unsigned long (*get_flags)(const u32 *addr, unsigned long);
|
|
};
|
|
};
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -130,8 +130,10 @@ static int of_bus_default_map(u32 *addr, const u32 *range,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static unsigned int of_bus_default_get_flags(const u32 *addr)
|
|
|
|
|
|
+static unsigned long of_bus_default_get_flags(const u32 *addr, unsigned long flags)
|
|
{
|
|
{
|
|
|
|
+ if (flags)
|
|
|
|
+ return flags;
|
|
return IORESOURCE_MEM;
|
|
return IORESOURCE_MEM;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -194,17 +196,21 @@ static int of_bus_pci_map(u32 *addr, const u32 *range,
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static unsigned int of_bus_pci_get_flags(const u32 *addr)
|
|
|
|
|
|
+static unsigned long of_bus_pci_get_flags(const u32 *addr, unsigned long flags)
|
|
{
|
|
{
|
|
- unsigned int flags = 0;
|
|
|
|
u32 w = addr[0];
|
|
u32 w = addr[0];
|
|
|
|
|
|
|
|
+ /* For PCI, we override whatever child busses may have used. */
|
|
|
|
+ flags = 0;
|
|
switch((w >> 24) & 0x03) {
|
|
switch((w >> 24) & 0x03) {
|
|
case 0x01:
|
|
case 0x01:
|
|
flags |= IORESOURCE_IO;
|
|
flags |= IORESOURCE_IO;
|
|
|
|
+ break;
|
|
|
|
+
|
|
case 0x02: /* 32 bits */
|
|
case 0x02: /* 32 bits */
|
|
case 0x03: /* 64 bits */
|
|
case 0x03: /* 64 bits */
|
|
flags |= IORESOURCE_MEM;
|
|
flags |= IORESOURCE_MEM;
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
if (w & 0x40000000)
|
|
if (w & 0x40000000)
|
|
flags |= IORESOURCE_PREFETCH;
|
|
flags |= IORESOURCE_PREFETCH;
|
|
@@ -362,10 +368,11 @@ static void __init build_device_resources(struct of_device *op,
|
|
int pna, pns;
|
|
int pna, pns;
|
|
|
|
|
|
size = of_read_addr(reg + na, ns);
|
|
size = of_read_addr(reg + na, ns);
|
|
- flags = bus->get_flags(reg);
|
|
|
|
|
|
|
|
memcpy(addr, reg, na * 4);
|
|
memcpy(addr, reg, na * 4);
|
|
|
|
|
|
|
|
+ flags = bus->get_flags(reg, 0);
|
|
|
|
+
|
|
/* If the immediate parent has no ranges property to apply,
|
|
/* If the immediate parent has no ranges property to apply,
|
|
* just use a 1<->1 mapping.
|
|
* just use a 1<->1 mapping.
|
|
*/
|
|
*/
|
|
@@ -393,6 +400,8 @@ static void __init build_device_resources(struct of_device *op,
|
|
dna, dns, pna))
|
|
dna, dns, pna))
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ flags = pbus->get_flags(addr, flags);
|
|
|
|
+
|
|
dna = pna;
|
|
dna = pna;
|
|
dns = pns;
|
|
dns = pns;
|
|
dbus = pbus;
|
|
dbus = pbus;
|