Module Name:    src
Committed By:   riastradh
Date:           Sun Dec 19 01:24:26 UTC 2021

Modified Files:
        src/sys/external/bsd/drm2/dist/drm: drm_cache.c
        src/sys/external/bsd/drm2/dist/drm/i915: i915_cmd_parser.c i915_dma.c
            i915_drv.c i915_drv.h i915_gem.c i915_gem_evict.c i915_gem_gtt.c
            i915_perf_types.h i915_request.c i915_scatterlist.h i915_utils.c
            i915_vma.c i915_vma.h i915_vma_types.h
        src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_context.c
            i915_gem_dmabuf.c i915_gem_object.h i915_gem_pages.c
            i915_gem_shmem.c
        src/sys/external/bsd/drm2/dist/drm/i915/gt: gen6_ppgtt.c gen8_ppgtt.c
            intel_ggtt.c intel_gtt.c intel_gtt.h
        src/sys/external/bsd/drm2/dist/drm/i915/gvt: gtt.h
        src/sys/external/bsd/drm2/i915drm: files.i915drmkms

Log Message:
First pass at i915, far from complete.

HEAVILY MODIFIED IN MERGE - maya


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm2/dist/drm/drm_cache.c
cvs rdiff -u -r1.23 -r1.24 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_cmd_parser.c
cvs rdiff -u -r1.33 -r1.34 src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
cvs rdiff -u -r1.20 -r1.21 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c
cvs rdiff -u -r1.34 -r1.35 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h
cvs rdiff -u -r1.62 -r1.63 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_evict.c
cvs rdiff -u -r1.19 -r1.20 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_perf_types.h \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_utils.c \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.h \
    src/sys/external/bsd/drm2/dist/drm/i915/i915_vma_types.h
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_context.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_dmabuf.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object.h \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/gen6_ppgtt.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/gen8_ppgtt.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c \
    src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.h
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/dist/drm/i915/gvt/gtt.h
cvs rdiff -u -r1.45 -r1.46 src/sys/external/bsd/drm2/i915drm/files.i915drmkms

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/drm_cache.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_cache.c:1.3 src/sys/external/bsd/drm2/dist/drm/drm_cache.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/drm_cache.c:1.3	Sat Dec 18 23:44:57 2021
+++ src/sys/external/bsd/drm2/dist/drm/drm_cache.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: drm_cache.c,v 1.3 2021/12/18 23:44:57 riastradh Exp $	*/
+/*	$NetBSD: drm_cache.c,v 1.4 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /**************************************************************************
  *
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_cache.c,v 1.3 2021/12/18 23:44:57 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_cache.c,v 1.4 2021/12/19 01:24:25 riastradh Exp $");
 
 #include <linux/export.h>
 #include <linux/highmem.h>
@@ -161,7 +161,11 @@ drm_clflush_virt_range(void *addr, unsig
 {
 #if defined(CONFIG_X86)
 	if (static_cpu_has(X86_FEATURE_CLFLUSH)) {
+#ifdef __NetBSD__
+		const int size = cpu_info_primary.ci_cflush_lsize;
+#else
 		const int size = boot_cpu_data.x86_clflush_size;
+#endif
 		void *end = addr + length;
 
 		addr = (void *)(((unsigned long)addr) & -size);

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_cmd_parser.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_cmd_parser.c:1.23 src/sys/external/bsd/drm2/dist/drm/i915/i915_cmd_parser.c:1.24
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_cmd_parser.c:1.23	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_cmd_parser.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_cmd_parser.c,v 1.23 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_cmd_parser.c,v 1.24 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /*
  * Copyright © 2013 Intel Corporation
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_cmd_parser.c,v 1.23 2021/12/18 23:45:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_cmd_parser.c,v 1.24 2021/12/19 01:24:25 riastradh Exp $");
 
 #include "gt/intel_engine.h"
 
@@ -1156,7 +1156,7 @@ static u32 *copy_batch(struct drm_i915_g
 		src = i915_gem_object_pin_map(src_obj, I915_MAP_WC);
 		if (!IS_ERR(src)) {
 			i915_unaligned_memcpy_from_wc(dst,
-						      src + offset,
+						      (char *)src + offset,
 						      length);
 			i915_gem_object_unpin_map(src_obj);
 		}
@@ -1184,11 +1184,11 @@ static u32 *copy_batch(struct drm_i915_g
 
 			src = kmap_atomic(i915_gem_object_get_page(src_obj, n));
 			if (needs_clflush)
-				drm_clflush_virt_range(src + x, len);
-			memcpy(ptr, src + x, len);
+				drm_clflush_virt_range((char *)src + x, len);
+			memcpy(ptr, (char *)src + x, len);
 			kunmap_atomic(src);
 
-			ptr += len;
+			ptr = (char *)ptr + len;
 			length -= len;
 			x = 0;
 		}

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.33 src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.34
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c:1.33	Sat Dec 18 23:54:51 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_dma.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_dma.c,v 1.33 2021/12/18 23:54:51 riastradh Exp $	*/
+/*	$NetBSD: i915_dma.c,v 1.34 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /* i915_dma.c -- DMA support for the I915 -*- linux-c -*-
  */
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_dma.c,v 1.33 2021/12/18 23:54:51 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_dma.c,v 1.34 2021/12/19 01:24:25 riastradh Exp $");
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
@@ -956,7 +956,8 @@ int i915_driver_load(struct drm_device *
 	dev_priv->regs = pci_iomap(dev->pdev, mmio_bar, mmio_size);
 #ifdef __NetBSD__
 	if (!dev_priv->regs)
-		dev_priv->regs = drm_agp_borrow(dev, mmio_bar, mmio_size);
+		dev_priv->regs = drm_agp_borrow(&dev_priv->drm, mmio_bar,
+		    mmio_size);
 #endif
 	if (!dev_priv->regs) {
 		DRM_ERROR("failed to map registers\n");

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.20 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.21
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c:1.20	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_drv.c,v 1.20 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_drv.c,v 1.21 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /* i915_drv.c -- i830,i845,i855,i865,i915 driver -*- linux-c -*-
  */
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_drv.c,v 1.20 2021/12/18 23:45:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_drv.c,v 1.21 2021/12/19 01:24:25 riastradh Exp $");
 
 #include <linux/acpi.h>
 #include <linux/device.h>
@@ -50,6 +50,7 @@ __KERNEL_RCSID(0, "$NetBSD: i915_drv.c,v
 #include <drm/drm_irq.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/i915_drm.h>
+#include "../drm_internal.h"	/* drm_pci_set_busid */
 
 #include "display/intel_acpi.h"
 #include "display/intel_audio.h"
@@ -295,11 +296,15 @@ static int i915_driver_modeset_probe(str
 			goto out;
 	}
 
+#ifdef __NetBSD__		/* XXX vga */
+	__USE(i915);
+#else
 	intel_bios_init(i915);
 
 	ret = intel_vga_register(i915);
 	if (ret)
 		goto out;
+#endif
 
 	intel_register_dsm_handler();
 
@@ -1548,9 +1553,11 @@ int i915_driver_probe(struct pci_dev *pd
 	}
 #endif
 
+#ifndef __NetBSD__		/* XXX done for us */
 	ret = pci_enable_device(pdev);
 	if (ret)
 		goto out_fini;
+#endif
 
 	ret = i915_driver_early_probe(dev_priv);
 	if (ret < 0)
@@ -1590,10 +1597,12 @@ out_runtime_pm_put:
 	enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 	i915_driver_late_release(dev_priv);
 out_pci_disable:
+#ifndef __NetBSD__
 	pci_disable_device(pdev);
 out_fini:
 	i915_probe_error(dev_priv, "Device initialization failed (%d)\n", ret);
 	i915_driver_destroy(dev_priv);
+#endif
 	return ret;
 }
 
@@ -1707,9 +1716,11 @@ static void intel_suspend_encoders(struc
 	drm_modeset_unlock_all(dev);
 }
 
+#ifndef __NetBSD__		/* XXX vlv suspend/resume */
 static int vlv_resume_prepare(struct drm_i915_private *dev_priv,
 			      bool rpm_resume);
 static int vlv_suspend_complete(struct drm_i915_private *dev_priv);
+#endif
 
 static bool suspend_to_idle(struct drm_i915_private *dev_priv)
 {
@@ -1720,6 +1731,7 @@ static bool suspend_to_idle(struct drm_i
 	return false;
 }
 
+#ifndef __NetBSD__		/* XXX runtime pm */
 static int i915_drm_prepare(struct drm_device *dev)
 {
 	struct drm_i915_private *i915 = to_i915(dev);
@@ -1734,6 +1746,7 @@ static int i915_drm_prepare(struct drm_d
 
 	return 0;
 }
+#endif
 
 int i915_drm_suspend(struct drm_device *dev)
 {
@@ -1749,7 +1762,9 @@ int i915_drm_suspend(struct drm_device *
 
 	drm_kms_helper_poll_disable(dev);
 
-#ifndef __NetBSD__		/* pmf handles this for us.  */
+#ifdef __NetBSD__		/* pmf handles this for us.  */
+	__USE(pdev);
+#else
 	pci_save_state(pdev);
 #endif
 
@@ -1813,7 +1828,11 @@ static int i915_drm_suspend_late(struct 
 	intel_display_power_suspend_late(dev_priv);
 
 	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
+#ifdef __NetBSD__
+		ret = 0;
+#else
 		ret = vlv_suspend_complete(dev_priv);
+#endif
 
 	if (ret) {
 		DRM_ERROR("Suspend complete failed: %d\n", ret);
@@ -1822,7 +1841,9 @@ static int i915_drm_suspend_late(struct 
 		goto out;
 	}
 
-#ifndef __NetBSD__		/* pmf handles this for us.  */
+#ifdef __NetBSD__		/* pmf handles this for us.  */
+	__USE(pdev);
+#else
 	pci_disable_device(pdev);
 	/*
 	 * During hibernation on some platforms the BIOS may try to access
@@ -1848,6 +1869,7 @@ out:
 	return ret;
 }
 
+#ifndef __NetBSD__		/* XXX vga switcheroo */
 int i915_suspend_switcheroo(struct drm_i915_private *i915, pm_message_t state)
 {
 	int error;
@@ -1865,6 +1887,7 @@ int i915_suspend_switcheroo(struct drm_i
 
 	return i915_drm_suspend_late(&i915->drm, false);
 }
+#endif
 
 int i915_drm_resume(struct drm_device *dev)
 {
@@ -1965,6 +1988,10 @@ int i915_drm_resume_early(struct drm_dev
 	 * the device powered we can also remove the following set power state
 	 * call.
 	 */
+#ifdef __NetBSD__		/* pmf handles this for us.  */
+	if (0)
+		goto out;
+#else
 	ret = pci_set_power_state(pdev, PCI_D0);
 	if (ret) {
 		DRM_ERROR("failed to set PCI D0 power state (%d)\n", ret);
@@ -1994,7 +2021,11 @@ int i915_drm_resume_early(struct drm_dev
 	disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 
 	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
+#ifdef __NetBSD__		/* XXX vlv suspend/resume */
+		ret = 0;
+#else
 		ret = vlv_resume_prepare(dev_priv, false);
+#endif
 	if (ret)
 		DRM_ERROR("Resume prepare failed: %d, continuing anyway\n",
 			  ret);
@@ -2014,6 +2045,7 @@ int i915_drm_resume_early(struct drm_dev
 	return ret;
 }
 
+#ifndef __NetBSD__		/* XXX vga switcheroo */
 int i915_resume_switcheroo(struct drm_i915_private *i915)
 {
 	int ret;
@@ -2573,7 +2605,9 @@ static int intel_runtime_suspend(struct 
 	intel_display_power_suspend(dev_priv);
 
 	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
+#ifndef __NetBSD__		/* XXX vlv suspend/resume */
 		ret = vlv_suspend_complete(dev_priv);
+#endif
 
 	if (ret) {
 		DRM_ERROR("Runtime suspend failed, disabling it (%d)\n", ret);

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.34 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.35
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.34	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_drv.h,v 1.34 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_drv.h,v 1.35 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /* i915_drv.h -- Private header for the I915 driver -*- linux-c -*-
  */
@@ -60,6 +60,7 @@
 #include <linux/shmem_fs.h>
 #include <linux/stackdepot.h>
 #include <linux/xarray.h>
+#include <linux/uuid.h>
 
 #include <drm/intel-gtt.h>
 #include <drm/drm_legacy.h> /* for struct drm_dma_handle */
@@ -1345,7 +1346,7 @@ struct dram_channel_info {
 
 static inline struct drm_i915_private *to_i915(const struct drm_device *dev)
 {
-	return container_of(dev, struct drm_i915_private, drm);
+	return __UNCONST(const_container_of(dev, struct drm_i915_private, drm));
 }
 
 #ifndef __NetBSD__
@@ -2071,12 +2072,14 @@ int i915_reg_read_ioctl(struct drm_devic
 	intel_de_wait_for_register((dev_priv_), (reg_), (mask_), 0, (timeout_))
 
 /* i915_mm.c */
+#ifndef __NetBSD__
 int remap_io_mapping(struct vm_area_struct *vma,
 		     unsigned long addr, unsigned long pfn, unsigned long size,
 		     struct io_mapping *iomap);
 int remap_io_sg(struct vm_area_struct *vma,
 		unsigned long addr, unsigned long size,
 		struct scatterlist *sgl, resource_size_t iobase);
+#endif
 
 static inline int intel_hws_csb_write_index(struct drm_i915_private *i915)
 {

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.62 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.63
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.62	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem.c,v 1.62 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_gem.c,v 1.63 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /*
  * Copyright © 2008-2015 Intel Corporation
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem.c,v 1.62 2021/12/18 23:45:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem.c,v 1.63 2021/12/19 01:24:25 riastradh Exp $");
 
 #ifdef __NetBSD__
 #if 0				/* XXX uvmhist option?  */
@@ -263,6 +263,7 @@ i915_gem_dumb_create(struct drm_file *fi
 		     struct drm_device *dev,
 		     struct drm_mode_create_dumb *args)
 {
+
 	enum intel_memory_type mem_type;
 	int cpp = DIV_ROUND_UP(args->bpp, 8);
 	u32 format;
@@ -287,7 +288,11 @@ i915_gem_dumb_create(struct drm_file *fi
 	/* align stride to page size so that we can remap */
 	if (args->pitch > intel_plane_fb_max_stride(to_i915(dev), format,
 						    DRM_FORMAT_MOD_LINEAR))
+#ifdef __NetBSD__               /* ALIGN means something else.  */
+		args->pitch = round_up(args->pitch, 4096);
+#else
 		args->pitch = ALIGN(args->pitch, 4096);
+#endif
 
 	if (args->pitch < args->width)
 		return -EINVAL;
@@ -356,6 +361,7 @@ i915_gem_shmem_pread(struct drm_i915_gem
 	int ret;
 
 	ret = i915_gem_object_prepare_read(obj, &needs_clflush);
+
 	if (ret)
 		return ret;
 

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_evict.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_evict.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_evict.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_evict.c:1.3	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_evict.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_evict.c,v 1.3 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_evict.c,v 1.4 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /*
  * Copyright © 2008-2010 Intel Corporation
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_evict.c,v 1.3 2021/12/18 23:45:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_evict.c,v 1.4 2021/12/19 01:24:25 riastradh Exp $");
 
 #include <drm/i915_drm.h>
 
@@ -256,14 +256,15 @@ int i915_gem_evict_for_node(struct i915_
 			    struct drm_mm_node *target,
 			    unsigned int flags)
 {
-	LIST_HEAD(eviction_list);
+	struct list_head eviction_list;
 	struct drm_mm_node *node;
 	u64 start = target->start;
 	u64 end = start + target->size;
 	struct i915_vma *vma, *next;
 	int ret = 0;
 
-	lockdep_assert_held(&vm->mutex);
+	INIT_LIST_HEAD(&eviction_list);
+	lockdep_assert_held(&vm->i915->drm.struct_mutex);
 	GEM_BUG_ON(!IS_ALIGNED(start, I915_GTT_PAGE_SIZE));
 	GEM_BUG_ON(!IS_ALIGNED(end, I915_GTT_PAGE_SIZE));
 

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c:1.19 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c:1.20
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c:1.19	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_gtt.c,v 1.19 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_gtt.c,v 1.20 2021/12/19 01:24:25 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_gtt.c,v 1.19 2021/12/18 23:45:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_gtt.c,v 1.20 2021/12/19 01:24:25 riastradh Exp $");
 
 #include <linux/slab.h> /* fault-inject.h is not standalone! */
 
@@ -42,15 +42,23 @@ __KERNEL_RCSID(0, "$NetBSD: i915_gem_gtt
 #define	_PAGE_PAT	PTE_PAT	/* 0x80 page attribute table on PTE */
 #endif
 
+#ifdef __NetBSD__
+int i915_gem_gtt_prepare_pages(struct drm_i915_gem_object *obj,
+			       bus_dmamap_t pages)
+#else
 int i915_gem_gtt_prepare_pages(struct drm_i915_gem_object *obj,
 			       struct sg_table *pages)
+#endif
 {
 	do {
 #ifdef __NetBSD__
-		KASSERT(0 < obj->base.size);
-		/* XXX errno NetBSD->Linux */
-		return -bus_dmamap_load_pglist(obj->base.dev->dmat, obj->pages,
-		    &obj->pageq, obj->base.size, BUS_DMA_NOWAIT);
+		/*
+		 * XXX Not sure whether caller should be passing DMA
+		 * map or page list.
+		 */
+		if (bus_dmamap_load_pglist(obj->base.dev->dmat, pages,
+			&obj->pageq, pages->dm_mapsize, BUS_DMA_NOWAIT) == 0)
+			return 0;
 #else
 		if (dma_map_sg_attrs(&obj->base.dev->pdev->dev,
 				     pages->sgl, pages->nents,
@@ -75,11 +83,20 @@ int i915_gem_gtt_prepare_pages(struct dr
 	return -ENOSPC;
 }
 
+#ifdef __NetBSD__
+void i915_gem_gtt_finish_pages(struct drm_i915_gem_object *obj,
+			       bus_dmamap_t pages)
+#else
 void i915_gem_gtt_finish_pages(struct drm_i915_gem_object *obj,
 			       struct sg_table *pages)
+#endif
 {
 	struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
+#ifdef __NetBSD__
+	bus_dma_tag_t dmat = dev_priv->drm.dev->dmat;
+#else
 	struct device *kdev = &dev_priv->drm.pdev->dev;
+#endif
 	struct i915_ggtt *ggtt = &dev_priv->ggtt;
 
 	if (unlikely(ggtt->do_idle_maps)) {
@@ -92,7 +109,11 @@ void i915_gem_gtt_finish_pages(struct dr
 		}
 	}
 
+#ifdef __NetBSD__
+	bus_dmamap_unload(dmat, pages);
+#else
 	dma_unmap_sg(kdev, pages->sgl, pages->nents, PCI_DMA_BIDIRECTIONAL);
+#endif
 }
 
 /**

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_perf_types.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_perf_types.h:1.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_perf_types.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_perf_types.h:1.2	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_perf_types.h	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_perf_types.h,v 1.2 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_perf_types.h,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /* SPDX-License-Identifier: MIT */
 /*
@@ -52,9 +52,11 @@ struct i915_oa_config {
 	const struct i915_oa_reg *flex_regs;
 	u32 flex_regs_len;
 
+#ifndef __NetBSD__		/* XXX sysfs */
 	struct attribute_group sysfs_metric;
 	struct attribute *attrs[2];
 	struct device_attribute sysfs_metric_id;
+#endif
 
 	struct kref ref;
 	struct rcu_head rcu;
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c:1.2	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_request.c	Sun Dec 19 01:24:26 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_request.c,v 1.2 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_request.c,v 1.3 2021/12/19 01:24:26 riastradh Exp $	*/
 
 /*
  * Copyright © 2008-2015 Intel Corporation
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_request.c,v 1.2 2021/12/18 23:45:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_request.c,v 1.3 2021/12/19 01:24:26 riastradh Exp $");
 
 #include <linux/dma-fence-array.h>
 #include <linux/irq_work.h>
@@ -1465,7 +1465,13 @@ static bool __i915_spin_request(const st
 
 struct request_wait {
 	struct dma_fence_cb cb;
+#ifdef __NetBSD__
+	bool complete;
+	kcondvar_t cv;
+	/* XXX lock, condvar, ...?  */
+#else
 	struct task_struct *tsk;
+#endif
 };
 
 static void request_wait_wake(struct dma_fence *fence, struct dma_fence_cb *cb)
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h:1.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h:1.2	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h	Sun Dec 19 01:24:26 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_scatterlist.h,v 1.2 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_scatterlist.h,v 1.3 2021/12/19 01:24:26 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -41,10 +41,12 @@ static __always_inline struct sgt_iter {
 	return s;
 }
 
+#ifndef __NetBSD__
 static inline int __sg_page_count(const struct scatterlist *sg)
 {
 	return sg->length >> PAGE_SHIFT;
 }
+#endif
 
 static inline struct scatterlist *____sg_next(struct scatterlist *sg)
 {
@@ -109,6 +111,7 @@ static inline unsigned int i915_sg_page_
 	return page_sizes;
 }
 
+#ifndef __NetBSD__
 static inline unsigned int i915_sg_segment_size(void)
 {
 	unsigned int size = swiotlb_max_segment();
@@ -123,6 +126,7 @@ static inline unsigned int i915_sg_segme
 
 	return size;
 }
+#endif
 
 bool i915_sg_trim(struct sg_table *orig_st);
 
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_utils.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_utils.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_utils.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_utils.c:1.2	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_utils.c	Sun Dec 19 01:24:26 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_utils.c,v 1.2 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_utils.c,v 1.3 2021/12/19 01:24:26 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,20 +6,41 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_utils.c,v 1.2 2021/12/18 23:45:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_utils.c,v 1.3 2021/12/19 01:24:26 riastradh Exp $");
 
 #include <drm/drm_drv.h>
 
 #include "i915_drv.h"
 #include "i915_utils.h"
 
+#ifdef __NetBSD__
+#define	NBSD_BUG_URL "https://gnats.NetBSD.org/";
+#define	NBSD_BUG_MSG							      \
+	"Please file a bug at " NBSD_BUG_URL " in category kern"	      \
+	" providing the dmesg log by booting with debug/verbose"	      \
+	" as in `boot -vx'."
+#else
 #define FDO_BUG_URL "https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs";
 #define FDO_BUG_MSG "Please file a bug on drm/i915; see " FDO_BUG_URL " for details."
+#endif
 
 void
 __i915_printk(struct drm_i915_private *dev_priv, const char *level,
 	      const char *fmt, ...)
 {
+#ifdef __NetBSD__
+	static volatile unsigned done = 0;
+	va_list va;
+
+	va_start(va, fmt);
+	printf("%s: %s ", device_xname(dev_priv->drm.dev), level);
+	vprintf(fmt, va);
+	va_end(va);
+
+	if (strncmp(level, KERN_ERR, strlen(KERN_ERR)) == 0 &&
+	    atomic_swap_uint(&done, 1) == 0)
+		printf("%s\n", NBSD_BUG_MSG);
+#else
 	static bool shown_bug_once;
 	struct device *kdev = dev_priv->drm.dev;
 	bool is_error = level[1] <= KERN_ERR[1];
@@ -53,6 +74,7 @@ __i915_printk(struct drm_i915_private *d
 			dev_notice(kdev, "%s", FDO_BUG_MSG);
 		shown_bug_once = true;
 	}
+#endif
 }
 
 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG)
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c:1.2	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.c	Sun Dec 19 01:24:26 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_vma.c,v 1.2 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_vma.c,v 1.3 2021/12/19 01:24:26 riastradh Exp $	*/
 
 /*
  * Copyright © 2016 Intel Corporation
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_vma.c,v 1.2 2021/12/18 23:45:28 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_vma.c,v 1.3 2021/12/19 01:24:26 riastradh Exp $");
 
 #include <linux/sched/mm.h>
 #include <drm/drm_gem.h>
@@ -130,12 +130,14 @@ vma_create(struct drm_i915_gem_object *o
 
 	i915_active_init(&vma->active, __i915_vma_active, __i915_vma_retire);
 
+#ifndef __NetBSD__		/* XXX fs reclaim */
 	/* Declare ourselves safe for use inside shrinkers */
 	if (IS_ENABLED(CONFIG_LOCKDEP)) {
 		fs_reclaim_acquire(GFP_KERNEL);
 		might_lock(&vma->active.mutex);
 		fs_reclaim_release(GFP_KERNEL);
 	}
+#endif
 
 	INIT_LIST_HEAD(&vma->closed_link);
 
@@ -423,6 +425,10 @@ int i915_vma_bind(struct i915_vma *vma,
 	return 0;
 }
 
+#ifdef __NetBSD__
+#  define	__iomem		__i915_vma_iomem
+#endif
+
 void __iomem *i915_vma_pin_iomap(struct i915_vma *vma)
 {
 	void __iomem *ptr;
@@ -469,6 +475,10 @@ err:
 	return IO_ERR_PTR(err);
 }
 
+#ifdef __NetBSD__
+#  undef	__iomem
+#endif
+
 void i915_vma_flush_writes(struct i915_vma *vma)
 {
 	if (i915_vma_unset_ggtt_write(vma))
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.h:1.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.h:1.2	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_vma.h	Sun Dec 19 01:24:26 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_vma.h,v 1.2 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_vma.h,v 1.3 2021/12/19 01:24:26 riastradh Exp $	*/
 
 /*
  * Copyright © 2016 Intel Corporation
@@ -147,7 +147,7 @@ static inline void i915_vma_put(struct i
 
 static __always_inline ptrdiff_t ptrdiff(const void *a, const void *b)
 {
-	return a - b;
+	return (const char *)a - (const char *)b;
 }
 
 static inline long
@@ -309,7 +309,13 @@ void i915_vma_unpin_iomap(struct i915_vm
 static inline struct page *i915_vma_first_page(struct i915_vma *vma)
 {
 	GEM_BUG_ON(!vma->pages);
+#ifdef __NetBSD__
+	GEM_BUG_ON(!vma->segs);
+	return container_of(PHYS_TO_VM_PAGE(vma->segs[0].ds_addr), struct page,
+	    p_vmp);
+#else
 	return sg_page(vma->pages->sgl);
+#endif
 }
 
 /**
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_vma_types.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_vma_types.h:1.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_vma_types.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_vma_types.h:1.2	Sat Dec 18 23:45:28 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_vma_types.h	Sun Dec 19 01:24:26 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_vma_types.h,v 1.2 2021/12/18 23:45:28 riastradh Exp $	*/
+/*	$NetBSD: i915_vma_types.h,v 1.3 2021/12/19 01:24:26 riastradh Exp $	*/
 
 /* SPDX-License-Identifier: MIT */
 /*
@@ -158,6 +158,12 @@ struct i915_ggtt_view {
 	};
 };
 
+
+#ifdef __NetBSD__
+#  define	__i915_vma_iomem	/* write-combining */
+#  define	__iomem			__i915_vma_iomem
+#endif
+
 /**
  * DOC: Virtual Memory Address
  *
@@ -177,7 +183,13 @@ struct i915_vma {
 	struct drm_i915_gem_object *obj;
 	struct dma_resv *resv; /** Alias of obj->resv */
 
+#ifdef __NetBSD__
+	bus_dma_segment_t *segs;
+	int nsegs;
+	bus_dmamap_t pages;
+#else
 	struct sg_table *pages;
+#endif
 	void __iomem *iomap;
 	void *private; /* owned by creator */
 
@@ -292,5 +304,9 @@ struct i915_vma {
 	u32 exec_handle;
 };
 
+#ifdef __NetBSD__
+#  undef	__iomem
+#endif
+
 #endif
 

Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_context.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_context.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_context.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_context.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_context.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_context.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_context.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_context.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_context.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $");
 
 #include <linux/log2.h>
 #include <linux/nospec.h>
@@ -803,14 +803,24 @@ static int gem_context_register(struct i
 		WRITE_ONCE(vm->file, fpriv); /* XXX */
 	mutex_unlock(&ctx->mutex);
 
+#ifdef __NetBSD__
+	ctx->pid = NULL;
+#else
 	ctx->pid = get_task_pid(current, PIDTYPE_PID);
+#endif
 	snprintf(ctx->name, sizeof(ctx->name), "%s[%d]",
+#ifdef __NetBSD__
+		 curproc->p_comm, (int)curproc->p_pid));
+#else
 		 current->comm, pid_nr(ctx->pid));
+#endif
 
 	/* And finally expose ourselves to userspace via the idr */
 	ret = xa_alloc(&fpriv->context_xa, id, ctx, xa_limit_32b, GFP_KERNEL);
+#ifndef __NetBSD__
 	if (ret)
 		put_pid(fetch_and_zero(&ctx->pid));
+#endif
 
 	return ret;
 }
Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_dmabuf.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_dmabuf.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_dmabuf.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_dmabuf.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_dmabuf.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_dmabuf.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_dmabuf.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_dmabuf.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_dmabuf.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $");
 
 #include <linux/dma-buf.h>
 #include <linux/highmem.h>
@@ -41,7 +41,8 @@ static struct sg_table *i915_gem_map_dma
 		goto err;
 
 #ifdef __NetBSD__
-	st = drm_prime_pglist_to_sg(&obj->pageq, obj->base.size >> PAGE_SHIFT);
+	st = drm_prime_pglist_to_sg(&obj->mm.pageq,
+	    obj->base.size >> PAGE_SHIFT);
 	if (IS_ERR(st))
 		goto err_unpin;
 #else
@@ -116,11 +117,29 @@ static void i915_gem_dmabuf_vunmap(struc
 	i915_gem_object_unpin_map(obj);
 }
 
+#ifdef __NetBSD__
+static int i915_gem_dmabuf_mmap(struct dma_buf *dma_buf, off_t *offp,
+    size_t size, int prot, int *flagsp, int *advicep,
+    struct uvm_object **uobjp, int *maxprotp)
+#else
 static int i915_gem_dmabuf_mmap(struct dma_buf *dma_buf, struct vm_area_struct *vma)
+#endif
 {
 	struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
 	int ret;
 
+#ifdef __NetBSD__
+	__USE(ret);
+	if (obj->base.size < size)
+		return -EINVAL;
+	if (!obj->base.filp)
+		return -ENODEV;
+	/* XXX review mmap refcount */
+	drm_gem_object_reference(&obj->base);
+	*advicep = UVM_ADV_RANDOM;
+	*uobjp = &obj->base.gemo_uvmobj;
+	*maxprotp = prot;
+#else
 	if (obj->base.size < vma->vm_end - vma->vm_start)
 		return -EINVAL;
 
@@ -133,6 +152,7 @@ static int i915_gem_dmabuf_mmap(struct d
 
 	fput(vma->vm_file);
 	vma->vm_file = get_file(obj->base.filp);
+#endif
 
 	return 0;
 }
Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object.h:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object.h:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_object.h	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_object.h,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_object.h,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -37,7 +37,11 @@ i915_gem_object_create_shmem_from_data(s
 
 extern const struct drm_i915_gem_object_ops i915_gem_shmem_ops;
 void __i915_gem_object_release_shmem(struct drm_i915_gem_object *obj,
+#ifdef __NetBSD__
+				     bus_dmamap_t pages,
+#else
 				     struct sg_table *pages,
+#endif
 				     bool needs_clflush);
 
 int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, int align);
@@ -276,8 +280,13 @@ i915_gem_object_get_dma_address(struct d
 				unsigned long n);
 
 void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
+#ifdef __NetBSD__
+				 bus_dmamap_t pages
+#else
 				 struct sg_table *pages,
-				 unsigned int sg_page_sizes);
+				 unsigned int sg_page_sizes
+#endif
+				 );
 
 int ____i915_gem_object_get_pages(struct drm_i915_gem_object *obj);
 int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj);
Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_pages.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_pages.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_pages.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_pages.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_pages.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $");
 
 #include "i915_drv.h"
 #include "i915_gem_object.h"
@@ -16,8 +16,13 @@ __KERNEL_RCSID(0, "$NetBSD: i915_gem_pag
 #include "i915_gem_mman.h"
 
 void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
+#ifdef __NetBSD__
+				 bus_dmamap_t pages,
+#else
 				 struct sg_table *pages,
-				 unsigned int sg_page_sizes)
+				 unsigned int sg_page_sizes
+#endif
+				)
 {
 	struct drm_i915_private *i915 = to_i915(obj->base.dev);
 	unsigned long supported = INTEL_INFO(i915)->page_sizes;
@@ -36,8 +41,10 @@ void __i915_gem_object_set_pages(struct 
 		obj->cache_dirty = false;
 	}
 
+#ifndef __NetBSD__
 	obj->mm.get_page.sg_pos = pages->sgl;
 	obj->mm.get_page.sg_idx = 0;
+#endif
 
 	obj->mm.pages = pages;
 
@@ -48,8 +55,10 @@ void __i915_gem_object_set_pages(struct 
 		obj->mm.quirked = true;
 	}
 
+#ifndef __NetBSD__
 	GEM_BUG_ON(!sg_page_sizes);
 	obj->mm.page_sizes.phys = sg_page_sizes;
+#endif
 
 	/*
 	 * Calculate the supported page-sizes which fit into the given
Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: i915_gem_shmem.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: i915_gem_shmem.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /*
  * SPDX-License-Identifier: MIT
@@ -7,7 +7,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i915_gem_shmem.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_shmem.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $");
 
 #include <linux/pagevec.h>
 #include <linux/swap.h>
@@ -282,7 +282,11 @@ put:
 
 void
 __i915_gem_object_release_shmem(struct drm_i915_gem_object *obj,
+#ifdef __NetBSD__
+				bus_dmamap_t pages,
+#else
 				struct sg_table *pages,
+#endif
 				bool needs_clflush)
 {
 	GEM_BUG_ON(obj->mm.madv == __I915_MADV_PURGED);
@@ -293,13 +297,22 @@ __i915_gem_object_release_shmem(struct d
 	if (needs_clflush &&
 	    (obj->read_domains & I915_GEM_DOMAIN_CPU) == 0 &&
 	    !(obj->cache_coherent & I915_BO_CACHE_COHERENT_FOR_READ))
+#ifdef __NetBSD__
+		/* XXX Shouldn't realy use obj->... here.  */
+		drm_clflush_pglist(&obj->mm.pageq);
+#else
 		drm_clflush_sg(pages);
+#endif
 
 	__start_cpu_write(obj);
 }
 
 static void
+#ifdef __NetBSD__
+shmem_put_pages(struct drm_i915_gem_object *obj, bus_dmamap_t map)
+#else
 shmem_put_pages(struct drm_i915_gem_object *obj, struct sg_table *pages)
+#endif
 {
 	struct sgt_iter sgt_iter;
 	struct pagevec pvec;

Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/gen6_ppgtt.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/gen6_ppgtt.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/gen6_ppgtt.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/gen6_ppgtt.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/gen6_ppgtt.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: gen6_ppgtt.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: gen6_ppgtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gen6_ppgtt.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gen6_ppgtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $");
 
 #include <linux/log2.h>
 
@@ -22,8 +22,14 @@ static inline void gen6_write_pde(const 
 				  const struct i915_page_table *pt)
 {
 	/* Caller needs to make sure the write completes if necessary */
+#ifdef __NetBSD__
+	CTASSERT(sizeof(gen6_pte_t) == 4);
+	bus_space_write_4(ppgtt->pd_bst, ppgtt->pd_bsh, pde*sizeof(gen6_pte_t),
+	    GEN6_PDE_ADDR_ENCODE(px_dma(pt)) | GEN6_PDE_VALID);
+#else
 	iowrite32(GEN6_PDE_ADDR_ENCODE(px_dma(pt)) | GEN6_PDE_VALID,
 		  ppgtt->pd_addr + pde);
+#endif
 }
 
 void gen7_ppgtt_enable(struct intel_gt *gt)
@@ -136,6 +142,25 @@ static void gen6_ppgtt_insert_entries(st
 
 	vaddr = kmap_atomic_px(i915_pt_entry(pd, act_pt));
 	do {
+#ifdef __NetBSD__
+		KASSERT(iter.seg < iter.map->dm_nsegs);
+		KASSERT((iter.off & (PAGE_SIZE - 1)) == 0);
+		const bus_dma_segment_t *seg = &iter.map->dm_segs[iter.seg];
+		KASSERT((seg->ds_addr & (PAGE_SIZE - 1)) == 0);
+		KASSERT((seg->ds_len & (PAGE_SIZE - 1)) == 0);
+		KASSERT(iter.off <= seg->ds_len - PAGE_SIZE);
+		vaddr[act_pte] = pte_encode |
+		    GEN6_PTE_ADDR_ENCODE(seg->ds_addr + iter.off);
+		iter.off += PAGE_SIZE;
+		if (iter.off >= seg->ds_len) {
+			GEM_BUG_ON(iter.off > seg->ds_len);
+			iter.off = 0;
+			if (++iter.seg >= iter.map->dm_nsegs) {
+				GEM_BUG_ON(iter.seg > iter.map->dm_nsegs);
+				break;
+			}
+		}
+#else
 		GEM_BUG_ON(iter.sg->length < I915_GTT_PAGE_SIZE);
 		vaddr[act_pte] = pte_encode | GEN6_PTE_ADDR_ENCODE(iter.dma);
 
@@ -148,6 +173,7 @@ static void gen6_ppgtt_insert_entries(st
 			iter.dma = sg_dma_address(iter.sg);
 			iter.max = iter.dma + iter.sg->length;
 		}
+#endif
 
 		if (++act_pte == GEN6_PTES) {
 			kunmap_atomic(vaddr);
@@ -313,7 +339,31 @@ static int pd_vma_bind(struct i915_vma *
 	u32 ggtt_offset = i915_ggtt_offset(vma) / I915_GTT_PAGE_SIZE;
 
 	px_base(ppgtt->base.pd)->ggtt_offset = ggtt_offset * sizeof(gen6_pte_t);
+#ifdef __NetBSD__
+    {
+	int ret;
+	ppgtt->pd_bst = ggtt->gsmt;
+	KASSERTMSG((sizeof(gen6_pte_t) * (ggtt->vm.total >> PAGE_SHIFT) <=
+		ggtt->gsmsz - (sizeof(gen6_pte_t) * ggtt_offset)),
+	    "oversize ggtt vm total %"PRIx64
+	    " requiring %"PRIx64" bytes of ptes,"
+	    " gsm has %"PRIx64" bytes for ptes",
+	    ggtt->vm.total,
+	    sizeof(gen6_pte_t) * (ggtt->vm.total >> PAGE_SHIFT),
+	    ggtt->gsmsz - (sizeof(gen6_pte_t) * ggtt_offset));
+	ret = -bus_space_subregion(ggtt->gsmt, ggtt->gsmh,
+	    sizeof(gen6_pte_t) * ggtt_offset,
+	    MIN(sizeof(gen6_pte_t) * (ggtt->vm.total >> PAGE_SHIFT),
+		ggtt->gsmsz - (sizeof(gen6_pte_t) * ggtt_offset)),
+	    &ppgtt->pd_bsh);
+	if (ret) {
+		DRM_ERROR("Unable to subregion the GGTT: %d\n", ret);
+		return ret;
+	}
+    }
+#else
 	ppgtt->pd_addr = (gen6_pte_t __iomem *)ggtt->gsm + ggtt_offset;
+#endif
 
 	gen6_flush_pd(ppgtt, 0, ppgtt->base.vm.total);
 	return 0;
Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/gen8_ppgtt.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/gen8_ppgtt.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/gen8_ppgtt.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/gen8_ppgtt.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/gen8_ppgtt.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: gen8_ppgtt.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: gen8_ppgtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gen8_ppgtt.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gen8_ppgtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $");
 
 #include <linux/log2.h>
 
@@ -384,6 +384,25 @@ gen8_ppgtt_insert_pte(struct i915_ppgtt 
 	pd = i915_pd_entry(pdp, gen8_pd_index(idx, 2));
 	vaddr = kmap_atomic_px(i915_pt_entry(pd, gen8_pd_index(idx, 1)));
 	do {
+#ifdef __NetBSD__
+		KASSERT(iter->seg < iter->map->dm_nsegs);
+		KASSERT((iter->off & (I915_GTT_PAGE_SIZE - 1)) == 0);
+		const bus_dma_segment_t *seg = &iter->map->dm_segs[iter->seg];
+		KASSERT((seg->ds_addr & (I915_GTT_PAGE_SIZE - 1)) == 0);
+		KASSERT((seg->ds_len & (I915_GTT_PAGE_SIZE - 1)) == 0);
+		KASSERT(iter->off <= seg->ds_len - I915_GTT_PAGE_SIZE);
+		vaddr[idx->pte] = pte_encode | (seg->ds_addr + iter->off);
+		iter->off += I915_GTT_PAGE_SIZE;
+		if (iter->off >= seg->ds_len) {
+			GEM_BUG_ON(iter->off > seg->ds_len);
+			iter->off = 0;
+			if (++iter->seg >= iter->map->dm_nsegs) {
+				GEM_BUG_ON(iter->seg > iter->map->dm_nsegs);
+				ret = false;
+				break;
+			}
+		}
+#else
 		GEM_BUG_ON(iter->sg->length < I915_GTT_PAGE_SIZE);
 		vaddr[gen8_pd_index(idx, 0)] = pte_encode | iter->dma;
 
@@ -398,6 +417,7 @@ gen8_ppgtt_insert_pte(struct i915_ppgtt 
 			iter->dma = sg_dma_address(iter->sg);
 			iter->max = iter->dma + iter->sg->length;
 		}
+#endif
 
 		if (gen8_pd_index(++idx, 0) == 0) {
 			if (gen8_pd_index(idx, 1) == 0) {
@@ -424,7 +444,11 @@ static void gen8_ppgtt_insert_huge(struc
 {
 	const gen8_pte_t pte_encode = gen8_pte_encode(0, cache_level, flags);
 	u64 start = vma->node.start;
+#ifdef __NetBSD__
+	bus_size_t rem = iter->map->dm_segs[iter->seg].ds_len - iter->off;
+#else
 	dma_addr_t rem = iter->sg->length;
+#endif
 
 	GEM_BUG_ON(!i915_vm_is_4lvl(vma->vm));
 
@@ -440,7 +464,13 @@ static void gen8_ppgtt_insert_huge(struc
 		u16 index;
 
 		if (vma->page_sizes.sg & I915_GTT_PAGE_SIZE_2M &&
+#ifdef __NetBSD__
+		    IS_ALIGNED((iter->map->dm_segs[iter->seg].ds_addr +
+			    iter->off),
+			I915_GTT_PAGE_SIZE_2M) &&
+#else
 		    IS_ALIGNED(iter->dma, I915_GTT_PAGE_SIZE_2M) &&
+#endif
 		    rem >= I915_GTT_PAGE_SIZE_2M &&
 		    !__gen8_pte_index(start, 0)) {
 			index = __gen8_pte_index(start, 1);
@@ -457,7 +487,13 @@ static void gen8_ppgtt_insert_huge(struc
 
 			if (!index &&
 			    vma->page_sizes.sg & I915_GTT_PAGE_SIZE_64K &&
+#ifdef __NetBSD__
+			    IS_ALIGNED((iter->map->dm_segs[iter->seg].ds_addr
+				    + iter->off),
+				I915_GTT_PAGE_SIZE_64K) &&
+#else
 			    IS_ALIGNED(iter->dma, I915_GTT_PAGE_SIZE_64K) &&
+#endif
 			    (IS_ALIGNED(rem, I915_GTT_PAGE_SIZE_64K) ||
 			     rem >= (I915_PDES - index) * I915_GTT_PAGE_SIZE))
 				maybe_64K = __gen8_pte_index(start, 1);
@@ -466,10 +502,41 @@ static void gen8_ppgtt_insert_huge(struc
 		}
 
 		do {
+#ifdef __NetBSD__
+			GEM_BUG_ON((iter->map->ds_seg[iter->seg].ds_len -
+				iter->off) < page_size);
+#else
 			GEM_BUG_ON(iter->sg->length < page_size);
+#endif
 			vaddr[index++] = encode | iter->dma;
 
 			start += page_size;
+#ifdef __NetBSD__
+			iter->off += page_size;
+			rem -= page_size;
+			if (iter->off >= iter->map->ds_seg[iter->seg].ds_len) {
+				GEM_BUG_ON(iter->off >
+				    iter->map->ds_seg[iter->seg].ds_len);
+				iter->off = 0;
+				if (++iter->seg >= iter->map->dm_nsegs) {
+					GEM_BUG_ON(iter->seg >
+					    iter->map->dm_nsegs);
+					break;
+				}
+				const bus_dma_segment_t *seg =
+				    &iter->map->dm_segs[iter->seg];
+				if (maybe_64K && index < I915_PDES &&
+				    !(IS_ALIGNED((seg->ds_addr + iter->off),
+					    I915_GTT_PAGE_SIZE_64K) &&
+					(IS_ALIGNED(rem,
+					    I915_GEM_PAGE_SIZE_64K) ||
+					    rem >= ((I915_PDES - index) * I915_GTT_PAGE_SIZE))))
+					maybe_64K = false;
+				if (unlikely(!IS_ALIGNED((seg->ds_addr +
+						iter->off), page_size)))
+					break;
+			}
+#else
 			iter->dma += page_size;
 			rem -= page_size;
 			if (iter->dma >= iter->max) {
@@ -490,6 +557,7 @@ static void gen8_ppgtt_insert_huge(struc
 				if (unlikely(!IS_ALIGNED(iter->dma, page_size)))
 					break;
 			}
+#endif
 		} while (rem >= page_size && index < I915_PDES);
 
 		kunmap_atomic(vaddr);
@@ -503,7 +571,12 @@ static void gen8_ppgtt_insert_huge(struc
 		if (maybe_64K != -1 &&
 		    (index == I915_PDES ||
 		     (i915_vm_has_scratch_64K(vma->vm) &&
-		      !iter->sg && IS_ALIGNED(vma->node.start +
+#ifdef __NetBSD__
+		      iter->seg == iter->map->dm_nsegs &&
+#else
+		      !iter->sg &&
+#endif
+		      IS_ALIGNED(vma->node.start +
 					      vma->node.size,
 					      I915_GTT_PAGE_SIZE_2M)))) {
 			vaddr = kmap_atomic_px(pd);
@@ -534,7 +607,12 @@ static void gen8_ppgtt_insert_huge(struc
 		}
 
 		vma->page_sizes.gtt |= page_size;
-	} while (iter->sg);
+	}
+#ifdef __NetBSD__
+	while (iter->seg < iter->map->dm_nsegs);
+#else
+	while (iter->sg);
+#endif
 }
 
 static void gen8_ppgtt_insert(struct i915_address_space *vm,
Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_ggtt.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_ggtt.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: intel_ggtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_ggtt.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_ggtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $");
 
 #include <linux/stop_machine.h>
 
@@ -225,41 +225,20 @@ static void gen8_ggtt_insert_page(struct
 	ggtt->invalidate(ggtt);
 }
 
-#ifdef __NetBSD__
-static void
-gen8_ggtt_insert_entries(struct i915_address_space *vm, bus_dmamap_t dmamap,
-    uint64_t start, enum i915_cache_level level, uint32_t flags)
-{
-	struct drm_i915_private *dev_priv = vm->dev->dev_private;
-	unsigned first_entry = start >> PAGE_SHIFT;
-	const bus_space_tag_t bst = dev_priv->gtt.bst;
-	const bus_space_handle_t bsh = dev_priv->gtt.bsh;
-	unsigned i;
-
-	KASSERT(0 < dmamap->dm_nsegs);
-	for (i = 0; i < dmamap->dm_nsegs; i++) {
-		KASSERT(dmamap->dm_segs[i].ds_len == PAGE_SIZE);
-		gen8_set_pte(bst, bsh, first_entry + i,
-		    gen8_pte_encode(dmamap->dm_segs[i].ds_addr, level, true, flags));
-	}
-	if (0 < i) {
-		/* Posting read.  */
-		WARN_ON(gen8_get_pte(bst, bsh, (first_entry + i - 1))
-		    != gen8_pte_encode(dmamap->dm_segs[i - 1].ds_addr, level,
-			true, flags));
-	}
-	I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
-	POSTING_READ(GFX_FLSH_CNTL_GEN6);
-}
-#else
 static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
 				     struct i915_vma *vma,
 				     enum i915_cache_level level,
 				     u32 flags)
 {
 	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
+#ifdef __NetBSD__
+	bus_dmamap_t map = vma->pages;
+	unsigned seg;
+	unsigned pgno;
+#else
 	struct sgt_iter sgt_iter;
 	gen8_pte_t __iomem *gtt_entries;
+#endif
 	const gen8_pte_t pte_encode = gen8_pte_encode(0, level, 0);
 	dma_addr_t addr;
 
@@ -279,7 +258,6 @@ static void gen8_ggtt_insert_entries(str
 	 */
 	ggtt->invalidate(ggtt);
 }
-#endif
 
 static void gen6_ggtt_insert_page(struct i915_address_space *vm,
 				  dma_addr_t addr,
@@ -288,10 +266,17 @@ static void gen6_ggtt_insert_page(struct
 				  u32 flags)
 {
 	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
+#ifndef __NetBSD__
 	gen6_pte_t __iomem *pte =
 		(gen6_pte_t __iomem *)ggtt->gsm + offset / I915_GTT_PAGE_SIZE;
+#endif
 
+#ifdef __NetBSD__
+	bus_space_write_4(ggtt->gsmt, ggtt->gsmh, offset >> PAGE_SHIFT,
+	    vm->pte_encode(addr, level, flags));
+#else
 	iowrite32(vm->pte_encode(addr, level, flags), pte);
+#endif
 
 	ggtt->invalidate(ggtt);
 }
@@ -303,48 +288,44 @@ static void gen6_ggtt_insert_page(struct
  * through the GMADR mapped BAR (i915->mm.gtt->gtt).
  */
 
-#ifdef __NetBSD__
-static void
-gen6_ggtt_insert_entries(struct i915_address_space *vm, bus_dmamap_t dmamap,
-    uint64_t start, enum i915_cache_level level, uint32_t flags)
-{
-	struct drm_i915_private *dev_priv = vm->dev->dev_private;
-	unsigned first_entry = start >> PAGE_SHIFT;
-	const bus_space_tag_t bst = dev_priv->gtt.bst;
-	const bus_space_handle_t bsh = dev_priv->gtt.bsh;
-	unsigned i;
-
-	KASSERT(0 < dmamap->dm_nsegs);
-	for (i = 0; i < dmamap->dm_nsegs; i++) {
-		KASSERT(dmamap->dm_segs[i].ds_len == PAGE_SIZE);
-		CTASSERT(sizeof(gen6_pte_t) == 4);
-		bus_space_write_4(bst, bsh, 4*(first_entry + i),
-		    vm->pte_encode(dmamap->dm_segs[i].ds_addr, level, true,
-			flags));
-	}
-	if (0 < i) {
-		/* Posting read.  */
-		WARN_ON(bus_space_read_4(bst, bsh, 4*(first_entry + i - 1))
-		    != vm->pte_encode(dmamap->dm_segs[i - 1].ds_addr, level,
-			true, flags));
-	}
-	I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
-	POSTING_READ(GFX_FLSH_CNTL_GEN6);
-}
-#else
 static void gen6_ggtt_insert_entries(struct i915_address_space *vm,
 				     struct i915_vma *vma,
 				     enum i915_cache_level level,
 				     u32 flags)
 {
 	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
+#ifdef __NetBSD__
+	bus_dmamap_t map = vma->pages;
+	unsigned seg;
+	unsigned pgno;
+#else
 	gen6_pte_t __iomem *entries = (gen6_pte_t __iomem *)ggtt->gsm;
 	unsigned int i = vma->node.start / I915_GTT_PAGE_SIZE;
 	struct sgt_iter iter;
 	dma_addr_t addr;
+#endif
 
+#ifdef __NetBSD__
+	pgno = vma->node.start >> PAGE_SHIFT;
+	for (seg = 0; seg < map->dm_nsegs; seg++) {
+		bus_addr_t addr = map->dm_segs[seg].ds_addr;
+		bus_size_t len = map->dm_segs[seg].ds_len;
+		KASSERT((addr & (PAGE_SIZE - 1)) == 0);
+		KASSERT((len & (PAGE_SIZE - 1)) == 0);
+		for (; len >= PAGE_SIZE; addr += PAGE_SIZE, len -= PAGE_SIZE) {
+			/* XXX KASSERT(pgno < ...)?  */
+			CTASSERT(sizeof(gen6_pte_t) == 4);
+			bus_space_write_4(ggtt->gsmt, ggtt->gsmh,
+			    sizeof(gen6_pte_t) * pgno++,
+			    vm->pte_encode(addr, level, flags));
+		}
+		KASSERT(len == 0);
+		/* XXX KASSERT(pgno <= ...)?  */
+	}
+#else
 	for_each_sgt_daddr(addr, iter, vma->pages)
 		iowrite32(vm->pte_encode(addr, level, flags), &entries[i++]);
+#endif
 
 	/*
 	 * We want to flush the TLBs only after we're certain all the PTE
@@ -352,7 +333,6 @@ static void gen6_ggtt_insert_entries(str
 	 */
 	ggtt->invalidate(ggtt);
 }
-#endif
 
 static void nop_clear_range(struct i915_address_space *vm,
 			    u64 start, u64 length)
@@ -366,10 +346,7 @@ static void gen8_ggtt_clear_range(struct
 	unsigned int first_entry = start / I915_GTT_PAGE_SIZE;
 	unsigned int num_entries = length / I915_GTT_PAGE_SIZE;
 	const gen8_pte_t scratch_pte = vm->scratch[0].encode;
-#ifdef __NetBSD__
-	const bus_space_tag_t bst = dev_priv->gtt.bst;
-	const bus_space_handle_t bsh = dev_priv->gtt.bsh;
-#else
+#ifndef __NetBSD__
 	gen8_pte_t __iomem *gtt_base =
 		(gen8_pte_t __iomem *)ggtt->gsm + first_entry;
 #endif
@@ -383,8 +360,8 @@ static void gen8_ggtt_clear_range(struct
 
 #ifdef __NetBSD__
 	for (i = 0; i < num_entries; i++)
-		gen8_set_pte(bst, bsh, first_entry + i, scratch_pte);
-	(void)gen8_get_pte(bst, bsh, first_entry);
+		gen8_set_pte(ggtt->gsmt, ggtt->gsmh, first_entry + i,
+		    scratch_pte);
 #else
 	for (i = 0; i < num_entries; i++)
 		gen8_set_pte(&gtt_base[i], scratch_pte);
@@ -490,8 +467,6 @@ static void gen6_ggtt_clear_range(struct
 	unsigned int first_entry = start / I915_GTT_PAGE_SIZE;
 	unsigned int num_entries = length / I915_GTT_PAGE_SIZE;
 #ifdef __NetBSD__
-	const bus_space_tag_t bst = dev_priv->gtt.bst;
-	const bus_space_handle_t bsh = dev_priv->gtt.bsh;
 	gen6_pte_t scratch_pte;
 #else
 	gen6_pte_t scratch_pte, __iomem *gtt_base =
@@ -509,8 +484,9 @@ static void gen6_ggtt_clear_range(struct
 #ifdef __NetBSD__
         CTASSERT(sizeof(gen6_pte_t) == 4);
         for (i = 0; i < num_entries; i++)
-                bus_space_write_4(bst, bsh, 4*(first_entry + i), scratch_pte);
-        (void)bus_space_read_4(bst, bsh, 4*first_entry);
+		bus_space_write_4(ggtt->gsmt, ggtt->gsmh,
+		    sizeof(gen6_pte_t) * (first_entry + i),
+		    scratch_pte);
 #else
 	for (i = 0; i < num_entries; i++)
 		iowrite32(scratch_pte, &gtt_base[i]);
@@ -843,17 +819,21 @@ static void ggtt_cleanup_hw(struct i915_
  */
 void i915_ggtt_driver_release(struct drm_i915_private *i915)
 {
+#ifndef __NetBSD__
 	struct pagevec *pvec;
+#endif
 
 	fini_aliasing_ppgtt(&i915->ggtt);
 
 	ggtt_cleanup_hw(&i915->ggtt);
 
+#ifndef __NetBSD__
 	pvec = &i915->mm.wc_stash.pvec;
 	if (pvec->nr) {
 		set_pages_array_wb(pvec->pages, pvec->nr);
 		__pagevec_release(pvec);
 	}
+#endif
 }
 
 static unsigned int gen6_get_total_gtt_size(u16 snb_gmch_ctl)
@@ -907,6 +887,23 @@ static int ggtt_probe_common(struct i915
 	 * resort to an uncached mapping. The WC issue is easily caught by the
 	 * readback check when writing GTT PTE entries.
 	 */
+#ifdef __NetBSD__
+    {
+	int flags;
+	if (IS_GEN9_LP(i915) || INTEL_GEN(i915) >= 10)
+		flags = 0;
+	else
+		flags = BUS_SPACE_MAP_PREFETCHABLE;
+	ggtt->gsmt = i915->drm.pdev->pd_pa.pa_memt;
+	/* XXX errno NetBSD->Linux */
+	ret = -bus_space_map(ggtt->gsmt, phys_addr, size, flags, &ggtt->gsmh);
+	if (ret) {
+		DRM_ERROR("Failed to map the ggtt page table: %d\n", ret);
+		return ret;
+	}
+	ggtt->gsmsz = size;
+    }
+#else
 	if (IS_GEN9_LP(i915) || INTEL_GEN(i915) >= 10)
 		ggtt->gsm = ioremap(phys_addr, size);
 	else
@@ -915,12 +912,19 @@ static int ggtt_probe_common(struct i915
 		DRM_ERROR("Failed to map the ggtt page table\n");
 		return -ENOMEM;
 	}
+#endif
 
 	ret = setup_scratch_page(&ggtt->vm, GFP_DMA32);
 	if (ret) {
 		DRM_ERROR("Scratch setup failed\n");
 		/* iounmap will also get called at remove, but meh */
+#ifdef __NetBSD__
+		KASSERT(ggtt->gsmsz == size);
+		bus_space_unmap(ggtt->gsmt, ggtt->gsmh, ggtt->gsmsz);
+		ggtt->gsmsz = 0;
+#else
 		iounmap(ggtt->gsm);
+#endif
 		return ret;
 	}
 
@@ -950,7 +954,14 @@ static void gen6_gmch_remove(struct i915
 {
 	struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
 
+#ifdef __NetBSD__
+	if (ggtt->gsmsz) {
+		bus_space_unmap(ggtt->gsmt, ggtt->gsmh, ggtt->gsmsz);
+		ggtt->gsmsz = 0;
+	}
+#else
 	iounmap(ggtt->gsm);
+#endif
 	cleanup_scratch_page(vm);
 }
 
@@ -970,15 +981,24 @@ static int gen8_gmch_probe(struct i915_g
 
 	/* TODO: We're not aware of mappable constraints on gen8 yet */
 	if (!IS_DGFX(i915)) {
+#ifdef __NetBSD__
+		ggtt->gmadr.start = pci_resource_start(pdev, 2);
+		ggtt->mappable_end = pci_resource_len(pdev, 2);
+#else
 		ggtt->gmadr = pci_resource(pdev, 2);
 		ggtt->mappable_end = resource_size(&ggtt->gmadr);
+#endif
 	}
 
+#ifdef __NetBSD__
+	ggtt->max_paddr = DMA_BIT_MASK(39);
+#else
 	err = pci_set_dma_mask(pdev, DMA_BIT_MASK(39));
 	if (!err)
 		err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(39));
 	if (err)
 		DRM_ERROR("Can't set DMA mask/consistent mask (%d)\n", err);
+#endif
 
 	pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
 	if (IS_CHERRYVIEW(i915))
@@ -1117,8 +1137,13 @@ static int gen6_gmch_probe(struct i915_g
 	u16 snb_gmch_ctl;
 	int err;
 
+#ifdef __NetBSD__
+	ggtt->gmadr.start = pci_resource_start(pdev, 2);
+	ggtt->mappable_end = pci_resource_len(pdev, 2);
+#else
 	ggtt->gmadr = pci_resource(pdev, 2);
 	ggtt->mappable_end = resource_size(&ggtt->gmadr);
+#endif
 
 	/*
 	 * 64/512MB is the current min/max we actually know of, but this is
@@ -1129,11 +1154,15 @@ static int gen6_gmch_probe(struct i915_g
 		return -ENXIO;
 	}
 
+#ifdef __NetBSD__
+	ggtt->max_paddr = DMA_BIT_MASK(40);
+#else
 	err = pci_set_dma_mask(pdev, DMA_BIT_MASK(40));
 	if (!err)
 		err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(40));
 	if (err)
 		DRM_ERROR("Can't set DMA mask/consistent mask (%d)\n", err);
+#endif
 	pci_read_config_word(pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
 
 	size = gen6_get_total_gtt_size(snb_gmch_ctl);
@@ -1186,8 +1215,22 @@ static int i915_gmch_probe(struct i915_g
 
 	intel_gtt_get(&ggtt->vm.total, &gmadr_base, &ggtt->mappable_end);
 
+#ifdef __NetBSD__
+	ggtt->gmadr.start = gmadr_base;
+	/* Based on i915_drv.c, i915_driver_init_hw.  */
+	if (INTEL_INFO(dev)->gen <= 2)
+		dev_priv->ggtt.max_paddr = DMA_BIT_MASK(30);
+	else if ((INTEL_INFO(dev)->gen <= 3) ||
+	    IS_BROADWATER(dev) || IS_CRESTLINE(dev))
+		dev_priv->ggtt.max_paddr = DMA_BIT_MASK(32);
+	else if (INTEL_INFO(dev)->gen <= 5)
+		dev_priv->ggtt.max_paddr = DMA_BIT_MASK(36);
+	else
+		dev_priv->ggtt.max_paddr = DMA_BIT_MASK(40);
+#else
 	ggtt->gmadr =
 		(struct resource)DEFINE_RES_MEM(gmadr_base, ggtt->mappable_end);
+#endif
 
 	ggtt->do_idle_maps = needs_idle_maps(i915);
 	ggtt->vm.insert_page = i915_ggtt_insert_page;
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.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.c	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_gtt.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: intel_gtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
 
 // SPDX-License-Identifier: MIT
 /*
@@ -6,7 +6,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_gtt.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_gtt.c,v 1.3 2021/12/19 01:24:25 riastradh Exp $");
 
 #include <linux/slab.h> /* fault-inject.h is not standalone! */
 
@@ -16,6 +16,7 @@ __KERNEL_RCSID(0, "$NetBSD: intel_gtt.c,
 #include "intel_gt.h"
 #include "intel_gtt.h"
 
+#ifndef __NetBSD__
 void stash_init(struct pagestash *stash)
 {
 	pagevec_init(&stash->pvec);
@@ -171,6 +172,7 @@ static void vm_free_page(struct i915_add
 	pagevec_add(&vm->free_pages.pvec, page);
 	spin_unlock(&vm->free_pages.lock);
 }
+#endif
 
 void __i915_vm_close(struct i915_address_space *vm)
 {
@@ -196,11 +198,13 @@ void __i915_vm_close(struct i915_address
 
 void i915_address_space_fini(struct i915_address_space *vm)
 {
+#ifndef __NetBSD__
 	spin_lock(&vm->free_pages.lock);
 	if (pagevec_count(&vm->free_pages.pvec))
 		vm_free_pages_release(vm, true);
 	GEM_BUG_ON(pagevec_count(&vm->free_pages.pvec));
 	spin_unlock(&vm->free_pages.lock);
+#endif
 
 	drm_mm_takedown(&vm->mm);
 
@@ -248,7 +252,11 @@ void i915_address_space_init(struct i915
 	drm_mm_init(&vm->mm, 0, vm->total);
 	vm->mm.head_node.color = I915_COLOR_UNEVICTABLE;
 
+#ifdef __NetBSD__
+	vm->dmat = dev_priv->drm.dmat;
+#else
 	stash_init(&vm->free_pages);
+#endif
 
 	INIT_LIST_HEAD(&vm->bound_list);
 }
@@ -270,6 +278,46 @@ static int __setup_page_dma(struct i915_
 			    struct i915_page_dma *p,
 			    gfp_t gfp)
 {
+#ifdef __NetBSD__
+	int busdmaflags = 0;
+	int error;
+	int nseg = 1;
+
+	if (flags & __GFP_WAIT)
+		busdmaflags |= BUS_DMA_WAITOK;
+	else
+		busdmaflags |= BUS_DMA_NOWAIT;
+
+	error = bus_dmamem_alloc(vm->dmat, PAGE_SIZE, PAGE_SIZE, 0, &p->seg,
+	    nseg, &nseg, busdmaflags);
+	if (error) {
+fail0:		p->map = NULL;
+		return -error;	/* XXX errno NetBSD->Linux */
+	}
+	KASSERT(nseg == 1);
+	error = bus_dmamap_create(vm->dmat, PAGE_SIZE, 1, PAGE_SIZE, 0,
+	    busdmaflags, &p->map);
+	if (error) {
+fail1:		bus_dmamem_free(vm->dmat, &p->seg, 1);
+		goto fail0;
+	}
+	error = bus_dmamap_load_raw(vm->dmat, p->map, &p->seg, 1, PAGE_SIZE,
+	    busdmaflags);
+	if (error) {
+fail2: __unused
+		bus_dmamap_destroy(vm->dmat, p->map);
+		goto fail1;
+	}
+
+	p->page = container_of(PHYS_TO_VM_PAGE(p->seg.ds_addr), struct page,
+	    p_vmp);
+
+	if (flags & __GFP_ZERO) {
+		void *va = kmap_atomic(p->page);
+		memset(va, 0, PAGE_SIZE);
+		kunmap_atomic(va);
+	}
+#else
 	p->page = vm_alloc_page(vm, gfp | I915_GFP_ALLOW_FAIL);
 	if (unlikely(!p->page))
 		return -ENOMEM;
@@ -283,6 +331,7 @@ static int __setup_page_dma(struct i915_
 		vm_free_page(vm, p->page);
 		return -ENOMEM;
 	}
+#endif
 
 	return 0;
 }
@@ -294,8 +343,14 @@ int setup_page_dma(struct i915_address_s
 
 void cleanup_page_dma(struct i915_address_space *vm, struct i915_page_dma *p)
 {
+#ifdef __NetBSD__
+	bus_dmamap_unload(vm->dmat, p->map);
+	bus_dmamap_destroy(vm->dmat, p->map);
+	bus_dmamem_free(vm->dmat, &p->seg, 1);
+#else
 	dma_unmap_page(vm->dma, p->daddr, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
 	vm_free_page(vm, p->page);
+#endif
 }
 
 void
Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.h:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.h:1.2	Sat Dec 18 23:45:30 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_gtt.h	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_gtt.h,v 1.2 2021/12/18 23:45:30 riastradh Exp $	*/
+/*	$NetBSD: intel_gtt.h,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /* SPDX-License-Identifier: MIT */
 /*
@@ -576,6 +576,18 @@ void gtt_write_workarounds(struct intel_
 
 void setup_private_pat(struct intel_uncore *uncore);
 
+#ifdef __NetBSD__
+struct sgt_dma {
+	bus_dmamap_t map;
+	unsigned seg;
+	bus_size_t off;
+};
+static inline struct sgt_dma
+sgt_dma(struct i915_vma *vma)
+{
+	return (struct sgt_dma) { vma->pages, 0, 0 };
+}
+#else
 static inline struct sgt_dma {
 	struct scatterlist *sg;
 	dma_addr_t dma, max;
@@ -585,5 +597,6 @@ static inline struct sgt_dma {
 
 	return (struct sgt_dma){ sg, addr, addr + sg->length };
 }
+#endif
 
 #endif

Index: src/sys/external/bsd/drm2/dist/drm/i915/gvt/gtt.h
diff -u src/sys/external/bsd/drm2/dist/drm/i915/gvt/gtt.h:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gvt/gtt.h:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/gvt/gtt.h:1.2	Sat Dec 18 23:45:31 2021
+++ src/sys/external/bsd/drm2/dist/drm/i915/gvt/gtt.h	Sun Dec 19 01:24:25 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: gtt.h,v 1.2 2021/12/18 23:45:31 riastradh Exp $	*/
+/*	$NetBSD: gtt.h,v 1.3 2021/12/19 01:24:25 riastradh Exp $	*/
 
 /*
  * Copyright(c) 2011-2016 Intel Corporation. All rights reserved.
@@ -36,6 +36,17 @@
 #ifndef _GVT_GTT_H_
 #define _GVT_GTT_H_
 
+#ifdef __NetBSD__
+#include <drm/bus_dma_hacks.h>
+#include <x86/machdep.h>
+#include <x86/pte.h>
+#define	_PAGE_PRESENT	PG_V	/* 0x01 PTE is present / valid */
+#define	_PAGE_RW	PG_RW	/* 0x02 read/write */
+#define	_PAGE_PWT	PG_WT	/* 0x08 write-through */
+#define	_PAGE_PCD	PG_N	/* 0x10 page cache disabled / non-cacheable */
+#define	_PAGE_PAT	PG_PAT	/* 0x80 page attribute table on PTE */
+#endif
+
 #define I915_GTT_PAGE_SHIFT         12
 
 struct intel_vgpu_mm;

Index: src/sys/external/bsd/drm2/i915drm/files.i915drmkms
diff -u src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.45 src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.46
--- src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.45	Sun Dec 19 00:57:42 2021
+++ src/sys/external/bsd/drm2/i915drm/files.i915drmkms	Sun Dec 19 01:24:26 2021
@@ -1,4 +1,4 @@
-#	$NetBSD: files.i915drmkms,v 1.45 2021/12/19 00:57:42 riastradh Exp $
+#	$NetBSD: files.i915drmkms,v 1.46 2021/12/19 01:24:26 riastradh Exp $
 
 version	20180827
 
@@ -17,9 +17,12 @@ makeoptions	i915drmkms	CPPFLAGS+="-I$S/e
 
 makeoptions	i915drmkms	CPPFLAGS+="-I$S/external/bsd/drm2/dist/drm/i915"
 
+makeoptions	i915drmkms	CPPFLAGS+="-DCONFIG_DRM_FBDEV_EMULATION=1"
+makeoptions	i915drmkms	CPPFLAGS+="-DCONFIG_DRM_I915_DEBUG=1" # XXX
+makeoptions	i915drmkms	CPPFLAGS+="-DCONFIG_DRM_I915_DEBUG_GEM=1" # XXX
 makeoptions	i915drmkms	CPPFLAGS+="-DCONFIG_DRM_I915_FBDEV=1"
+makeoptions	i915drmkms	CPPFLAGS+="-DCONFIG_DRM_I915_GVT=0"
 makeoptions	i915drmkms	CPPFLAGS+="-DCONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT=0"
-makeoptions	i915drmkms	CPPFLAGS+="-DCONFIG_DRM_FBDEV_EMULATION=1"
 
 makeoptions	i915drmkms	"CWARNFLAGS.i915drmkms"+="-Wno-shadow"
 makeoptions	i915drmkms	"CWARNFLAGS.i915drmkms"+="-Wno-pointer-arith"

Reply via email to