From d2ed3fe60b74bbb38fd895cdc29c054aef3d9a14 Mon Sep 17 00:00:00 2001
From: Taylor R Campbell <riastradh@NetBSD.org>
Date: Mon, 3 Jun 2024 19:57:23 +0000
Subject: [PATCH] i915_gem_mman.c: Apply mmap types via pmap flags.

---
 .../drm2/dist/drm/i915/gem/i915_gem_mman.c    | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c b/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c
index d5d240db673a..6f6a9bdc637c 100644
--- a/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c
+++ b/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c
@@ -345,6 +345,23 @@ static vm_fault_t vm_fault_cpu(struct vm_fault *vmf)
 	KASSERT(i915_gem_object_type_has(obj,
 		I915_GEM_OBJECT_HAS_STRUCT_PAGE));
 
+	int pmapflags;
+	switch (mmo->mmap_type) {
+	case I915_MMAP_TYPE_WC:
+	case I915_MMAP_TYPE_GTT:
+		pmapflags = PMAP_WRITE_COMBINE;
+		break;
+	case I915_MMAP_TYPE_WB:
+		pmapflags = 0;	/* default */
+		break;
+	case I915_MMAP_TYPE_UC:
+		pmapflags = PMAP_NOCACHE;
+		break;
+	default:
+		panic("invalid i915 gem mmap offset type: %d",
+		    mmo->mmap_type);
+	}
+
 	struct scatterlist *sg = obj->mm.pages->sgl;
 	unsigned startpage = (ufi->entry->offset + (vaddr - ufi->entry->start))
 	    >> PAGE_SHIFT;
@@ -360,7 +377,7 @@ static vm_fault_t vm_fault_cpu(struct vm_fault *vmf)
 		/* XXX errno NetBSD->Linux */
 		err = -pmap_enter(ufi->orig_map->pmap,
 		    vaddr + i*PAGE_SIZE, paddr, ufi->entry->protection,
-		    PMAP_CANFAIL | ufi->entry->protection);
+		    PMAP_CANFAIL | ufi->entry->protection | pmapflags);
 		if (err)
 			break;
 	}