]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Add PCI ROM mapping fix fwd from BenH.
authorChris Wright <chrisw@osdl.org>
Sat, 3 Sep 2005 22:33:33 +0000 (15:33 -0700)
committerChris Wright <chrisw@osdl.org>
Sat, 3 Sep 2005 22:33:33 +0000 (15:33 -0700)
queue/fix-pci-rom-mapping.patch [new file with mode: 0644]
queue/series

diff --git a/queue/fix-pci-rom-mapping.patch b/queue/fix-pci-rom-mapping.patch
new file mode 100644 (file)
index 0000000..796e4d6
--- /dev/null
@@ -0,0 +1,75 @@
+From stable-bounces@linux.kernel.org  Sat Sep  3 15:29:40 2005
+From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+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 <benh@kernel.crashing.org>
+Signed-off-by: Linus Torvalds <torvalds@osdl.org>
+Signed-off-by: Chris Wright <chrisw@osdl.org>
+---
+ 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, &region, 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;
+               }
+       }
index b0fb337192708f22d14785337f80713eca795621..4c011c8fe593fa136d21b4fc8032b83da2a24cb9 100644 (file)
@@ -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