Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 11:32:54 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm: drm_gem.c drm_prime.c
        src/sys/external/bsd/drm2/dist/drm/i915: i915_gem_fence_reg.c
            i915_gem_fence_reg.h i915_gem_gtt.c
        src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_clflush.c
            i915_gem_dmabuf.c i915_gem_mman.c i915_gem_object_types.h
            i915_gem_shmem.c
        src/sys/external/bsd/drm2/dist/drm/ttm: ttm_tt.c
        src/sys/external/bsd/drm2/dist/include/drm: drm_cache.h drm_prime.h
        src/sys/external/bsd/drm2/dist/include/drm/ttm: ttm_tt.h
        src/sys/external/bsd/drm2/drm: drm_cache.c
        src/sys/external/bsd/drm2/include/drm: bus_dma_hacks.h
        src/sys/external/bsd/drm2/ttm: ttm_bus_dma.c

Log Message:
drm: Nix use of uvm pglist.  Just use arrays of page pointers.


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/sys/external/bsd/drm2/dist/drm/drm_gem.c
cvs rdiff -u -r1.14 -r1.15 src/sys/external/bsd/drm2/dist/drm/drm_prime.c
cvs rdiff -u -r1.4 -r1.5 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h
cvs rdiff -u -r1.21 -r1.22 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_clflush.c
cvs rdiff -u -r1.4 -r1.5 \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_dmabuf.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object_types.h
cvs rdiff -u -r1.5 -r1.6 \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c
cvs rdiff -u -r1.16 -r1.17 src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c
cvs rdiff -u -r1.8 -r1.9 \
    src/sys/external/bsd/drm2/dist/include/drm/drm_cache.h
cvs rdiff -u -r1.5 -r1.6 \
    src/sys/external/bsd/drm2/dist/include/drm/drm_prime.h
cvs rdiff -u -r1.5 -r1.6 \
    src/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h
cvs rdiff -u -r1.16 -r1.17 src/sys/external/bsd/drm2/drm/drm_cache.c
cvs rdiff -u -r1.20 -r1.21 \
    src/sys/external/bsd/drm2/include/drm/bus_dma_hacks.h
cvs rdiff -u -r1.9 -r1.10 src/sys/external/bsd/drm2/ttm/ttm_bus_dma.c

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/drm_gem.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_gem.c:1.21 src/sys/external/bsd/drm2/dist/drm/drm_gem.c:1.22
--- src/sys/external/bsd/drm2/dist/drm/drm_gem.c:1.21	Sun Dec 19 11:26:14 2021
+++ src/sys/external/bsd/drm2/dist/drm/drm_gem.c	Sun Dec 19 11:32:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_gem.c,v 1.21 2021/12/19 11:26:14 riastradh Exp $	*/
+/*	$NetBSD: drm_gem.c,v 1.22 2021/12/19 11:32:53 riastradh Exp $	*/
 
 /*
  * Copyright © 2008 Intel Corporation
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_gem.c,v 1.21 2021/12/19 11:26:14 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_gem.c,v 1.22 2021/12/19 11:32:53 riastradh Exp $");
 
 #include <linux/types.h>
 #include <linux/slab.h>
@@ -600,7 +600,6 @@ static void drm_gem_check_release_pageve
 struct page **
 drm_gem_get_pages(struct drm_gem_object *obj)
 {
-	struct pglist pglist;
 	struct vm_page *vm_page;
 	struct page **pages;
 	unsigned i, npages;
@@ -615,15 +614,17 @@ drm_gem_get_pages(struct drm_gem_object 
 		goto fail0;
 	}
 
-	TAILQ_INIT(&pglist);
 	/* XXX errno NetBSD->Linux */
-	ret = -uvm_obj_wirepages(obj->filp, 0, obj->size, &pglist);
+	ret = -uvm_obj_wirepages(obj->filp, 0, obj->size, NULL);
 	if (ret)
 		goto fail1;
 
