drm/nouveau/nouveau: bios pointers may be unaligned, use proper accessors
authorIlia Mirkin <imirkin@alum.mit.edu>
Wed, 27 Jul 2016 05:00:31 +0000 (01:00 -0400)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 12 Oct 2016 07:29:02 +0000 (17:29 +1000)
This can show up on SPARC or other architectures that don't handle
unaligned accesses. The kernel normally fixes these up, but it shouldn't
have to.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96836
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_bios.h
drivers/gpu/drm/nouveau/nvkm/subdev/mxm/mxms.c

index 0067586eb015b51acb5796a26646a812e9b29df3..18eb061ccafb1bed715c834c90e0aaac50d765b0 100644 (file)
 
 #define DCB_LOC_ON_CHIP 0
 
-#define ROM16(x) le16_to_cpu(*(u16 *)&(x))
-#define ROM32(x) le32_to_cpu(*(u32 *)&(x))
-#define ROM48(x) ({ u8 *p = &(x); (u64)ROM16(p[4]) << 32 | ROM32(p[0]); })
-#define ROM64(x) le64_to_cpu(*(u64 *)&(x))
+#define ROM16(x) get_unaligned_le16(&(x))
+#define ROM32(x) get_unaligned_le32(&(x))
 #define ROMPTR(d,x) ({            \
        struct nouveau_drm *drm = nouveau_drm((d)); \
        ROM16(x) ? &drm->vbios.data[ROM16(x)] : NULL; \
index 45a2f8e784f9f01be2bd6b15c2199a9aa7470f26..9abfa5e2fe9f1368b05b4d9d6f89ca316af2c181 100644 (file)
@@ -23,8 +23,8 @@
  */
 #include "mxms.h"
 
-#define ROM16(x) le16_to_cpu(*(u16 *)&(x))
-#define ROM32(x) le32_to_cpu(*(u32 *)&(x))
+#define ROM16(x) get_unaligned_le16(&(x))
+#define ROM32(x) get_unaligned_le32(&(x))
 
 static u8 *
 mxms_data(struct nvkm_mxm *mxm)