summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/nouveau/nouveau_bios.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-04-03 10:12:21 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2012-04-03 10:12:21 -0700
commite1a7eb08ee097e97e928062a242b0de5b2599a11 (patch)
tree2e94ca0bd2ac5a53a4a7234b2f1b5f98f669cca8 /drivers/gpu/drm/nouveau/nouveau_bios.c
parent464662b91614188b4af9df51baaa0d6b3d89a15f (diff)
parent62fb376e214d3c1bfdf6fbb77dac162f6da04d7e (diff)
Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux
Pull drm fixes from Dave Airlie: "Mainly nouveau fixes, one for a regressions in -rc1, fixes for booting on a ppc G5, and a Kconfig fix. Two radeon fixes, one oops, one s/r fix. One udl mmap fix. And one core drm fix to stop bad fbdev apps overwriting bits of ram." * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: drm: Validate requested virtual size against allocated fb size drm/radeon: Don't dereference possibly-NULL pointer. mm, drm/udl: fixup vma flags on mmap drm/radeon/kms: fix fans after resume nouveau/bios: Fix tracking of BIOS image data nouveau: Fix crash when pci_ram_rom() returns a size of 0 drm/nouveau: select POWER_SUPPLY drm/nouveau: inform userspace of relaxed kernel subchannel requirements Revert "drm/nouveau: inform userspace of new kernel subchannel requirements" drm/nouveau: oops, create m2mf for nvd9 too
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_bios.c')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bios.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c
index 637afe71de56..1947d6139a38 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bios.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bios.c
@@ -177,14 +177,15 @@ bios_shadow_pci(struct nvbios *bios)
if (!pci_enable_rom(pdev)) {
void __iomem *rom = pci_map_rom(pdev, &length);
- if (rom) {
+ if (rom && length) {
bios->data = kmalloc(length, GFP_KERNEL);
if (bios->data) {
memcpy_fromio(bios->data, rom, length);
bios->length = length;
}
- pci_unmap_rom(pdev, rom);
}
+ if (rom)
+ pci_unmap_rom(pdev, rom);
pci_disable_rom(pdev);
}
@@ -272,6 +273,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;
@@ -280,7 +282,8 @@ bios_shadow(struct drm_device *dev)
if (mthd->score > best->score) {
kfree(best->data);
best = mthd;
- }
+ } else
+ kfree(mthd->data);
} while ((++mthd)->shadow);
if (best->score) {