|
@@ -128,12 +128,35 @@ static void of_bus_pci_count_cells(struct device_node *np,
|
|
|
*sizec = 2;
|
|
|
}
|
|
|
|
|
|
+static unsigned int of_bus_pci_get_flags(const u32 *addr)
|
|
|
+{
|
|
|
+ unsigned int flags = 0;
|
|
|
+ u32 w = addr[0];
|
|
|
+
|
|
|
+ switch((w >> 24) & 0x03) {
|
|
|
+ case 0x01:
|
|
|
+ flags |= IORESOURCE_IO;
|
|
|
+ break;
|
|
|
+ case 0x02: /* 32 bits */
|
|
|
+ case 0x03: /* 64 bits */
|
|
|
+ flags |= IORESOURCE_MEM;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (w & 0x40000000)
|
|
|
+ flags |= IORESOURCE_PREFETCH;
|
|
|
+ return flags;
|
|
|
+}
|
|
|
+
|
|
|
static u64 of_bus_pci_map(u32 *addr, const u32 *range, int na, int ns, int pna)
|
|
|
{
|
|
|
u64 cp, s, da;
|
|
|
+ unsigned int af, rf;
|
|
|
+
|
|
|
+ af = of_bus_pci_get_flags(addr);
|
|
|
+ rf = of_bus_pci_get_flags(range);
|
|
|
|
|
|
/* Check address type match */
|
|
|
- if ((addr[0] ^ range[0]) & 0x03000000)
|
|
|
+ if ((af ^ rf) & (IORESOURCE_MEM | IORESOURCE_IO))
|
|
|
return OF_BAD_ADDR;
|
|
|
|
|
|
/* Read address values, skipping high cell */
|
|
@@ -153,25 +176,6 @@ static int of_bus_pci_translate(u32 *addr, u64 offset, int na)
|
|
|
return of_bus_default_translate(addr + 1, offset, na - 1);
|
|
|
}
|
|
|
|
|
|
-static unsigned int of_bus_pci_get_flags(const u32 *addr)
|
|
|
-{
|
|
|
- unsigned int flags = 0;
|
|
|
- u32 w = addr[0];
|
|
|
-
|
|
|
- switch((w >> 24) & 0x03) {
|
|
|
- case 0x01:
|
|
|
- flags |= IORESOURCE_IO;
|
|
|
- break;
|
|
|
- case 0x02: /* 32 bits */
|
|
|
- case 0x03: /* 64 bits */
|
|
|
- flags |= IORESOURCE_MEM;
|
|
|
- break;
|
|
|
- }
|
|
|
- if (w & 0x40000000)
|
|
|
- flags |= IORESOURCE_PREFETCH;
|
|
|
- return flags;
|
|
|
-}
|
|
|
-
|
|
|
const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
|
|
|
unsigned int *flags)
|
|
|
{
|