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 <[email protected]>
@@ -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 <[email protected]>
@@ -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(>->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(>->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 = >->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);
+}