Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 11:45:02 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915: i915_irq.c
        src/sys/external/bsd/drm2/dist/drm/i915/display: intel_fbdev.c
            intel_gmbus.c intel_hdmi.c
        src/sys/external/bsd/drm2/dist/drm/i915/gt: intel_gt_pm.c
            intel_gt_requests.c intel_gtt.c
        src/sys/external/bsd/drm2/dist/drm/i915/gt/uc: intel_guc.c
            intel_guc_ct.c intel_guc_submission.c
        src/sys/external/bsd/drm2/i915drm: files.i915drmkms
        src/sys/external/bsd/drm2/include/linux: atomic.h kref.h preempt.h
            random.h string.h
        src/sys/external/bsd/drm2/include/linux/sched: signal.h
Added Files:
        src/sys/external/bsd/drm2/i915drm: intel_gtt_subr.c
Removed Files:
        src/sys/external/bsd/drm2/i915drm: intel_gtt.c

Log Message:
i915: more work


To generate a diff of this commit:
cvs rdiff -u -r1.24 -r1.25 src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c
cvs rdiff -u -r1.7 -r1.8 \
    src/sys/external/bsd/drm2/dist/drm/i915/display/intel_fbdev.c
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/display/intel_gmbus.c \
    src/sys/external/bsd/drm2/dist/drm/i915/display/intel_hdmi.c
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt_pm.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt_requests.c
cvs rdiff -u -r1.6 -r1.7 \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_ct.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_submission.c
cvs rdiff -u -r1.77 -r1.78 src/sys/external/bsd/drm2/i915drm/files.i915drmkms
cvs rdiff -u -r1.13 -r0 src/sys/external/bsd/drm2/i915drm/intel_gtt.c
cvs rdiff -u -r0 -r1.1 src/sys/external/bsd/drm2/i915drm/intel_gtt_subr.c
cvs rdiff -u -r1.40 -r1.41 src/sys/external/bsd/drm2/include/linux/atomic.h
cvs rdiff -u -r1.11 -r1.12 src/sys/external/bsd/drm2/include/linux/kref.h
cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/include/linux/preempt.h
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/include/linux/random.h
cvs rdiff -u -r1.10 -r1.11 src/sys/external/bsd/drm2/include/linux/string.h
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/include/linux/sched/signal.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_irq.c
diff -u 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.25
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.24	Sun Dec 19 11:33:49 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_irq.c,v 1.24 2021/12/19 11:33:49 riastradh Exp $	*/
+/*	$NetBSD: i915_irq.c,v 1.25 2021/12/19 11:45:01 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.24 2021/12/19 11:33:49 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_irq.c,v 1.25 2021/12/19 11:45:01 riastradh Exp $");
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
@@ -1184,27 +1184,19 @@ static void intel_get_hpd_pins(struct dr
 static void gmbus_irq_handler(struct drm_i915_private *dev_priv)
 {
 
-#ifdef __NetBSD__
 	spin_lock(&dev_priv->gmbus_wait_lock);
 	DRM_SPIN_WAKEUP_ALL(&dev_priv->gmbus_wait_queue,
 	    &dev_priv->gmbus_wait_lock);
 	spin_unlock(&dev_priv->gmbus_wait_lock);
-#else
-	wake_up_all(&dev_priv->gmbus_wait_queue);
-#endif
 }
 
 static void dp_aux_irq_handler(struct drm_i915_private *dev_priv)
 {
 
-#ifdef __NetBSD__
 	spin_lock(&dev_priv->gmbus_wait_lock);
 	DRM_SPIN_WAKEUP_ALL(&dev_priv->gmbus_wait_queue,
 	    &dev_priv->gmbus_wait_lock);
 	spin_unlock(&dev_priv->gmbus_wait_lock);
-#else
-	wake_up_all(&dev_priv->gmbus_wait_queue);
-#endif
 }
 
 #if defined(CONFIG_DEBUG_FS)

Index: src/sys/external/bsd/drm2/dist/drm/i915/display/intel_fbdev.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/display/intel_fbdev.c:1.7 src/sys/external/bsd/drm2/dist/drm/i915/display/intel_fbdev.c:1.8
--- src/sys/external/bsd/drm2/dist/drm/i915/display/intel_fbdev.c:1.7	Sun Dec 19 11:39:45 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_fbdev.c	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_fbdev.c,v 1.7 2021/12/19 11:39:45 riastradh Exp $	*/
+/*	$NetBSD: intel_fbdev.c,v 1.8 2021/12/19 11:45:01 riastradh Exp $	*/
 
 /*
  * Copyright © 2007 David Airlie
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_fbdev.c,v 1.7 2021/12/19 11:39:45 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_fbdev.c,v 1.8 2021/12/19 11:45:01 riastradh Exp $");
 
 #include <linux/async.h>
 #include <linux/console.h>
@@ -590,6 +590,7 @@ void intel_fbdev_fini(struct drm_i915_pr
  * processing, fbdev will perform a full connector reprobe if a hotplug event
  * was received while HPD was suspended.
  */
+#ifndef __NetBSD__		/* XXX fb suspend */
 static void intel_fbdev_hpd_set_suspend(struct intel_fbdev *ifbdev, int state)
 {
 	bool send_hpd = false;
@@ -605,6 +606,7 @@ static void intel_fbdev_hpd_set_suspend(
 		drm_fb_helper_hotplug_event(&ifbdev->helper);
 	}
 }
