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