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;