Module Name: src Committed By: riastradh Date: Sun Dec 19 01:34:08 UTC 2021
Modified Files: src/sys/external/bsd/drm2/dist/drm/i915: i915_gem.c i915_gem_fence_reg.h src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_object.c i915_gem_pages.c i915_gem_phys.c i915_gem_shmem.c i915_gem_wait.c Log Message: Sync i915_gem_fault. Hack up the rest of i915_gem.c enough to build. To generate a diff of this commit: cvs rdiff -u -r1.63 -r1.64 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c cvs rdiff -u -r1.2 -r1.3 \ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h cvs rdiff -u -r1.2 -r1.3 \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object.c \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_wait.c cvs rdiff -u -r1.3 -r1.4 \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.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/i915_gem.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.63 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.64 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.63 Sun Dec 19 01:24:25 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c Sun Dec 19 01:34:08 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem.c,v 1.63 2021/12/19 01:24:25 riastradh Exp $ */ +/* $NetBSD: i915_gem.c,v 1.64 2021/12/19 01:34:08 riastradh Exp $ */ /* * Copyright © 2008-2015 Intel Corporation @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem.c,v 1.63 2021/12/19 01:24:25 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem.c,v 1.64 2021/12/19 01:34:08 riastradh Exp $"); #ifdef __NetBSD__ #if 0 /* XXX uvmhist option? */ @@ -283,7 +283,11 @@ i915_gem_dumb_create(struct drm_file *fi } /* have to work out size/pitch and return them */ +#ifdef __NetBSD__ /* ALIGN means something else. */ + args->pitch = round_up(args->width * cpp, 64); +#else args->pitch = ALIGN(args->width * cpp, 64); +#endif /* align stride to page size so that we can remap */ if (args->pitch > intel_plane_fb_max_stride(to_i915(dev), format, 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.2 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.2 Sat Dec 18 23:45:28 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h Sun Dec 19 01:34:08 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_fence_reg.h,v 1.2 2021/12/18 23:45:28 riastradh Exp $ */ +/* $NetBSD: i915_gem_fence_reg.h,v 1.3 2021/12/19 01:34:08 riastradh Exp $ */ /* * Copyright © 2016 Intel Corporation @@ -61,10 +61,17 @@ void i915_unreserve_fence(struct i915_fe void i915_gem_restore_fences(struct i915_ggtt *ggtt); +#ifdef __NetBSD__ +void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj, + struct pglist *pages); +void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj, + struct pglist *pages); +#else void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj, struct sg_table *pages); void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj, struct sg_table *pages); +#endif void i915_ggtt_init_fences(struct i915_ggtt *ggtt); Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object.c:1.2 Sat Dec 18 23:45:30 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object.c Sun Dec 19 01:34:08 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_object.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $ */ +/* $NetBSD: i915_gem_object.c,v 1.3 2021/12/19 01:34:08 riastradh Exp $ */ /* * Copyright © 2017 Intel Corporation @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_object.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_object.c,v 1.3 2021/12/19 01:34:08 riastradh Exp $"); #include <linux/sched/mm.h> @@ -75,8 +75,10 @@ void i915_gem_object_init(struct drm_i91 obj->ops = ops; obj->mm.madv = I915_MADV_WILLNEED; +#ifndef __NetBSD__ INIT_RADIX_TREE(&obj->mm.get_page.radix, GFP_KERNEL | __GFP_NOWARN); mutex_init(&obj->mm.get_page.lock); +#endif } /** Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c:1.2 Sat Dec 18 23:45:30 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c Sun Dec 19 01:34:08 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_phys.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $ */ +/* $NetBSD: i915_gem_phys.c,v 1.3 2021/12/19 01:34:08 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_phys.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_phys.c,v 1.3 2021/12/19 01:34:08 riastradh Exp $"); #include <linux/highmem.h> #include <linux/shmem_fs.h> @@ -155,7 +155,11 @@ static const struct drm_i915_gem_object_ int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, int align) { +#ifdef __NetBSD__ + bus_dmamap_t pages; +#else struct sg_table *pages; +#endif int err; if (align > obj->base.size) @@ -209,7 +213,13 @@ int i915_gem_object_attach_phys(struct d err_xfer: obj->ops = &i915_gem_shmem_ops; if (!IS_ERR_OR_NULL(pages)) { +#ifdef __NetBSD__ + unsigned int sg_page_sizes = 0, seg; + for (seg = 0; seg < pages->dm_nsegs; seg++) + sg_page_sizes |= pages->dm_segs[seg].ds_len; +#else unsigned int sg_page_sizes = i915_sg_page_sizes(pages->sgl); +#endif __i915_gem_object_set_pages(obj, pages, sg_page_sizes); } Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_wait.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_wait.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_wait.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_wait.c:1.2 Sat Dec 18 23:45:30 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_wait.c Sun Dec 19 01:34:08 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_wait.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $ */ +/* $NetBSD: i915_gem_wait.c,v 1.3 2021/12/19 01:34:08 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_wait.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_wait.c,v 1.3 2021/12/19 01:34:08 riastradh Exp $"); #include <linux/dma-fence-array.h> #include <linux/jiffies.h> @@ -103,6 +103,9 @@ static void __fence_set_priority(struct { struct i915_request *rq; struct intel_engine_cs *engine; +#ifdef __NetBSD__ + int s; +#endif if (dma_fence_is_signaled(fence) || !dma_fence_is_i915(fence)) return; @@ -110,12 +113,20 @@ static void __fence_set_priority(struct rq = to_request(fence); engine = rq->engine; +#ifdef __NetBSD__ + s = splsoftserial(); +#else local_bh_disable(); +#endif rcu_read_lock(); /* RCU serialisation for set-wedged protection */ if (engine->schedule) engine->schedule(rq, attr); rcu_read_unlock(); +#ifdef __NetBSD__ + splx(s); +#else local_bh_enable(); /* kick the tasklets if queues were reprioritised */ +#endif } static void fence_set_priority(struct dma_fence *fence, Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c:1.4 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c:1.3 Sun Dec 19 01:24:25 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c Sun Dec 19 01:34:08 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_pages.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $ */ +/* $NetBSD: i915_gem_pages.c,v 1.4 2021/12/19 01:34:08 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_pages.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_pages.c,v 1.4 2021/12/19 01:34:08 riastradh Exp $"); #include "i915_drv.h" #include "i915_gem_object.h" @@ -421,6 +421,7 @@ void __i915_gem_object_flush_map(struct } } +#ifndef __NetBSD__ struct scatterlist * i915_gem_object_get_sg(struct drm_i915_gem_object *obj, unsigned int n, @@ -533,10 +534,35 @@ lookup: return sg; } +#endif struct page * i915_gem_object_get_page(struct drm_i915_gem_object *obj, unsigned int n) { +#ifdef __NetBSD__ + struct vm_page *page; + + if (obj->phys_handle) { + vaddr_t va = (vaddr_t)obj->phys_handle->vaddr; + paddr_t pa; + if (!pmap_extract(pmap_kernel(), va + n*PAGE_SIZE, &pa)) + panic("i915 gem object phys-attached but not mapped:" + " obj=%p pgno=%d va=%p", obj, n, + obj->phys_handle->vaddr); + page = PHYS_TO_VM_PAGE(pa); + } else { + /* + * Pages must be pinned so that we need not hold the + * lock to prevent them from disappearing. + */ + KASSERT(obj->mm.pages != NULL); + mutex_enter(obj->base.filp->vmobjlock); + page = uvm_pagelookup(obj->base.filp, ptoa(n)); + mutex_exit(obj->base.filp->vmobjlock); + } + KASSERT(page != NULL); + return container_of(page, struct page, p_vmp); +#else struct scatterlist *sg; unsigned int offset; @@ -544,6 +570,7 @@ i915_gem_object_get_page(struct drm_i915 sg = i915_gem_object_get_sg(obj, n, &offset); return nth_page(sg_page(sg), offset); +#endif } /* Like i915_gem_object_get_page(), but mark the returned page dirty */ @@ -565,6 +592,18 @@ i915_gem_object_get_dma_address_len(stru unsigned long n, unsigned int *len) { +#ifdef __NetBSD__ + bus_addr_t poff = (bus_addr_t)n << PAGE_SHIFT; + unsigned seg; + + for (seg = 0; seg < obj->mm.pages->dm_nsegs; seg++) { + if (poff <= obj->mm.pages->dm_segs[seg].ds_len) + return obj->mm.pages->dm_segs[seg].ds_addr + poff; + poff -= obj->mm.pages->dm_segs[seg].ds_len; + } + KASSERT(0); + return 0; +#else struct scatterlist *sg; unsigned int offset; @@ -574,6 +613,7 @@ i915_gem_object_get_dma_address_len(stru *len = sg_dma_len(sg) - (offset << PAGE_SHIFT); return sg_dma_address(sg) + (offset << PAGE_SHIFT); +#endif } dma_addr_t 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.3 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.4 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.3 Sun Dec 19 01:24:25 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c Sun Dec 19 01:34:08 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_shmem.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $ */ +/* $NetBSD: i915_gem_shmem.c,v 1.4 2021/12/19 01:34:08 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_shmem.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_shmem.c,v 1.4 2021/12/19 01:34:08 riastradh Exp $"); #include <linux/pagevec.h> #include <linux/swap.h> @@ -557,8 +557,19 @@ i915_gem_object_create_shmem_from_data(s const void *data, resource_size_t size) { struct drm_i915_gem_object *obj; +#ifdef __NetBSD__ + struct iovec iov = { .iov_base = __UNCONST(data), .iov_len = size }; + struct uio uio = { + .uio_iov = &iov, + .uio_iovcnt = 1, + .uio_offset = 0, + .uio_resid = size, + .uio_rw = UIO_WRITE, + }; +#else struct file *file; resource_size_t offset; +#endif int err; obj = i915_gem_object_create_shmem(dev_priv, round_up(size, PAGE_SIZE)); @@ -567,6 +578,14 @@ i915_gem_object_create_shmem_from_data(s GEM_BUG_ON(obj->write_domain != I915_GEM_DOMAIN_CPU); +#ifdef __NetBSD__ + UIO_SETUP_SYSSPACE(&uio); + /* XXX errno NetBSD->Linux */ + err = -ubc_uiomove(obj->base.filp, &uio, size, UVM_ADV_NORMAL, + UBC_WRITE); + if (err) + goto fail; +#else file = obj->base.filp; offset = 0; do { @@ -594,6 +613,7 @@ i915_gem_object_create_shmem_from_data(s data += len; offset += len; } while (size); +#endif return obj;