diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2014-03-31 05:25:09 +0200 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2014-05-02 08:24:55 +0200 |
commit | ce23b234d157f1dfea098fcc77cb5b6887d10df2 (patch) | |
tree | 97ab160d79b13a7421258b32018246671217947a /drivers/gpu | |
parent | drm/nouveau/acpi: allow non-optimus setups to load vbios from acpi (diff) | |
download | linux-ce23b234d157f1dfea098fcc77cb5b6887d10df2.tar.xz linux-ce23b234d157f1dfea098fcc77cb5b6887d10df2.zip |
drm/nouveau/bios: fix shadowing from PROM on big-endian systems
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/nouveau/core/subdev/bios/base.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/gpu/drm/nouveau/core/subdev/bios/base.c b/drivers/gpu/drm/nouveau/core/subdev/bios/base.c index e9df94f96d78..3de7d818be76 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/bios/base.c +++ b/drivers/gpu/drm/nouveau/core/subdev/bios/base.c @@ -168,7 +168,8 @@ nouveau_bios_shadow_prom(struct nouveau_bios *bios) */ i = 16; do { - if ((nv_rd32(bios, 0x300000) & 0xffff) == 0xaa55) + u32 data = le32_to_cpu(nv_rd32(bios, 0x300000)) & 0xffff; + if (data == 0xaa55) break; } while (i--); @@ -176,14 +177,15 @@ nouveau_bios_shadow_prom(struct nouveau_bios *bios) goto out; /* read entire bios image to system memory */ - bios->size = ((nv_rd32(bios, 0x300000) >> 16) & 0xff) * 512; + bios->size = (le32_to_cpu(nv_rd32(bios, 0x300000)) >> 16) & 0xff; + bios->size = bios->size * 512; if (!bios->size) goto out; bios->data = kmalloc(bios->size, GFP_KERNEL); if (bios->data) { - for (i = 0; i < bios->size; i+=4) - nv_wo32(bios, i, nv_rd32(bios, 0x300000 + i)); + for (i = 0; i < bios->size; i += 4) + ((u32 *)bios->data)[i/4] = nv_rd32(bios, 0x300000 + i); } /* check the PCI record header */ |