Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 12:27:49 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915: i915_gem.c i915_vma.c
        src/sys/external/bsd/drm2/include/linux: io-mapping.h

Log Message:
drm: Allow multiple concurrent io_mapping_map_wc on the same space.

(This should maybe check that there aren't overlapping maps of the
same parts of the space.)


To generate a diff of this commit:
cvs rdiff -u -r1.73 -r1.74 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
cvs rdiff -u -r1.11 -r1.12 src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c
cvs rdiff -u -r1.11 -r1.12 \
    src/sys/external/bsd/drm2/include/linux/io-mapping.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/i915/i915_gem.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.73 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.74
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.73	Sun Dec 19 12:27:09 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c	Sun Dec 19 12:27:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem.c,v 1.73 2021/12/19 12:27:09 riastradh Exp $	*/
+/*	$NetBSD: i915_gem.c,v 1.74 2021/12/19 12:27:49 riastradh Exp $	*/
 
 /*
  * Copyright © 2008-2015 Intel Corporation
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem.c,v 1.73 2021/12/19 12:27:09 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem.c,v 1.74 2021/12/19 12:27:49 riastradh Exp $");
 
 #ifdef __NetBSD__
 #include <drm/bus_dma_hacks.h>
@@ -405,7 +405,7 @@ gtt_user_read(struct io_mapping *mapping
 					 (void __force *)vaddr + offset,
 					 length);
 #ifdef __NetBSD__
-		io_mapping_unmap(mapping, vaddr);
+		io_mapping_unmap(mapping, vaddr, PAGE_SIZE);
 #else
 		io_mapping_unmap(vaddr);
 #endif

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c:1.11 src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c:1.12
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c:1.11	Sun Dec 19 12:12:15 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c	Sun Dec 19 12:27:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_vma.c,v 1.11 2021/12/19 12:12:15 riastradh Exp $	*/
+/*	$NetBSD: i915_vma.c,v 1.12 2021/12/19 12:27:49 riastradh Exp $	*/
 
 /*
  * Copyright © 2016 Intel Corporation
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_vma.c,v 1.11 2021/12/19 12:12:15 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_vma.c,v 1.12 2021/12/19 12:27:49 riastradh Exp $");
 
 #include <linux/sched/mm.h>
 #include <drm/drm_gem.h>
@@ -513,7 +513,8 @@ void __iomem *i915_vma_pin_iomap(struct 
 
 		if (unlikely(cmpxchg(&vma->iomap, NULL, ptr))) {
 #ifdef __NetBSD__
-			io_mapping_unmap(&i915_vm_to_ggtt(vma->vm)->iomap, ptr);
+			io_mapping_unmap(&i915_vm_to_ggtt(vma->vm)->iomap, ptr,
+			    vma->node.size);
 #else
 			io_mapping_unmap(ptr);
 #endif
@@ -1181,7 +1182,8 @@ static void __i915_vma_iounmap(struct i9
 		return;
 
 #ifdef __NetBSD__
-	io_mapping_unmap(&i915_vm_to_ggtt(vma->vm)->iomap, vma->iomap);
+	io_mapping_unmap(&i915_vm_to_ggtt(vma->vm)->iomap, vma->iomap,
+	    vma->node.size);
 #else
 	io_mapping_unmap(vma->iomap);
 #endif

Index: src/sys/external/bsd/drm2/include/linux/io-mapping.h
diff -u src/sys/external/bsd/drm2/include/linux/io-mapping.h:1.11 src/sys/external/bsd/drm2/include/linux/io-mapping.h:1.12
--- src/sys/external/bsd/drm2/include/linux/io-mapping.h:1.11	Sun Dec 19 12:04:51 2021
+++ src/sys/external/bsd/drm2/include/linux/io-mapping.h	Sun Dec 19 12:27:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: io-mapping.h,v 1.11 2021/12/19 12:04:51 riastradh Exp $	*/
+/*	$NetBSD: io-mapping.h,v 1.12 2021/12/19 12:27:49 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -45,7 +45,6 @@ struct io_mapping {
 	bus_addr_t		base; /* Linux API */
 	bus_size_t		size; /* Linux API */
 	vaddr_t			diom_va;
