aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2012-10-21 20:08:19 -0400
committerBen Skeggs <bskeggs@redhat.com>2012-10-21 23:39:38 -0400
commitd1626a965141b1e600efad29947b6c36dab183c3 (patch)
treeca7fb5ae9b716f6d87af3a8890d9de47b338d006 /drivers
parent00e4845bad84689fbaacc86bc54a0b99d5d3c1fc (diff)
drm/nouveau/bios: fetch full 4KiB block to determine ACPI ROM image size
Buggy firmware leads to bad things happening otherwise.. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/bios/base.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/gpu/drm/nouveau/core/subdev/bios/base.c b/drivers/gpu/drm/nouveau/core/subdev/bios/base.c
index 3a84ad4f171a..70ca7d5a1aa1 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/bios/base.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/bios/base.c
@@ -192,7 +192,6 @@ nouveau_bios_shadow_acpi(struct nouveau_bios *bios)
192{ 192{
193 struct pci_dev *pdev = nv_device(bios)->pdev; 193 struct pci_dev *pdev = nv_device(bios)->pdev;
194 int ret, cnt, i; 194 int ret, cnt, i;
195 u8 data[3];
196 195
197 if (!nouveau_acpi_rom_supported(pdev)) { 196 if (!nouveau_acpi_rom_supported(pdev)) {
198 bios->data = NULL; 197 bios->data = NULL;
@@ -200,8 +199,13 @@ nouveau_bios_shadow_acpi(struct nouveau_bios *bios)
200 } 199 }
201 200
202 bios->size = 0; 201 bios->size = 0;
203 if (nouveau_acpi_get_bios_chunk(data, 0, 3) == 3) 202 bios->data = kmalloc(4096, GFP_KERNEL);
204 bios->size = data[2] * 512; 203 if (bios->data) {
204 if (nouveau_acpi_get_bios_chunk(bios->data, 0, 4096) == 4096)
205 bios->size = bios->data[2] * 512;
206 kfree(bios->data);
207 }
208
205 if (!bios->size) 209 if (!bios->size)
206 return; 210 return;
207 211