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"