[Nouveau] [PATCH] nouveau: bios pointers may be unaligned, use proper accessors

Ilia Mirkin imirkin at alum.mit.edu
Wed Jul 27 05:00:31 UTC 2016


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 at alum.mit.edu>
---
 drm/nouveau/nouveau_bios.h         | 6 ++----
 drm/nouveau/nvkm/subdev/mxm/mxms.c | 4 ++--
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/drm/nouveau/nouveau_bios.h b/drm/nouveau/nouveau_bios.h
index 0067586..18eb061 100644
--- a/drm/nouveau/nouveau_bios.h
+++ b/drm/nouveau/nouveau_bios.h
@@ -31,10 +31,8 @@
 
 #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; \
diff --git a/drm/nouveau/nvkm/subdev/mxm/mxms.c b/drm/nouveau/nvkm/subdev/mxm/mxms.c
index 45a2f8e..9abfa5e 100644
--- a/drm/nouveau/nvkm/subdev/mxm/mxms.c
+++ b/drm/nouveau/nvkm/subdev/mxm/mxms.c
@@ -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)
-- 
2.7.3



More information about the Nouveau mailing list