Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 11:33:50 UTC 2021

Modified Files:
        src/sys/external/bsd/common/include/linux: kernel.h
        src/sys/external/bsd/drm2/dist/drm/i915: i915_drv.h
            i915_gem_fence_reg.c i915_gem_fence_reg.h i915_irq.c i915_memcpy.c
            i915_perf.c i915_scatterlist.h intel_uncore.h
        src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_phys.c
            i915_gem_region.c i915_gem_shmem.c i915_gem_shrinker.c
            i915_gem_tiling.c i915_gem_userptr.c
        src/sys/external/bsd/drm2/dist/drm/i915/gt: intel_rps.h
        src/sys/external/bsd/drm2/i915drm: files.i915drmkms i915_gem_userptr.c
            i915_module.c i915_pci_autoconf.c
        src/sys/external/bsd/drm2/include/asm: cpufeature.h
        src/sys/external/bsd/drm2/include/linux: fs.h interrupt.h ktime.h mm.h
            pagemap.h scatterlist.h shmem_fs.h
        src/sys/external/bsd/drm2/include/linux/sched: mm.h
        src/sys/external/bsd/drm2/linux: linux_sg.c

Log Message:
drm: Another pass over i915.  Most of i915 gem builds now.


To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/external/bsd/common/include/linux/kernel.h
cvs rdiff -u -r1.43 -r1.44 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h
cvs rdiff -u -r1.5 -r1.6 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c
cvs rdiff -u -r1.4 -r1.5 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h
cvs rdiff -u -r1.23 -r1.24 src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.c \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c
cvs rdiff -u -r1.6 -r1.7 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h \
    src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h
cvs rdiff -u -r1.4 -r1.5 \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_region.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shrinker.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c
cvs rdiff -u -r1.7 -r1.8 \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_rps.h
cvs rdiff -u -r1.69 -r1.70 src/sys/external/bsd/drm2/i915drm/files.i915drmkms
cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm2/i915drm/i915_gem_userptr.c
cvs rdiff -u -r1.13 -r1.14 src/sys/external/bsd/drm2/i915drm/i915_module.c
cvs rdiff -u -r1.4 -r1.5 \
    src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c
cvs rdiff -u -r1.7 -r1.8 src/sys/external/bsd/drm2/include/asm/cpufeature.h
cvs rdiff -u -r1.6 -r1.7 src/sys/external/bsd/drm2/include/linux/fs.h
cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/include/linux/interrupt.h
cvs rdiff -u -r1.15 -r1.16 src/sys/external/bsd/drm2/include/linux/ktime.h
cvs rdiff -u -r1.20 -r1.21 src/sys/external/bsd/drm2/include/linux/mm.h
cvs rdiff -u -r1.5 -r1.6 src/sys/external/bsd/drm2/include/linux/pagemap.h
cvs rdiff -u -r1.4 -r1.5 \
    src/sys/external/bsd/drm2/include/linux/scatterlist.h
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/include/linux/shmem_fs.h
cvs rdiff -u -r1.1 -r1.2 src/sys/external/bsd/drm2/include/linux/sched/mm.h
cvs rdiff -u -r1.1 -r1.2 src/sys/external/bsd/drm2/linux/linux_sg.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/common/include/linux/kernel.h
diff -u src/sys/external/bsd/common/include/linux/kernel.h:1.42 src/sys/external/bsd/common/include/linux/kernel.h:1.43
--- src/sys/external/bsd/common/include/linux/kernel.h:1.42	Sun Dec 19 11:33:09 2021
+++ src/sys/external/bsd/common/include/linux/kernel.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: kernel.h,v 1.42 2021/12/19 11:33:09 riastradh Exp $	*/
+/*	$NetBSD: kernel.h,v 1.43 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -261,4 +261,13 @@ add_taint(unsigned taint, int lockdep)
 {
 }
 
+#define	DFEINE_STATIC_KEY_FALSE(FLAG)					      \
+	bool FLAG = false
+
+static inline bool
+static_branch_likely(const bool *flagp)
+{
+	return __predict_true(*flagp);
+}
+
 #endif  /* _LINUX_KERNEL_H_ */

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.43 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.44
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.43	Sun Dec 19 11:32:35 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_drv.h,v 1.43 2021/12/19 11:32:35 riastradh Exp $	*/
+/*	$NetBSD: i915_drv.h,v 1.44 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /* i915_drv.h -- Private header for the I915 driver -*- linux-c -*-
  */
@@ -1323,6 +1323,11 @@ struct drm_i915_private {
 
 	I915_SELFTEST_DECLARE(struct i915_selftest_stash selftest;)
 
+#ifdef __NetBSD__
+	pci_intr_handle_t *pci_ihp;
+	void *pci_intrcookie;
+#endif
+
 	/*
 	 * NOTE: This is the dri1/ums dungeon, don't add stuff here. Your patch
 	 * will be rejected. Instead look for a better place.

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c:1.5 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c:1.6
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c:1.5	Sun Dec 19 11:32:54 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_fence_reg.c,v 1.5 2021/12/19 11:32:54 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_fence_reg.c,v 1.6 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*
  * Copyright © 2008-2015 Intel Corporation
@@ -24,7 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_fence_reg.c,v 1.5 2021/12/19 11:32:54 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_fence_reg.c,v 1.6 2021/12/19 11:33:49 riastradh Exp $");
 
 #include <linux/bitmap.h>
 #include <drm/i915_drm.h>
@@ -783,39 +783,16 @@ static void i915_gem_swizzle_page(struct
  * by swapping them out and back in again).
  */
 void
-#ifdef __NetBSD__
-i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj,
-				  struct page **pages)
-#else
 i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj,
 				  struct sg_table *pages)
-#endif
 {
-#ifdef __NetBSD__
-	struct vm_page *vm_page;
-#else
 	struct sgt_iter sgt_iter;
-#endif
 	struct page *page;
 	int i;
 
 	if (obj->bit_17 == NULL)
 		return;
 
-#ifdef __NetBSD__
-	for (i = 0; i < obj->base.size >> PAGE_SHIFT; i++) {
-		page = pages[i];
-		vm_page = &page->p_vmp;
-		unsigned char new_bit_17 = VM_PAGE_TO_PHYS(vm_page) >> 17;
-		if ((new_bit_17 & 0x1) !=
-		    (test_bit(i, obj->bit_17) != 0)) {
-			i915_gem_swizzle_page(page);
-			rw_enter(obj->base.filp->vmobjlock, RW_WRITER);
-			uvm_pagemarkdirty(vm_page, UVM_PAGE_STATUS_DIRTY);
-			rw_exit(obj->base.filp->vmobjlock);
-		}
-	}
-#else
 	i = 0;
 	for_each_sgt_page(page, sgt_iter, pages) {
 		char new_bit_17 = page_to_phys(page) >> 17;
@@ -825,7 +802,6 @@ i915_gem_object_do_bit_17_swizzle(struct
 		}
 		i++;
 	}
-#endif
 }
 
 /**
@@ -838,21 +814,12 @@ i915_gem_object_do_bit_17_swizzle(struct
  * be called before the backing storage can be unpinned.
  */
 void
-#ifdef __NetBSD__
-i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj,
-				    struct page **pages)
-#else
 i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj,
 				    struct sg_table *pages)
