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(>->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); +}