Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 01:35:35 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915: i915_gem_gtt.c
        src/sys/external/bsd/drm2/dist/drm/i915/gt: gen6_ppgtt.h gen8_ppgtt.c
            intel_ggtt.c intel_gtt.c intel_gtt.h

Log Message:
Work over i915_gem_gtt.c enough to make it build.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/gen6_ppgtt.h
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/gen8_ppgtt.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.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_gtt.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c:1.20 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.20	Sun Dec 19 01:24:25 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c	Sun Dec 19 01:35:35 2021
@@ -1,13 +1,12 @@
-/*	$NetBSD: i915_gem_gtt.c,v 1.20 2021/12/19 01:24:25 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_gtt.c,v 1.21 2021/12/19 01:35:35 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
  * Copyright © 2010 Daniel Vetter
  * Copyright © 2020 Intel Corporation
  */
-
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_gtt.c,v 1.20 2021/12/19 01:24:25 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_gtt.c,v 1.21 2021/12/19 01:35:35 riastradh Exp $");
 
 #include <linux/slab.h> /* fault-inject.h is not standalone! */
 
@@ -57,7 +56,7 @@ int i915_gem_gtt_prepare_pages(struct dr
 		 * map or page list.
 		 */
 		if (bus_dmamap_load_pglist(obj->base.dev->dmat, pages,
-			&obj->pageq, pages->dm_mapsize, BUS_DMA_NOWAIT) == 0)
+			&obj->mm.pageq, pages->dm_mapsize, BUS_DMA_NOWAIT) == 0)
 			return 0;
 #else
 		if (dma_map_sg_attrs(&obj->base.dev->pdev->dev,
@@ -93,7 +92,7 @@ void i915_gem_gtt_finish_pages(struct dr
 {
 	struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
 #ifdef __NetBSD__
-	bus_dma_tag_t dmat = dev_priv->drm.dev->dmat;
+	bus_dma_tag_t dmat = dev_priv->drm.dmat;
 #else
 	struct device *kdev = &dev_priv->drm.pdev->dev;
 #endif

Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/gen6_ppgtt.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/gen6_ppgtt.h:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/gen6_ppgtt.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/gen6_ppgtt.h:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/gen6_ppgtt.h	Sun Dec 19 01:35:35 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: gen6_ppgtt.h,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: gen6_ppgtt.h,v 1.3 2021/12/19 01:35:35 riastradh Exp $	*/
 
 /* SPDX-License-Identifier: MIT */
 /*
@@ -15,7 +15,12 @@ struct gen6_ppgtt {
 
 	struct mutex flush;
 	struct i915_vma *vma;
+#ifdef __NetBSD__
+	bus_space_tag_t pd_bst;
+	bus_space_handle_t pd_bsh;
+#else
 	gen6_pte_t __iomem *pd_addr;
+#endif
 
 	atomic_t pin_count;
 	struct mutex pin_mutex;
@@ -54,6 +59,15 @@ static inline struct gen6_ppgtt *to_gen6
  * so each of the other parameters should preferably be a simple variable, or
  * at most an lvalue with no side-effects!
  */
+#ifdef __NetBSD__		/* XXX ALIGN means something else.  */
+#define gen6_for_each_pde(pt, pd, start, length, iter)			\
+	for (iter = gen6_pde_index(start);				\
+	     length > 0 && iter < I915_PDES &&				\
+		(pt = (pd)->page_table[iter], true);			\
+	     ({ u32 temp = round_up(start+1, 1 << GEN6_PDE_SHIFT);	\
+		    temp = min(temp - start, length);			\
+		    start += temp, length -= temp; }), ++iter)
+#else
 #define gen6_for_each_pde(pt, pd, start, length, iter)			\
 	for (iter = gen6_pde_index(start);				\
 	     length > 0 && iter < I915_PDES &&				\
@@ -61,6 +75,7 @@ static inline struct gen6_ppgtt *to_gen6
 	     ({ u32 temp = ALIGN(start+1, 1 << GEN6_PDE_SHIFT);		\
 		    temp = min(temp - start, length);			\
 		    start += temp, length -= temp; }), ++iter)
+#endif
 
 #define gen6_for_all_pdes(pt, pd, iter)					\
 	for (iter = 0;							\

Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/gen8_ppgtt.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/gen8_ppgtt.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/gt/gen8_ppgtt.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/gen8_ppgtt.c:1.3	Sun Dec 19 01:24:25 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/gen8_ppgtt.c	Sun Dec 19 01:35:35 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: gen8_ppgtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
+/*	$NetBSD: gen8_ppgtt.c,v 1.4 2021/12/19 01:35:35 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gen8_ppgtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gen8_ppgtt.c,v 1.4 2021/12/19 01:35:35 riastradh Exp $");
 
 #include <linux/log2.h>
 
@@ -503,7 +503,7 @@ static void gen8_ppgtt_insert_huge(struc
 
 		do {
 #ifdef __NetBSD__
-			GEM_BUG_ON((iter->map->ds_seg[iter->seg].ds_len -
+			GEM_BUG_ON((iter->map->ds_segs[iter->seg].ds_len -
 				iter->off) < page_size);
 #else
 			GEM_BUG_ON(iter->sg->length < page_size);
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.3 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c:1.3	Sun Dec 19 01:24:25 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c	Sun Dec 19 01:35:35 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_ggtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
+/*	$NetBSD: intel_ggtt.c,v 1.4 2021/12/19 01:35:35 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_ggtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_ggtt.c,v 1.4 2021/12/19 01:35:35 riastradh Exp $");
 
 #include <linux/stop_machine.h>
 
@@ -308,7 +308,7 @@ static void gen6_ggtt_insert_entries(str
 #ifdef __NetBSD__
 	pgno = vma->node.start >> PAGE_SHIFT;
 	for (seg = 0; seg < map->dm_nsegs; seg++) {
-		bus_addr_t addr = map->dm_segs[seg].ds_addr;
+		addr = map->dm_segs[seg].ds_addr;
 		bus_size_t len = map->dm_segs[seg].ds_len;
 		KASSERT((addr & (PAGE_SIZE - 1)) == 0);
 		KASSERT((len & (PAGE_SIZE - 1)) == 0);
@@ -1259,7 +1259,11 @@ static int ggtt_probe_hw(struct i915_ggt
 
 	ggtt->vm.gt = gt;
 	ggtt->vm.i915 = i915;
+#ifdef __NetBSD__
+	ggtt->vm.dmat = i915->drm.dmat;
+#else
 	ggtt->vm.dma = &i915->drm.pdev->dev;
+#endif
 
 	if (INTEL_GEN(i915) <= 5)
 		ret = i915_gmch_probe(ggtt);
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.3 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c:1.3	Sun Dec 19 01:24:25 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c	Sun Dec 19 01:35:35 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_gtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
+/*	$NetBSD: intel_gtt.c,v 1.4 2021/12/19 01:35:35 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_gtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_gtt.c,v 1.4 2021/12/19 01:35:35 riastradh Exp $");
 
 #include <linux/slab.h> /* fault-inject.h is not standalone! */
 
@@ -265,10 +265,14 @@ 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) {
 		sg_free_table(vma->pages);
 		kfree(vma->pages);
 	}
+#endif
 	vma->pages = NULL;
 
 	memset(&vma->page_sizes, 0, sizeof(vma->page_sizes));
@@ -283,7 +287,7 @@ static int __setup_page_dma(struct i915_
 	int error;
 	int nseg = 1;
 
-	if (flags & __GFP_WAIT)
+	if (gfp & __GFP_WAIT)
 		busdmaflags |= BUS_DMA_WAITOK;
 	else
 		busdmaflags |= BUS_DMA_NOWAIT;
@@ -312,7 +316,7 @@ fail2: __unused
 	p->page = container_of(PHYS_TO_VM_PAGE(p->seg.ds_addr), struct page,
 	    p_vmp);
 
-	if (flags & __GFP_ZERO) {
+	if (gfp & __GFP_ZERO) {
 		void *va = kmap_atomic(p->page);
 		memset(va, 0, PAGE_SIZE);
 		kunmap_atomic(va);
@@ -383,6 +387,48 @@ int setup_scratch_page(struct i915_addre
 	gfp |= __GFP_ZERO | __GFP_RETRY_MAYFAIL;
 
 	do {
+#ifdef __NetBSD__
+		struct vm_page *vm_page;
+		void *kva;
+		int nseg;
+		int ret;
+
+		/* Allocate a scratch page.  */
+		/* XXX errno NetBSD->Linux */
+		ret = -bus_dmamem_alloc(vm->dmat, size, size, 0,
+		    &vm->scratch_page.seg, 1, &nseg, BUS_DMA_NOWAIT);
+		if (ret)
+			goto skip;
+		KASSERT(nseg == 1);
+		KASSERT(vm->scratch_page.seg.ds_len == size);
+
+		/* Create a DMA map.  */
+		ret = -bus_dmamap_create(vm->dmat, size, 1, size, 0,
+		    BUS_DMA_NOWAIT, &vm->scratch_page.map);
+		if (ret)
+			goto free_dmamem;
+
+		/* Load the segment into the DMA map.  */
+		ret = -bus_dmamap_load_raw(vm->dmat, vm->scratch_page.map,
+		    &vm->scratch_page.seg, 1, size, BUS_DMA_NOWAIT);
+		if (ret)
+			goto destroy_dmamap;
+		KASSERT(vm->scratch_page.map->dm_nsegs == 1);
+		KASSERT(vm->scratch_page.map->dm_segs[0].ds_len == size);
+
+		/* Zero the page.  */
+		ret = -bus_dmamem_map(vm->dmat, &vm->scratch_page.seg, 1,
+		    size, &kva, BUS_DMA_NOWAIT);
+		if (ret)
+			goto unload_dmamap;
+		memset(kva, 0, size);
+		bus_dmamem_unmap(vm->dmat, kva, size);
+
+		/* XXX Is this page guaranteed to work as a huge page?  */
+		vm_page = PHYS_TO_VM_PAGE(vm->scratch_page.seg.ds_addr);
+		vm->scratch_page.page = container_of(vm_page, struct page,
+		    p_vmp);
+#else
 		unsigned int order = get_order(size);
 		struct page *page;
 		dma_addr_t addr;
@@ -405,12 +451,20 @@ int setup_scratch_page(struct i915_addre
 		vm->scratch[0].base.page = page;
 		vm->scratch[0].base.daddr = addr;
 		vm->scratch_order = order;
+#endif
 		return 0;
 
+#ifdef __NetBSD__
+unload_dmamap:	bus_dmamap_unload(vm->dmat, vm->scratch_page.map);
+destroy_dmamap:	bus_dmamap_destroy(vm->dmat, vm->scratch_page.map);
+		vm->scratch_page.map = NULL; /* paranoia */
+free_dmamem:	bus_dmamem_free(vm->dmat, &vm->scratch_page.seg, 1);
+#else
 unmap_page:
 		dma_unmap_page(vm->dma, addr, size, PCI_DMA_BIDIRECTIONAL);
 free_page:
 		__free_pages(page, order);
+#endif
 skip:
 		if (size == I915_GTT_PAGE_SIZE_4K)
 			return -ENOMEM;
@@ -423,11 +477,18 @@ skip:
 void cleanup_scratch_page(struct i915_address_space *vm)
 {
 	struct i915_page_dma *p = px_base(&vm->scratch[0]);
+#ifdef __NetBSD__
+	bus_dmamap_unload(vm->dmat, p->map);
+	bus_dmamap_destroy(vm->dmat, p->map);
+	vm->scratch_page.map = NULL; /* paranoia */
+	bus_dmamem_free(vm->dmat, &p->seg, 1);
+#else
 	unsigned int order = vm->scratch_order;
 
 	dma_unmap_page(vm->dma, p->daddr, BIT(order) << PAGE_SHIFT,
 		       PCI_DMA_BIDIRECTIONAL);
 	__free_pages(p->page, order);
+#endif
 }
 
 void free_scratch(struct i915_address_space *vm)
Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.h:1.3 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.h:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.h:1.3	Sun Dec 19 01:24:25 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.h	Sun Dec 19 01:35:35 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_gtt.h,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
+/*	$NetBSD: intel_gtt.h,v 1.4 2021/12/19 01:35:35 riastradh Exp $	*/
 
 /* SPDX-License-Identifier: MIT */
 /*
@@ -142,6 +142,13 @@ typedef u64 gen8_pte_t;
 
 struct i915_page_dma {
 	struct page *page;
+#ifdef __NetBSD__
+	union {
+		bus_dma_segment_t seg;
+		uint32_t ggtt_offset;
+	};
+	bus_dmamap_t map;
+#else
 	union {
 		dma_addr_t daddr;
 
@@ -151,6 +158,7 @@ struct i915_page_dma {
 		 */
 		u32 ggtt_offset;
 	};
+#endif
 };
 
 struct i915_page_scratch {
@@ -182,7 +190,11 @@ struct i915_page_directory {
 	__px_choose_expr(px, struct i915_page_table *, &__x->base, \
 	__px_choose_expr(px, struct i915_page_directory *, &__x->pt.base, \
 	(void)0))))
+#ifdef __NetBSD__
+#define px_dma(px) (px_base(px)->map->dm_segs[0].ds_addr)
+#else
 #define px_dma(px) (px_base(px)->daddr)
+#endif
 
 #define px_pt(px) \
 	__px_choose_expr(px, struct i915_page_table *, __x, \
@@ -213,8 +225,10 @@ struct i915_vma_ops {
 };
 
 struct pagestash {
+#ifndef __NetBSD__
 	spinlock_t lock;
 	struct pagevec pvec;
+#endif
 };
 
 void stash_init(struct pagestash *stash);
@@ -226,7 +240,12 @@ struct i915_address_space {
 	struct drm_mm mm;
 	struct intel_gt *gt;
 	struct drm_i915_private *i915;
+#ifdef __NetBSD__
+	bus_dma_tag_t dmat;
+#else
 	struct device *dma;
+#endif
+
 	/*
 	 * Every address space belongs to a struct file - except for the global
 	 * GTT that is owned by the driver (and so @file is set to NULL). In
@@ -264,7 +283,9 @@ struct i915_address_space {
 	 */
 	struct list_head bound_list;
 
+#ifndef __NetBSD__
 	struct pagestash free_pages;
+#endif
 
 	/* Global GTT */
 	bool is_ggtt:1;
@@ -313,11 +334,36 @@ struct i915_ggtt {
 	struct i915_address_space vm;
 
 	struct io_mapping iomap;	/* Mapping to our CPU mappable region */
+#ifdef __NetBSD__
+	struct {
+		bus_addr_t start;
+	} gmadr;
+#else
 	struct resource gmadr;          /* GMADR resource */
+#endif
 	resource_size_t mappable_end;	/* End offset that we can CPU map */
 
 	/** "Graphics Stolen Memory" holds the global PTEs */
+#ifdef __NetBSD__
+	/*
+	 * This is not actually the `Graphics Stolen Memory'; it is the
+	 * graphics translation table, which we write to through the
+	 * GTTADR/GTTMMADR PCI BAR, and which is backed by `Graphics
+	 * GTT Stolen Memory'.  That isn't the `Graphics Stolen Memory'
+	 * either, although it is stolen from main memory.
+	 */
+	bus_space_tag_t		gsmt;
+	bus_space_handle_t	gsmh;
+	bus_size_t		gsmsz;
+
+	/* Maximum physical address that can be wired into a GTT entry.  */
+	uint64_t		max_paddr;
+
+	/* Page freelist for pages limited to the above maximum address.  */
+	int			pgfl;
+#else
 	void __iomem *gsm;
+#endif
 	void (*invalidate)(struct i915_ggtt *ggtt);
 
 	/** PPGTT used for aliasing the PPGTT with the GTT */
@@ -369,7 +415,11 @@ i915_vm_is_4lvl(const struct i915_addres
 static inline bool
 i915_vm_has_scratch_64K(struct i915_address_space *vm)
 {
+#ifdef __NetBSD__
+	return vm->scratch_page.seg.ds_len == I915_GTT_PAGE_SIZE_64K;
+#else
 	return vm->scratch_order == get_order(I915_GTT_PAGE_SIZE_64K);
+#endif
 }
 
 static inline bool

Reply via email to