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