Module Name: src Committed By: riastradh Date: Sun Dec 19 11:26:35 UTC 2021
Modified Files: src/sys/external/bsd/drm2/dist/drm/i915: i915_drv.c i915_gem.c src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_clflush.c i915_gem_client_blt.c i915_gem_mman.c src/sys/external/bsd/drm2/i915drm: i915_module.c src/sys/external/bsd/drm2/include/linux: irq_work.h Log Message: i915: machete To generate a diff of this commit: cvs rdiff -u -r1.39 -r1.40 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c cvs rdiff -u -r1.69 -r1.70 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/gem/i915_gem_clflush.c \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_client_blt.c cvs rdiff -u -r1.3 -r1.4 \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c cvs rdiff -u -r1.11 -r1.12 src/sys/external/bsd/drm2/i915drm/i915_module.c cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm2/include/linux/irq_work.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_drv.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.39 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.40 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.39 Sun Dec 19 11:19:32 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c Sun Dec 19 11:26:35 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_drv.c,v 1.39 2021/12/19 11:19:32 riastradh Exp $ */ +/* $NetBSD: i915_drv.c,v 1.40 2021/12/19 11:26:35 riastradh Exp $ */ /* i915_drv.c -- i830,i845,i855,i865,i915 driver -*- linux-c -*- */ @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_drv.c,v 1.39 2021/12/19 11:19:32 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_drv.c,v 1.40 2021/12/19 11:26:35 riastradh Exp $"); #include <linux/acpi.h> #include <linux/device.h> @@ -2847,16 +2847,6 @@ static const struct drm_ioctl_desc i915_ DRM_IOCTL_DEF_DRV(I915_GEM_VM_DESTROY, i915_gem_vm_destroy_ioctl, DRM_RENDER_ALLOW), }; -#ifdef __NetBSD__ - -static const struct uvm_pagerops i915_gem_uvm_ops = { - .pgo_reference = drm_gem_pager_reference, - .pgo_detach = drm_gem_pager_detach, - .pgo_fault = i915_gem_fault, -}; - -#endif - static struct drm_driver driver = { /* Don't use MTRRs here; the Xserver or userspace app should * deal with them for Intel hardware. @@ -2875,9 +2865,8 @@ static struct drm_driver driver = { .request_irq = drm_pci_request_irq, .free_irq = drm_pci_free_irq, - /* XXX Not clear the `or legacy' part is important here. */ - .mmap_object = &drm_gem_mmap_object, - .gem_uvm_ops = &i915_gem_uvm_ops, + .mmap_object = &i915_gem_mmap_object, + .gem_uvm_ops = NULL, #endif 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.69 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.70 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.69 Sun Dec 19 11:24:29 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c Sun Dec 19 11:26:35 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem.c,v 1.69 2021/12/19 11:24:29 riastradh Exp $ */ +/* $NetBSD: i915_gem.c,v 1.70 2021/12/19 11:26:35 riastradh Exp $ */ /* * Copyright © 2008-2015 Intel Corporation @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem.c,v 1.69 2021/12/19 11:24:29 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem.c,v 1.70 2021/12/19 11:26:35 riastradh Exp $"); #ifdef __NetBSD__ #if 0 /* XXX uvmhist option? */ @@ -1239,7 +1239,9 @@ void i915_gem_driver_remove(struct drm_i i915_gem_suspend_late(dev_priv); intel_gt_driver_remove(&dev_priv->gt); +#ifndef __NetBSD__ /* XXX uabi_engines */ dev_priv->uabi_engines = RB_ROOT; +#endif /* Flush any outstanding unpin_work. */ i915_gem_drain_workqueue(dev_priv); 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.2 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.2 Sat Dec 18 23:45:30 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_clflush.c Sun Dec 19 11:26:35 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_clflush.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $ */ +/* $NetBSD: i915_gem_clflush.c,v 1.3 2021/12/19 11:26:35 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_clflush.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_clflush.c,v 1.3 2021/12/19 11:26:35 riastradh Exp $"); #include "display/intel_frontbuffer.h" @@ -24,7 +24,11 @@ struct clflush { static void __do_clflush(struct drm_i915_gem_object *obj) { GEM_BUG_ON(!i915_gem_object_has_pages(obj)); +#ifdef __NetBSD__ + drm_clflush_pglist(&obj->mm.pageq); +#else drm_clflush_sg(obj->mm.pages); +#endif i915_gem_object_flush_frontbuffer(obj, ORIGIN_CPU); } Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_client_blt.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_client_blt.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_client_blt.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_client_blt.c:1.2 Sat Dec 18 23:45:30 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_client_blt.c Sun Dec 19 11:26:35 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_client_blt.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $ */ +/* $NetBSD: i915_gem_client_blt.c,v 1.3 2021/12/19 11:26:35 riastradh Exp $ */ // SPDX-License-Identifier: MIT /* @@ -6,7 +6,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_client_blt.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_client_blt.c,v 1.3 2021/12/19 11:26:35 riastradh Exp $"); #include "i915_drv.h" #include "gt/intel_context.h" @@ -18,7 +18,12 @@ __KERNEL_RCSID(0, "$NetBSD: i915_gem_cli struct i915_sleeve { struct i915_vma *vma; struct drm_i915_gem_object *obj; +#ifdef __NetBSD__ + struct pglist *pglist; + bus_dmamap_t pages; /* XXX ??? XXX ??? */ +#else struct sg_table *pages; +#endif struct i915_page_sizes page_sizes; }; @@ -171,7 +176,11 @@ static void clear_pages_worker(struct wo if (obj->cache_dirty) { if (i915_gem_object_has_struct_page(obj)) +#ifdef __NetBSD__ + drm_clflush_pglist(w->sleeve->pglist); +#else drm_clflush_sg(w->sleeve->pages); +#endif obj->cache_dirty = false; } obj->read_domains = I915_GEM_GPU_DOMAINS; @@ -258,7 +267,27 @@ clear_pages_work_notify(struct i915_sw_f return NOTIFY_DONE; } +#ifdef __NetBSD__ +/* XXX my kingdom for a non-tentacular link set */ + +static spinlock_t fence_lock; + +void i915_gem_client_blt_init(void); +void +i915_gem_client_blt_init(void) +{ + spin_lock_init(&fence_lock); +} + +void i915_gem_client_blt_fini(void); +void +i915_gem_client_blt_fini(void) +{ + spin_lock_destroy(&fence_lock); +} +#else static DEFINE_SPINLOCK(fence_lock); +#endif /* XXX: better name please */ int i915_gem_schedule_fill_pages_blt(struct drm_i915_gem_object *obj, 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.3 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.3 Sun Dec 19 10:24:52 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c Sun Dec 19 11:26:35 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_mman.c,v 1.3 2021/12/19 10:24:52 riastradh Exp $ */ +/* $NetBSD: i915_gem_mman.c,v 1.4 2021/12/19 11:26:35 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.3 2021/12/19 10:24:52 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.4 2021/12/19 11:26:35 riastradh Exp $"); #include <linux/anon_inodes.h> #include <linux/mman.h> @@ -26,6 +26,7 @@ __KERNEL_RCSID(0, "$NetBSD: i915_gem_mma #include "i915_user_extensions.h" #include "i915_vma.h" +#ifndef __NetBSD__ static inline bool __vma_matches(struct vm_area_struct *vma, struct file *filp, unsigned long addr, unsigned long size) @@ -36,6 +37,7 @@ __vma_matches(struct vm_area_struct *vma return vma->vm_start == addr && (vma->vm_end - vma->vm_start) == PAGE_ALIGN(size); } +#endif /** * i915_gem_mmap_ioctl - Maps the contents of an object, returning the address @@ -94,6 +96,26 @@ i915_gem_mmap_ioctl(struct drm_device *d goto err; } +#ifdef __NetBSD__ + int error; + + /* Acquire a reference for uvm_map to consume. */ + uao_reference(obj->filp); + addr = (*curproc->p_emul->e_vm_default_addr)(curproc, + (vaddr_t)curproc->p_vmspace->vm_daddr, args->size, + curproc->p_vmspace->vm_map.flags & VM_MAP_TOPDOWN); + error = uvm_map(&curproc->p_vmspace->vm_map, &addr, args->size, + obj->filp, args->offset, 0, + UVM_MAPFLAG(VM_PROT_READ|VM_PROT_WRITE, + VM_PROT_READ|VM_PROT_WRITE, UVM_INH_COPY, UVM_ADV_NORMAL, + 0)); + if (error) { + uao_detach(obj->filp); + /* XXX errno NetBSD->Linux */ + addr = -error; + goto err; + } +#else addr = vm_mmap(obj->base.filp, 0, args->size, PROT_READ | PROT_WRITE, MAP_SHARED, args->offset); @@ -118,6 +140,7 @@ i915_gem_mmap_ioctl(struct drm_device *d if (IS_ERR_VALUE(addr)) goto err; } +#endif i915_gem_object_put(obj); args->addr_ptr = (u64)addr; @@ -215,6 +238,18 @@ compute_partial_view(const struct drm_i9 return view; } +#ifdef __NetBSD__ + +static int +i915_gem_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, struct vm_page **pps, + int npages, int centeridx, vm_prot_t access_type, int flags) +{ + struct uvm_object *uobj = ufi->entry->object.uvm_obj; + struct ... +} + +#else + static vm_fault_t i915_error_to_vmf_fault(int err) { switch (err) { @@ -407,6 +442,8 @@ err: return i915_error_to_vmf_fault(ret); } +#endif /* __NetBSD__ */ + void __i915_gem_object_release_mmap_gtt(struct drm_i915_gem_object *obj) { struct i915_vma *vma; @@ -469,6 +506,23 @@ void i915_gem_object_release_mmap_offset struct i915_mmap_offset *mmo, *mn; spin_lock(&obj->mmo.lock); +#ifdef __NetBSD__ + enum i915_mmap_type t; + struct vm_page *pg; + + (void)mmo; + (void)mn; + for (t = 0; t < I915_MMA_NTYPES; t++) { + if (t == I915_MMAP_TYPE_GTT) + continue; + /* + * 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); + } +#else rbtree_postorder_for_each_entry_safe(mmo, mn, &obj->mmo.offsets, offset) { /* @@ -483,6 +537,7 @@ void i915_gem_object_release_mmap_offset obj->base.dev->anon_inode->i_mapping); spin_lock(&obj->mmo.lock); } +#endif spin_unlock(&obj->mmo.lock); } @@ -503,6 +558,15 @@ static struct i915_mmap_offset * lookup_mmo(struct drm_i915_gem_object *obj, enum i915_mmap_type mmap_type) { +#ifdef __NetBSD__ + struct i915_mmap_offset *mmo; + + spin_lock(&obj->mmo.lock); + mmo = obj->mmo.offsets[mmap_type]; + spin_unlock(&obj->mmo.lock); + + return mmo; +#else struct rb_node *rb; spin_lock(&obj->mmo.lock); @@ -524,11 +588,31 @@ lookup_mmo(struct drm_i915_gem_object *o spin_unlock(&obj->mmo.lock); return NULL; +#endif } static struct i915_mmap_offset * insert_mmo(struct drm_i915_gem_object *obj, struct i915_mmap_offset *mmo) { +#ifdef __NetBSD__ + struct i915_mmap_offset *to_free = NULL; + + spin_lock(&obj->mmo.lock); + if (obj->mmo.offsets[mmo->mmap_type]) { + drm_vma_offset_remove(obj->base.dev->vma_offset_manager, + &mmo->vma_node); + to_free = mmo; + mmo = obj->mmo.offsets[mmo->mmap_type]; + } else { + obj->mmo.offsets[mmo->mmap_type] = mmo; + } + spin_unlock(&obj->mmo.lock); + + if (to_free) + kfree(to_free); + + return mmo; +#else struct rb_node *rb, **p; spin_lock(&obj->mmo.lock); @@ -558,6 +642,7 @@ insert_mmo(struct drm_i915_gem_object *o spin_unlock(&obj->mmo.lock); return mmo; +#endif } static struct i915_mmap_offset * @@ -737,6 +822,17 @@ i915_gem_mmap_offset_ioctl(struct drm_de return __assign_mmap_offset(file, args->handle, type, &args->offset); } +#ifdef __NetBSD__ + +int +i915_gem_mmap_object(struct drm_device *dev, off_t byte_offset, size_t nbytes, + int prot, struct uvm_object **uobjp, voff_t *uoffsetp, struct file *fp) +{ + panic("NYI"); +} + +#else + static void vm_open(struct vm_area_struct *vma) { struct i915_mmap_offset *mmo = vma->vm_private_data; @@ -901,6 +997,8 @@ int i915_gem_mmap(struct file *filp, str return 0; } +#endif /* __NetBSD__ */ + #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) #include "selftests/i915_gem_mman.c" #endif Index: src/sys/external/bsd/drm2/i915drm/i915_module.c diff -u src/sys/external/bsd/drm2/i915drm/i915_module.c:1.11 src/sys/external/bsd/drm2/i915drm/i915_module.c:1.12 --- src/sys/external/bsd/drm2/i915drm/i915_module.c:1.11 Sun Dec 19 11:13:30 2021 +++ src/sys/external/bsd/drm2/i915drm/i915_module.c Sun Dec 19 11:26:35 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_module.c,v 1.11 2021/12/19 11:13:30 riastradh Exp $ */ +/* $NetBSD: i915_module.c,v 1.12 2021/12/19 11:26:35 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_module.c,v 1.11 2021/12/19 11:13:30 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_module.c,v 1.12 2021/12/19 11:26:35 riastradh Exp $"); #include <sys/types.h> #include <sys/module.h> @@ -53,6 +53,8 @@ MODULE(MODULE_CLASS_DRIVER, i915drmkms, struct drm_sysctl_def i915_def = DRM_SYSCTL_INIT(); int i915_global_buddy_init(void); /* XXX */ +void i915_gem_client_blt_init(void); /* XXX */ +void i915_gem_client_blt_fini(void); /* XXX */ static int i915drmkms_init(void) @@ -69,6 +71,7 @@ i915drmkms_init(void) drm_sysctl_init(&i915_def); spin_lock_init(&mchdev_lock); + i915_gem_client_blt_init(); return 0; } @@ -90,6 +93,7 @@ static void i915drmkms_fini(void) { + i915_gem_client_blt_fini(); spin_lock_destroy(&mchdev_lock); drm_sysctl_fini(&i915_def); } Index: src/sys/external/bsd/drm2/include/linux/irq_work.h diff -u src/sys/external/bsd/drm2/include/linux/irq_work.h:1.3 src/sys/external/bsd/drm2/include/linux/irq_work.h:1.4 --- src/sys/external/bsd/drm2/include/linux/irq_work.h:1.3 Sun Dec 19 11:05:27 2021 +++ src/sys/external/bsd/drm2/include/linux/irq_work.h Sun Dec 19 11:26:35 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: irq_work.h,v 1.3 2021/12/19 11:05:27 riastradh Exp $ */ +/* $NetBSD: irq_work.h,v 1.4 2021/12/19 11:26:35 riastradh Exp $ */ /*- * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -38,6 +38,7 @@ #define irq_work_queue linux_irq_work_queue struct irq_work { + char dummy; }; void init_irq_work(struct irq_work *, void (*)(struct irq_work *));