+#endif	/* __NetBSD__ */
 
 void intel_fbdev_set_suspend(struct drm_device *dev, int state, bool synchronous)
 {

Index: src/sys/external/bsd/drm2/dist/drm/i915/display/intel_gmbus.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/display/intel_gmbus.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/display/intel_gmbus.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/display/intel_gmbus.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_gmbus.c	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_gmbus.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: intel_gmbus.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2006 Dave Airlie <airl...@linux.ie>
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_gmbus.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_gmbus.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $");
 
 #include <linux/export.h>
 #include <linux/i2c-algo-bit.h>
@@ -332,9 +332,6 @@ intel_gpio_setup(struct intel_gmbus *bus
 
 static int gmbus_wait(struct drm_i915_private *dev_priv, u32 status, u32 irq_en)
 {
-#ifndef __NetBSD__
-	DEFINE_WAIT(wait);
-#endif
 	u32 gmbus2;
 	int ret;
 
@@ -342,24 +339,42 @@ static int gmbus_wait(struct drm_i915_pr
 	 * we also need to check for NAKs besides the hw ready/idle signal, we
 	 * need to wake up periodically and check that ourselves.
 	 */
-#ifdef __NetBSD__
-	if (cold || !HAS_GMBUS_IRQ(dev_priv->dev))
-		irq_en = 0;
-#else
 	if (!HAS_GMBUS_IRQ(dev_priv))
 		irq_en = 0;
+#ifdef __NetBSD__
+	if (cold)
+		irq_en = 0;
 #endif
 
-	add_wait_queue(&dev_priv->gmbus_wait_queue, &wait);
+	spin_lock(&dev_priv->gmbus_wait_lock);
 	I915_WRITE_FW(GMBUS4, irq_en);
 
 	status |= GMBUS_SATOER;
-	ret = wait_for_us((gmbus2 = I915_READ_FW(GMBUS2)) & status, 2);
-	if (ret)
-		ret = wait_for((gmbus2 = I915_READ_FW(GMBUS2)) & status, 50);
+	if (!irq_en) {
+		unsigned timeout = 10*1000;
+
+		ret = 0;
+		while ((gmbus2 = intel_uncore_read_fw(&dev_priv->uncore,
+			    GMBUS2)) & GMBUS_ACTIVE) {
+			if (--timeout == 0) {
+				ret = -ETIMEDOUT;
+				break;
+			}
+			udelay(1);
+		}
+	} else {
+		DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(ret,
+		    &dev_priv->gmbus_wait_queue,
+		    &dev_priv->gmbus_wait_lock,
+		    msecs_to_jiffies_timeout(10),
+		    (((gmbus2 = intel_uncore_read_fw(&dev_priv->uncore,
+				GMBUS2))
+			    & GMBUS_ACTIVE)
+			== 0));
+	}
 
 	I915_WRITE_FW(GMBUS4, 0);
-	remove_wait_queue(&dev_priv->gmbus_wait_queue, &wait);
+	spin_unlock(&dev_priv->gmbus_wait_lock);
 
 	if (gmbus2 & GMBUS_SATOER)
 		return -ENXIO;
@@ -370,37 +385,45 @@ static int gmbus_wait(struct drm_i915_pr
 static int
 gmbus_wait_idle(struct drm_i915_private *dev_priv)
 {
-	DEFINE_WAIT(wait);
 	u32 irq_enable;
 	int ret;
 
 	/* Important: The hw handles only the first bit, so set only one! */
 	irq_enable = 0;
-#ifdef __NetBSD__
-	if (cold || !HAS_GMBUS_IRQ(dev_priv->dev))
-		irq_enable = GMBUS_IDLE_EN;
-#else
 	if (HAS_GMBUS_IRQ(dev_priv))
 		irq_enable = GMBUS_IDLE_EN;
+#ifdef __NetBSD__
+	if (cold)
+		irq_enable = 0;
 #endif
 
-	add_wait_queue(&dev_priv->gmbus_wait_queue, &wait);
+	spin_lock(&dev_priv->gmbus_wait_lock);
 	I915_WRITE_FW(GMBUS4, irq_enable);
 
-#ifdef __NetBSD__ /* XXX post-merge audit */
-	spin_lock(&dev_priv->gmbus_wait_lock);
-	DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(ret, &dev_priv->gmbus_wait_queue,
-	    &dev_priv->gmbus_wait_lock, msecs_to_jiffies_timeout(10),
-	    C);
-	spin_unlock(&dev_priv->gmbus_wait_lock);
-#else
-	ret = intel_wait_for_register_fw(&dev_priv->uncore,
-					 GMBUS2, GMBUS_ACTIVE, 0,
-					 10);
-#endif
+	if (!irq_enable) {
+		unsigned timeout = 10*1000;
+
+		ret = 0;
+		while (intel_uncore_read_fw(&dev_priv->uncore, GMBUS2)
+		    & GMBUS_ACTIVE) {
+			if (--timeout == 0) {
+				ret = -ETIMEDOUT;
+				break;
+			}
+			udelay(1);
+		}
+	} else {
+		DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(ret,
+		    &dev_priv->gmbus_wait_queue,
+		    &dev_priv->gmbus_wait_lock,
+		    msecs_to_jiffies_timeout(10),
+		    ((intel_uncore_read_fw(&dev_priv->uncore, GMBUS2)
+			    & GMBUS_ACTIVE)
+			== 0));
+	}
 
 	I915_WRITE_FW(GMBUS4, 0);
-	remove_wait_queue(&dev_priv->gmbus_wait_queue, &wait);
+	spin_unlock(&dev_priv->gmbus_wait_lock);
 
 	return ret;
 }
@@ -858,7 +881,6 @@ static const struct i2c_lock_operations 
  */
 int intel_gmbus_setup(struct drm_i915_private *dev_priv)
 {
-	struct pci_dev *pdev = dev_priv->drm.pdev;
 	struct intel_gmbus *bus;
 	unsigned int pin;
 	int ret;
@@ -877,12 +899,8 @@ int intel_gmbus_setup(struct drm_i915_pr
 
 	mutex_init(&dev_priv->gmbus_mutex);
 
-#ifdef __NetBSD__
 	spin_lock_init(&dev_priv->gmbus_wait_lock);
 	DRM_INIT_WAITQUEUE(&dev_priv->gmbus_wait_queue, "i915i2c");
-#else
-	init_waitqueue_head(&dev_priv->gmbus_wait_queue);
-#endif
 
 	for (pin = 0; pin < ARRAY_SIZE(dev_priv->gmbus); pin++) {
 		if (!intel_gmbus_is_valid_pin(dev_priv, pin))
@@ -897,11 +915,7 @@ int intel_gmbus_setup(struct drm_i915_pr
 			 "i915 gmbus %s",
 			 get_gmbus_pin(dev_priv, pin)->name);
 
-#ifdef __NetBSD__
-		bus->adapter.dev.parent = dev->dev;
-#else
-		bus->adapter.dev.parent = &pdev->dev;
-#endif
+		bus->adapter.dev.parent = dev_priv->drm.dev;
 		bus->dev_priv = dev_priv;
 
 		bus->adapter.algo = &gmbus_algorithm;
@@ -993,9 +1007,7 @@ void intel_gmbus_teardown(struct drm_i91
 		i2c_del_adapter(&bus->adapter);
 	}
 
-#ifdef __NetBSD__
 	DRM_DESTROY_WAITQUEUE(&dev_priv->gmbus_wait_queue);
 	spin_lock_destroy(&dev_priv->gmbus_wait_lock);
-#endif
 	mutex_destroy(&dev_priv->gmbus_mutex);
 }
Index: src/sys/external/bsd/drm2/dist/drm/i915/display/intel_hdmi.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/display/intel_hdmi.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/display/intel_hdmi.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/display/intel_hdmi.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/display/intel_hdmi.c	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_hdmi.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: intel_hdmi.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $	*/
 
 /*
  * Copyright 2006 Dave Airlie <airl...@linux.ie>
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_hdmi.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_hdmi.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $");
 
 #include <linux/delay.h>
 #include <linux/hdmi.h>
@@ -555,7 +555,7 @@ static void hsw_read_infoframe(struct in
 {
 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
-	u32 val, *data = frame;
+	u32 val __unused, *data = frame;
 	int i;
 
 	val = I915_READ(HSW_TVIDEO_DIP_CTL(cpu_transcoder));

Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt_pm.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt_pm.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt_pm.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt_pm.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt_pm.c	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_gt_pm.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: intel_gt_pm.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_gt_pm.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_gt_pm.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $");
 
 #include <linux/suspend.h>
 
@@ -273,6 +273,7 @@ void intel_gt_suspend_prepare(struct int
 	intel_uc_suspend(&gt->uc);
 }
 
+#ifndef __NetBSD__		/* XXX i915 pm */
 static suspend_state_t pm_suspend_target(void)
 {
 #if IS_ENABLED(CONFIG_SUSPEND) && IS_ENABLED(CONFIG_PM_SLEEP)
@@ -281,6 +282,7 @@ static suspend_state_t pm_suspend_target
 	return PM_SUSPEND_TO_IDLE;
 #endif
 }
+#endif
 
 void intel_gt_suspend_late(struct intel_gt *gt)
 {
@@ -294,6 +296,7 @@ void intel_gt_suspend_late(struct intel_
 
 	GEM_BUG_ON(gt->awake);
 
+#ifndef __NetBSD__
 	/*
 	 * On disabling the device, we want to turn off HW access to memory
 	 * that we no longer own.
@@ -306,6 +309,7 @@ void intel_gt_suspend_late(struct intel_
 	 */
 	if (pm_suspend_target() == PM_SUSPEND_TO_IDLE)
 		return;
+#endif
 
 	with_intel_runtime_pm(gt->uncore->rpm, wakeref) {
 		intel_rps_disable(&gt->rps);
Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt_requests.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt_requests.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt_requests.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt_requests.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt_requests.c	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_gt_requests.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: intel_gt_requests.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,8 +7,9 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_gt_requests.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_gt_requests.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $");
 
+#include <linux/sched/signal.h>
 #include <linux/workqueue.h>
 
 #include "i915_drv.h" /* for_each_engine() */
@@ -19,6 +20,8 @@ __KERNEL_RCSID(0, "$NetBSD: intel_gt_req
 #include "intel_gt_requests.h"
 #include "intel_timeline.h"
 
+#include <linux/nbsd-namespace.h>
+
 static bool retire_requests(struct intel_timeline *tl)
 {
 	struct i915_request *rq, *rn;
@@ -122,6 +125,11 @@ void intel_engine_fini_retire(struct int
 	GEM_BUG_ON(engine->retire);
 }
 
+static void
+null_release(struct kref *kref)
+{
+}
+
 long intel_gt_retire_requests_timeout(struct intel_gt *gt, long timeout)
 {
 	struct intel_gt_timelines *timelines = &gt->timelines;
@@ -172,7 +180,7 @@ long intel_gt_retire_requests_timeout(st
 		mutex_unlock(&tl->mutex);
 
 		/* Defer the final release to after the spinlock */
-		if (refcount_dec_and_test(&tl->kref.refcount)) {
+		if (kref_put(&tl->kref, null_release)) {
 			GEM_BUG_ON(atomic_read(&tl->active_count));
 			list_add(&tl->link, &free);
 		}

Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c:1.6 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c:1.7
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c:1.6	Sun Dec 19 11:26:26 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_gtt.c,v 1.6 2021/12/19 11:26:26 riastradh Exp $	*/
+/*	$NetBSD: intel_gtt.c,v 1.7 2021/12/19 11:45:01 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_gtt.c,v 1.6 2021/12/19 11:26:26 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_gtt.c,v 1.7 2021/12/19 11:45:01 riastradh Exp $");
 
 #include <linux/slab.h> /* fault-inject.h is not standalone! */
 
@@ -16,6 +16,8 @@ __KERNEL_RCSID(0, "$NetBSD: intel_gtt.c,
 #include "intel_gt.h"
 #include "intel_gtt.h"
 
+#include <linux/nbsd-namespace.h>
+
 #ifndef __NetBSD__
 void stash_init(struct pagestash *stash)
 {
@@ -253,7 +255,7 @@ void i915_address_space_init(struct i915
 	vm->mm.head_node.color = I915_COLOR_UNEVICTABLE;
 
 #ifdef __NetBSD__
-	vm->dmat = dev_priv->drm.dmat;
+	vm->dmat = vm->i915->drm.dmat;
 #else
 	stash_init(&vm->free_pages);
 #endif
@@ -397,39 +399,39 @@ int setup_scratch_page(struct i915_addre
 		/* Allocate a scratch page.  */
 		/* XXX errno NetBSD->Linux */
 		ret = -bus_dmamem_alloc(vm->dmat, size, size, 0,
-		    &vm->scratch_page.seg, 1, &nseg, BUS_DMA_NOWAIT);
+		    &vm->scratch[0].base.seg, 1, &nseg, BUS_DMA_NOWAIT);
 		if (ret)
 			goto skip;
 		KASSERT(nseg == 1);
-		KASSERT(vm->scratch_page.seg.ds_len == size);
+		KASSERT(vm->scratch[0].base.seg.ds_len == size);
 
 		/* Create a DMA map.  */
 		ret = -bus_dmamap_create(vm->dmat, size, 1, size, 0,
-		    BUS_DMA_NOWAIT, &vm->scratch_page.map);
+		    BUS_DMA_NOWAIT, &vm->scratch[0].base.map);
 		if (ret)
 			goto free_dmamem;
 
 		/* Load the segment into the DMA map.  */
-		ret = -bus_dmamap_load_raw(vm->dmat, vm->scratch_page.map,
-		    &vm->scratch_page.seg, 1, size, BUS_DMA_NOWAIT);
+		ret = -bus_dmamap_load_raw(vm->dmat, vm->scratch[0].base.map,
+		    &vm->scratch[0].base.seg, 1, size, BUS_DMA_NOWAIT);
 		if (ret)
 			goto destroy_dmamap;
-		KASSERT(vm->scratch_page.map->dm_nsegs == 1);
-		KASSERT(vm->scratch_page.map->dm_segs[0].ds_len == size);
+		KASSERT(vm->scratch[0].base.map->dm_nsegs == 1);
+		KASSERT(vm->scratch[0].base.map->dm_segs[0].ds_len == size);
 
 		/* Zero the page.  */
-		ret = -bus_dmamem_map(vm->dmat, &vm->scratch_page.seg, 1,
+		ret = -bus_dmamem_map(vm->dmat, &vm->scratch[0].base.seg, 1,
 		    size, &kva, BUS_DMA_NOWAIT|BUS_DMA_NOCACHE);
 		if (ret)
 			goto unload_dmamap;
 		memset(kva, 0, size);
-		bus_dmamap_sync(vm->dmat, vm->scratch_page.map, 0, size,
+		bus_dmamap_sync(vm->dmat, vm->scratch[0].base.map, 0, size,
 		    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
 		bus_dmamem_unmap(vm->dmat, kva, size);
 
 		/* XXX Is this page guaranteed to work as a huge page?  */
-		vm_page = PHYS_TO_VM_PAGE(vm->scratch_page.seg.ds_addr);
-		vm->scratch_page.page = container_of(vm_page, struct page,
+		vm_page = PHYS_TO_VM_PAGE(vm->scratch[0].base.seg.ds_addr);
+		vm->scratch[0].base.page = container_of(vm_page, struct page,
 		    p_vmp);
 #else
 		struct page *page;
@@ -457,10 +459,10 @@ int setup_scratch_page(struct i915_addre
 		return 0;
 
 #ifdef __NetBSD__
-unload_dmamap:	bus_dmamap_unload(vm->dmat, vm->scratch_page.map);
-destroy_dmamap:	bus_dmamap_destroy(vm->dmat, vm->scratch_page.map);
-		vm->scratch_page.map = NULL; /* paranoia */
-free_dmamem:	bus_dmamem_free(vm->dmat, &vm->scratch_page.seg, 1);
+unload_dmamap:	bus_dmamap_unload(vm->dmat, vm->scratch[0].base.map);
+destroy_dmamap:	bus_dmamap_destroy(vm->dmat, vm->scratch[0].base.map);
+		vm->scratch[0].base.map = NULL; /* paranoia */
+free_dmamem:	bus_dmamem_free(vm->dmat, &vm->scratch[0].base.seg, 1);
 #else
 unmap_page:
 		dma_unmap_page(vm->dma, addr, size, PCI_DMA_BIDIRECTIONAL);
@@ -482,7 +484,7 @@ void cleanup_scratch_page(struct i915_ad
 #ifdef __NetBSD__
 	bus_dmamap_unload(vm->dmat, p->map);
 	bus_dmamap_destroy(vm->dmat, p->map);
-	vm->scratch_page.map = NULL; /* paranoia */
+	vm->scratch[0].base.map = NULL; /* paranoia */
 	bus_dmamem_free(vm->dmat, &p->seg, 1);
 #else
 	unsigned int order = vm->scratch_order;

Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc.c:1.2	Sat Dec 18 23:45:31 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc.c	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_guc.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $	*/
+/*	$NetBSD: intel_guc.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_guc.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_guc.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $");
 
 #include "gt/intel_gt.h"
 #include "gt/intel_gt_irq.h"
@@ -16,6 +16,8 @@ __KERNEL_RCSID(0, "$NetBSD: intel_guc.c,
 #include "intel_guc_submission.h"
 #include "i915_drv.h"
 
+#include <linux/nbsd-namespace.h>
+
 /**
  * DOC: GuC
  *
Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_ct.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_ct.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_ct.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_ct.c:1.2	Sat Dec 18 23:45:31 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_ct.c	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_guc_ct.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $	*/
+/*	$NetBSD: intel_guc_ct.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_guc_ct.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_guc_ct.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $");
 
 #include "i915_drv.h"
 #include "intel_guc_ct.h"
@@ -387,9 +387,22 @@ static int wait_for_ctb_desc_update(stru
 	 * No GuC command should ever take longer than 10ms.
 	 */
 #define done (READ_ONCE(desc->fence) == fence)
+#ifdef __NetBSD__
+	int timo = 10;
+	err = 0;
+	while (!done) {
+		if (--timo == 0) {
+			kpause("intelguc", false, mstohz(10), NULL);
+			if (!done)
+				err = -ETIMEDOUT;
+			break;
+		}
+	}
+#else
 	err = wait_for_us(done, 10);
 	if (err)
 		err = wait_for(done, 10);
+#endif
 #undef done
 
 	if (unlikely(err)) {
@@ -433,9 +446,22 @@ static int wait_for_ct_request_update(st
 	 * No GuC command should ever take longer than 10ms.
 	 */
 #define done INTEL_GUC_MSG_IS_RESPONSE(READ_ONCE(req->status))
+#ifdef __NetBSD__
+	int timo = 10;
+	err = 0;
+	while (!done) {
+		if (--timo == 0) {
+			kpause("intelguc", false, mstohz(10), NULL);
+			if (!done)
+				err = -ETIMEDOUT;
+			break;
+		}
+	}
+#else
 	err = wait_for_us(done, 10);
 	if (err)
 		err = wait_for(done, 10);
+#endif
 #undef done
 
 	if (unlikely(err))
Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_submission.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_submission.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_submission.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_submission.c:1.2	Sat Dec 18 23:45:31 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_submission.c	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_guc_submission.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $	*/
+/*	$NetBSD: intel_guc_submission.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_guc_submission.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_guc_submission.c,v 1.3 2021/12/19 11:45:01 riastradh Exp $");
 
 #include <linux/circ_buf.h>
 
@@ -486,7 +486,7 @@ static void guc_reset_cancel(struct inte
 	/* Remaining _unready_ requests will be nop'ed when submitted */
 
 	execlists->queue_priority_hint = INT_MIN;
-	execlists->queue = RB_ROOT_CACHED;
+	i915_sched_init(execlists);
 
 	spin_unlock_irqrestore(&engine->active.lock, flags);
 }

Index: src/sys/external/bsd/drm2/i915drm/files.i915drmkms
diff -u src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.77 src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.78
--- src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.77	Sun Dec 19 11:39:24 2021
+++ src/sys/external/bsd/drm2/i915drm/files.i915drmkms	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-#	$NetBSD: files.i915drmkms,v 1.77 2021/12/19 11:39:24 riastradh Exp $
+#	$NetBSD: files.i915drmkms,v 1.78 2021/12/19 11:45:01 riastradh Exp $
 
 version	20180827
 
@@ -58,7 +58,7 @@ file	external/bsd/drm2/i915drm/i915_perf
 file	external/bsd/drm2/i915drm/i915_sysfs.c	i915drmkms
 file	external/bsd/drm2/i915drm/i915_switcheroo.c	i915drmkms
 file	external/bsd/drm2/i915drm/icl_dsi.c		i915drmkms
-file	external/bsd/drm2/i915drm/intel_gtt.c		i915drmkms
+file	external/bsd/drm2/i915drm/intel_gtt_subr.c	i915drmkms
 file	external/bsd/drm2/i915drm/intelfb.c		intelfb
 file	external/bsd/drm2/i915drm/vlv_dsi.c	i915drmkms
 
@@ -157,9 +157,9 @@ file	external/bsd/drm2/dist/drm/i915/gt/
 file	external/bsd/drm2/dist/drm/i915/gt/intel_context.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/intel_engine_cs.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/intel_engine_heartbeat.c	i915drmkms
-file	external/bsd/drm2/dist/drm/i915/gt/intel_engine_pm.c	i915drmkms
+#file	external/bsd/drm2/dist/drm/i915/gt/intel_engine_pm.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/intel_engine_pool.c	i915drmkms
-file	external/bsd/drm2/dist/drm/i915/gt/intel_engine_user.c	i915drmkms
+#file	external/bsd/drm2/dist/drm/i915/gt/intel_engine_user.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/intel_gt.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/intel_gt_irq.c	i915drmkms
@@ -184,7 +184,7 @@ file	external/bsd/drm2/dist/drm/i915/gt/
 file	external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_ads.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_ct.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_fw.c	i915drmkms
-file	external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_log.c	i915drmkms
+#file	external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_log.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/uc/intel_guc_submission.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/uc/intel_huc.c	i915drmkms
 file	external/bsd/drm2/dist/drm/i915/gt/uc/intel_huc_fw.c	i915drmkms

Index: src/sys/external/bsd/drm2/include/linux/atomic.h
diff -u src/sys/external/bsd/drm2/include/linux/atomic.h:1.40 src/sys/external/bsd/drm2/include/linux/atomic.h:1.41
--- src/sys/external/bsd/drm2/include/linux/atomic.h:1.40	Sun Dec 19 11:37:41 2021
+++ src/sys/external/bsd/drm2/include/linux/atomic.h	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic.h,v 1.40 2021/12/19 11:37:41 riastradh Exp $	*/
+/*	$NetBSD: atomic.h,v 1.41 2021/12/19 11:45:01 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -41,6 +41,11 @@
 /* XXX Hope the GCC __sync builtins work everywhere we care about!  */
 #define	xchg(P, V)		__sync_lock_test_and_set(P, V)
 #define	cmpxchg(P, O, N)	__sync_val_compare_and_swap(P, O, N)
+#define	try_cmpxchg(P, V, N)						      \
+({									      \
+	__typeof__(*(V)) *__tcx_v = (V), __tcx_expected = *__tcx_v;	      \
+	(*__tcx_v = cmpxchg((P), __tcx_expected, (N))) == __tcx_expected;     \
+})
 
 /*
  * atomic (u)int operations

Index: src/sys/external/bsd/drm2/include/linux/kref.h
diff -u src/sys/external/bsd/drm2/include/linux/kref.h:1.11 src/sys/external/bsd/drm2/include/linux/kref.h:1.12
--- src/sys/external/bsd/drm2/include/linux/kref.h:1.11	Sun Dec 19 11:39:00 2021
+++ src/sys/external/bsd/drm2/include/linux/kref.h	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: kref.h,v 1.11 2021/12/19 11:39:00 riastradh Exp $	*/
+/*	$NetBSD: kref.h,v 1.12 2021/12/19 11:45:01 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -48,7 +48,7 @@ struct kref {
 static inline void
 kref_init(struct kref *kref)
 {
-	kref->kr_count = 1;
+	atomic_store_relaxed(&kref->kr_count, 1);
 }
 
 static inline void
@@ -70,7 +70,7 @@ kref_get_unless_zero(struct kref *kref)
 	unsigned count;
 
 	do {
-		count = kref->kr_count;
+		count = atomic_load_relaxed(&kref->kr_count);
 		if ((count == 0) || (count == UINT_MAX))
 			return false;
 	} while (atomic_cas_uint(&kref->kr_count, count, (count + 1)) !=
@@ -93,7 +93,7 @@ kref_sub(struct kref *kref, unsigned int
 #endif
 
 	do {
-		old = kref->kr_count;
+		old = atomic_load_relaxed(&kref->kr_count);
 		KASSERTMSG((count <= old), "overreleasing kref: %u - %u",
 		    old, count);
 		new = (old - count);
@@ -108,7 +108,8 @@ kref_sub(struct kref *kref, unsigned int
 }
 
 static inline int
-kref_put_lock(struct kref *kref, void (*release)(struct kref *), spinlock_t *interlock)
+kref_put_lock(struct kref *kref, void (*release)(struct kref *),
+    spinlock_t *interlock)
 {
 	unsigned int old, new;
 
@@ -117,7 +118,7 @@ kref_put_lock(struct kref *kref, void (*
 #endif
 
 	do {
-		old = kref->kr_count;
+		old = atomic_load_relaxed(&kref->kr_count);
 		KASSERT(old > 0);
 		if (old == 1) {
 			spin_lock(interlock);
@@ -152,7 +153,7 @@ kref_put_mutex(struct kref *kref, void (
 #endif
 
 	do {
-		old = kref->kr_count;
+		old = atomic_load_relaxed(&kref->kr_count);
 		KASSERT(old > 0);
 		if (old == 1) {
 			mutex_lock(interlock);
@@ -172,11 +173,8 @@ kref_put_mutex(struct kref *kref, void (
 static inline unsigned
 kref_read(const struct kref *kref)
 {
-	unsigned v;
 
-	v = kref->kr_count;
-
-	return v;
+	return atomic_load_relaxed(&kref->kr_count);
 }
 
 /*

Index: src/sys/external/bsd/drm2/include/linux/preempt.h
diff -u src/sys/external/bsd/drm2/include/linux/preempt.h:1.4 src/sys/external/bsd/drm2/include/linux/preempt.h:1.5
--- src/sys/external/bsd/drm2/include/linux/preempt.h:1.4	Sun Dec 19 10:57:50 2021
+++ src/sys/external/bsd/drm2/include/linux/preempt.h	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: preempt.h,v 1.4 2021/12/19 10:57:50 riastradh Exp $	*/
+/*	$NetBSD: preempt.h,v 1.5 2021/12/19 11:45:01 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -39,5 +39,6 @@
 
 #define	in_atomic()	kpreempt_disabled()
 #define	in_task()	!(cpu_intr_p() || cpu_softintr_p() || in_atomic())
+#define	in_irq()	cpu_intr_p()
 
 #endif  /* _LINUX_PREEMPT_H_ */

Index: src/sys/external/bsd/drm2/include/linux/random.h
diff -u src/sys/external/bsd/drm2/include/linux/random.h:1.2 src/sys/external/bsd/drm2/include/linux/random.h:1.3
--- src/sys/external/bsd/drm2/include/linux/random.h:1.2	Sun Dec 19 01:34:23 2021
+++ src/sys/external/bsd/drm2/include/linux/random.h	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: random.h,v 1.2 2021/12/19 01:34:23 riastradh Exp $	*/
+/*	$NetBSD: random.h,v 1.3 2021/12/19 11:45:01 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -54,4 +54,14 @@ get_random_long(void)
 	return v;
 }
 
+static inline uint32_t
+get_random_u32(void)
+{
+	uint32_t v;
+
+	cprng_strong(kern_cprng, &v, sizeof v, 0);
+
+	return v;
+}
+
 #endif	/* _LINUX_RANDOM_H_ */

Index: src/sys/external/bsd/drm2/include/linux/string.h
diff -u src/sys/external/bsd/drm2/include/linux/string.h:1.10 src/sys/external/bsd/drm2/include/linux/string.h:1.11
--- src/sys/external/bsd/drm2/include/linux/string.h:1.10	Sun Dec 19 11:14:56 2021
+++ src/sys/external/bsd/drm2/include/linux/string.h	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: string.h,v 1.10 2021/12/19 11:14:56 riastradh Exp $	*/
+/*	$NetBSD: string.h,v 1.11 2021/12/19 11:45:01 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -115,28 +115,37 @@ strscpy(char *dst, const char *src, size
 	return dstsize - n;
 }
 
-static inline void
-memset32(uint32_t *p, uint32_t v, size_t n)
+static inline void *
+memset32(uint32_t *buf, uint32_t v, size_t n)
 {
+	uint32_t *p = buf;
 
 	while (n --> 0)
 		*p++ = v;
+
+	return buf;
 }
 
-static inline void
-memset64(uint64_t *p, uint64_t v, size_t n)
+static inline void *
+memset64(uint64_t *buf, uint64_t v, size_t n)
 {
+	uint64_t *p = buf;
 
 	while (n --> 0)
 		*p++ = v;
+
+	return buf;
 }
 
-static inline void
-memset_p(void **p, void *v, size_t n)
+static inline void *
+memset_p(void **buf, void *v, size_t n)
 {
+	void **p = buf;
 
 	while (n --> 0)
 		*p++ = v;
+
+	return buf;
 }
 
 #define str_has_prefix(str, prefix) strncmp(str, prefix, strlen(prefix))

Index: src/sys/external/bsd/drm2/include/linux/sched/signal.h
diff -u src/sys/external/bsd/drm2/include/linux/sched/signal.h:1.2 src/sys/external/bsd/drm2/include/linux/sched/signal.h:1.3
--- src/sys/external/bsd/drm2/include/linux/sched/signal.h:1.2	Sun Dec 19 10:38:59 2021
+++ src/sys/external/bsd/drm2/include/linux/sched/signal.h	Sun Dec 19 11:45:01 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: signal.h,v 1.2 2021/12/19 10:38:59 riastradh Exp $	*/
+/*	$NetBSD: signal.h,v 1.3 2021/12/19 11:45:01 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -31,4 +31,13 @@
 
 #include <linux/sched.h>
 
+static inline bool
+signal_pending(struct proc *p)
+{
+
+	KASSERT(p == curproc);
+	return __predict_false(curlwp->l_flag & LW_PENDSIG) &&
+	    sigispending(curlwp, 0);
+}
+
 #endif	/* _LINUX_SCHED_SIGNAL_H_ */

Added files:

Index: src/sys/external/bsd/drm2/i915drm/intel_gtt_subr.c
diff -u /dev/null src/sys/external/bsd/drm2/i915drm/intel_gtt_subr.c:1.1
--- /dev/null	Sun Dec 19 11:45:02 2021
+++ src/sys/external/bsd/drm2/i915drm/intel_gtt_subr.c	Sun Dec 19 11:45:01 2021
@@ -0,0 +1,246 @@
+/*	$NetBSD: intel_gtt_subr.c,v 1.1 2021/12/19 11:45:01 riastradh Exp $	*/
+
+/*-
+ * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Taylor R. Campbell.
+ *
+ * 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.
+ */
+
+/* Intel GTT stubs */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: intel_gtt_subr.c,v 1.1 2021/12/19 11:45:01 riastradh Exp $");
+
+#include <sys/types.h>
+#include <sys/bus.h>
+#include <sys/errno.h>
+#include <sys/systm.h>
+
+#include <machine/vmparam.h>
+
+#include <dev/pci/pcivar.h>		/* XXX agpvar.h needs...  */
+#include <dev/pci/agpvar.h>
+#include <dev/pci/agp_i810var.h>
+
+#include <linux/scatterlist.h>
+
+#include "drm/intel-gtt.h"
+
+/* Access to this should be single-threaded.  */
+static struct {
+	bus_dma_segment_t	scratch_seg;
+	bus_dmamap_t		scratch_map;
+} intel_gtt;
+
+struct resource intel_graphics_stolen_res;
+
+void
+intel_gtt_get(uint64_t *va_size, bus_addr_t *aper_base, uint64_t *aper_size)
+{
+	struct agp_softc *const sc = agp_i810_sc;
+
+	if (sc == NULL) {
+		*va_size = 0;
+		*aper_base = 0;
+		*aper_size = 0;
+		return;
+	}
+
+	struct agp_i810_softc *const isc = sc->as_chipc;
+	*va_size = ((size_t)(isc->gtt_size/sizeof(uint32_t)) << PAGE_SHIFT);
+	*aper_base = sc->as_apaddr;
+	*aper_size = sc->as_apsize;
+
+#ifdef notyet
+	intel_graphics_stolen_res.base = ...;
+	intel_graphics_stolen_res.size = isc->stolen;
+#endif
+}
+
+int
+intel_gmch_probe(struct pci_dev *bridge_pci __unused,
+    struct pci_dev *gpu __unused, struct agp_bridge_data *bridge_agp __unused)
+{
+	struct agp_softc *const sc = agp_i810_sc;
+	int nsegs;
+	int error;
+
+	if (sc == NULL)
+		return 0;
+
+	error = bus_dmamem_alloc(sc->as_dmat, PAGE_SIZE, PAGE_SIZE, 0,
+	    &intel_gtt.scratch_seg, 1, &nsegs, BUS_DMA_WAITOK);
+	if (error)
+		goto fail0;
+	KASSERT(nsegs == 1);
+
+	error = bus_dmamap_create(sc->as_dmat, PAGE_SIZE, 1, PAGE_SIZE, 0,
+	    BUS_DMA_WAITOK, &intel_gtt.scratch_map);
+	if (error)
+		goto fail1;
+
+	error = bus_dmamap_load_raw(sc->as_dmat, intel_gtt.scratch_map,
+	    &intel_gtt.scratch_seg, 1, PAGE_SIZE, BUS_DMA_WAITOK);
+	if (error)
+		goto fail2;
+
+	/* Success!  */
+	return 1;
+
+fail3: __unused
+	bus_dmamap_unload(sc->as_dmat, intel_gtt.scratch_map);
+fail2:	bus_dmamap_destroy(sc->as_dmat, intel_gtt.scratch_map);
+fail1:	bus_dmamem_free(sc->as_dmat, &intel_gtt.scratch_seg, 1);
+fail0:	KASSERT(error);
+	return 0;
+}
+
+void
+intel_gmch_remove(void)
+{
+	struct agp_softc *const sc = agp_i810_sc;
+
+	bus_dmamap_unload(sc->as_dmat, intel_gtt.scratch_map);
+	bus_dmamap_destroy(sc->as_dmat, intel_gtt.scratch_map);
+	bus_dmamem_free(sc->as_dmat, &intel_gtt.scratch_seg, 1);
+}
+
+bool
+intel_enable_gtt(void)
+{
+	struct agp_softc *sc = agp_i810_sc;
+	struct agp_i810_softc *isc;
+
+	if (sc == NULL)
+		return false;
+	isc = sc->as_chipc;
+	agp_i810_reset(isc);
+	return true;
+}
+
+void
+intel_gtt_chipset_flush(void)
+{
+
+	KASSERT(agp_i810_sc != NULL);
+	agp_i810_chipset_flush(agp_i810_sc->as_chipc);
+}
+
+static int
+intel_gtt_flags(unsigned flags)
+{
+	int gtt_flags = AGP_I810_GTT_VALID;
+
+	switch (flags) {
+	case AGP_USER_MEMORY:
+		break;
+	case AGP_USER_CACHED_MEMORY:
+		gtt_flags |= AGP_I810_GTT_CACHED;
+		break;
+	default:
+		panic("invalid intel gtt flags: %x", flags);
+	}
+
+	return gtt_flags;
+}
+
+void
+intel_gtt_insert_page(bus_addr_t addr, unsigned va_page, unsigned flags)
+{
+	struct agp_i810_softc *const isc = agp_i810_sc->as_chipc;
+	off_t va = (off_t)va_page << PAGE_SHIFT;
+	int gtt_flags = intel_gtt_flags(flags);
+	int error;
+
+	error = agp_i810_write_gtt_entry(isc, va, addr, gtt_flags);
+	if (error)
+		device_printf(agp_i810_sc->as_dev,
+		    "write gtt entry"
+		    " %"PRIxMAX" -> %"PRIxMAX" (flags=%x) failed: %d\n",
+		    (uintmax_t)va, (uintmax_t)addr, flags,
+		    error);
+	agp_i810_post_gtt_entry(isc, va);
+	intel_gtt_chipset_flush();
+}
+
+void
+intel_gtt_insert_sg_entries(struct sg_table *sg, unsigned va_page,
+    unsigned flags)
+{
+	bus_dmamap_t dmamap = sg->sgl[0].sg_dmamap;
+	struct agp_i810_softc *const isc = agp_i810_sc->as_chipc;
+	off_t va = (off_t)va_page << PAGE_SHIFT;
+	unsigned seg;
+	int gtt_flags = intel_gtt_flags(flags);
+	int error;
+
+	KASSERT(0 <= va);
+	KASSERT((va >> PAGE_SHIFT) == va_page);
+	KASSERT(0 < dmamap->dm_nsegs);
+
+	for (seg = 0; seg < dmamap->dm_nsegs; seg++) {
+		const bus_addr_t addr = dmamap->dm_segs[seg].ds_addr;
+		bus_size_t len;
+
+		for (len = dmamap->dm_segs[seg].ds_len;
+		     len >= PAGE_SIZE;
+		     len -= PAGE_SIZE, va += PAGE_SIZE) {
+			error = agp_i810_write_gtt_entry(isc, va, addr,
+			    gtt_flags);
+			if (error)
+				device_printf(agp_i810_sc->as_dev,
+				    "write gtt entry"
+				    " %"PRIxMAX" -> %"PRIxMAX" (flags=%x)"
+				    " failed: %d\n",
+				    (uintmax_t)va, (uintmax_t)addr, flags,
+				    error);
+		}
+		KASSERTMSG(len == 0,
+		    "segment length not divisible by PAGE_SIZE: %jx",
+		    (uintmax_t)dmamap->dm_segs[seg].ds_len);
+	}
+	agp_i810_post_gtt_entry(isc, (va - PAGE_SIZE));
+	intel_gtt_chipset_flush();
+}
+
+void
+intel_gtt_clear_range(unsigned va_page, unsigned npages)
+{
+	struct agp_i810_softc *const isc = agp_i810_sc->as_chipc;
+	const bus_addr_t addr = intel_gtt.scratch_map->dm_segs[0].ds_addr;
+	const int gtt_flags = AGP_I810_GTT_VALID;
+	off_t va = (va_page << PAGE_SHIFT);
+
+	KASSERT(0 <= va);
+	KASSERT((va >> PAGE_SHIFT) == va_page);
+	KASSERT(0 < npages);
+
+	while (npages--) {
+		agp_i810_write_gtt_entry(isc, va, addr, gtt_flags);
+		va += PAGE_SIZE;
+	}
+	agp_i810_post_gtt_entry(isc, va - PAGE_SIZE);
+}

Reply via email to