-	i = 0;
-	TAILQ_FOREACH(vm_page, &pglist, pageq.queue)
-		pages[i++] = container_of(vm_page, struct page, p_vmp);
+	rw_enter(obj->filp->vmobjlock, RW_READER);
+	for (i = 0; i < npages; i++) {
+		vm_page = uvm_pagelookup(obj->filp, ptoa(i));
+		pages[i] = container_of(vm_page, struct page, p_vmp);
+	}
+	rw_exit(obj->filp->vmobjlock);
 
 	return pages;
 

Index: src/sys/external/bsd/drm2/dist/drm/drm_prime.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_prime.c:1.14 src/sys/external/bsd/drm2/dist/drm/drm_prime.c:1.15
--- src/sys/external/bsd/drm2/dist/drm/drm_prime.c:1.14	Sun Dec 19 10:38:22 2021
+++ src/sys/external/bsd/drm2/dist/drm/drm_prime.c	Sun Dec 19 11:32:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_prime.c,v 1.14 2021/12/19 10:38:22 riastradh Exp $	*/
+/*	$NetBSD: drm_prime.c,v 1.15 2021/12/19 11:32:53 riastradh Exp $	*/
 
 /*
  * Copyright © 2012 Red Hat
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_prime.c,v 1.14 2021/12/19 10:38:22 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_prime.c,v 1.15 2021/12/19 11:32:53 riastradh Exp $");
 
 #include <linux/export.h>
 #include <linux/dma-buf.h>
@@ -89,31 +89,6 @@ sg_alloc_table_from_pages(struct sg_tabl
 }
 
 static int
-sg_alloc_table_from_pglist(struct sg_table *sgt, const struct pglist *pglist,
-    unsigned npages, bus_size_t offset, bus_size_t size, gfp_t gfp)
-{
-	struct vm_page *pg;
-	unsigned i;
-
-	KASSERT(offset == 0);
-	KASSERT(size == npages << PAGE_SHIFT);
-
-	sgt->sgt_pgs = kcalloc(npages, sizeof(sgt->sgt_pgs[0]), gfp);
-	if (sgt->sgt_pgs == NULL)
-		return -ENOMEM;
-	sgt->sgt_npgs = npages;
-
-	i = 0;
-	TAILQ_FOREACH(pg, pglist, pageq.queue) {
-		KASSERT(i < npages);
-		sgt->sgt_pgs[i] = VM_PAGE_TO_PHYS(pg);
-	}
-	KASSERT(i == npages);
-
-	return 0;
-}
-
-static int
 sg_alloc_table_from_bus_dmamem(struct sg_table *sgt, bus_dma_tag_t dmat,
     const bus_dma_segment_t *segs, int nsegs, gfp_t gfp)
 {
@@ -1239,30 +1214,6 @@ out:
 	return ERR_PTR(ret);
 }
 
-struct sg_table *
-drm_prime_pglist_to_sg(struct pglist *pglist, unsigned npages)
-{
-	struct sg_table *sg;
-	int ret;
-
-	sg = kmalloc(sizeof(*sg), GFP_KERNEL);
-	if (sg == NULL) {
-		ret = -ENOMEM;
-		goto out;
-	}
-
-	ret = sg_alloc_table_from_pglist(sg, pglist, 0, npages << PAGE_SHIFT,
-	    npages, GFP_KERNEL);
-	if (ret)
-		goto out;
-
-	return sg;
-
-out:
-	kfree(sg);
-	return ERR_PTR(ret);
-}
-
 bus_size_t
 drm_prime_sg_size(struct sg_table *sg)
 {

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c:1.4 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c:1.4	Sun Dec 19 11:31:26 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c	Sun Dec 19 11:32:54 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_fence_reg.c,v 1.4 2021/12/19 11:31:26 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_fence_reg.c,v 1.5 2021/12/19 11:32:54 riastradh Exp $	*/
 
 /*
  * Copyright © 2008-2015 Intel Corporation
@@ -24,7 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_fence_reg.c,v 1.4 2021/12/19 11:31:26 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_fence_reg.c,v 1.5 2021/12/19 11:32:54 riastradh Exp $");
 
 #include <linux/bitmap.h>
 #include <drm/i915_drm.h>
@@ -785,36 +785,35 @@ static void i915_gem_swizzle_page(struct
 void
 #ifdef __NetBSD__
 i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj,
-				  struct pglist *pages)
+				  struct page **pages)
 #else
 i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj,
 				  struct sg_table *pages)
 #endif
 {
 #ifdef __NetBSD__
-	struct vm_page *page;
+	struct vm_page *vm_page;
 #else
 	struct sgt_iter sgt_iter;
-	struct page *page;
 #endif
+	struct page *page;
 	int i;
 
 	if (obj->bit_17 == NULL)
 		return;
 
 #ifdef __NetBSD__
-	i = 0;
-	TAILQ_FOREACH(page, &obj->mm.pageq, pageq.queue) {
-		unsigned char new_bit_17 = VM_PAGE_TO_PHYS(page) >> 17;
+	for (i = 0; i < obj->base.size >> PAGE_SHIFT; i++) {
+		page = pages[i];
+		vm_page = &page->p_vmp;
+		unsigned char new_bit_17 = VM_PAGE_TO_PHYS(vm_page) >> 17;
 		if ((new_bit_17 & 0x1) !=
 		    (test_bit(i, obj->bit_17) != 0)) {
-			i915_gem_swizzle_page(container_of(page, struct page,
-				p_vmp));
+			i915_gem_swizzle_page(page);
 			rw_enter(obj->base.filp->vmobjlock, RW_WRITER);
-			uvm_pagemarkdirty(page, UVM_PAGE_STATUS_DIRTY);
+			uvm_pagemarkdirty(vm_page, UVM_PAGE_STATUS_DIRTY);
 			rw_exit(obj->base.filp->vmobjlock);
 		}
-		i += 1;
 	}
 #else
 	i = 0;
@@ -841,18 +840,18 @@ i915_gem_object_do_bit_17_swizzle(struct
 void
 #ifdef __NetBSD__
 i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj,
-				    struct pglist *pages)
+				    struct page **pages)
 #else
 i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj,
 				    struct sg_table *pages)
 #endif
 {
 #ifdef __NetBSD__
-	struct vm_page *page;
+	struct vm_page *vm_page;
 #else
 	struct sg_page_iter sg_iter;
-	struct page *page;
 #endif
+	struct page *page;
 	const unsigned int page_count = obj->base.size >> PAGE_SHIFT;
 	int i;
 
@@ -868,12 +867,13 @@ i915_gem_object_save_bit_17_swizzle(stru
 	i = 0;
 
 #ifdef __NetBSD__
-	TAILQ_FOREACH(page, &obj->mm.pageq, pageq.queue) {
-		if (ISSET(VM_PAGE_TO_PHYS(page), __BIT(17)))
+	for (i = 0; i < obj->base.size >> PAGE_SHIFT; i++) {
+		page = pages[i];
+		vm_page = &page->p_vmp;
+		if (ISSET(VM_PAGE_TO_PHYS(vm_page), __BIT(17)))
 			__set_bit(i, obj->bit_17);
 		else
 			__clear_bit(i, obj->bit_17);
-		i++;
 	}
 #else
 	for_each_sgt_page(page, sgt_iter, pages) {

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h:1.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h:1.3	Sun Dec 19 01:34:08 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h	Sun Dec 19 11:32:54 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_fence_reg.h,v 1.3 2021/12/19 01:34:08 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_fence_reg.h,v 1.4 2021/12/19 11:32:54 riastradh Exp $	*/
 
 /*
  * Copyright © 2016 Intel Corporation
@@ -63,9 +63,9 @@ void i915_gem_restore_fences(struct i915
 
 #ifdef __NetBSD__
 void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj,
-				       struct pglist *pages);
+				       struct page **pages);
 void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj,
-					 struct pglist *pages);
+					 struct page **pages);
 #else
 void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj,
 				       struct sg_table *pages);

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c:1.21 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c:1.22
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c:1.21	Sun Dec 19 01:35:35 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c	Sun Dec 19 11:32:54 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_gtt.c,v 1.21 2021/12/19 01:35:35 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_gtt.c,v 1.22 2021/12/19 11:32:54 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  * Copyright © 2020 Intel Corporation
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_gtt.c,v 1.21 2021/12/19 01:35:35 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_gtt.c,v 1.22 2021/12/19 11:32:54 riastradh Exp $");
 
 #include <linux/slab.h> /* fault-inject.h is not standalone! */
 
