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;