-	bus_size_t		diom_mapsize;
 	bool			diom_atomic;
 };
 
@@ -78,7 +77,6 @@ bus_space_io_mapping_init_wc(bus_space_t
 	mapping->diom_bst = bst;
 	mapping->base = addr;
 	mapping->size = size;
-	mapping->diom_mapsize = 0;
 	mapping->diom_atomic = false;
 
 	/* Allocate kva for one page.  */
@@ -93,7 +91,6 @@ static inline void
 io_mapping_fini(struct io_mapping *mapping)
 {
 
-	KASSERT(mapping->diom_mapsize == 0);
 	KASSERT(!mapping->diom_atomic);
 
 	uvm_km_free(kernel_map, mapping->diom_va, PAGE_SIZE, UVM_KMF_VAONLY);
@@ -135,11 +132,10 @@ io_mapping_map_wc(struct io_mapping *map
 	KASSERT(PAGE_SIZE <= mapping->size);
 	KASSERT(offset <= (mapping->size - PAGE_SIZE));
 	KASSERT(__type_fit(off_t, offset));
-	KASSERT(mapping->diom_mapsize == 0);
-	KASSERT(!mapping->diom_atomic);
 
 	va = uvm_km_alloc(kernel_map, size, PAGE_SIZE,
 	    UVM_KMF_VAONLY|UVM_KMF_WAITVA);
+	KASSERT(va != mapping->diom_va);
 	for (pg = 0; pg < npgs; pg++) {
 		cookie = bus_space_mmap(mapping->diom_bst, mapping->base,
 		    offset + pg*PAGE_SIZE,
@@ -152,27 +148,20 @@ io_mapping_map_wc(struct io_mapping *map
 	}
 	pmap_update(pmap_kernel());
 
-	mapping->diom_mapsize = size;
-	mapping->diom_atomic = false;
 	return (void *)va;
 }
 
 static inline void
-io_mapping_unmap(struct io_mapping *mapping, void *ptr __diagused)
+io_mapping_unmap(struct io_mapping *mapping, void *ptr, bus_size_t size)
 {
 	vaddr_t va = (vaddr_t)ptr;
 
-	KASSERT(mapping->diom_mapsize);
-	KASSERT(!mapping->diom_atomic);
 	KASSERT(mapping->diom_va != va);
 
-	pmap_kremove(va, mapping->diom_mapsize);
+	pmap_kremove(va, size);
 	pmap_update(pmap_kernel());
 
-	uvm_km_free(kernel_map, va, mapping->diom_mapsize, UVM_KMF_VAONLY);
-
-	mapping->diom_mapsize = 0;
-	mapping->diom_atomic = false;
+	uvm_km_free(kernel_map, va, size, UVM_KMF_VAONLY);
 }
 
 static inline void *
@@ -184,7 +173,6 @@ io_mapping_map_atomic_wc(struct io_mappi
 	KASSERT(PAGE_SIZE <= mapping->size);
 	KASSERT(offset <= (mapping->size - PAGE_SIZE));
 	KASSERT(__type_fit(off_t, offset));
-	KASSERT(mapping->diom_mapsize == 0);
 	KASSERT(!mapping->diom_atomic);
 
 	cookie = bus_space_mmap(mapping->diom_bst, mapping->base, offset,
@@ -196,7 +184,6 @@ io_mapping_map_atomic_wc(struct io_mappi
 	    PROT_READ|PROT_WRITE, pmap_mmap_flags(cookie));
 	pmap_update(pmap_kernel());
 
-	mapping->diom_mapsize = PAGE_SIZE;
 	mapping->diom_atomic = true;
 	return (void *)mapping->diom_va;
 }
@@ -205,14 +192,12 @@ static inline void
 io_mapping_unmap_atomic(struct io_mapping *mapping, void *ptr __diagused)
 {
 
-	KASSERT(mapping->diom_mapsize);
 	KASSERT(mapping->diom_atomic);
 	KASSERT(mapping->diom_va == (vaddr_t)ptr);
 
 	pmap_kremove(mapping->diom_va, PAGE_SIZE);
 	pmap_update(pmap_kernel());
 
-	mapping->diom_mapsize = 0;
 	mapping->diom_atomic = false;
 }
 

Reply via email to