Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 12:10:07 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_mman.c
        src/sys/external/bsd/drm2/dist/drm/i915/gt: intel_ggtt.c intel_gtt.c

Log Message:
i915: Draft intel ggtt partial page view.


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c
cvs rdiff -u -r1.9 -r1.10 \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c
cvs rdiff -u -r1.7 -r1.8 \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.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/i915/gem/i915_gem_mman.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.18 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.19
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.18	Sun Dec 19 12:09:01 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c	Sun Dec 19 12:10:06 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_mman.c,v 1.18 2021/12/19 12:09:01 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_mman.c,v 1.19 2021/12/19 12:10:06 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.18 2021/12/19 12:09:01 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.19 2021/12/19 12:10:06 riastradh Exp $");
 
 #include <linux/anon_inodes.h>
 #include <linux/mman.h>
@@ -434,9 +434,6 @@ static vm_fault_t vm_fault_gtt(struct vm
 				       PIN_MAPPABLE |
 				       PIN_NONBLOCK /* NOWARN */ |
 				       PIN_NOEVICT);
-#ifdef __NetBSD__		/* XXX i915 partial views */
-	(void)compute_partial_view;
-#else
 	if (IS_ERR(vma)) {
 		/* Use a partial view if it is bigger than available space */
 		struct i915_ggtt_view view =
@@ -462,7 +459,6 @@ static vm_fault_t vm_fault_gtt(struct vm
 		/* The entire mappable GGTT is pinned? Unexpected! */
 		GEM_BUG_ON(vma == ERR_PTR(-ENOSPC));
 	}
-#endif
 	if (IS_ERR(vma)) {
 		ret = PTR_ERR(vma);
 		goto err_reset;

Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c:1.9 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c:1.10
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c:1.9	Sun Dec 19 12:03:38 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c	Sun Dec 19 12:10:07 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_ggtt.c,v 1.9 2021/12/19 12:03:38 riastradh Exp $	*/
+/*	$NetBSD: intel_ggtt.c,v 1.10 2021/12/19 12:10:07 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_ggtt.c,v 1.9 2021/12/19 12:03:38 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_ggtt.c,v 1.10 2021/12/19 12:10:07 riastradh Exp $");
 
 #include <linux/stop_machine.h>
 
@@ -1589,19 +1589,103 @@ err_st_alloc:
 	return ERR_PTR(ret);
 }
 
+#endif	/* __NetBSD__ */
+
 static noinline struct sg_table *
 intel_partial_pages(const struct i915_ggtt_view *view,
 		    struct drm_i915_gem_object *obj)
 {
+#ifdef __NetBSD__
+	struct sg_table *st = NULL;
+	int ret = -ENOMEM;
+
+	KASSERTMSG(view->partial.offset <= obj->base.size >> PAGE_SHIFT,
+	    "obj=%p size=0x%zx; view offset=0x%zx size=0x%zx",
+	    obj,
+	    (size_t)obj->base.size >> PAGE_SHIFT,
+	    (size_t)view->partial.offset,
+	    (size_t)view->partial.size);
+	KASSERTMSG((view->partial.size <=
+		(obj->base.size >> PAGE_SHIFT) - view->partial.offset),
+	    "obj=%p size=0x%zx; view offset=0x%zx size=0x%zx",
+	    obj,
+	    (size_t)obj->base.size >> PAGE_SHIFT,
+	    (size_t)view->partial.offset,
+	    (size_t)view->partial.size);
+	KASSERTMSG(view->partial.size <= INT_MAX, "view size=0x%zx",
+	    (size_t)view->partial.size);
+
+	st = kmalloc(sizeof(*st), GFP_KERNEL);
+	if (st == NULL)
+		goto fail;
+	ret = sg_alloc_table(st, view->partial.size, GFP_KERNEL);
+	if (ret) {
+		kfree(st);
+		st = NULL;
+		goto fail;
+	}
+
+	/* XXX errno NetBSD->Linux */
+	if (obj->mm.pages->sgl->sg_dmamap) { /* XXX KASSERT?  */
+		ret = -bus_dmamap_create(obj->base.dev->dmat,
+		    (bus_size_t)view->partial.size << PAGE_SHIFT,
+		    view->partial.size, PAGE_SIZE, 0, BUS_DMA_NOWAIT,
+		    &st->sgl->sg_dmamap);
+		if (ret)
+			goto fail;
+	}
+
+	/*
+	 * Copy over the pages.  The view's offset and size are in
+	 * units of pages already.
+	 */
+	KASSERT(st->sgl->sg_npgs == view->partial.size);
+	memcpy(st->sgl->sg_pgs,
+	    obj->mm.pages->sgl->sg_pgs + view->partial.offset,
+	    sizeof(st->sgl->sg_pgs[0]) * view->partial.size);
+
+	/*
+	 * Copy over the DMA addresses.  For simplicity, we don't do
+	 * anything to compress contiguous pages into larger segments.
+	 */
+	if (obj->mm.pages->sgl->sg_dmamap) {
+		unsigned i, j, k;
+
+		st->sgl->sg_dmamap->dm_nsegs = view->partial.size;
+		for (i = j = 0; i < view->partial.size; j++) {
+			KASSERT(j <= obj->mm.pages->sgl->sg_dmamap->dm_nsegs);
+			const bus_dma_segment_t *iseg =
+			    &obj->mm.pages->sgl->sg_dmamap->dm_segs[j];
+			KASSERT(iseg->ds_len % PAGE_SIZE == 0);
+			for (k = 0; k < iseg->ds_len >> PAGE_SHIFT; k++) {
+				bus_dma_segment_t *oseg =
+				    &st->sgl->sg_dmamap->dm_segs[i++];
+				oseg->ds_addr = iseg->ds_addr + k*PAGE_SIZE;
+				oseg->ds_len = PAGE_SIZE;
+			}
+		}
+	}
+
+	/* Success!  */
+	return st;
+
+fail:	if (st->sgl->sg_dmamap)
+		bus_dmamap_destroy(obj->base.dev->dmat, st->sgl->sg_dmamap);
+	if (st)
+		kfree(st);
+	return ERR_PTR(ret);
+#else
 	struct sg_table *st;
 	struct scatterlist *sg, *iter;
 	unsigned int count = view->partial.size;
 	unsigned int offset;
-	int ret = -ENOMEM;
+	int ret;
 
 	st = kmalloc(sizeof(*st), GFP_KERNEL);
-	if (!st)
+	if (!st) {
+		ret = -ENOMEM;
 		goto err_st_alloc;
+	}
 
 	ret = sg_alloc_table(st, count, GFP_KERNEL);
 	if (ret)
@@ -1640,9 +1724,8 @@ err_sg_alloc:
 	kfree(st);
 err_st_alloc:
 	return ERR_PTR(ret);
-}
-
 #endif	/* __NetBSD__ */
+}
 
 static int
 i915_get_ggtt_vma_pages(struct i915_vma *vma)
@@ -1675,11 +1758,11 @@ i915_get_ggtt_vma_pages(struct i915_vma 
 		vma->pages =
 			intel_remap_pages(&vma->ggtt_view.remapped, vma->obj);
 		break;
+#endif
 
 	case I915_GGTT_VIEW_PARTIAL:
 		vma->pages = intel_partial_pages(&vma->ggtt_view, vma->obj);
 		break;
-#endif
 	}
 
 	ret = 0;

Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c:1.7 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c:1.8
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c:1.7	Sun Dec 19 11:45:01 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c	Sun Dec 19 12:10:07 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_gtt.c,v 1.7 2021/12/19 11:45:01 riastradh Exp $	*/
+/*	$NetBSD: intel_gtt.c,v 1.8 2021/12/19 12:10:07 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_gtt.c,v 1.7 2021/12/19 11:45:01 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_gtt.c,v 1.8 2021/12/19 12:10:07 riastradh Exp $");
 
 #include <linux/slab.h> /* fault-inject.h is not standalone! */
 
@@ -267,14 +267,16 @@ void clear_pages(struct i915_vma *vma)
 {
 	GEM_BUG_ON(!vma->pages);
 
-#ifdef __NetBSD__		/* XXX rotate pages */
-	GEM_BUG_ON(vma->pages != vma->obj->mm.pages);
-#else
 	if (vma->pages != vma->obj->mm.pages) {
+#ifdef __NetBSD__
+		if (vma->pages->sgl->sg_dmamap) {
+			bus_dma_tag_t dmat = vma->obj->base.dev->dmat;
+			bus_dmamap_destroy(dmat, vma->pages->sgl->sg_dmamap);
+		}
+#endif
 		sg_free_table(vma->pages);
 		kfree(vma->pages);
 	}
-#endif
 	vma->pages = NULL;
 
 	memset(&vma->page_sizes, 0, sizeof(vma->page_sizes));

Reply via email to