diff options
Diffstat (limited to 'sys-kernel/gentoo-sources/files/ofpci.patch')
-rw-r--r-- | sys-kernel/gentoo-sources/files/ofpci.patch | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/sys-kernel/gentoo-sources/files/ofpci.patch b/sys-kernel/gentoo-sources/files/ofpci.patch new file mode 100644 index 0000000..29aa0af --- /dev/null +++ b/sys-kernel/gentoo-sources/files/ofpci.patch @@ -0,0 +1,100 @@ +From benh@kernel.crashing.org Thu Jul 17 15:53:31 2008 +From: Benjamin Herrenschmidt <benh@kernel.crashing.org> +Subject: powerpc: Fix OF parsing of 64 bits PCI addresses +Date: Thu, 17 Jul 2008 15:53:31 +1000 +X-Patchwork-ID: 19691 + +The OF parsing code for PCI addresses isn't always treating properly +the address space indication 0b11 (ie. 0x3) as meaning 64 bits +memory space. + +This means that it fails to parse addresses for PCI BARs that have +this encoding set by the firmware, which happens on some SLOF +versions and breaks offb palette handling on Powerstation. + +Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> +--- + +Acked-by: Segher Boessenkool <segher@kernel.crashing.org> + +--- +Index: linux-work/arch/powerpc/kernel/pci-common.c +=================================================================== +--- linux-work.orig/arch/powerpc/kernel/pci-common.c 2008-07-17 15:09:11.000000000 +1000 ++++ linux-work/arch/powerpc/kernel/pci-common.c 2008-07-17 15:09:22.000000000 +1000 +@@ -598,6 +598,7 @@ void __devinit pci_process_bridge_OF_ran + res->start = pci_addr; + break; + case 2: /* PCI Memory space */ ++ case 3: /* PCI 64 bits Memory space */ + printk(KERN_INFO + " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n", + cpu_addr, cpu_addr + size - 1, pci_addr, +Index: linux-work/arch/powerpc/kernel/prom_parse.c +=================================================================== +--- linux-work.orig/arch/powerpc/kernel/prom_parse.c 2008-07-17 15:06:43.000000000 +1000 ++++ linux-work/arch/powerpc/kernel/prom_parse.c 2008-07-17 15:08:16.000000000 +1000 +@@ -128,12 +128,35 @@ static void of_bus_pci_count_cells(struc + *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 *add + 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) + { + |