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(>t_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, >t_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"