@@ -55,8 +55,9 @@ int i915_gem_gtt_prepare_pages(struct dr
 		 * XXX Not sure whether caller should be passing DMA
 		 * map or page list.
 		 */
-		if (bus_dmamap_load_pglist(obj->base.dev->dmat, pages,
-			&obj->mm.pageq, pages->dm_mapsize, BUS_DMA_NOWAIT) == 0)
+		if (bus_dmamap_load_pages(obj->base.dev->dmat, pages,
+			obj->mm.pagearray, obj->base.size, BUS_DMA_NOWAIT)
+		    == 0)
 			return 0;
 #else
 		if (dma_map_sg_attrs(&obj->base.dev->pdev->dev,

Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_clflush.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_clflush.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_clflush.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_clflush.c:1.3	Sun Dec 19 11:26:35 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_clflush.c	Sun Dec 19 11:32:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_clflush.c,v 1.3 2021/12/19 11:26:35 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_clflush.c,v 1.4 2021/12/19 11:32:53 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_clflush.c,v 1.3 2021/12/19 11:26:35 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_clflush.c,v 1.4 2021/12/19 11:32:53 riastradh Exp $");
 
 #include "display/intel_frontbuffer.h"
 
@@ -25,7 +25,7 @@ static void __do_clflush(struct drm_i915
 {
 	GEM_BUG_ON(!i915_gem_object_has_pages(obj));
 #ifdef __NetBSD__
-	drm_clflush_pglist(&obj->mm.pageq);
+	drm_clflush_pages(obj->mm.pagearray, obj->base.size >> PAGE_SHIFT);
 #else
 	drm_clflush_sg(obj->mm.pages);
 #endif

Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_dmabuf.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_dmabuf.c:1.4 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_dmabuf.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_dmabuf.c:1.4	Sun Dec 19 11:27:20 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_dmabuf.c	Sun Dec 19 11:32:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_dmabuf.c,v 1.4 2021/12/19 11:27:20 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_dmabuf.c,v 1.5 2021/12/19 11:32:53 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_dmabuf.c,v 1.4 2021/12/19 11:27:20 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_dmabuf.c,v 1.5 2021/12/19 11:32:53 riastradh Exp $");
 
 #include <linux/dma-buf.h>
 #include <linux/highmem.h>
@@ -41,7 +41,7 @@ static struct sg_table *i915_gem_map_dma
 		goto err;
 
 #ifdef __NetBSD__
-	st = drm_prime_pglist_to_sg(&obj->mm.pageq,
+	st = drm_prime_pages_to_sg(obj->mm.pagearray,
 	    obj->base.size >> PAGE_SHIFT);
 	if (IS_ERR(st))
 		goto err_unpin_pages;
Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.4 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.4	Sun Dec 19 11:26:35 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c	Sun Dec 19 11:32:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_mman.c,v 1.4 2021/12/19 11:26:35 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_mman.c,v 1.5 2021/12/19 11:32:53 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.4 2021/12/19 11:26:35 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.5 2021/12/19 11:32:53 riastradh Exp $");
 
 #include <linux/anon_inodes.h>
 #include <linux/mman.h>
@@ -508,7 +508,9 @@ void i915_gem_object_release_mmap_offset
 	spin_lock(&obj->mmo.lock);
 #ifdef __NetBSD__
 	enum i915_mmap_type t;
-	struct vm_page *pg;
+	struct page *page;
+	struct vm_page *vm_page;
+	unsigned i;
 
 	(void)mmo;
 	(void)mn;
@@ -519,8 +521,11 @@ void i915_gem_object_release_mmap_offset
 		 * XXX Gotta take some uvm object's lock, outside the
 		 * spin lock, probably?
 		 */
-		TAILQ_FOREACH(pg, &obj->mm.pageq, pageq.queue)
-			pmap_page_protect(pg, VM_PROT_NONE);
+		for (i = 0; i < obj->base.size >> PAGE_SHIFT; i++) {
+			page = obj->mm.pagearray[i];
+			vm_page = &page->p_vmp;
+			pmap_page_protect(vm_page, VM_PROT_NONE);
+		}
 	}
 #else
 	rbtree_postorder_for_each_entry_safe(mmo, mn,
Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object_types.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object_types.h:1.4 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object_types.h:1.5
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object_types.h:1.4	Sun Dec 19 11:27:27 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object_types.h	Sun Dec 19 11:32:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_object_types.h,v 1.4 2021/12/19 11:27:27 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_object_types.h,v 1.5 2021/12/19 11:32:53 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -214,7 +214,7 @@ struct drm_i915_gem_object {
 		struct list_head region_link;
 
 #ifdef __NetBSD__
-		struct pglist pageq;    /* wired pages of normal objects */
+		struct page **pagearray;/* wired pages of normal objects */
 		struct sg_table *sg;    /* drm prime objects */
 		bus_dma_segment_t *segs;/* internal objects */
 		unsigned nsegs;

Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.5 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.6
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.5	Sun Dec 19 01:44:57 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c	Sun Dec 19 11:32:53 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_shmem.c,v 1.5 2021/12/19 01:44:57 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_shmem.c,v 1.6 2021/12/19 11:32:53 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_shmem.c,v 1.5 2021/12/19 01:44:57 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_shmem.c,v 1.6 2021/12/19 11:32:53 riastradh Exp $");
 
 #include <linux/pagevec.h>
 #include <linux/swap.h>
@@ -298,8 +298,13 @@ __i915_gem_object_release_shmem(struct d
 	    (obj->read_domains & I915_GEM_DOMAIN_CPU) == 0 &&
 	    !(obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ))
 #ifdef __NetBSD__
-		/* XXX Shouldn't realy use obj->... here.  */
-		drm_clflush_pglist(&obj->mm.pageq);
+		/*
+		 * XXX Should maybe use bus_dmamap_sync instead --
+		 * shouldn't really touch obj->mm here since the caller
+		 * already pulled off the pages.
+		 */
+		drm_clflush_pages(obj->mm.pagearray,
+		    obj->base.size >> PAGE_SHIFT);
 #else
 		drm_clflush_sg(pages);
 #endif

Index: src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c
diff -u src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c:1.16 src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c:1.17
--- src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c:1.16	Sun Dec 19 11:05:48 2021
+++ src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c	Sun Dec 19 11:32:54 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: ttm_tt.c,v 1.16 2021/12/19 11:05:48 riastradh Exp $	*/
+/*	$NetBSD: ttm_tt.c,v 1.17 2021/12/19 11:32:54 riastradh Exp $	*/
 
 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
 /**************************************************************************
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ttm_tt.c,v 1.16 2021/12/19 11:05:48 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ttm_tt.c,v 1.17 2021/12/19 11:32:54 riastradh Exp $");
 
 #define pr_fmt(fmt) "[TTM] " fmt
 
@@ -251,7 +251,6 @@ static void ttm_tt_init_fields(struct tt
 	    __func__);	/* paranoia -- can't prove in five minutes */
 	ttm->swap_storage = uao_create(PAGE_SIZE * MAX(1, bo->num_pages), 0);
 	uao_set_pgfl(ttm->swap_storage, bus_dmamem_pgfl(ttm->bdev->dmat));
-	TAILQ_INIT(&ttm->pglist);
 #else
 	ttm->swap_storage = NULL;
 #endif
@@ -427,7 +426,7 @@ int
 ttm_tt_wire(struct ttm_tt *ttm)
 {
 	struct uvm_object *uobj = ttm->swap_storage;
-	struct vm_page *page;
+	struct vm_page *vm_page;
 	unsigned i;
 	int error;
 
@@ -438,19 +437,17 @@ ttm_tt_wire(struct ttm_tt *ttm)
 	KASSERT(uobj != NULL);
 
 	error = uvm_obj_wirepages(uobj, 0, (ttm->num_pages << PAGE_SHIFT),
-	    &ttm->pglist);
+	    NULL);
 	if (error)
 		/* XXX errno NetBSD->Linux */
 		return -error;
 
-	i = 0;
-	TAILQ_FOREACH(page, &ttm->pglist, pageq.queue) {
-		KASSERT(i < ttm->num_pages);
-		KASSERT(ttm->pages[i] == NULL);
-		ttm->pages[i] = container_of(page, struct page, p_vmp);
-		i++;
+	rw_enter(uobj->vmobjlock, RW_READER);
+	for (i = 0; i < ttm->num_pages; i++) {
+		vm_page = uvm_pagelookup(uobj, ptoa(i));
+		ttm->pages[i] = container_of(vm_page, struct page, p_vmp);
 	}
-	KASSERT(i == ttm->num_pages);
+	rw_exit(uobj->vmobjlock);
 
 	/* Success!  */
 	return 0;

Index: src/sys/external/bsd/drm2/dist/include/drm/drm_cache.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/drm_cache.h:1.8 src/sys/external/bsd/drm2/dist/include/drm/drm_cache.h:1.9
--- src/sys/external/bsd/drm2/dist/include/drm/drm_cache.h:1.8	Sun Dec 19 10:47:30 2021
+++ src/sys/external/bsd/drm2/dist/include/drm/drm_cache.h	Sun Dec 19 11:32:54 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_cache.h,v 1.8 2021/12/19 10:47:30 riastradh Exp $	*/
+/*	$NetBSD: drm_cache.h,v 1.9 2021/12/19 11:32:54 riastradh Exp $	*/
 
 /**************************************************************************
  *
@@ -41,8 +41,6 @@ struct page;
 
 void drm_clflush_pages(struct page *pages[], unsigned long num_pages);
 #ifdef __NetBSD__		/* XXX drm clflush */
-struct pglist;
-void drm_clflush_pglist(struct pglist *);
 void drm_clflush_page(struct page *);
 void drm_clflush_virt_range(const void *, size_t);
 #else

Index: src/sys/external/bsd/drm2/dist/include/drm/drm_prime.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/drm_prime.h:1.5 src/sys/external/bsd/drm2/dist/include/drm/drm_prime.h:1.6
--- src/sys/external/bsd/drm2/dist/include/drm/drm_prime.h:1.5	Sun Dec 19 10:38:23 2021
+++ src/sys/external/bsd/drm2/dist/include/drm/drm_prime.h	Sun Dec 19 11:32:54 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_prime.h,v 1.5 2021/12/19 10:38:23 riastradh Exp $	*/
+/*	$NetBSD: drm_prime.h,v 1.6 2021/12/19 11:32:54 riastradh Exp $	*/
 
 /*
  * Copyright © 2012 Red Hat
@@ -112,7 +112,6 @@ void drm_prime_gem_destroy(struct drm_ge
 
 #ifdef __NetBSD__
 extern struct sg_table *drm_prime_bus_dmamem_to_sg(bus_dma_tag_t, const bus_dma_segment_t *, int);
-extern struct sg_table *drm_prime_pglist_to_sg(struct pglist *, unsigned);
 extern int drm_prime_sg_to_bus_dmamem(bus_dma_tag_t, bus_dma_segment_t *, int, int *, const struct sg_table *);
 extern int drm_prime_bus_dmamap_load_sgt(bus_dma_tag_t, bus_dmamap_t, struct sg_table *);
 extern bus_size_t drm_prime_sg_size(struct sg_table *);

Index: src/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h
diff -u src/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h:1.5 src/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h:1.6
--- src/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h:1.5	Sun Dec 19 09:58:30 2021
+++ src/sys/external/bsd/drm2/dist/include/drm/ttm/ttm_tt.h	Sun Dec 19 11:32:54 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: ttm_tt.h,v 1.5 2021/12/19 09:58:30 riastradh Exp $	*/
+/*	$NetBSD: ttm_tt.h,v 1.6 2021/12/19 11:32:54 riastradh Exp $	*/
 
 /**************************************************************************
  *
@@ -113,7 +113,6 @@ struct ttm_tt {
 	struct sg_table *sg; /* for SG objects via dma-buf */
 #ifdef __NetBSD__
 	struct uvm_object *swap_storage;
-	struct pglist pglist;
 #else
 	struct file *swap_storage;
 #endif

Index: src/sys/external/bsd/drm2/drm/drm_cache.c
diff -u src/sys/external/bsd/drm2/drm/drm_cache.c:1.16 src/sys/external/bsd/drm2/drm/drm_cache.c:1.17
--- src/sys/external/bsd/drm2/drm/drm_cache.c:1.16	Sun Dec 19 09:52:00 2021
+++ src/sys/external/bsd/drm2/drm/drm_cache.c	Sun Dec 19 11:32:54 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_cache.c,v 1.16 2021/12/19 09:52:00 riastradh Exp $	*/
+/*	$NetBSD: drm_cache.c,v 1.17 2021/12/19 11:32:54 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_cache.c,v 1.16 2021/12/19 09:52:00 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_cache.c,v 1.17 2021/12/19 11:32:54 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -72,24 +72,6 @@ drm_clflush_pages(struct page **pages, u
 }
 
 void
-drm_clflush_pglist(struct pglist *list)
-{
-#if defined(DRM_CLFLUSH)
-	if (drm_md_clflush_finegrained_p()) {
-		struct vm_page *page;
-
-		drm_md_clflush_begin();
-		TAILQ_FOREACH(page, list, pageq.queue)
-			drm_md_clflush_page(container_of(page, struct page,
-				p_vmp));
-		drm_md_clflush_commit();
-	} else {
-		drm_md_clflush_all();
-	}
-#endif
-}
-
-void
 drm_clflush_page(struct page *page)
 {
 #if defined(DRM_CLFLUSH)

Index: src/sys/external/bsd/drm2/include/drm/bus_dma_hacks.h
diff -u src/sys/external/bsd/drm2/include/drm/bus_dma_hacks.h:1.20 src/sys/external/bsd/drm2/include/drm/bus_dma_hacks.h:1.21
--- src/sys/external/bsd/drm2/include/drm/bus_dma_hacks.h:1.20	Thu Feb 20 09:07:39 2020
+++ src/sys/external/bsd/drm2/include/drm/bus_dma_hacks.h	Sun Dec 19 11:32:54 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: bus_dma_hacks.h,v 1.20 2020/02/20 09:07:39 mrg Exp $	*/
+/*	$NetBSD: bus_dma_hacks.h,v 1.21 2021/12/19 11:32:54 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -40,6 +40,8 @@
 #include <uvm/uvm.h>
 #include <uvm/uvm_extern.h>
 
+#include <linux/mm_types.h>	/* XXX struct page */
+
 #if defined(__i386__) || defined(__x86_64__)
 #  include <x86/bus_private.h>
 #  include <x86/machdep.h>
@@ -120,9 +122,15 @@ bus_dmatag_bounces_paddr(bus_dma_tag_t d
 
 #define MAX_STACK_SEGS 32	/* XXXMRG: 512 bytes on 16 byte seg platforms */
 
+/*
+ * XXX This should really take an array of struct vm_page pointers, but
+ * Linux drm code stores arrays of struct page pointers, and these two
+ * types (struct page ** and struct vm_page **) are not compatible so
+ * naive conversion would violate strict aliasing rules.
+ */
 static inline int
-bus_dmamap_load_pglist(bus_dma_tag_t tag, bus_dmamap_t map,
-    struct pglist *pglist, bus_size_t size, int flags)
+bus_dmamap_load_pages(bus_dma_tag_t tag, bus_dmamap_t map,
+    struct page **pgs, bus_size_t size, int flags)
 {
 	km_flag_t kmflags;
 	bus_dma_segment_t *segs;
@@ -131,12 +139,11 @@ bus_dmamap_load_pglist(bus_dma_tag_t tag
 	struct vm_page *page;
 	int error;
 
-	nsegs = 0;
-	TAILQ_FOREACH(page, pglist, pageq.queue) {
-		if (nsegs == MIN(INT_MAX, (SIZE_MAX / sizeof(segs[0]))))
-			return ENOMEM;
-		nsegs++;
-	}
+	KASSERT((size & (PAGE_SIZE - 1)) == 0);
+
+	if ((size >> PAGE_SHIFT) > INT_MAX)
+		return ENOMEM;
+	nsegs = size >> PAGE_SHIFT;
 
 	KASSERT(nsegs <= (SIZE_MAX / sizeof(segs[0])));
 	if (nsegs > MAX_STACK_SEGS) {
@@ -157,8 +164,8 @@ bus_dmamap_load_pglist(bus_dma_tag_t tag
 		segs = stacksegs;
 	}
 
-	seg = 0;
-	TAILQ_FOREACH(page, pglist, pageq.queue) {
+	for (seg = 0; seg < nsegs; seg++) {
+		page = &pgs[seg]->p_vmp;
 		paddr_t paddr = VM_PAGE_TO_PHYS(page);
 		bus_addr_t baddr = PHYS_TO_BUS_MEM(tag, paddr);
 

Index: src/sys/external/bsd/drm2/ttm/ttm_bus_dma.c
diff -u src/sys/external/bsd/drm2/ttm/ttm_bus_dma.c:1.9 src/sys/external/bsd/drm2/ttm/ttm_bus_dma.c:1.10
--- src/sys/external/bsd/drm2/ttm/ttm_bus_dma.c:1.9	Sun Feb 23 15:46:40 2020
+++ src/sys/external/bsd/drm2/ttm/ttm_bus_dma.c	Sun Dec 19 11:32:54 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: ttm_bus_dma.c,v 1.9 2020/02/23 15:46:40 ad Exp $	*/
+/*	$NetBSD: ttm_bus_dma.c,v 1.10 2021/12/19 11:32:54 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ttm_bus_dma.c,v 1.9 2020/02/23 15:46:40 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ttm_bus_dma.c,v 1.10 2021/12/19 11:32:54 riastradh Exp $");
 
 #include <sys/bus.h>
 
@@ -75,8 +75,8 @@ ttm_bus_dma_populate(struct ttm_dma_tt *
 
 	/* Load the DMA map.  */
 	/* XXX errno NetBSD->Linux */
-	ret = -bus_dmamap_load_pglist(ttm_dma->ttm.bdev->dmat,
-	    ttm_dma->dma_address, &ttm_dma->ttm.pglist,
+	ret = -bus_dmamap_load_pages(ttm_dma->ttm.bdev->dmat,
+	    ttm_dma->dma_address, ttm_dma->ttm.pages,
 	    (ttm_dma->ttm.num_pages << PAGE_SHIFT), BUS_DMA_NOWAIT);
 	if (ret)
 		goto fail1;

Reply via email to