-#endif
 {
-#ifdef __NetBSD__
-	struct vm_page *vm_page;
-#else
-	struct sg_page_iter sg_iter;
-#endif
-	struct page *page;
 	const unsigned int page_count = obj->base.size >> PAGE_SHIFT;
+	struct sgt_iter sgt_iter;
+	struct page *page;
 	int i;
 
 	if (obj->bit_17 == NULL) {
@@ -866,16 +833,6 @@ i915_gem_object_save_bit_17_swizzle(stru
 
 	i = 0;
 
-#ifdef __NetBSD__
-	for (i = 0; i < obj->base.size >> PAGE_SHIFT; i++) {
-		page = pages[i];
-		vm_page = &page->p_vmp;
-		if (ISSET(VM_PAGE_TO_PHYS(vm_page), __BIT(17)))
-			__set_bit(i, obj->bit_17);
-		else
-			__clear_bit(i, obj->bit_17);
-	}
-#else
 	for_each_sgt_page(page, sgt_iter, pages) {
 		if (page_to_phys(page) & (1 << 17))
 			__set_bit(i, obj->bit_17);
@@ -883,7 +840,6 @@ i915_gem_object_save_bit_17_swizzle(stru
 			__clear_bit(i, obj->bit_17);
 		i++;
 	}
-#endif
 }
 
 void i915_ggtt_init_fences(struct i915_ggtt *ggtt)

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.4 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h:1.5
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h:1.4	Sun Dec 19 11:32:54 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_fence_reg.h,v 1.4 2021/12/19 11:32:54 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_fence_reg.h,v 1.5 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*
  * Copyright © 2016 Intel Corporation
@@ -61,17 +61,10 @@ 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 page **pages);
-void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj,
-					 struct page **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/i915_irq.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.23 src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.24
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.23	Sun Dec 19 11:32:44 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_irq.c,v 1.23 2021/12/19 11:32:44 riastradh Exp $	*/
+/*	$NetBSD: i915_irq.c,v 1.24 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /* i915_irq.c -- IRQ support for the I915 -*- linux-c -*-
  */
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_irq.c,v 1.23 2021/12/19 11:32:44 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_irq.c,v 1.24 2021/12/19 11:33:49 riastradh Exp $");
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
@@ -2388,7 +2388,7 @@ gen8_de_irq_handler(struct drm_i915_priv
 	return ret;
 }
 
-static inline u32 gen8_master_intr_disable(void __iomem * const regs)
+static inline u32 gen8_master_intr_disable(struct intel_uncore *regs)
 {
 	raw_reg_write(regs, GEN8_MASTER_IRQ, 0);
 
@@ -2401,7 +2401,7 @@ static inline u32 gen8_master_intr_disab
 	return raw_reg_read(regs, GEN8_MASTER_IRQ);
 }
 
-static inline void gen8_master_intr_enable(void __iomem * const regs)
+static inline void gen8_master_intr_enable(struct intel_uncore *regs)
 {
 	raw_reg_write(regs, GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
 }
@@ -2460,7 +2460,7 @@ gen11_gu_misc_irq_handler(struct intel_g
 		intel_opregion_asle_intr(gt->i915);
 }
 
-static inline u32 gen11_master_intr_disable(void __iomem * const regs)
+static inline u32 gen11_master_intr_disable(struct intel_uncore *regs)
 {
 	raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, 0);
 
@@ -2473,7 +2473,7 @@ static inline u32 gen11_master_intr_disa
 	return raw_reg_read(regs, GEN11_GFX_MSTR_IRQ);
 }
 
-static inline void gen11_master_intr_enable(void __iomem * const regs)
+static inline void gen11_master_intr_enable(struct intel_uncore *regs)
 {
 	raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, GEN11_MASTER_IRQ);
 }
@@ -2498,8 +2498,8 @@ gen11_display_irq_handler(struct drm_i91
 
 static __always_inline irqreturn_t
 __gen11_irq_handler(struct drm_i915_private * const i915,
-		    u32 (*intr_disable)(void __iomem * const regs),
-		    void (*intr_enable)(void __iomem * const regs))
+		    u32 (*intr_disable)(struct intel_uncore *regs),
+		    void (*intr_enable)(struct intel_uncore *regs))
 {
 	struct intel_gt *gt = &i915->gt;
 	u32 master_ctl;
@@ -2530,7 +2530,7 @@ __gen11_irq_handler(struct drm_i915_priv
 	return IRQ_HANDLED;
 }
 
-static irqreturn_t gen11_irq_handler(int irq, void *arg)
+static irqreturn_t gen11_irq_handler(DRM_IRQ_ARGS)
 {
 	return __gen11_irq_handler(arg,
 				   gen11_master_intr_disable,
@@ -2801,7 +2801,7 @@ static void gen8_irq_reset(struct drm_i9
 	struct intel_uncore *uncore = &dev_priv->uncore;
 	enum pipe pipe;
 
-	gen8_master_intr_disable(dev_priv->uncore.regs);
+	gen8_master_intr_disable(&dev_priv->uncore);
 
 	gen8_gt_irq_reset(&dev_priv->gt);
 
@@ -2863,7 +2863,7 @@ static void gen11_irq_reset(struct drm_i
 {
 	struct intel_uncore *uncore = &dev_priv->uncore;
 
-	gen11_master_intr_disable(dev_priv->uncore.regs);
+	gen11_master_intr_disable(&dev_priv->uncore);
 
 	gen11_gt_irq_reset(&dev_priv->gt);
 	gen11_display_irq_reset(dev_priv);
@@ -3069,7 +3069,7 @@ static void gen11_hpd_detection_setup(st
 
 static void gen11_hpd_irq_setup(struct drm_i915_private *dev_priv)
 {
-	u32 hotplug_irqs, enabled_irqs;
+	u32 hotplug_irqs, enabled_irqs __unused;
 	const u32 *hpd;
 	u32 val;
 
@@ -3434,7 +3434,7 @@ static void gen8_irq_postinstall(struct 
 	if (HAS_PCH_SPLIT(dev_priv))
 		ibx_irq_postinstall(dev_priv);
 
-	gen8_master_intr_enable(dev_priv->uncore.regs);
+	gen8_master_intr_enable(&dev_priv->uncore);
 }
 
 static void icp_irq_postinstall(struct drm_i915_private *dev_priv)
@@ -3476,7 +3476,7 @@ static void gen11_irq_postinstall(struct
 
 	I915_WRITE(GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
 
-	gen11_master_intr_enable(uncore->regs);
+	gen11_master_intr_enable(uncore);
 	POSTING_READ(GEN11_GFX_MSTR_IRQ);
 }
 
@@ -4066,7 +4066,9 @@ static void intel_irq_postinstall(struct
  */
 int intel_irq_install(struct drm_i915_private *dev_priv)
 {
+#ifndef __NetBSD__
 	int irq = dev_priv->drm.pdev->irq;
+#endif
 	int ret;
 
 	/*
@@ -4080,8 +4082,61 @@ int intel_irq_install(struct drm_i915_pr
 
 	intel_irq_reset(dev_priv);
 
+#ifdef __NetBSD__
+    {
+	struct pci_dev *const pdev = dev_priv->drm.pdev;
+	const char *const name = device_xname(pci_dev_dev(pdev));
+	const struct pci_attach_args *pa = &pdev->pd_pa;
+	const char *intrstr;
+	char intrbuf[PCI_INTRSTR_LEN];
+
+	if (pdev->msi_enabled) {
+		if (pdev->pd_intr_handles == NULL) {
+			/* XXX errno NetBSD->Linux */
+			if ((ret = -pci_msi_alloc_exact(pa, &dev_priv->pci_ihp,
+			    1))) {
+				aprint_error_dev(pci_dev_dev(pdev),
+				    "couldn't allocate MSI (%s)\n", name);
+				goto out;
+			}
+		} else {
+			dev_priv->pci_ihp = pdev->pd_intr_handles;
+			pdev->pd_intr_handles = NULL;
+		}
+	} else {
+		/* XXX errno NetBSD->Linux */
+		if ((ret = -pci_intx_alloc(pa, &dev_priv->pci_ihp))) {
+			aprint_error_dev(pci_dev_dev(pdev),
+			    "couldn't allocate INTx interrupt (%s)\n",
+			    name);
+			goto out;
+		}
+	}
+
+	intrstr = pci_intr_string(pa->pa_pc, dev_priv->pci_ihp[0],
+	    intrbuf, sizeof(intrbuf));
+	dev_priv->pci_intrcookie = pci_intr_establish_xname(pa->pa_pc,
+	    dev_priv->pci_ihp[0], IPL_DRM, intel_irq_handler(dev_priv),
+	    dev_priv, name);
+	if (dev_priv->pci_intrcookie == NULL) {
+		aprint_error_dev(pci_dev_dev(pdev),
+		    "couldn't establish interrupt at %s (%s)\n", intrstr, name);
+		pci_intr_release(pa->pa_pc, dev_priv->pci_ihp, 1);
+		dev_priv->pci_ihp = NULL;
+		ret = -EIO;	/* XXX er? */
+		goto out;
+	}
+
+	/* Success!  */
+	aprint_normal_dev(pci_dev_dev(pdev), "interrupting at %s (%s)\n",
+	    intrstr, name);
+	ret = 0;
+out:;
+    }
+#else
 	ret = request_irq(irq, intel_irq_handler(dev_priv),
 			  IRQF_SHARED, DRIVER_NAME, dev_priv);
+#endif
 	if (ret < 0) {
 		dev_priv->drm.irq_enabled = false;
 		return ret;
@@ -4101,7 +4156,9 @@ int intel_irq_install(struct drm_i915_pr
  */
 void intel_irq_uninstall(struct drm_i915_private *dev_priv)
 {
+#ifndef __NetBSD__
 	int irq = dev_priv->drm.pdev->irq;
+#endif
 
 	/*
 	 * FIXME we can get called twice during driver probe
@@ -4116,7 +4173,19 @@ void intel_irq_uninstall(struct drm_i915
 
 	intel_irq_reset(dev_priv);
 
+#ifdef __NetBSD__
+	const struct pci_attach_args *pa = &dev_priv->drm.pdev->pd_pa;
+	if (dev_priv->pci_intrcookie != NULL) {
+		pci_intr_disestablish(pa->pa_pc, dev_priv->pci_intrcookie);
+		dev_priv->pci_intrcookie = NULL;
+	}
+	if (dev_priv->pci_ihp != NULL) {
+		pci_intr_release(pa->pa_pc, dev_priv->pci_ihp, 1);
+		dev_priv->pci_ihp = NULL;
+	}
+#else
 	free_irq(irq, dev_priv);
+#endif
 
 	intel_hpd_cancel_work(dev_priv);
 	dev_priv->runtime_pm.irqs_enabled = false;
@@ -4161,5 +4230,9 @@ bool intel_irqs_enabled(struct drm_i915_
 
 void intel_synchronize_irq(struct drm_i915_private *i915)
 {
+#ifdef __NetBSD__
+	xc_barrier(0);
+#else
 	synchronize_irq(i915->drm.pdev->irq);
+#endif
 }

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.c:1.3	Sun Dec 19 01:40:41 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_memcpy.c,v 1.3 2021/12/19 01:40:41 riastradh Exp $	*/
+/*	$NetBSD: i915_memcpy.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*
  * Copyright © 2016 Intel Corporation
@@ -25,13 +25,15 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_memcpy.c,v 1.3 2021/12/19 01:40:41 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_memcpy.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $");
 
 #include <linux/kernel.h>
 #include <asm/fpu/api.h>
 
 #include "i915_memcpy.h"
 
+#include <linux/nbsd-namespace.h>
+
 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG)
 #define CI_BUG_ON(expr) BUG_ON(expr)
 #else
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c:1.3	Sun Dec 19 11:06:55 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_perf.c,v 1.3 2021/12/19 11:06:55 riastradh Exp $	*/
+/*	$NetBSD: i915_perf.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*
  * Copyright © 2015-2016 Intel Corporation
@@ -194,7 +194,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_perf.c,v 1.3 2021/12/19 11:06:55 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_perf.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $");
 
 #include <linux/anon_inodes.h>
 #include <linux/sizes.h>
@@ -225,6 +225,8 @@ __KERNEL_RCSID(0, "$NetBSD: i915_perf.c,
 #include "oa/i915_oa_icl.h"
 #include "oa/i915_oa_tgl.h"
 
+#include <linux/nbsd-namespace.h>
+
 /* HW requires this to be a power of two, between 128k and 16M, though driver
  * is currently generally designed assuming the largest 16M size is used such
  * that the overflow cases are unlikely in normal operation.
@@ -401,9 +403,9 @@ void i915_oa_config_release(struct kref 
 	struct i915_oa_config *oa_config =
 		container_of(ref, typeof(*oa_config), ref);
 
-	kfree(oa_config->flex_regs);
-	kfree(oa_config->b_counter_regs);
-	kfree(oa_config->mux_regs);
+	kfree(__UNCONST(oa_config->flex_regs));
+	kfree(__UNCONST(oa_config->b_counter_regs));
+	kfree(__UNCONST(oa_config->mux_regs));
 
 	kfree_rcu(oa_config, rcu);
 }

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h:1.6 src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h:1.7
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h:1.6	Sun Dec 19 11:33:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_scatterlist.h,v 1.6 2021/12/19 11:33:30 riastradh Exp $	*/
+/*	$NetBSD: i915_scatterlist.h,v 1.7 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -22,11 +22,11 @@ struct sgt_iter {
 };
 
 #define	for_each_sgt_page(pp, iter, sgt)				      \
-	for ((iter)->i = 0;						      \
-	     ((iter)->i < (sgt)->sgt_npgs				      \
-		 ? ((pp) = (sgt)->sgt_pgs[(iter)->i], 1)		      \
+	for ((iter).i = 0;						      \
+	     ((iter).i < (sgt)->sgl->sg_npgs				      \
+		 ? (((pp) = (sgt)->sgl->sg_pgs[(iter).i]), 1)		      \
 		 : 0);							      \
-	     (iter)->i++)
+	     (iter).i++)
 
 static inline unsigned
 i915_sg_page_sizes(struct scatterlist *sg)
@@ -39,6 +39,18 @@ i915_sg_page_sizes(struct scatterlist *s
 	return page_sizes;
 }
 
+static inline unsigned
+i915_sg_segment_size(void)
+{
+	return PAGE_SIZE;
+}
+
+static inline bool
+i915_sg_trim(struct sg_table *sgt)
+{
+	return true;
+}
+
 #else
 
 /*
@@ -150,8 +162,8 @@ static inline unsigned int i915_sg_segme
 	return size;
 }
 
-#endif
-
 bool i915_sg_trim(struct sg_table *orig_st);
 
 #endif
+
+#endif
Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h:1.6 src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h:1.7
--- src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h:1.6	Sun Dec 19 11:12:59 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_uncore.h,v 1.6 2021/12/19 11:12:59 riastradh Exp $	*/
+/*	$NetBSD: intel_uncore.h,v 1.7 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*
  * Copyright © 2017 Intel Corporation
@@ -457,11 +457,11 @@ static inline int intel_uncore_write_and
 }
 
 #ifdef __NetBSD__
-#define	raw_reg_read(i915, reg)						      \
-	bus_space_read_4((i915)->regs_bst, (i915)->regs_bsh,		      \
+#define	raw_reg_read(uncore, reg)					      \
+	bus_space_read_4((uncore)->regs_bst, (uncore)->regs_bsh,	      \
 	    i915_mmio_reg_offset(reg))
-#define	raw_reg_write(i915, reg, value)					      \
-	bus_space_write_4((i915)->regs_bst, (i915)->regs_bsh,		      \
+#define	raw_reg_write(uncore, reg, value)				      \
+	bus_space_write_4((uncore)->regs_bst, (uncore)->regs_bsh,	      \
 	    i915_mmio_reg_offset(reg), (value))
 #else
 #define raw_reg_read(base, reg) \

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.4 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c:1.4	Sun Dec 19 11:33:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_phys.c,v 1.4 2021/12/19 11:33:30 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_phys.c,v 1.5 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_phys.c,v 1.4 2021/12/19 11:33:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_phys.c,v 1.5 2021/12/19 11:33:49 riastradh Exp $");
 
 #include <linux/highmem.h>
 #include <linux/shmem_fs.h>
@@ -29,7 +29,7 @@ __KERNEL_RCSID(0, "$NetBSD: i915_gem_phy
 static int i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj)
 {
 #ifdef __NetBSD__
-	struct uvm_object *uobj = obj->base.filp;
+	struct uvm_object *mapping = obj->base.filp;
 #else
 	struct address_space *mapping = obj->base.filp->f_mapping;
 #endif
@@ -113,24 +113,9 @@ static int i915_gem_object_get_pages_phy
 		struct page *page;
 		void *src;
 
-#ifdef __NetBSD__
-		struct vm_page *vm_page;
-
-		/* XXX errno NetBSD->Linux */
-		ret = -uvm_obj_wirepages(uobj, i*PAGE_SIZE, (i + 1)*PAGE_SIZE,
-		    NULL);
-		if (ret)
-			goto err_st;
-		rw_enter(uobj->vmobjlock, RW_READER);
-		vm_page = uvm_pagelookup(uobj, i*PAGE_SIZE);
-		rw_exit(uobj->vmobjlock);
-		KASSERT(vm_page);
-		page = container_of(vm_page, struct page, p_vmp);
-#else
 		page = shmem_read_mapping_page(mapping, i);
 		if (IS_ERR(page))
 			goto err_st;
-#endif
 
 		src = kmap_atomic(page);
 		memcpy(dst, src, PAGE_SIZE);
@@ -138,7 +123,7 @@ static int i915_gem_object_get_pages_phy
 		kunmap_atomic(src);
 
 #ifdef __NetBSD__
-		uvm_obj_unwirepages(uobj, i*PAGE_SIZE, (i + 1)*PAGE_SIZE);
+		uvm_obj_unwirepages(mapping, i*PAGE_SIZE, (i + 1)*PAGE_SIZE);
 #else
 		put_page(page);
 #endif
@@ -195,8 +180,7 @@ i915_gem_object_put_pages_phys(struct dr
 
 	if (obj->mm.dirty) {
 #ifdef __NetBSD__
-		struct uvm_object *uobj = obj->base.filp;
-		struct vm_page *vm_page;
+		struct uvm_object *mapping = obj->base.filp;
 #else
 		struct address_space *mapping = obj->base.filp->f_mapping;
 #endif
@@ -207,20 +191,9 @@ i915_gem_object_put_pages_phys(struct dr
 			struct page *page;
 			char *dst;
 
-#ifdef __NetBSD__
-			if (uvm_obj_wirepages(uobj, i*PAGE_SIZE,
-				(i + 1)*PAGE_SIZE, NULL) != 0)
-				continue;
-			rw_enter(uobj->vmobjlock, RW_READER);
-			vm_page = uvm_pagelookup(uobj, i*PAGE_SIZE);
-			rw_exit(uobj->vmobjlock);
-			KASSERT(vm_page);
-			page = container_of(vm_page, struct page, p_vmp);
-#else
 			page = shmem_read_mapping_page(mapping, i);
 			if (IS_ERR(page))
 				continue;
-#endif
 
 			dst = kmap_atomic(page);
 			drm_clflush_virt_range(src, PAGE_SIZE);
@@ -229,7 +202,8 @@ i915_gem_object_put_pages_phys(struct dr
 
 			set_page_dirty(page);
 #ifdef __NetBSD__
-			uvm_obj_unwirepages(uobj, i*PAGE_SIZE,
+			/* XXX mark_page_accessed */
+			uvm_obj_unwirepages(mapping, i*PAGE_SIZE,
 			    (i + 1)*PAGE_SIZE);
 #else
 			if (obj->mm.madv == I915_MADV_WILLNEED)

Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_region.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_region.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_region.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_region.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_region.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_region.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_region.c,v 1.3 2021/12/19 11:33:49 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_region.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_region.c,v 1.3 2021/12/19 11:33:49 riastradh Exp $");
 
 #include "intel_memory_region.h"
 #include "i915_gem_region.h"
@@ -20,6 +20,10 @@ i915_gem_object_put_pages_buddy(struct d
 	__intel_memory_region_put_pages_buddy(obj->mm.region, &obj->mm.blocks);
 
 	obj->mm.dirty = false;
+#ifdef __NetBSD__
+	bus_dmamap_unload(obj->base.dev->dmat, pages->sgl->sg_dmamap);
+	bus_dmamap_destroy(obj->base.dev->dmat, pages->sgl->sg_dmamap);
+#endif
 	sg_free_table(pages);
 	kfree(pages);
 }
@@ -58,6 +62,50 @@ i915_gem_object_get_pages_buddy(struct d
 	GEM_BUG_ON(list_empty(blocks));
 
 	sg = st->sgl;
+#ifdef __NetBSD__
+	__USE(prev_end);
+	__USE(sg_page_sizes);
+	bus_dma_tag_t dmat = obj->base.dev->dmat;
+	bus_dma_segment_t *segs = NULL;
+	int i = 0, nsegs = 0;
+	bool loaded = false;
+
+	list_for_each_entry(block, blocks, link) {
+		if (nsegs >= INT_MAX ||
+		    nsegs >= SIZE_MAX/sizeof(segs[0]))
+			goto err;
+		nsegs++;
+	}
+	segs = kmem_zalloc(nsegs * sizeof(segs[0]), KM_SLEEP);
+	list_for_each_entry(block, blocks, link) {
+		u64 block_size, offset;
+
+		block_size = min_t(u64, size,
+				   i915_buddy_block_size(&mem->mm, block));
+		offset = i915_buddy_block_offset(block);
+
+		segs[i].ds_addr = mem->region.start + offset;
+		segs[i].ds_len = block_size;
+	}
+
+	/* XXX errno NetBSD->Linux */
+	ret = -bus_dmamap_create(dmat, size, nsegs, size, 0, BUS_DMA_WAITOK,
+	    &sg->sg_dmamap);
+	if (ret)
+		goto err;
+
+	/* XXX errno NetBSD->Linux */
+	ret = -bus_dmamap_load_raw(dmat, sg->sg_dmamap, segs, nsegs, size,
+	    BUS_DMA_WAITOK);
+	if (ret)
+		goto err;
+	loaded = true;
+
+	kmem_free(segs, nsegs * sizeof(segs[0]));
+	segs = NULL;
+
+	__i915_gem_object_set_pages(obj, st, i915_sg_page_sizes(sg));
+#else
 	st->nents = 0;
 	sg_page_sizes = 0;
 	prev_end = (resource_size_t)-1;
@@ -97,9 +145,20 @@ i915_gem_object_get_pages_buddy(struct d
 	i915_sg_trim(st);
 
 	__i915_gem_object_set_pages(obj, st, sg_page_sizes);
+#endif
 
 	return 0;
 
+#ifdef __NetBSD__
+err:
+	if (loaded)
+		bus_dmamap_unload(dmat, st->sgl->sg_dmamap);
+	if (st->sgl->sg_dmamap)
+		bus_dmamap_destroy(dmat, st->sgl->sg_dmamap);
+	if (segs)
+		kmem_free(segs, nsegs * sizeof(segs[0]));
+	__intel_memory_region_put_pages_buddy(mem, blocks);
+#endif
 err_free_sg:
 	sg_free_table(st);
 	kfree(st);
Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shrinker.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shrinker.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shrinker.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shrinker.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shrinker.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_shrinker.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_shrinker.c,v 1.3 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_shrinker.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_shrinker.c,v 1.3 2021/12/19 11:33:49 riastradh Exp $");
 
 #include <linux/oom.h>
 #include <linux/sched/mm.h>
@@ -427,6 +427,7 @@ void i915_gem_driver_unregister__shrinke
 void i915_gem_shrinker_taints_mutex(struct drm_i915_private *i915,
 				    struct mutex *mutex)
 {
+#if IS_ENABLED(CONFIG_LOCKDEP)
 	bool unlock = false;
 
 	if (!IS_ENABLED(CONFIG_LOCKDEP))
@@ -447,6 +448,7 @@ void i915_gem_shrinker_taints_mutex(stru
 
 	if (unlock)
 		mutex_release(&i915->drm.struct_mutex.dep_map, _RET_IP_);
+#endif
 }
 
 #define obj_to_i915(obj__) to_i915((obj__)->base.dev)
Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_tiling.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_tiling.c,v 1.3 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,8 +7,9 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_tiling.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_tiling.c,v 1.3 2021/12/19 11:33:49 riastradh Exp $");
 
+#include <linux/bitmap.h>
 #include <linux/string.h>
 #include <linux/bitops.h>
 #include <drm/i915_drm.h>

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.7 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.8
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.7	Sun Dec 19 11:33:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_shmem.c,v 1.7 2021/12/19 11:33:30 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_shmem.c,v 1.8 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_shmem.c,v 1.7 2021/12/19 11:33:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_shmem.c,v 1.8 2021/12/19 11:33:49 riastradh Exp $");
 
 #include <linux/pagevec.h>
 #include <linux/swap.h>
@@ -23,12 +23,14 @@ __KERNEL_RCSID(0, "$NetBSD: i915_gem_shm
  * Move pages to appropriate lru and release the pagevec, decrementing the
  * ref count of those pages.
  */
+#ifndef __NetBSD__
 static void check_release_pagevec(struct pagevec *pvec)
 {
 	check_move_unevictable_pages(pvec);
 	__pagevec_release(pvec);
 	cond_resched();
 }
+#endif
 
 static int shmem_get_pages(struct drm_i915_gem_object *obj)
 {
@@ -36,7 +38,11 @@ static int shmem_get_pages(struct drm_i9
 	struct intel_memory_region *mem = obj->mm.region;
 	const unsigned long page_count = obj->base.size / PAGE_SIZE;
 	unsigned long i;
+#ifdef __NetBSD__
+	struct uvm_object *mapping;
+#else
 	struct address_space *mapping;
+#endif
 	struct sg_table *st;
 	struct scatterlist *sg;
 	struct sgt_iter sgt_iter;
@@ -44,7 +50,9 @@ static int shmem_get_pages(struct drm_i9
 	unsigned long last_pfn = 0;	/* suppress gcc warning */
 	unsigned int max_segment = i915_sg_segment_size();
 	unsigned int sg_page_sizes;
+#ifndef __NetBSD__
 	struct pagevec pvec;
+#endif
 	gfp_t noreclaim;
 	int ret;
 
@@ -79,10 +87,14 @@ rebuild_st:
 	 *
 	 * Fail silently without starting the shrinker
 	 */
+#ifdef __NetBSD__
+	mapping = obj->base.filp;
+#else
 	mapping = obj->base.filp->f_mapping;
 	mapping_set_unevictable(mapping);
 	noreclaim = mapping_gfp_constraint(mapping, ~__GFP_RECLAIM);
 	noreclaim |= __GFP_NORETRY | __GFP_NOWARN;
+#endif
 
 	sg = st->sgl;
 	st->nents = 0;
@@ -116,6 +128,7 @@ rebuild_st:
 			 * defer the oom here by reporting the ENOMEM back
 			 * to userspace.
 			 */
+#ifndef __NetBSD__
 			if (!*s) {
 				/* reclaim and warn, but no oom */
 				gfp = mapping_gfp_mask(mapping);
@@ -136,8 +149,14 @@ rebuild_st:
 				 */
 				gfp |= __GFP_RETRY_MAYFAIL;
 			}
+#endif
 		} while (1);
 
+#ifdef __NetBSD__
+		__USE(last_pfn);
+		KASSERT(st->nents == i);
+		sg->sg_pgs[st->nents++] = page;
+#else
 		if (!i ||
 		    sg->length >= max_segment ||
 		    page_to_pfn(page) != last_pfn + 1) {
@@ -154,11 +173,14 @@ rebuild_st:
 
 		/* Check that the i965g/gm workaround works. */
 		WARN_ON((gfp & __GFP_DMA32) && (last_pfn >= 0x00100000UL));
+#endif
 	}
+#ifndef __NetBSD__
 	if (sg) { /* loop terminated early; short sg table */
 		sg_page_sizes |= sg->length;
 		sg_mark_end(sg);
 	}
+#endif
 
 	/* Trim unused sg entries to avoid wasting memory. */
 	i915_sg_trim(st);
@@ -171,14 +193,19 @@ rebuild_st:
 		 * for PAGE_SIZE chunks instead may be helpful.
 		 */
 		if (max_segment > PAGE_SIZE) {
+#ifdef __NetBSD__
+			__USE(sgt_iter);
+			uvm_obj_unwirepages(mapping, 0, obj->base.size);
+#else
 			for_each_sgt_page(page, sgt_iter, st)
 				put_page(page);
+#endif
 			sg_free_table(st);
 
 			max_segment = PAGE_SIZE;
 			goto rebuild_st;
 		} else {
-			dev_warn(&i915->drm.pdev->dev,
+			dev_warn(i915->drm.dev,
 				 "Failed to DMA remap %lu pages\n",
 				 page_count);
 			goto err_pages;
@@ -193,8 +220,13 @@ rebuild_st:
 	return 0;
 
 err_sg:
+#ifndef __NetBSD__
 	sg_mark_end(sg);
+#endif
 err_pages:
+#ifdef __NetBSD__
+	uvm_obj_unwirepages(mapping, 0, obj->base.size);
+#else
 	mapping_clear_unevictable(mapping);
 	pagevec_init(&pvec);
 	for_each_sgt_page(page, sgt_iter, st) {
@@ -203,6 +235,7 @@ err_pages:
 	}
 	if (pagevec_count(&pvec))
 		check_release_pagevec(&pvec);
+#endif
 	sg_free_table(st);
 	kfree(st);
 
@@ -238,6 +271,7 @@ shmem_truncate(struct drm_i915_gem_objec
 static void
 shmem_writeback(struct drm_i915_gem_object *obj)
 {
+#ifndef __NetBSD__
 	struct address_space *mapping;
 	struct writeback_control wbc = {
 		.sync_mode = WB_SYNC_NONE,
@@ -278,6 +312,7 @@ shmem_writeback(struct drm_i915_gem_obje
 put:
 		put_page(page);
 	}
+#endif
 }
 
 void
@@ -302,8 +337,10 @@ static void
 shmem_put_pages(struct drm_i915_gem_object *obj, struct sg_table *pages)
 {
 	struct sgt_iter sgt_iter;
+#ifndef __NetBSD__
 	struct pagevec pvec;
 	struct page *page;
+#endif
 
 	__i915_gem_object_release_shmem(obj, pages, true);
 
@@ -312,6 +349,10 @@ shmem_put_pages(struct drm_i915_gem_obje
 	if (i915_gem_object_needs_bit17_swizzle(obj))
 		i915_gem_object_save_bit_17_swizzle(obj, pages);
 
+#ifdef __NetBSD__
+	__USE(sgt_iter);
+	uvm_obj_unwirepages(obj->base.filp, 0, obj->base.size);
+#else
 	mapping_clear_unevictable(file_inode(obj->base.filp)->i_mapping);
 
 	pagevec_init(&pvec);
@@ -327,6 +368,7 @@ shmem_put_pages(struct drm_i915_gem_obje
 	}
 	if (pagevec_count(&pvec))
 		check_release_pagevec(&pvec);
+#endif
 	obj->mm.dirty = false;
 
 	sg_free_table(pages);
@@ -337,7 +379,11 @@ static int
 shmem_pwrite(struct drm_i915_gem_object *obj,
 	     const struct drm_i915_gem_pwrite *arg)
 {
+#ifdef __NetBSD__
+	struct uvm_object *mapping = obj->base.filp;
+#else
 	struct address_space *mapping = obj->base.filp->f_mapping;
+#endif
 	char __user *user_data = u64_to_user_ptr(arg->data_ptr);
 	u64 remain, offset;
 	unsigned int pg;
@@ -372,6 +418,24 @@ shmem_pwrite(struct drm_i915_gem_object 
 	offset = arg->offset;
 	pg = offset_in_page(offset);
 
+#ifdef __NetBSD__
+	__USE(pg);
+	struct iovec iov = { .iov_base = user_data, .iov_len = remain };
+	struct uio uio = {
+		.uio_iov = &iov,
+		.uio_iovcnt = 1,
+		.uio_offset = offset,
+		.uio_resid = remain,
+		.uio_rw = UIO_WRITE,
+		.uio_vmspace = curproc->p_vmspace,
+	};
+	int ret;
+
+	/* XXX errno NetBSD->Linux */
+	ret = -ubc_uiomove(mapping, &uio, remain, UVM_ADV_NORMAL, UBC_WRITE);
+	if (ret)
+		return ret;
+#else
 	do {
 		unsigned int len, unwritten;
 		struct page *page;
@@ -419,6 +483,7 @@ shmem_pwrite(struct drm_i915_gem_object 
 		offset += len;
 		pg = 0;
 	} while (remain);
+#endif
 
 	return 0;
 }
@@ -454,7 +519,7 @@ static int __create_shmem(struct drm_i91
 			  resource_size_t size)
 {
 #ifdef __NetBSD__
-	return drm_gem_object_init(dev, obj, size);
+	return drm_gem_object_init(&i915->drm, obj, size);
 #else
 	unsigned long flags = VM_NORESERVE;
 	struct file *filp;
@@ -502,9 +567,13 @@ create_shmem(struct intel_memory_region 
 		mask |= __GFP_DMA32;
 	}
 
+#ifdef __NetBSD__
+	__USE(mapping);
+#else
 	mapping = obj->base.filp->f_mapping;
 	mapping_set_gfp_mask(mapping, mask);
 	GEM_BUG_ON(!(mapping_gfp_mask(mapping) & __GFP_RECLAIM));
+#endif
 
 	i915_gem_object_init(obj, &i915_gem_shmem_ops, &lock_class);
 

Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c:1.3	Sun Dec 19 10:28:41 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_userptr.c,v 1.3 2021/12/19 10:28:41 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_userptr.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_userptr.c,v 1.3 2021/12/19 10:28:41 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_userptr.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $");
 
 #include <linux/mmu_context.h>
 #include <linux/mmu_notifier.h>
@@ -22,8 +22,14 @@ __KERNEL_RCSID(0, "$NetBSD: i915_gem_use
 #include "i915_gem_object.h"
 #include "i915_scatterlist.h"
 
+#include <linux/nbsd-namespace.h>
+
 struct i915_mm_struct {
+#ifdef __NetBSD__
+	struct vmspace *mm;
+#else
 	struct mm_struct *mm;
+#endif
 	struct drm_i915_private *i915;
 	struct i915_mmu_notifier *mn;
 	struct hlist_node node;
@@ -264,8 +270,13 @@ i915_gem_userptr_init__mmu_notifier(stru
 }
 
 static void
+#ifdef __NetBSD__
+i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
+		       struct vmspace *mm)
+#else
 i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
 		       struct mm_struct *mm)
+#endif
 {
 	if (mn == NULL)
 		return;
@@ -300,15 +311,24 @@ i915_gem_userptr_init__mmu_notifier(stru
 }
 
 static void
+#ifdef __NetBSD__
+i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
+		       struct vmspace *mm)
+#else
 i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
 		       struct mm_struct *mm)
+#endif
 {
 }
 
 #endif
 
 static struct i915_mm_struct *
+#ifdef __NetBSD__
+__i915_mm_struct_find(struct drm_i915_private *dev_priv, struct vmspace *real)
+#else
 __i915_mm_struct_find(struct drm_i915_private *dev_priv, struct mm_struct *real)
+#endif
 {
 	struct i915_mm_struct *mm;
 
@@ -338,7 +358,11 @@ i915_gem_userptr_init__mm_struct(struct 
 	 * up.
 	 */
 	mutex_lock(&dev_priv->mm_lock);
+#ifdef __NetBSD__
+	mm = __i915_mm_struct_find(dev_priv, curproc->p_vmspace);
+#else
 	mm = __i915_mm_struct_find(dev_priv, current->mm);
+#endif
 	if (mm == NULL) {
 		mm = kmalloc(sizeof(*mm), GFP_KERNEL);
 		if (mm == NULL) {
@@ -349,8 +373,12 @@ i915_gem_userptr_init__mm_struct(struct 
 		kref_init(&mm->kref);
 		mm->i915 = to_i915(obj->base.dev);
 
+#ifdef __NetBSD__
+		mm->mm = curproc->p_vmspace;
+#else
 		mm->mm = current->mm;
-		mmgrab(current->mm);
+#endif
+		mmgrab(mm->mm);
 
 		mm->mn = NULL;
 
@@ -464,7 +492,11 @@ __i915_gem_userptr_get_pages_worker(stru
 
 	pvec = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
 	if (pvec != NULL) {
+#ifdef __NetBSD__
+		struct vmspace *mm = obj->userptr.mm->mm;
+#else
 		struct mm_struct *mm = obj->userptr.mm->mm;
+#endif
 		unsigned int flags = 0;
 		int locked = 0;
 
@@ -566,7 +598,11 @@ __i915_gem_userptr_get_pages_schedule(st
 static int i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)
 {
 	const unsigned long num_pages = obj->base.size >> PAGE_SHIFT;
+#ifdef __NetBSD__
+	struct vmspace *mm = obj->userptr.mm->mm;
+#else
 	struct mm_struct *mm = obj->userptr.mm->mm;
+#endif
 	struct page **pvec;
 	struct sg_table *pages;
 	bool active;
@@ -600,7 +636,12 @@ static int i915_gem_userptr_get_pages(st
 	pvec = NULL;
 	pinned = 0;
 
-	if (mm == current->mm) {
+#ifdef __NetBSD__
+	if (mm == curproc->p_vmspace)
+#else
+	if (mm == current->mm)
+#endif
+	{
 		pvec = kvmalloc_array(num_pages, sizeof(struct page *),
 				      GFP_KERNEL |
 				      __GFP_NORETRY |

Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_rps.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_rps.h:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_rps.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_rps.h:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_rps.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_rps.h,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: intel_rps.h,v 1.3 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -38,4 +38,6 @@ void gen5_rps_irq_handler(struct intel_r
 void gen6_rps_irq_handler(struct intel_rps *rps, u32 pm_iir);
 void gen11_rps_irq_handler(struct intel_rps *rps, u32 pm_iir);
 
+extern spinlock_t mchdev_lock;
+
 #endif /* INTEL_RPS_H */

Index: src/sys/external/bsd/drm2/i915drm/files.i915drmkms
diff -u src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.69 src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.70
--- src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.69	Sun Dec 19 11:32:17 2021
+++ src/sys/external/bsd/drm2/i915drm/files.i915drmkms	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-#	$NetBSD: files.i915drmkms,v 1.69 2021/12/19 11:32:17 riastradh Exp $
+#	$NetBSD: files.i915drmkms,v 1.70 2021/12/19 11:33:49 riastradh Exp $
 
 version	20180827
 
@@ -29,6 +29,8 @@ makeoptions	i915drmkms	"CPPFLAGS.i915drm
 makeoptions	i915drmkms	"CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_FBDEV=1"
 makeoptions	i915drmkms	"CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_GVT=0"
 makeoptions	i915drmkms	"CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT=0"
+makeoptions	i915drmkms	"CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_DEBUG_MMIO=1" # XXX
+makeoptions	i915drmkms	"CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_FORCE_PROBE=0"
 
 makeoptions	i915drmkms	"CWARNFLAGS.i915drmkms"+="-Wno-missing-field-initializers"
 makeoptions	i915drmkms	"CWARNFLAGS.i915drmkms"+="-Wno-pointer-arith"
@@ -132,7 +134,7 @@ file	external/bsd/drm2/dist/drm/i915/gem
 file	external/bsd/drm2/dist/drm/i915/gem/i915_gem_stolen.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gem/i915_gem_throttle.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c	i915drmkms
-file	external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c	i915drmkms
+#file	external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gem/i915_gem_wait.c	i915drmkms
 #file	external/bsd/drm2/dist/drm/i915/gem/i915_gemfs.c	i915drmkms
 #file	external/bsd/drm2/dist/drm/i915/gt/debugfs_engines.c	i915drmkms

Index: src/sys/external/bsd/drm2/i915drm/i915_gem_userptr.c
diff -u src/sys/external/bsd/drm2/i915drm/i915_gem_userptr.c:1.3 src/sys/external/bsd/drm2/i915drm/i915_gem_userptr.c:1.4
--- src/sys/external/bsd/drm2/i915drm/i915_gem_userptr.c:1.3	Sun Dec 19 11:31:33 2021
+++ src/sys/external/bsd/drm2/i915drm/i915_gem_userptr.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_userptr.c,v 1.3 2021/12/19 11:31:33 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_userptr.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,17 +30,22 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_userptr.c,v 1.3 2021/12/19 11:31:33 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_userptr.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $");
 
 #include "i915_drv.h"
 #include "../dist/drm/i915/gem/i915_gem_ioctls.h"
 
 int
-i915_gem_init_userptr(struct drm_i915_private *dev_priv)
+i915_gem_init_userptr(struct drm_i915_private *i915)
 {
 	return 0;
 }
 
+void
+i915_gem_cleanup_userptr(struct drm_i915_private *i915)
+{
+}
+
 int
 i915_gem_userptr_ioctl(struct drm_device *dev, void *data,
     struct drm_file *file)

Index: src/sys/external/bsd/drm2/i915drm/i915_module.c
diff -u src/sys/external/bsd/drm2/i915drm/i915_module.c:1.13 src/sys/external/bsd/drm2/i915drm/i915_module.c:1.14
--- src/sys/external/bsd/drm2/i915drm/i915_module.c:1.13	Sun Dec 19 11:27:12 2021
+++ src/sys/external/bsd/drm2/i915drm/i915_module.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_module.c,v 1.13 2021/12/19 11:27:12 riastradh Exp $	*/
+/*	$NetBSD: i915_module.c,v 1.14 2021/12/19 11:33:49 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.13 2021/12/19 11:27:12 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_module.c,v 1.14 2021/12/19 11:33:49 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/module.h>
@@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: i915_module.
 #include <drm/drm_sysctl.h>
 
 #include "i915_drv.h"
+#include "gt/intel_rps.h"
 
 MODULE(MODULE_CLASS_DRIVER, i915drmkms, "drmkms,drmkms_pci"); /* XXX drmkms_i2c */
 

Index: src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c
diff -u src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c:1.4 src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c:1.5
--- src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c:1.4	Sun Dec 19 11:05:12 2021
+++ src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_pci_autoconf.c,v 1.4 2021/12/19 11:05:12 riastradh Exp $	*/
+/*	$NetBSD: i915_pci_autoconf.c,v 1.5 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_pci_autoconf.c,v 1.4 2021/12/19 11:05:12 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_pci_autoconf.c,v 1.5 2021/12/19 11:33:49 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/queue.h>
@@ -38,6 +38,8 @@ __KERNEL_RCSID(0, "$NetBSD: i915_pci_aut
 #include <sys/queue.h>
 #include <sys/workqueue.h>
 
+#include <drm/drm_pci.h>
+
 #include "i915_drv.h"
 #include "i915_pci.h"
 
@@ -111,7 +113,7 @@ i915drmkms_pci_lookup(const struct pci_a
 	const struct intel_device_info *const info =
 	    (const void *)(uintptr_t)i915_device_ids[i].driver_data;
 
-	if (IS_ALPHA_SUPPORT(info)) {
+	if (info->require_force_probe) {
 		printf("i915drmkms: preliminary hardware support disabled\n");
 		return NULL;
 	}

Index: src/sys/external/bsd/drm2/include/asm/cpufeature.h
diff -u src/sys/external/bsd/drm2/include/asm/cpufeature.h:1.7 src/sys/external/bsd/drm2/include/asm/cpufeature.h:1.8
--- src/sys/external/bsd/drm2/include/asm/cpufeature.h:1.7	Sun Dec 19 01:25:05 2021
+++ src/sys/external/bsd/drm2/include/asm/cpufeature.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufeature.h,v 1.7 2021/12/19 01:25:05 riastradh Exp $	*/
+/*	$NetBSD: cpufeature.h,v 1.8 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -36,6 +36,8 @@
 
 #if defined(__i386__) || defined(__x86_64__)
 
+#include <x86/specialreg.h>
+
 #define	cpu_has_clflush	((cpu_info_primary.ci_feat_val[0] & CPUID_CLFSH) != 0)
 #define	cpu_has_pat	((cpu_info_primary.ci_feat_val[0] & CPUID_PAT) != 0)
 

Index: src/sys/external/bsd/drm2/include/linux/fs.h
diff -u src/sys/external/bsd/drm2/include/linux/fs.h:1.6 src/sys/external/bsd/drm2/include/linux/fs.h:1.7
--- src/sys/external/bsd/drm2/include/linux/fs.h:1.6	Sun Dec 19 10:37:40 2021
+++ src/sys/external/bsd/drm2/include/linux/fs.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: fs.h,v 1.6 2021/12/19 10:37:40 riastradh Exp $	*/
+/*	$NetBSD: fs.h,v 1.7 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -39,4 +39,10 @@
 #include <linux/err.h>
 #include <linux/wait_bit.h>
 
+static inline struct uvm_object *
+file_inode(struct uvm_object *uobj)
+{
+	return uobj;
+}
+
 #endif  /* _LINUX_FS_H_ */

Index: src/sys/external/bsd/drm2/include/linux/interrupt.h
diff -u src/sys/external/bsd/drm2/include/linux/interrupt.h:1.8 src/sys/external/bsd/drm2/include/linux/interrupt.h:1.9
--- src/sys/external/bsd/drm2/include/linux/interrupt.h:1.8	Sun Dec 19 10:37:25 2021
+++ src/sys/external/bsd/drm2/include/linux/interrupt.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: interrupt.h,v 1.8 2021/12/19 10:37:25 riastradh Exp $	*/
+/*	$NetBSD: interrupt.h,v 1.9 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -44,6 +44,8 @@
 #define	disable_irq		linux_disable_irq
 #define	enable_irq		linux_enable_irq
 
+typedef irqreturn_t (*irq_handler_t)(void *);
+
 void	disable_irq(int);
 void	enable_irq(int);
 

Index: src/sys/external/bsd/drm2/include/linux/ktime.h
diff -u src/sys/external/bsd/drm2/include/linux/ktime.h:1.15 src/sys/external/bsd/drm2/include/linux/ktime.h:1.16
--- src/sys/external/bsd/drm2/include/linux/ktime.h:1.15	Sun Dec 19 01:58:18 2021
+++ src/sys/external/bsd/drm2/include/linux/ktime.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: ktime.h,v 1.15 2021/12/19 01:58:18 riastradh Exp $	*/
+/*	$NetBSD: ktime.h,v 1.16 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -144,6 +144,12 @@ ktime_get_raw_ns(void)
 	return ktime_to_ns(ktime_get_raw());
 }
 
+static inline uint64_t
+ktime_get_mono_fast_ns(void)
+{
+	return ktime_get_raw_ns();
+}
+
 static inline ktime_t
 ktime_get_monotonic_offset(void)
 {

Index: src/sys/external/bsd/drm2/include/linux/mm.h
diff -u src/sys/external/bsd/drm2/include/linux/mm.h:1.20 src/sys/external/bsd/drm2/include/linux/mm.h:1.21
--- src/sys/external/bsd/drm2/include/linux/mm.h:1.20	Sun Dec 19 10:51:31 2021
+++ src/sys/external/bsd/drm2/include/linux/mm.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: mm.h,v 1.20 2021/12/19 10:51:31 riastradh Exp $	*/
+/*	$NetBSD: mm.h,v 1.21 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -87,8 +87,16 @@ vm_mmap(struct file *file __unused, unsi
 }
 
 static inline unsigned long
+totalram_pages(void)
+{
+
+	return uvmexp.npages;
+}
+
+static inline unsigned long
 get_num_physpages(void)
 {
+
 	return uvmexp.npages;
 }
 

Index: src/sys/external/bsd/drm2/include/linux/pagemap.h
diff -u src/sys/external/bsd/drm2/include/linux/pagemap.h:1.5 src/sys/external/bsd/drm2/include/linux/pagemap.h:1.6
--- src/sys/external/bsd/drm2/include/linux/pagemap.h:1.5	Sun Dec 19 11:15:26 2021
+++ src/sys/external/bsd/drm2/include/linux/pagemap.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: pagemap.h,v 1.5 2021/12/19 11:15:26 riastradh Exp $	*/
+/*	$NetBSD: pagemap.h,v 1.6 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -34,9 +34,12 @@
 
 #include <sys/types.h>
 
+#include <linux/gfp.h>
 #include <linux/highmem.h>
 #include <linux/uaccess.h>
 
+struct uvm_object;
+
 static inline int
 fault_in_multipages_readable(const char *uaddr __unused, size_t len __unused)
 {
@@ -49,4 +52,10 @@ fault_in_multipages_writeable(char *uadd
 	return 0;
 }
 
+static inline gfp_t
+mapping_gfp_mask(struct uvm_object *uobj __unused)
+{
+	return GFP_KERNEL;
+}
+
 #endif  /* _LINUX_PAGEMAP_H_ */

Index: src/sys/external/bsd/drm2/include/linux/scatterlist.h
diff -u src/sys/external/bsd/drm2/include/linux/scatterlist.h:1.4 src/sys/external/bsd/drm2/include/linux/scatterlist.h:1.5
--- src/sys/external/bsd/drm2/include/linux/scatterlist.h:1.4	Sun Dec 19 11:33:31 2021
+++ src/sys/external/bsd/drm2/include/linux/scatterlist.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: scatterlist.h,v 1.4 2021/12/19 11:33:31 riastradh Exp $	*/
+/*	$NetBSD: scatterlist.h,v 1.5 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -40,6 +40,7 @@
 #include <linux/types.h>
 
 /* namespace */
+#define	__sg_alloc_table_from_pages	linux___sg_alloc_table_from_pages
 #define	dma_map_sg			linux_dma_map_sg
 #define	dma_map_sg_attrs		linux_dma_map_sg_attrs
 #define	dma_unmap_sg			linux_dma_unmap_sg
@@ -61,6 +62,8 @@ struct sg_table {
 };
 
 int sg_alloc_table(struct sg_table *, unsigned, gfp_t);
+int __sg_alloc_table_from_pages(struct sg_table *, struct page **, unsigned,
+    bus_size_t, bus_size_t, unsigned, gfp_t);
 int sg_alloc_table_from_pages(struct sg_table *, struct page **, unsigned,
     bus_size_t, bus_size_t, gfp_t);
 int sg_alloc_table_from_bus_dmamem(struct sg_table *, bus_dma_tag_t,

Index: src/sys/external/bsd/drm2/include/linux/shmem_fs.h
diff -u src/sys/external/bsd/drm2/include/linux/shmem_fs.h:1.2 src/sys/external/bsd/drm2/include/linux/shmem_fs.h:1.3
--- src/sys/external/bsd/drm2/include/linux/shmem_fs.h:1.2	Tue Mar 18 18:20:43 2014
+++ src/sys/external/bsd/drm2/include/linux/shmem_fs.h	Sun Dec 19 11:33:49 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: shmem_fs.h,v 1.2 2014/03/18 18:20:43 riastradh Exp $	*/
+/*	$NetBSD: shmem_fs.h,v 1.3 2021/12/19 11:33:49 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -32,4 +32,55 @@
 #ifndef _LINUX_SHMEM_FS_H_
 #define _LINUX_SHMEM_FS_H_
 
+#include <sys/types.h>
+#include <sys/param.h>
+
+#include <sys/rwlock.h>
+
+#include <lib/libkern/libkern.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <linux/err.h>
+#include <linux/gfp.h>
+#include <linux/mm_types.h>
+
+static inline struct page *
+shmem_read_mapping_page_gfp(struct uvm_object *uobj, voff_t i, gfp_t gfp)
+{
+	struct vm_page *vm_page;
+	int error;
+
+	error = uvm_obj_wirepages(uobj, i*PAGE_SIZE, (i + 1)*PAGE_SIZE, NULL);
+	if (error)
+		return ERR_PTR(-error); /* XXX errno NetBSD->Linux */
+
+	rw_enter(uobj->vmobjlock, RW_READER);
+	vm_page = uvm_pagelookup(uobj, i*PAGE_SIZE);
+	rw_exit(uobj->vmobjlock);
+
+	KASSERT(vm_page);
+	return container_of(vm_page, struct page, p_vmp);
+}
+
+static inline struct page *
+shmem_read_mapping_page(struct uvm_object *uobj, voff_t i)
+{
+	return shmem_read_mapping_page_gfp(uobj, i, GFP_KERNEL);
+}
+
+static inline void
+shmem_truncate_range(struct uvm_object *uobj, voff_t start, voff_t end)
+{
+	int flags = PGO_FREE;
+
+	if (start == 0 && end == -1) {
+		flags |= PGO_ALLPAGES;
+	} else {
+		KASSERT(0 <= start);
+		KASSERT(start <= end);
+	}
+	(*uobj->pgops->pgo_put)(uobj, start, end, flags);
+}
+
 #endif  /* _LINUX_SHMEM_FS_H_ */

Index: src/sys/external/bsd/drm2/include/linux/sched/mm.h
diff -u src/sys/external/bsd/drm2/include/linux/sched/mm.h:1.1 src/sys/external/bsd/drm2/include/linux/sched/mm.h:1.2
--- src/sys/external/bsd/drm2/include/linux/sched/mm.h:1.1	Sun Dec 19 00:31:27 2021
+++ src/sys/external/bsd/drm2/include/linux/sched/mm.h	Sun Dec 19 11:33:50 2021
@@ -0,0 +1,48 @@
+/*	$NetBSD: mm.h,v 1.2 2021/12/19 11:33:50 riastradh Exp $	*/
+
+/*-
+ * Copyright (c) 2021 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _LINUX_SCHED_MM_H_
+#define _LINUX_SCHED_MM_H_
+
+#include <sys/types.h>
+
+#include <uvm/uvm_extern.h>
+
+static inline void
+mmgrab(struct vmspace *vm)
+{
+	uvmspace_addref(vm);
+}
+
+static inline void
+mmdrop(struct vmspace *vm)
+{
+	uvmspace_free(vm);
+}
+
+#endif	/* _LINUX_SCHED_MM_H_ */

Index: src/sys/external/bsd/drm2/linux/linux_sg.c
diff -u src/sys/external/bsd/drm2/linux/linux_sg.c:1.1 src/sys/external/bsd/drm2/linux/linux_sg.c:1.2
--- src/sys/external/bsd/drm2/linux/linux_sg.c:1.1	Sun Dec 19 11:33:31 2021
+++ src/sys/external/bsd/drm2/linux/linux_sg.c	Sun Dec 19 11:33:50 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_sg.c,v 1.1 2021/12/19 11:33:31 riastradh Exp $	*/
+/*	$NetBSD: linux_sg.c,v 1.2 2021/12/19 11:33:50 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_sg.c,v 1.1 2021/12/19 11:33:31 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_sg.c,v 1.2 2021/12/19 11:33:50 riastradh Exp $");
 
 #include <sys/bus.h>
 #include <sys/errno.h>
@@ -54,8 +54,9 @@ sg_alloc_table(struct sg_table *sgt, uns
 }
 
 int
-sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pgs,
-    unsigned npgs, bus_size_t offset, bus_size_t size, gfp_t gfp)
+__sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pgs,
+    unsigned npgs, bus_size_t offset, bus_size_t size, unsigned maxseg,
+    gfp_t gfp)
 {
 	unsigned i;
 	int ret;
@@ -74,6 +75,15 @@ sg_alloc_table_from_pages(struct sg_tabl
 }
 
 int
+sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pgs,
+    unsigned npgs, bus_size_t offset, bus_size_t size, gfp_t gfp)
+{
+
+	return __sg_alloc_table_from_pages(sgt, pgs, npgs, offset, size,
+	    -1, gfp);
+}
+
+int
 sg_alloc_table_from_bus_dmamem(struct sg_table *sgt, bus_dma_tag_t dmat,
     const bus_dma_segment_t *seg, int nseg, gfp_t gfp)
 {

Reply via email to