drm/nouveau/bios: fix shadowing of ACPI ROMs larger than 64KiB
authorBen Skeggs <bskeggs@redhat.com>
Tue, 9 Oct 2012 02:21:36 +0000 (12:21 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 9 Oct 2012 02:21:36 +0000 (12:21 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/subdev/bios/base.c

index 2fbb6df697cdc2268fa911d70a45443bfbcba509..dcb5c2befc928a716425ace89149cec8a808c2e3 100644 (file)
@@ -185,23 +185,22 @@ static void
 nouveau_bios_shadow_acpi(struct nouveau_bios *bios)
 {
        struct pci_dev *pdev = nv_device(bios)->pdev;
-       int cnt = 65536 / 4096;
-       int ret;
+       int ret, cnt, i;
+       u8  data[3];
 
        if (!nouveau_acpi_rom_supported(pdev))
                return;
 
-       bios->data = kmalloc(65536, GFP_KERNEL);
        bios->size = 0;
-       if (!bios->data)
-               return;
-
-       while (cnt--) {
-               ret = nouveau_acpi_get_bios_chunk(bios->data, bios->size, 4096);
-               if (ret != 4096)
-                       return;
+       if (nouveau_acpi_get_bios_chunk(data, 0, 3) == 3)
+               bios->size = data[2] * 512;
 
-               bios->size += 4096;
+       bios->data = kmalloc(bios->size, GFP_KERNEL);
+       for (i = 0; bios->data && i < bios->size; i += cnt) {
+               cnt = min((bios->size - i), (u32)4096);
+               ret = nouveau_acpi_get_bios_chunk(bios->data, i, cnt);
+               if (ret != cnt)
+                       break;
        }
 }