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 *));

Reply via email to