Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 12:36:50 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/amd/amdgpu: amdgpu_device.c
        src/sys/external/bsd/drm2/dist/drm/i915: intel_uncore.h

Log Message:
drm: Work around bus_space_read_8 on LP32.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 \
    src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c
cvs rdiff -u -r1.9 -r1.10 \
    src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c
diff -u src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c:1.12 src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c:1.13
--- src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c:1.12	Sun Dec 19 12:36:41 2021
+++ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c	Sun Dec 19 12:36:50 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: amdgpu_device.c,v 1.12 2021/12/19 12:36:41 riastradh Exp $	*/
+/*	$NetBSD: amdgpu_device.c,v 1.13 2021/12/19 12:36:50 riastradh Exp $	*/
 
 /*
  * Copyright 2008 Advanced Micro Devices, Inc.
@@ -28,7 +28,7 @@
  *          Jerome Glisse
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amdgpu_device.c,v 1.12 2021/12/19 12:36:41 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amdgpu_device.c,v 1.13 2021/12/19 12:36:50 riastradh Exp $");
 
 #include <linux/power_supply.h>
 #include <linux/kthread.h>
@@ -483,9 +483,25 @@ u64 amdgpu_mm_rdoorbell64(struct amdgpu_
 {
 	if (index < adev->doorbell.num_doorbells) {
 #ifdef __NetBSD__
+#ifdef _LP64
 		return bus_space_read_8(adev->doorbell.bst, adev->doorbell.bsh,
 		    8*index);
 #else
+		uint64_t lo, hi;
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+		lo = bus_space_read_4(adev->doorbell.bst, adev->doorbell.bsh,
+		    8*index);
+		hi = bus_space_read_4(adev->doorbell.bst, adev->doorbell.bsh,
+		    8*index + 4);
+#else
+		hi = bus_space_read_4(adev->doorbell.bst, adev->doorbell.bsh,
+		    8*index);
+		lo = bus_space_read_4(adev->doorbell.bst, adev->doorbell.bsh,
+		    8*index + 4);
+#endif
+		return lo | (hi << 32);
+#endif
+#else
 		return atomic64_read((atomic64_t *)(adev->doorbell.ptr + index));
 #endif
 	} else {
@@ -508,9 +524,23 @@ void amdgpu_mm_wdoorbell64(struct amdgpu
 {
 	if (index < adev->doorbell.num_doorbells) {
 #ifdef __NetBSD__
+#ifdef _LP64
 		bus_space_write_8(adev->doorbell.bst, adev->doorbell.bsh,
 		    8*index, v);
 #else
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+		bus_space_write_4(adev->doorbell.bst, adev->doorbell.bsh,
+		    8*index, v & 0xffffffffU);
+		bus_space_write_4(adev->doorbell.bst, adev->doorbell.bsh,
+		    8*index + 4, v >> 32);
+#else
+		bus_space_write_4(adev->doorbell.bst, adev->doorbell.bsh,
+		    8*index, v >> 32);
+		bus_space_write_4(adev->doorbell.bst, adev->doorbell.bsh,
+		    8*index + 4, v & 0xffffffffU);
+#endif
+#endif
+#else
 		atomic64_set((atomic64_t *)(adev->doorbell.ptr + index), v);
 #endif
 	} else {

Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h:1.9 src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h:1.10
--- src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h:1.9	Sun Dec 19 12:32:15 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h	Sun Dec 19 12:36:50 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_uncore.h,v 1.9 2021/12/19 12:32:15 riastradh Exp $	*/
+/*	$NetBSD: intel_uncore.h,v 1.10 2021/12/19 12:36:50 riastradh Exp $	*/
 
 /*
  * Copyright © 2017 Intel Corporation
@@ -321,7 +321,16 @@ static inline uint32_t __raw_uncore_read
 }
 static inline uint64_t __raw_uncore_read64(const struct intel_uncore *uncore,
 						i915_reg_t reg) {
+#ifdef _LP64
 	return bus_space_read_8(uncore->regs_bst, uncore->regs_bsh, i915_mmio_reg_offset(reg));
+#else
+	uint64_t lo, hi;
+	lo = bus_space_read_4(uncore->regs_bst, uncore->regs_bsh,
+	    i915_mmio_reg_offset(reg));
+	hi = bus_space_read_4(uncore->regs_bst, uncore->regs_bsh,
+	    i915_mmio_reg_offset(reg) + 4);
+	return lo | (hi << 32);
+#endif
 }
 static inline void __raw_uncore_write8(const struct intel_uncore *uncore,
 						i915_reg_t reg, uint8_t val) {
@@ -337,7 +346,14 @@ static inline void __raw_uncore_write32(
 }
 static inline void __raw_uncore_write64(const struct intel_uncore *uncore,
 						i915_reg_t reg, uint64_t val) {
+#ifdef _LP64
 	bus_space_write_8(uncore->regs_bst, uncore->regs_bsh, i915_mmio_reg_offset(reg), val);
+#else
+	bus_space_write_4(uncore->regs_bst, uncore->regs_bsh,
+	    i915_mmio_reg_offset(reg), val & 0xffffffffU);
+	bus_space_write_4(uncore->regs_bst, uncore->regs_bsh,
+	    i915_mmio_reg_offset(reg) + 4, val >> 32);
+#endif
 }
 #endif
 

Reply via email to