]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
drm/nouveau/bios: fix some shadowing issues, particularly acpi
authorBen Skeggs <bskeggs@redhat.com>
Fri, 4 May 2012 06:25:13 +0000 (16:25 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 24 May 2012 06:55:56 +0000 (16:55 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_bios.c

index 524f283263a946d2dc2f845adb270c5455952991..2f11e16a81a9054008cd7db3744a4ae4fa366f53 100644 (file)
@@ -196,35 +196,24 @@ static void
 bios_shadow_acpi(struct nvbios *bios)
 {
        struct pci_dev *pdev = bios->dev->pdev;
-       int ptr, len, ret;
-       u8 data[3];
+       int cnt = 65536 / ROM_BIOS_PAGE;
+       int ret;
 
        if (!nouveau_acpi_rom_supported(pdev))
                return;
 
-       ret = nouveau_acpi_get_bios_chunk(data, 0, sizeof(data));
-       if (ret != sizeof(data))
-               return;
-
-       bios->length = min(data[2] * 512, 65536);
-       bios->data = kmalloc(bios->length, GFP_KERNEL);
+       bios->data = kmalloc(cnt * ROM_BIOS_PAGE, GFP_KERNEL);
        if (!bios->data)
                return;
 
-       len = bios->length;
-       ptr = 0;
-       while (len) {
-               int size = (len > ROM_BIOS_PAGE) ? ROM_BIOS_PAGE : len;
-
-               ret = nouveau_acpi_get_bios_chunk(bios->data, ptr, size);
-               if (ret != size) {
-                       kfree(bios->data);
-                       bios->data = NULL;
+       bios->length = 0;
+       while (cnt--) {
+               ret = nouveau_acpi_get_bios_chunk(bios->data, bios->length,
+                                                 ROM_BIOS_PAGE);
+               if (ret != ROM_BIOS_PAGE)
                        return;
-               }
 
-               len -= size;
-               ptr += size;
+               bios->length += ROM_BIOS_PAGE;
        }
 }
 
@@ -294,6 +283,7 @@ bios_shadow(struct drm_device *dev)
                mthd->score = score_vbios(bios, mthd->rw);
                mthd->size = bios->length;
                mthd->data = bios->data;
+               bios->data = NULL;
        } while (mthd->score != 3 && (++mthd)->shadow);
 
        mthd = shadow_methods;