From: Chris Wright Date: Sat, 3 Sep 2005 22:33:33 +0000 (-0700) Subject: Add PCI ROM mapping fix fwd from BenH. X-Git-Tag: v2.6.13.1~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b223d89f051f4746e12a8140e86fca325151063c;p=thirdparty%2Fkernel%2Fstable-queue.git Add PCI ROM mapping fix fwd from BenH. --- diff --git a/queue/fix-pci-rom-mapping.patch b/queue/fix-pci-rom-mapping.patch new file mode 100644 index 00000000000..796e4d6184d --- /dev/null +++ b/queue/fix-pci-rom-mapping.patch @@ -0,0 +1,75 @@ +From stable-bounces@linux.kernel.org Sat Sep 3 15:29:40 2005 +From: Benjamin Herrenschmidt +To: stable@kernel.org +Date: Sun, 04 Sep 2005 08:28:05 +1000 +Subject: [PATCH] Fix PCI ROM mapping + +This fixes a problem with pci_map_rom() which doesn't properly +update the ROM BAR value with the address thas allocated for it by the +PCI code. This problem, among other, breaks boot on Mac laptops. + +It'ss a new version based on Linus latest one with better error +checking. + +Signed-off-by: Benjamin Herrenschmidt +Signed-off-by: Linus Torvalds +Signed-off-by: Chris Wright +--- + drivers/pci/rom.c | 24 +++++++++++++++++------- + 1 files changed, 17 insertions(+), 7 deletions(-) + +Index: linux-2.6.13.y/drivers/pci/rom.c +=================================================================== +--- linux-2.6.13.y.orig/drivers/pci/rom.c ++++ linux-2.6.13.y/drivers/pci/rom.c +@@ -21,13 +21,21 @@ + * between the ROM and other resources, so enabling it may disable access + * to MMIO registers or other card memory. + */ +-static void pci_enable_rom(struct pci_dev *pdev) ++static int pci_enable_rom(struct pci_dev *pdev) + { ++ struct resource *res = pdev->resource + PCI_ROM_RESOURCE; ++ struct pci_bus_region region; + u32 rom_addr; + ++ if (!res->flags) ++ return -1; ++ ++ pcibios_resource_to_bus(pdev, ®ion, res); + pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_addr); +- rom_addr |= PCI_ROM_ADDRESS_ENABLE; ++ rom_addr &= ~PCI_ROM_ADDRESS_MASK; ++ rom_addr |= region.start | PCI_ROM_ADDRESS_ENABLE; + pci_write_config_dword(pdev, pdev->rom_base_reg, rom_addr); ++ return 0; + } + + /** +@@ -71,19 +79,21 @@ void __iomem *pci_map_rom(struct pci_dev + } else { + if (res->flags & IORESOURCE_ROM_COPY) { + *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); +- return (void __iomem *)pci_resource_start(pdev, PCI_ROM_RESOURCE); ++ return (void __iomem *)pci_resource_start(pdev, ++ PCI_ROM_RESOURCE); + } else { + /* assign the ROM an address if it doesn't have one */ +- if (res->parent == NULL) +- pci_assign_resource(pdev, PCI_ROM_RESOURCE); +- ++ if (res->parent == NULL && ++ pci_assign_resource(pdev,PCI_ROM_RESOURCE)) ++ return NULL; + start = pci_resource_start(pdev, PCI_ROM_RESOURCE); + *size = pci_resource_len(pdev, PCI_ROM_RESOURCE); + if (*size == 0) + return NULL; + + /* Enable ROM space decodes */ +- pci_enable_rom(pdev); ++ if (pci_enable_rom(pdev)) ++ return NULL; + } + } + diff --git a/queue/series b/queue/series index b0fb3371927..4c011c8fe59 100644 --- a/queue/series +++ b/queue/series @@ -1,3 +1,4 @@ saa7134-dvb-must-select-tda1004x.patch aacraid-bad-BUG_ON-fix.patch fix-sk_forward_alloc-underflow-in-tcp_sendmsg.patch +fix-pci-rom-mapping.patch