Module Name: src Committed By: riastradh Date: Sun Dec 19 11:33:50 UTC 2021
Modified Files: src/sys/external/bsd/common/include/linux: kernel.h src/sys/external/bsd/drm2/dist/drm/i915: i915_drv.h i915_gem_fence_reg.c i915_gem_fence_reg.h i915_irq.c i915_memcpy.c i915_perf.c i915_scatterlist.h intel_uncore.h src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_phys.c i915_gem_region.c i915_gem_shmem.c i915_gem_shrinker.c i915_gem_tiling.c i915_gem_userptr.c src/sys/external/bsd/drm2/dist/drm/i915/gt: intel_rps.h src/sys/external/bsd/drm2/i915drm: files.i915drmkms i915_gem_userptr.c i915_module.c i915_pci_autoconf.c src/sys/external/bsd/drm2/include/asm: cpufeature.h src/sys/external/bsd/drm2/include/linux: fs.h interrupt.h ktime.h mm.h pagemap.h scatterlist.h shmem_fs.h src/sys/external/bsd/drm2/include/linux/sched: mm.h src/sys/external/bsd/drm2/linux: linux_sg.c Log Message: drm: Another pass over i915. Most of i915 gem builds now. To generate a diff of this commit: cvs rdiff -u -r1.42 -r1.43 src/sys/external/bsd/common/include/linux/kernel.h cvs rdiff -u -r1.43 -r1.44 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h cvs rdiff -u -r1.5 -r1.6 \ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c cvs rdiff -u -r1.4 -r1.5 \ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h cvs rdiff -u -r1.23 -r1.24 src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c cvs rdiff -u -r1.3 -r1.4 \ src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.c \ src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c cvs rdiff -u -r1.6 -r1.7 \ src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h \ src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h cvs rdiff -u -r1.4 -r1.5 \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c cvs rdiff -u -r1.2 -r1.3 \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_region.c \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shrinker.c \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c cvs rdiff -u -r1.7 -r1.8 \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c cvs rdiff -u -r1.3 -r1.4 \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c cvs rdiff -u -r1.2 -r1.3 \ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_rps.h cvs rdiff -u -r1.69 -r1.70 src/sys/external/bsd/drm2/i915drm/files.i915drmkms cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm2/i915drm/i915_gem_userptr.c cvs rdiff -u -r1.13 -r1.14 src/sys/external/bsd/drm2/i915drm/i915_module.c cvs rdiff -u -r1.4 -r1.5 \ src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c cvs rdiff -u -r1.7 -r1.8 src/sys/external/bsd/drm2/include/asm/cpufeature.h cvs rdiff -u -r1.6 -r1.7 src/sys/external/bsd/drm2/include/linux/fs.h cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/include/linux/interrupt.h cvs rdiff -u -r1.15 -r1.16 src/sys/external/bsd/drm2/include/linux/ktime.h cvs rdiff -u -r1.20 -r1.21 src/sys/external/bsd/drm2/include/linux/mm.h cvs rdiff -u -r1.5 -r1.6 src/sys/external/bsd/drm2/include/linux/pagemap.h cvs rdiff -u -r1.4 -r1.5 \ src/sys/external/bsd/drm2/include/linux/scatterlist.h cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/include/linux/shmem_fs.h cvs rdiff -u -r1.1 -r1.2 src/sys/external/bsd/drm2/include/linux/sched/mm.h cvs rdiff -u -r1.1 -r1.2 src/sys/external/bsd/drm2/linux/linux_sg.c 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/common/include/linux/kernel.h diff -u src/sys/external/bsd/common/include/linux/kernel.h:1.42 src/sys/external/bsd/common/include/linux/kernel.h:1.43 --- src/sys/external/bsd/common/include/linux/kernel.h:1.42 Sun Dec 19 11:33:09 2021 +++ src/sys/external/bsd/common/include/linux/kernel.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: kernel.h,v 1.42 2021/12/19 11:33:09 riastradh Exp $ */ +/* $NetBSD: kernel.h,v 1.43 2021/12/19 11:33:49 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -261,4 +261,13 @@ add_taint(unsigned taint, int lockdep) { } +#define DFEINE_STATIC_KEY_FALSE(FLAG) \ + bool FLAG = false + +static inline bool +static_branch_likely(const bool *flagp) +{ + return __predict_true(*flagp); +} + #endif /* _LINUX_KERNEL_H_ */ 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.43 src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.44 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h:1.43 Sun Dec 19 11:32:35 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_drv.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_drv.h,v 1.43 2021/12/19 11:32:35 riastradh Exp $ */ +/* $NetBSD: i915_drv.h,v 1.44 2021/12/19 11:33:49 riastradh Exp $ */ /* i915_drv.h -- Private header for the I915 driver -*- linux-c -*- */ @@ -1323,6 +1323,11 @@ struct drm_i915_private { I915_SELFTEST_DECLARE(struct i915_selftest_stash selftest;) +#ifdef __NetBSD__ + pci_intr_handle_t *pci_ihp; + void *pci_intrcookie; +#endif + /* * NOTE: This is the dri1/ums dungeon, don't add stuff here. Your patch * will be rejected. Instead look for a better place. Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c:1.5 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c:1.6 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c:1.5 Sun Dec 19 11:32:54 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_fence_reg.c,v 1.5 2021/12/19 11:32:54 riastradh Exp $ */ +/* $NetBSD: i915_gem_fence_reg.c,v 1.6 2021/12/19 11:33:49 riastradh Exp $ */ /* * Copyright © 2008-2015 Intel Corporation @@ -24,7 +24,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_fence_reg.c,v 1.5 2021/12/19 11:32:54 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_fence_reg.c,v 1.6 2021/12/19 11:33:49 riastradh Exp $"); #include <linux/bitmap.h> #include <drm/i915_drm.h> @@ -783,39 +783,16 @@ static void i915_gem_swizzle_page(struct * by swapping them out and back in again). */ void -#ifdef __NetBSD__ -i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj, - struct page **pages) -#else i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj, struct sg_table *pages) -#endif { -#ifdef __NetBSD__ - struct vm_page *vm_page; -#else struct sgt_iter sgt_iter; -#endif struct page *page; int i; if (obj->bit_17 == NULL) return; -#ifdef __NetBSD__ - for (i = 0; i < obj->base.size >> PAGE_SHIFT; i++) { - page = pages[i]; - vm_page = &page->p_vmp; - unsigned char new_bit_17 = VM_PAGE_TO_PHYS(vm_page) >> 17; - if ((new_bit_17 & 0x1) != - (test_bit(i, obj->bit_17) != 0)) { - i915_gem_swizzle_page(page); - rw_enter(obj->base.filp->vmobjlock, RW_WRITER); - uvm_pagemarkdirty(vm_page, UVM_PAGE_STATUS_DIRTY); - rw_exit(obj->base.filp->vmobjlock); - } - } -#else i = 0; for_each_sgt_page(page, sgt_iter, pages) { char new_bit_17 = page_to_phys(page) >> 17; @@ -825,7 +802,6 @@ i915_gem_object_do_bit_17_swizzle(struct } i++; } -#endif } /** @@ -838,21 +814,12 @@ i915_gem_object_do_bit_17_swizzle(struct * be called before the backing storage can be unpinned. */ void -#ifdef __NetBSD__ -i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj, - struct page **pages) -#else i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj, struct sg_table *pages) -#endif { -#ifdef __NetBSD__ - struct vm_page *vm_page; -#else - struct sg_page_iter sg_iter; -#endif - struct page *page; const unsigned int page_count = obj->base.size >> PAGE_SHIFT; + struct sgt_iter sgt_iter; + struct page *page; int i; if (obj->bit_17 == NULL) { @@ -866,16 +833,6 @@ i915_gem_object_save_bit_17_swizzle(stru i = 0; -#ifdef __NetBSD__ - for (i = 0; i < obj->base.size >> PAGE_SHIFT; i++) { - page = pages[i]; - vm_page = &page->p_vmp; - if (ISSET(VM_PAGE_TO_PHYS(vm_page), __BIT(17))) - __set_bit(i, obj->bit_17); - else - __clear_bit(i, obj->bit_17); - } -#else for_each_sgt_page(page, sgt_iter, pages) { if (page_to_phys(page) & (1 << 17)) __set_bit(i, obj->bit_17); @@ -883,7 +840,6 @@ i915_gem_object_save_bit_17_swizzle(stru __clear_bit(i, obj->bit_17); i++; } -#endif } void i915_ggtt_init_fences(struct i915_ggtt *ggtt) Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h:1.4 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h:1.5 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h:1.4 Sun Dec 19 11:32:54 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_fence_reg.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_fence_reg.h,v 1.4 2021/12/19 11:32:54 riastradh Exp $ */ +/* $NetBSD: i915_gem_fence_reg.h,v 1.5 2021/12/19 11:33:49 riastradh Exp $ */ /* * Copyright © 2016 Intel Corporation @@ -61,17 +61,10 @@ void i915_unreserve_fence(struct i915_fe void i915_gem_restore_fences(struct i915_ggtt *ggtt); -#ifdef __NetBSD__ -void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj, - struct page **pages); -void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj, - struct page **pages); -#else void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj, struct sg_table *pages); void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj, struct sg_table *pages); -#endif void i915_ggtt_init_fences(struct i915_ggtt *ggtt); Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.23 src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.24 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c:1.23 Sun Dec 19 11:32:44 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_irq.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_irq.c,v 1.23 2021/12/19 11:32:44 riastradh Exp $ */ +/* $NetBSD: i915_irq.c,v 1.24 2021/12/19 11:33:49 riastradh Exp $ */ /* i915_irq.c -- IRQ support for the I915 -*- linux-c -*- */ @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_irq.c,v 1.23 2021/12/19 11:32:44 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_irq.c,v 1.24 2021/12/19 11:33:49 riastradh Exp $"); #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt @@ -2388,7 +2388,7 @@ gen8_de_irq_handler(struct drm_i915_priv return ret; } -static inline u32 gen8_master_intr_disable(void __iomem * const regs) +static inline u32 gen8_master_intr_disable(struct intel_uncore *regs) { raw_reg_write(regs, GEN8_MASTER_IRQ, 0); @@ -2401,7 +2401,7 @@ static inline u32 gen8_master_intr_disab return raw_reg_read(regs, GEN8_MASTER_IRQ); } -static inline void gen8_master_intr_enable(void __iomem * const regs) +static inline void gen8_master_intr_enable(struct intel_uncore *regs) { raw_reg_write(regs, GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL); } @@ -2460,7 +2460,7 @@ gen11_gu_misc_irq_handler(struct intel_g intel_opregion_asle_intr(gt->i915); } -static inline u32 gen11_master_intr_disable(void __iomem * const regs) +static inline u32 gen11_master_intr_disable(struct intel_uncore *regs) { raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, 0); @@ -2473,7 +2473,7 @@ static inline u32 gen11_master_intr_disa return raw_reg_read(regs, GEN11_GFX_MSTR_IRQ); } -static inline void gen11_master_intr_enable(void __iomem * const regs) +static inline void gen11_master_intr_enable(struct intel_uncore *regs) { raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, GEN11_MASTER_IRQ); } @@ -2498,8 +2498,8 @@ gen11_display_irq_handler(struct drm_i91 static __always_inline irqreturn_t __gen11_irq_handler(struct drm_i915_private * const i915, - u32 (*intr_disable)(void __iomem * const regs), - void (*intr_enable)(void __iomem * const regs)) + u32 (*intr_disable)(struct intel_uncore *regs), + void (*intr_enable)(struct intel_uncore *regs)) { struct intel_gt *gt = &i915->gt; u32 master_ctl; @@ -2530,7 +2530,7 @@ __gen11_irq_handler(struct drm_i915_priv return IRQ_HANDLED; } -static irqreturn_t gen11_irq_handler(int irq, void *arg) +static irqreturn_t gen11_irq_handler(DRM_IRQ_ARGS) { return __gen11_irq_handler(arg, gen11_master_intr_disable, @@ -2801,7 +2801,7 @@ static void gen8_irq_reset(struct drm_i9 struct intel_uncore *uncore = &dev_priv->uncore; enum pipe pipe; - gen8_master_intr_disable(dev_priv->uncore.regs); + gen8_master_intr_disable(&dev_priv->uncore); gen8_gt_irq_reset(&dev_priv->gt); @@ -2863,7 +2863,7 @@ static void gen11_irq_reset(struct drm_i { struct intel_uncore *uncore = &dev_priv->uncore; - gen11_master_intr_disable(dev_priv->uncore.regs); + gen11_master_intr_disable(&dev_priv->uncore); gen11_gt_irq_reset(&dev_priv->gt); gen11_display_irq_reset(dev_priv); @@ -3069,7 +3069,7 @@ static void gen11_hpd_detection_setup(st static void gen11_hpd_irq_setup(struct drm_i915_private *dev_priv) { - u32 hotplug_irqs, enabled_irqs; + u32 hotplug_irqs, enabled_irqs __unused; const u32 *hpd; u32 val; @@ -3434,7 +3434,7 @@ static void gen8_irq_postinstall(struct if (HAS_PCH_SPLIT(dev_priv)) ibx_irq_postinstall(dev_priv); - gen8_master_intr_enable(dev_priv->uncore.regs); + gen8_master_intr_enable(&dev_priv->uncore); } static void icp_irq_postinstall(struct drm_i915_private *dev_priv) @@ -3476,7 +3476,7 @@ static void gen11_irq_postinstall(struct I915_WRITE(GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE); - gen11_master_intr_enable(uncore->regs); + gen11_master_intr_enable(uncore); POSTING_READ(GEN11_GFX_MSTR_IRQ); } @@ -4066,7 +4066,9 @@ static void intel_irq_postinstall(struct */ int intel_irq_install(struct drm_i915_private *dev_priv) { +#ifndef __NetBSD__ int irq = dev_priv->drm.pdev->irq; +#endif int ret; /* @@ -4080,8 +4082,61 @@ int intel_irq_install(struct drm_i915_pr intel_irq_reset(dev_priv); +#ifdef __NetBSD__ + { + struct pci_dev *const pdev = dev_priv->drm.pdev; + const char *const name = device_xname(pci_dev_dev(pdev)); + const struct pci_attach_args *pa = &pdev->pd_pa; + const char *intrstr; + char intrbuf[PCI_INTRSTR_LEN]; + + if (pdev->msi_enabled) { + if (pdev->pd_intr_handles == NULL) { + /* XXX errno NetBSD->Linux */ + if ((ret = -pci_msi_alloc_exact(pa, &dev_priv->pci_ihp, + 1))) { + aprint_error_dev(pci_dev_dev(pdev), + "couldn't allocate MSI (%s)\n", name); + goto out; + } + } else { + dev_priv->pci_ihp = pdev->pd_intr_handles; + pdev->pd_intr_handles = NULL; + } + } else { + /* XXX errno NetBSD->Linux */ + if ((ret = -pci_intx_alloc(pa, &dev_priv->pci_ihp))) { + aprint_error_dev(pci_dev_dev(pdev), + "couldn't allocate INTx interrupt (%s)\n", + name); + goto out; + } + } + + intrstr = pci_intr_string(pa->pa_pc, dev_priv->pci_ihp[0], + intrbuf, sizeof(intrbuf)); + dev_priv->pci_intrcookie = pci_intr_establish_xname(pa->pa_pc, + dev_priv->pci_ihp[0], IPL_DRM, intel_irq_handler(dev_priv), + dev_priv, name); + if (dev_priv->pci_intrcookie == NULL) { + aprint_error_dev(pci_dev_dev(pdev), + "couldn't establish interrupt at %s (%s)\n", intrstr, name); + pci_intr_release(pa->pa_pc, dev_priv->pci_ihp, 1); + dev_priv->pci_ihp = NULL; + ret = -EIO; /* XXX er? */ + goto out; + } + + /* Success! */ + aprint_normal_dev(pci_dev_dev(pdev), "interrupting at %s (%s)\n", + intrstr, name); + ret = 0; +out:; + } +#else ret = request_irq(irq, intel_irq_handler(dev_priv), IRQF_SHARED, DRIVER_NAME, dev_priv); +#endif if (ret < 0) { dev_priv->drm.irq_enabled = false; return ret; @@ -4101,7 +4156,9 @@ int intel_irq_install(struct drm_i915_pr */ void intel_irq_uninstall(struct drm_i915_private *dev_priv) { +#ifndef __NetBSD__ int irq = dev_priv->drm.pdev->irq; +#endif /* * FIXME we can get called twice during driver probe @@ -4116,7 +4173,19 @@ void intel_irq_uninstall(struct drm_i915 intel_irq_reset(dev_priv); +#ifdef __NetBSD__ + const struct pci_attach_args *pa = &dev_priv->drm.pdev->pd_pa; + if (dev_priv->pci_intrcookie != NULL) { + pci_intr_disestablish(pa->pa_pc, dev_priv->pci_intrcookie); + dev_priv->pci_intrcookie = NULL; + } + if (dev_priv->pci_ihp != NULL) { + pci_intr_release(pa->pa_pc, dev_priv->pci_ihp, 1); + dev_priv->pci_ihp = NULL; + } +#else free_irq(irq, dev_priv); +#endif intel_hpd_cancel_work(dev_priv); dev_priv->runtime_pm.irqs_enabled = false; @@ -4161,5 +4230,9 @@ bool intel_irqs_enabled(struct drm_i915_ void intel_synchronize_irq(struct drm_i915_private *i915) { +#ifdef __NetBSD__ + xc_barrier(0); +#else synchronize_irq(i915->drm.pdev->irq); +#endif } Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.c:1.4 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.c:1.3 Sun Dec 19 01:40:41 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_memcpy.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_memcpy.c,v 1.3 2021/12/19 01:40:41 riastradh Exp $ */ +/* $NetBSD: i915_memcpy.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $ */ /* * Copyright © 2016 Intel Corporation @@ -25,13 +25,15 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_memcpy.c,v 1.3 2021/12/19 01:40:41 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_memcpy.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $"); #include <linux/kernel.h> #include <asm/fpu/api.h> #include "i915_memcpy.h" +#include <linux/nbsd-namespace.h> + #if IS_ENABLED(CONFIG_DRM_I915_DEBUG) #define CI_BUG_ON(expr) BUG_ON(expr) #else Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c:1.4 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c:1.3 Sun Dec 19 11:06:55 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_perf.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_perf.c,v 1.3 2021/12/19 11:06:55 riastradh Exp $ */ +/* $NetBSD: i915_perf.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $ */ /* * Copyright © 2015-2016 Intel Corporation @@ -194,7 +194,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_perf.c,v 1.3 2021/12/19 11:06:55 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_perf.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $"); #include <linux/anon_inodes.h> #include <linux/sizes.h> @@ -225,6 +225,8 @@ __KERNEL_RCSID(0, "$NetBSD: i915_perf.c, #include "oa/i915_oa_icl.h" #include "oa/i915_oa_tgl.h" +#include <linux/nbsd-namespace.h> + /* HW requires this to be a power of two, between 128k and 16M, though driver * is currently generally designed assuming the largest 16M size is used such * that the overflow cases are unlikely in normal operation. @@ -401,9 +403,9 @@ void i915_oa_config_release(struct kref struct i915_oa_config *oa_config = container_of(ref, typeof(*oa_config), ref); - kfree(oa_config->flex_regs); - kfree(oa_config->b_counter_regs); - kfree(oa_config->mux_regs); + kfree(__UNCONST(oa_config->flex_regs)); + kfree(__UNCONST(oa_config->b_counter_regs)); + kfree(__UNCONST(oa_config->mux_regs)); kfree_rcu(oa_config, rcu); } 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.6 src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h:1.7 --- src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h:1.6 Sun Dec 19 11:33:30 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/i915_scatterlist.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_scatterlist.h,v 1.6 2021/12/19 11:33:30 riastradh Exp $ */ +/* $NetBSD: i915_scatterlist.h,v 1.7 2021/12/19 11:33:49 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -22,11 +22,11 @@ struct sgt_iter { }; #define for_each_sgt_page(pp, iter, sgt) \ - for ((iter)->i = 0; \ - ((iter)->i < (sgt)->sgt_npgs \ - ? ((pp) = (sgt)->sgt_pgs[(iter)->i], 1) \ + for ((iter).i = 0; \ + ((iter).i < (sgt)->sgl->sg_npgs \ + ? (((pp) = (sgt)->sgl->sg_pgs[(iter).i]), 1) \ : 0); \ - (iter)->i++) + (iter).i++) static inline unsigned i915_sg_page_sizes(struct scatterlist *sg) @@ -39,6 +39,18 @@ i915_sg_page_sizes(struct scatterlist *s return page_sizes; } +static inline unsigned +i915_sg_segment_size(void) +{ + return PAGE_SIZE; +} + +static inline bool +i915_sg_trim(struct sg_table *sgt) +{ + return true; +} + #else /* @@ -150,8 +162,8 @@ static inline unsigned int i915_sg_segme return size; } -#endif - bool i915_sg_trim(struct sg_table *orig_st); #endif + +#endif Index: src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h diff -u src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h:1.6 src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h:1.7 --- src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h:1.6 Sun Dec 19 11:12:59 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/intel_uncore.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: intel_uncore.h,v 1.6 2021/12/19 11:12:59 riastradh Exp $ */ +/* $NetBSD: intel_uncore.h,v 1.7 2021/12/19 11:33:49 riastradh Exp $ */ /* * Copyright © 2017 Intel Corporation @@ -457,11 +457,11 @@ static inline int intel_uncore_write_and } #ifdef __NetBSD__ -#define raw_reg_read(i915, reg) \ - bus_space_read_4((i915)->regs_bst, (i915)->regs_bsh, \ +#define raw_reg_read(uncore, reg) \ + bus_space_read_4((uncore)->regs_bst, (uncore)->regs_bsh, \ i915_mmio_reg_offset(reg)) -#define raw_reg_write(i915, reg, value) \ - bus_space_write_4((i915)->regs_bst, (i915)->regs_bsh, \ +#define raw_reg_write(uncore, reg, value) \ + bus_space_write_4((uncore)->regs_bst, (uncore)->regs_bsh, \ i915_mmio_reg_offset(reg), (value)) #else #define raw_reg_read(base, reg) \ Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c:1.4 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c:1.5 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c:1.4 Sun Dec 19 11:33:30 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_phys.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_phys.c,v 1.4 2021/12/19 11:33:30 riastradh Exp $ */ +/* $NetBSD: i915_gem_phys.c,v 1.5 2021/12/19 11:33:49 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_phys.c,v 1.4 2021/12/19 11:33:30 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_phys.c,v 1.5 2021/12/19 11:33:49 riastradh Exp $"); #include <linux/highmem.h> #include <linux/shmem_fs.h> @@ -29,7 +29,7 @@ __KERNEL_RCSID(0, "$NetBSD: i915_gem_phy static int i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj) { #ifdef __NetBSD__ - struct uvm_object *uobj = obj->base.filp; + struct uvm_object *mapping = obj->base.filp; #else struct address_space *mapping = obj->base.filp->f_mapping; #endif @@ -113,24 +113,9 @@ static int i915_gem_object_get_pages_phy struct page *page; void *src; -#ifdef __NetBSD__ - struct vm_page *vm_page; - - /* XXX errno NetBSD->Linux */ - ret = -uvm_obj_wirepages(uobj, i*PAGE_SIZE, (i + 1)*PAGE_SIZE, - NULL); - if (ret) - goto err_st; - rw_enter(uobj->vmobjlock, RW_READER); - vm_page = uvm_pagelookup(uobj, i*PAGE_SIZE); - rw_exit(uobj->vmobjlock); - KASSERT(vm_page); - page = container_of(vm_page, struct page, p_vmp); -#else page = shmem_read_mapping_page(mapping, i); if (IS_ERR(page)) goto err_st; -#endif src = kmap_atomic(page); memcpy(dst, src, PAGE_SIZE); @@ -138,7 +123,7 @@ static int i915_gem_object_get_pages_phy kunmap_atomic(src); #ifdef __NetBSD__ - uvm_obj_unwirepages(uobj, i*PAGE_SIZE, (i + 1)*PAGE_SIZE); + uvm_obj_unwirepages(mapping, i*PAGE_SIZE, (i + 1)*PAGE_SIZE); #else put_page(page); #endif @@ -195,8 +180,7 @@ i915_gem_object_put_pages_phys(struct dr if (obj->mm.dirty) { #ifdef __NetBSD__ - struct uvm_object *uobj = obj->base.filp; - struct vm_page *vm_page; + struct uvm_object *mapping = obj->base.filp; #else struct address_space *mapping = obj->base.filp->f_mapping; #endif @@ -207,20 +191,9 @@ i915_gem_object_put_pages_phys(struct dr struct page *page; char *dst; -#ifdef __NetBSD__ - if (uvm_obj_wirepages(uobj, i*PAGE_SIZE, - (i + 1)*PAGE_SIZE, NULL) != 0) - continue; - rw_enter(uobj->vmobjlock, RW_READER); - vm_page = uvm_pagelookup(uobj, i*PAGE_SIZE); - rw_exit(uobj->vmobjlock); - KASSERT(vm_page); - page = container_of(vm_page, struct page, p_vmp); -#else page = shmem_read_mapping_page(mapping, i); if (IS_ERR(page)) continue; -#endif dst = kmap_atomic(page); drm_clflush_virt_range(src, PAGE_SIZE); @@ -229,7 +202,8 @@ i915_gem_object_put_pages_phys(struct dr set_page_dirty(page); #ifdef __NetBSD__ - uvm_obj_unwirepages(uobj, i*PAGE_SIZE, + /* XXX mark_page_accessed */ + uvm_obj_unwirepages(mapping, i*PAGE_SIZE, (i + 1)*PAGE_SIZE); #else if (obj->mm.madv == I915_MADV_WILLNEED) Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_region.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_region.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_region.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_region.c:1.2 Sat Dec 18 23:45:30 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_region.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_region.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $ */ +/* $NetBSD: i915_gem_region.c,v 1.3 2021/12/19 11:33:49 riastradh Exp $ */ // SPDX-License-Identifier: MIT /* @@ -6,7 +6,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_region.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_region.c,v 1.3 2021/12/19 11:33:49 riastradh Exp $"); #include "intel_memory_region.h" #include "i915_gem_region.h" @@ -20,6 +20,10 @@ i915_gem_object_put_pages_buddy(struct d __intel_memory_region_put_pages_buddy(obj->mm.region, &obj->mm.blocks); obj->mm.dirty = false; +#ifdef __NetBSD__ + bus_dmamap_unload(obj->base.dev->dmat, pages->sgl->sg_dmamap); + bus_dmamap_destroy(obj->base.dev->dmat, pages->sgl->sg_dmamap); +#endif sg_free_table(pages); kfree(pages); } @@ -58,6 +62,50 @@ i915_gem_object_get_pages_buddy(struct d GEM_BUG_ON(list_empty(blocks)); sg = st->sgl; +#ifdef __NetBSD__ + __USE(prev_end); + __USE(sg_page_sizes); + bus_dma_tag_t dmat = obj->base.dev->dmat; + bus_dma_segment_t *segs = NULL; + int i = 0, nsegs = 0; + bool loaded = false; + + list_for_each_entry(block, blocks, link) { + if (nsegs >= INT_MAX || + nsegs >= SIZE_MAX/sizeof(segs[0])) + goto err; + nsegs++; + } + segs = kmem_zalloc(nsegs * sizeof(segs[0]), KM_SLEEP); + list_for_each_entry(block, blocks, link) { + u64 block_size, offset; + + block_size = min_t(u64, size, + i915_buddy_block_size(&mem->mm, block)); + offset = i915_buddy_block_offset(block); + + segs[i].ds_addr = mem->region.start + offset; + segs[i].ds_len = block_size; + } + + /* XXX errno NetBSD->Linux */ + ret = -bus_dmamap_create(dmat, size, nsegs, size, 0, BUS_DMA_WAITOK, + &sg->sg_dmamap); + if (ret) + goto err; + + /* XXX errno NetBSD->Linux */ + ret = -bus_dmamap_load_raw(dmat, sg->sg_dmamap, segs, nsegs, size, + BUS_DMA_WAITOK); + if (ret) + goto err; + loaded = true; + + kmem_free(segs, nsegs * sizeof(segs[0])); + segs = NULL; + + __i915_gem_object_set_pages(obj, st, i915_sg_page_sizes(sg)); +#else st->nents = 0; sg_page_sizes = 0; prev_end = (resource_size_t)-1; @@ -97,9 +145,20 @@ i915_gem_object_get_pages_buddy(struct d i915_sg_trim(st); __i915_gem_object_set_pages(obj, st, sg_page_sizes); +#endif return 0; +#ifdef __NetBSD__ +err: + if (loaded) + bus_dmamap_unload(dmat, st->sgl->sg_dmamap); + if (st->sgl->sg_dmamap) + bus_dmamap_destroy(dmat, st->sgl->sg_dmamap); + if (segs) + kmem_free(segs, nsegs * sizeof(segs[0])); + __intel_memory_region_put_pages_buddy(mem, blocks); +#endif err_free_sg: sg_free_table(st); kfree(st); Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shrinker.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shrinker.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shrinker.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shrinker.c:1.2 Sat Dec 18 23:45:30 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shrinker.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_shrinker.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $ */ +/* $NetBSD: i915_gem_shrinker.c,v 1.3 2021/12/19 11:33:49 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_shrinker.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_shrinker.c,v 1.3 2021/12/19 11:33:49 riastradh Exp $"); #include <linux/oom.h> #include <linux/sched/mm.h> @@ -427,6 +427,7 @@ void i915_gem_driver_unregister__shrinke void i915_gem_shrinker_taints_mutex(struct drm_i915_private *i915, struct mutex *mutex) { +#if IS_ENABLED(CONFIG_LOCKDEP) bool unlock = false; if (!IS_ENABLED(CONFIG_LOCKDEP)) @@ -447,6 +448,7 @@ void i915_gem_shrinker_taints_mutex(stru if (unlock) mutex_release(&i915->drm.struct_mutex.dep_map, _RET_IP_); +#endif } #define obj_to_i915(obj__) to_i915((obj__)->base.dev) Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c:1.3 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c:1.2 Sat Dec 18 23:45:30 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_tiling.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $ */ +/* $NetBSD: i915_gem_tiling.c,v 1.3 2021/12/19 11:33:49 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,8 +7,9 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_tiling.c,v 1.2 2021/12/18 23:45:30 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_tiling.c,v 1.3 2021/12/19 11:33:49 riastradh Exp $"); +#include <linux/bitmap.h> #include <linux/string.h> #include <linux/bitops.h> #include <drm/i915_drm.h> 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.7 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.8 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c:1.7 Sun Dec 19 11:33:30 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_shmem.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_shmem.c,v 1.7 2021/12/19 11:33:30 riastradh Exp $ */ +/* $NetBSD: i915_gem_shmem.c,v 1.8 2021/12/19 11:33:49 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_shmem.c,v 1.7 2021/12/19 11:33:30 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_shmem.c,v 1.8 2021/12/19 11:33:49 riastradh Exp $"); #include <linux/pagevec.h> #include <linux/swap.h> @@ -23,12 +23,14 @@ __KERNEL_RCSID(0, "$NetBSD: i915_gem_shm * Move pages to appropriate lru and release the pagevec, decrementing the * ref count of those pages. */ +#ifndef __NetBSD__ static void check_release_pagevec(struct pagevec *pvec) { check_move_unevictable_pages(pvec); __pagevec_release(pvec); cond_resched(); } +#endif static int shmem_get_pages(struct drm_i915_gem_object *obj) { @@ -36,7 +38,11 @@ static int shmem_get_pages(struct drm_i9 struct intel_memory_region *mem = obj->mm.region; const unsigned long page_count = obj->base.size / PAGE_SIZE; unsigned long i; +#ifdef __NetBSD__ + struct uvm_object *mapping; +#else struct address_space *mapping; +#endif struct sg_table *st; struct scatterlist *sg; struct sgt_iter sgt_iter; @@ -44,7 +50,9 @@ static int shmem_get_pages(struct drm_i9 unsigned long last_pfn = 0; /* suppress gcc warning */ unsigned int max_segment = i915_sg_segment_size(); unsigned int sg_page_sizes; +#ifndef __NetBSD__ struct pagevec pvec; +#endif gfp_t noreclaim; int ret; @@ -79,10 +87,14 @@ rebuild_st: * * Fail silently without starting the shrinker */ +#ifdef __NetBSD__ + mapping = obj->base.filp; +#else mapping = obj->base.filp->f_mapping; mapping_set_unevictable(mapping); noreclaim = mapping_gfp_constraint(mapping, ~__GFP_RECLAIM); noreclaim |= __GFP_NORETRY | __GFP_NOWARN; +#endif sg = st->sgl; st->nents = 0; @@ -116,6 +128,7 @@ rebuild_st: * defer the oom here by reporting the ENOMEM back * to userspace. */ +#ifndef __NetBSD__ if (!*s) { /* reclaim and warn, but no oom */ gfp = mapping_gfp_mask(mapping); @@ -136,8 +149,14 @@ rebuild_st: */ gfp |= __GFP_RETRY_MAYFAIL; } +#endif } while (1); +#ifdef __NetBSD__ + __USE(last_pfn); + KASSERT(st->nents == i); + sg->sg_pgs[st->nents++] = page; +#else if (!i || sg->length >= max_segment || page_to_pfn(page) != last_pfn + 1) { @@ -154,11 +173,14 @@ rebuild_st: /* Check that the i965g/gm workaround works. */ WARN_ON((gfp & __GFP_DMA32) && (last_pfn >= 0x00100000UL)); +#endif } +#ifndef __NetBSD__ if (sg) { /* loop terminated early; short sg table */ sg_page_sizes |= sg->length; sg_mark_end(sg); } +#endif /* Trim unused sg entries to avoid wasting memory. */ i915_sg_trim(st); @@ -171,14 +193,19 @@ rebuild_st: * for PAGE_SIZE chunks instead may be helpful. */ if (max_segment > PAGE_SIZE) { +#ifdef __NetBSD__ + __USE(sgt_iter); + uvm_obj_unwirepages(mapping, 0, obj->base.size); +#else for_each_sgt_page(page, sgt_iter, st) put_page(page); +#endif sg_free_table(st); max_segment = PAGE_SIZE; goto rebuild_st; } else { - dev_warn(&i915->drm.pdev->dev, + dev_warn(i915->drm.dev, "Failed to DMA remap %lu pages\n", page_count); goto err_pages; @@ -193,8 +220,13 @@ rebuild_st: return 0; err_sg: +#ifndef __NetBSD__ sg_mark_end(sg); +#endif err_pages: +#ifdef __NetBSD__ + uvm_obj_unwirepages(mapping, 0, obj->base.size); +#else mapping_clear_unevictable(mapping); pagevec_init(&pvec); for_each_sgt_page(page, sgt_iter, st) { @@ -203,6 +235,7 @@ err_pages: } if (pagevec_count(&pvec)) check_release_pagevec(&pvec); +#endif sg_free_table(st); kfree(st); @@ -238,6 +271,7 @@ shmem_truncate(struct drm_i915_gem_objec static void shmem_writeback(struct drm_i915_gem_object *obj) { +#ifndef __NetBSD__ struct address_space *mapping; struct writeback_control wbc = { .sync_mode = WB_SYNC_NONE, @@ -278,6 +312,7 @@ shmem_writeback(struct drm_i915_gem_obje put: put_page(page); } +#endif } void @@ -302,8 +337,10 @@ static void shmem_put_pages(struct drm_i915_gem_object *obj, struct sg_table *pages) { struct sgt_iter sgt_iter; +#ifndef __NetBSD__ struct pagevec pvec; struct page *page; +#endif __i915_gem_object_release_shmem(obj, pages, true); @@ -312,6 +349,10 @@ shmem_put_pages(struct drm_i915_gem_obje if (i915_gem_object_needs_bit17_swizzle(obj)) i915_gem_object_save_bit_17_swizzle(obj, pages); +#ifdef __NetBSD__ + __USE(sgt_iter); + uvm_obj_unwirepages(obj->base.filp, 0, obj->base.size); +#else mapping_clear_unevictable(file_inode(obj->base.filp)->i_mapping); pagevec_init(&pvec); @@ -327,6 +368,7 @@ shmem_put_pages(struct drm_i915_gem_obje } if (pagevec_count(&pvec)) check_release_pagevec(&pvec); +#endif obj->mm.dirty = false; sg_free_table(pages); @@ -337,7 +379,11 @@ static int shmem_pwrite(struct drm_i915_gem_object *obj, const struct drm_i915_gem_pwrite *arg) { +#ifdef __NetBSD__ + struct uvm_object *mapping = obj->base.filp; +#else struct address_space *mapping = obj->base.filp->f_mapping; +#endif char __user *user_data = u64_to_user_ptr(arg->data_ptr); u64 remain, offset; unsigned int pg; @@ -372,6 +418,24 @@ shmem_pwrite(struct drm_i915_gem_object offset = arg->offset; pg = offset_in_page(offset); +#ifdef __NetBSD__ + __USE(pg); + struct iovec iov = { .iov_base = user_data, .iov_len = remain }; + struct uio uio = { + .uio_iov = &iov, + .uio_iovcnt = 1, + .uio_offset = offset, + .uio_resid = remain, + .uio_rw = UIO_WRITE, + .uio_vmspace = curproc->p_vmspace, + }; + int ret; + + /* XXX errno NetBSD->Linux */ + ret = -ubc_uiomove(mapping, &uio, remain, UVM_ADV_NORMAL, UBC_WRITE); + if (ret) + return ret; +#else do { unsigned int len, unwritten; struct page *page; @@ -419,6 +483,7 @@ shmem_pwrite(struct drm_i915_gem_object offset += len; pg = 0; } while (remain); +#endif return 0; } @@ -454,7 +519,7 @@ static int __create_shmem(struct drm_i91 resource_size_t size) { #ifdef __NetBSD__ - return drm_gem_object_init(dev, obj, size); + return drm_gem_object_init(&i915->drm, obj, size); #else unsigned long flags = VM_NORESERVE; struct file *filp; @@ -502,9 +567,13 @@ create_shmem(struct intel_memory_region mask |= __GFP_DMA32; } +#ifdef __NetBSD__ + __USE(mapping); +#else mapping = obj->base.filp->f_mapping; mapping_set_gfp_mask(mapping, mask); GEM_BUG_ON(!(mapping_gfp_mask(mapping) & __GFP_RECLAIM)); +#endif i915_gem_object_init(obj, &i915_gem_shmem_ops, &lock_class); Index: src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c:1.3 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c:1.4 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c:1.3 Sun Dec 19 10:28:41 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_userptr.c,v 1.3 2021/12/19 10:28:41 riastradh Exp $ */ +/* $NetBSD: i915_gem_userptr.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_userptr.c,v 1.3 2021/12/19 10:28:41 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_userptr.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $"); #include <linux/mmu_context.h> #include <linux/mmu_notifier.h> @@ -22,8 +22,14 @@ __KERNEL_RCSID(0, "$NetBSD: i915_gem_use #include "i915_gem_object.h" #include "i915_scatterlist.h" +#include <linux/nbsd-namespace.h> + struct i915_mm_struct { +#ifdef __NetBSD__ + struct vmspace *mm; +#else struct mm_struct *mm; +#endif struct drm_i915_private *i915; struct i915_mmu_notifier *mn; struct hlist_node node; @@ -264,8 +270,13 @@ i915_gem_userptr_init__mmu_notifier(stru } static void +#ifdef __NetBSD__ +i915_mmu_notifier_free(struct i915_mmu_notifier *mn, + struct vmspace *mm) +#else i915_mmu_notifier_free(struct i915_mmu_notifier *mn, struct mm_struct *mm) +#endif { if (mn == NULL) return; @@ -300,15 +311,24 @@ i915_gem_userptr_init__mmu_notifier(stru } static void +#ifdef __NetBSD__ +i915_mmu_notifier_free(struct i915_mmu_notifier *mn, + struct vmspace *mm) +#else i915_mmu_notifier_free(struct i915_mmu_notifier *mn, struct mm_struct *mm) +#endif { } #endif static struct i915_mm_struct * +#ifdef __NetBSD__ +__i915_mm_struct_find(struct drm_i915_private *dev_priv, struct vmspace *real) +#else __i915_mm_struct_find(struct drm_i915_private *dev_priv, struct mm_struct *real) +#endif { struct i915_mm_struct *mm; @@ -338,7 +358,11 @@ i915_gem_userptr_init__mm_struct(struct * up. */ mutex_lock(&dev_priv->mm_lock); +#ifdef __NetBSD__ + mm = __i915_mm_struct_find(dev_priv, curproc->p_vmspace); +#else mm = __i915_mm_struct_find(dev_priv, current->mm); +#endif if (mm == NULL) { mm = kmalloc(sizeof(*mm), GFP_KERNEL); if (mm == NULL) { @@ -349,8 +373,12 @@ i915_gem_userptr_init__mm_struct(struct kref_init(&mm->kref); mm->i915 = to_i915(obj->base.dev); +#ifdef __NetBSD__ + mm->mm = curproc->p_vmspace; +#else mm->mm = current->mm; - mmgrab(current->mm); +#endif + mmgrab(mm->mm); mm->mn = NULL; @@ -464,7 +492,11 @@ __i915_gem_userptr_get_pages_worker(stru pvec = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL); if (pvec != NULL) { +#ifdef __NetBSD__ + struct vmspace *mm = obj->userptr.mm->mm; +#else struct mm_struct *mm = obj->userptr.mm->mm; +#endif unsigned int flags = 0; int locked = 0; @@ -566,7 +598,11 @@ __i915_gem_userptr_get_pages_schedule(st static int i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj) { const unsigned long num_pages = obj->base.size >> PAGE_SHIFT; +#ifdef __NetBSD__ + struct vmspace *mm = obj->userptr.mm->mm; +#else struct mm_struct *mm = obj->userptr.mm->mm; +#endif struct page **pvec; struct sg_table *pages; bool active; @@ -600,7 +636,12 @@ static int i915_gem_userptr_get_pages(st pvec = NULL; pinned = 0; - if (mm == current->mm) { +#ifdef __NetBSD__ + if (mm == curproc->p_vmspace) +#else + if (mm == current->mm) +#endif + { pvec = kvmalloc_array(num_pages, sizeof(struct page *), GFP_KERNEL | __GFP_NORETRY | Index: src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_rps.h diff -u src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_rps.h:1.2 src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_rps.h:1.3 --- src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_rps.h:1.2 Sat Dec 18 23:45:30 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gt/intel_rps.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: intel_rps.h,v 1.2 2021/12/18 23:45:30 riastradh Exp $ */ +/* $NetBSD: intel_rps.h,v 1.3 2021/12/19 11:33:49 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -38,4 +38,6 @@ void gen5_rps_irq_handler(struct intel_r void gen6_rps_irq_handler(struct intel_rps *rps, u32 pm_iir); void gen11_rps_irq_handler(struct intel_rps *rps, u32 pm_iir); +extern spinlock_t mchdev_lock; + #endif /* INTEL_RPS_H */ Index: src/sys/external/bsd/drm2/i915drm/files.i915drmkms diff -u src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.69 src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.70 --- src/sys/external/bsd/drm2/i915drm/files.i915drmkms:1.69 Sun Dec 19 11:32:17 2021 +++ src/sys/external/bsd/drm2/i915drm/files.i915drmkms Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -# $NetBSD: files.i915drmkms,v 1.69 2021/12/19 11:32:17 riastradh Exp $ +# $NetBSD: files.i915drmkms,v 1.70 2021/12/19 11:33:49 riastradh Exp $ version 20180827 @@ -29,6 +29,8 @@ makeoptions i915drmkms "CPPFLAGS.i915drm makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_FBDEV=1" makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_GVT=0" makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT=0" +makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_DEBUG_MMIO=1" # XXX +makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_FORCE_PROBE=0" makeoptions i915drmkms "CWARNFLAGS.i915drmkms"+="-Wno-missing-field-initializers" makeoptions i915drmkms "CWARNFLAGS.i915drmkms"+="-Wno-pointer-arith" @@ -132,7 +134,7 @@ file external/bsd/drm2/dist/drm/i915/gem file external/bsd/drm2/dist/drm/i915/gem/i915_gem_stolen.c i915drmkms file external/bsd/drm2/dist/drm/i915/gem/i915_gem_throttle.c i915drmkms file external/bsd/drm2/dist/drm/i915/gem/i915_gem_tiling.c i915drmkms -file external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c i915drmkms +#file external/bsd/drm2/dist/drm/i915/gem/i915_gem_userptr.c i915drmkms file external/bsd/drm2/dist/drm/i915/gem/i915_gem_wait.c i915drmkms #file external/bsd/drm2/dist/drm/i915/gem/i915_gemfs.c i915drmkms #file external/bsd/drm2/dist/drm/i915/gt/debugfs_engines.c i915drmkms Index: src/sys/external/bsd/drm2/i915drm/i915_gem_userptr.c diff -u src/sys/external/bsd/drm2/i915drm/i915_gem_userptr.c:1.3 src/sys/external/bsd/drm2/i915drm/i915_gem_userptr.c:1.4 --- src/sys/external/bsd/drm2/i915drm/i915_gem_userptr.c:1.3 Sun Dec 19 11:31:33 2021 +++ src/sys/external/bsd/drm2/i915drm/i915_gem_userptr.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_userptr.c,v 1.3 2021/12/19 11:31:33 riastradh Exp $ */ +/* $NetBSD: i915_gem_userptr.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,17 +30,22 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_userptr.c,v 1.3 2021/12/19 11:31:33 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_userptr.c,v 1.4 2021/12/19 11:33:49 riastradh Exp $"); #include "i915_drv.h" #include "../dist/drm/i915/gem/i915_gem_ioctls.h" int -i915_gem_init_userptr(struct drm_i915_private *dev_priv) +i915_gem_init_userptr(struct drm_i915_private *i915) { return 0; } +void +i915_gem_cleanup_userptr(struct drm_i915_private *i915) +{ +} + int i915_gem_userptr_ioctl(struct drm_device *dev, void *data, struct drm_file *file) Index: src/sys/external/bsd/drm2/i915drm/i915_module.c diff -u src/sys/external/bsd/drm2/i915drm/i915_module.c:1.13 src/sys/external/bsd/drm2/i915drm/i915_module.c:1.14 --- src/sys/external/bsd/drm2/i915drm/i915_module.c:1.13 Sun Dec 19 11:27:12 2021 +++ src/sys/external/bsd/drm2/i915drm/i915_module.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_module.c,v 1.13 2021/12/19 11:27:12 riastradh Exp $ */ +/* $NetBSD: i915_module.c,v 1.14 2021/12/19 11:33:49 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_module.c,v 1.13 2021/12/19 11:27:12 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_module.c,v 1.14 2021/12/19 11:33:49 riastradh Exp $"); #include <sys/types.h> #include <sys/module.h> @@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: i915_module. #include <drm/drm_sysctl.h> #include "i915_drv.h" +#include "gt/intel_rps.h" MODULE(MODULE_CLASS_DRIVER, i915drmkms, "drmkms,drmkms_pci"); /* XXX drmkms_i2c */ Index: src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c diff -u src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c:1.4 src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c:1.5 --- src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c:1.4 Sun Dec 19 11:05:12 2021 +++ src/sys/external/bsd/drm2/i915drm/i915_pci_autoconf.c Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_pci_autoconf.c,v 1.4 2021/12/19 11:05:12 riastradh Exp $ */ +/* $NetBSD: i915_pci_autoconf.c,v 1.5 2021/12/19 11:33:49 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_pci_autoconf.c,v 1.4 2021/12/19 11:05:12 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_pci_autoconf.c,v 1.5 2021/12/19 11:33:49 riastradh Exp $"); #include <sys/types.h> #include <sys/queue.h> @@ -38,6 +38,8 @@ __KERNEL_RCSID(0, "$NetBSD: i915_pci_aut #include <sys/queue.h> #include <sys/workqueue.h> +#include <drm/drm_pci.h> + #include "i915_drv.h" #include "i915_pci.h" @@ -111,7 +113,7 @@ i915drmkms_pci_lookup(const struct pci_a const struct intel_device_info *const info = (const void *)(uintptr_t)i915_device_ids[i].driver_data; - if (IS_ALPHA_SUPPORT(info)) { + if (info->require_force_probe) { printf("i915drmkms: preliminary hardware support disabled\n"); return NULL; } Index: src/sys/external/bsd/drm2/include/asm/cpufeature.h diff -u src/sys/external/bsd/drm2/include/asm/cpufeature.h:1.7 src/sys/external/bsd/drm2/include/asm/cpufeature.h:1.8 --- src/sys/external/bsd/drm2/include/asm/cpufeature.h:1.7 Sun Dec 19 01:25:05 2021 +++ src/sys/external/bsd/drm2/include/asm/cpufeature.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: cpufeature.h,v 1.7 2021/12/19 01:25:05 riastradh Exp $ */ +/* $NetBSD: cpufeature.h,v 1.8 2021/12/19 11:33:49 riastradh Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -36,6 +36,8 @@ #if defined(__i386__) || defined(__x86_64__) +#include <x86/specialreg.h> + #define cpu_has_clflush ((cpu_info_primary.ci_feat_val[0] & CPUID_CLFSH) != 0) #define cpu_has_pat ((cpu_info_primary.ci_feat_val[0] & CPUID_PAT) != 0) Index: src/sys/external/bsd/drm2/include/linux/fs.h diff -u src/sys/external/bsd/drm2/include/linux/fs.h:1.6 src/sys/external/bsd/drm2/include/linux/fs.h:1.7 --- src/sys/external/bsd/drm2/include/linux/fs.h:1.6 Sun Dec 19 10:37:40 2021 +++ src/sys/external/bsd/drm2/include/linux/fs.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: fs.h,v 1.6 2021/12/19 10:37:40 riastradh Exp $ */ +/* $NetBSD: fs.h,v 1.7 2021/12/19 11:33:49 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -39,4 +39,10 @@ #include <linux/err.h> #include <linux/wait_bit.h> +static inline struct uvm_object * +file_inode(struct uvm_object *uobj) +{ + return uobj; +} + #endif /* _LINUX_FS_H_ */ Index: src/sys/external/bsd/drm2/include/linux/interrupt.h diff -u src/sys/external/bsd/drm2/include/linux/interrupt.h:1.8 src/sys/external/bsd/drm2/include/linux/interrupt.h:1.9 --- src/sys/external/bsd/drm2/include/linux/interrupt.h:1.8 Sun Dec 19 10:37:25 2021 +++ src/sys/external/bsd/drm2/include/linux/interrupt.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: interrupt.h,v 1.8 2021/12/19 10:37:25 riastradh Exp $ */ +/* $NetBSD: interrupt.h,v 1.9 2021/12/19 11:33:49 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -44,6 +44,8 @@ #define disable_irq linux_disable_irq #define enable_irq linux_enable_irq +typedef irqreturn_t (*irq_handler_t)(void *); + void disable_irq(int); void enable_irq(int); Index: src/sys/external/bsd/drm2/include/linux/ktime.h diff -u src/sys/external/bsd/drm2/include/linux/ktime.h:1.15 src/sys/external/bsd/drm2/include/linux/ktime.h:1.16 --- src/sys/external/bsd/drm2/include/linux/ktime.h:1.15 Sun Dec 19 01:58:18 2021 +++ src/sys/external/bsd/drm2/include/linux/ktime.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: ktime.h,v 1.15 2021/12/19 01:58:18 riastradh Exp $ */ +/* $NetBSD: ktime.h,v 1.16 2021/12/19 11:33:49 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -144,6 +144,12 @@ ktime_get_raw_ns(void) return ktime_to_ns(ktime_get_raw()); } +static inline uint64_t +ktime_get_mono_fast_ns(void) +{ + return ktime_get_raw_ns(); +} + static inline ktime_t ktime_get_monotonic_offset(void) { Index: src/sys/external/bsd/drm2/include/linux/mm.h diff -u src/sys/external/bsd/drm2/include/linux/mm.h:1.20 src/sys/external/bsd/drm2/include/linux/mm.h:1.21 --- src/sys/external/bsd/drm2/include/linux/mm.h:1.20 Sun Dec 19 10:51:31 2021 +++ src/sys/external/bsd/drm2/include/linux/mm.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: mm.h,v 1.20 2021/12/19 10:51:31 riastradh Exp $ */ +/* $NetBSD: mm.h,v 1.21 2021/12/19 11:33:49 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -87,8 +87,16 @@ vm_mmap(struct file *file __unused, unsi } static inline unsigned long +totalram_pages(void) +{ + + return uvmexp.npages; +} + +static inline unsigned long get_num_physpages(void) { + return uvmexp.npages; } Index: src/sys/external/bsd/drm2/include/linux/pagemap.h diff -u src/sys/external/bsd/drm2/include/linux/pagemap.h:1.5 src/sys/external/bsd/drm2/include/linux/pagemap.h:1.6 --- src/sys/external/bsd/drm2/include/linux/pagemap.h:1.5 Sun Dec 19 11:15:26 2021 +++ src/sys/external/bsd/drm2/include/linux/pagemap.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: pagemap.h,v 1.5 2021/12/19 11:15:26 riastradh Exp $ */ +/* $NetBSD: pagemap.h,v 1.6 2021/12/19 11:33:49 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -34,9 +34,12 @@ #include <sys/types.h> +#include <linux/gfp.h> #include <linux/highmem.h> #include <linux/uaccess.h> +struct uvm_object; + static inline int fault_in_multipages_readable(const char *uaddr __unused, size_t len __unused) { @@ -49,4 +52,10 @@ fault_in_multipages_writeable(char *uadd return 0; } +static inline gfp_t +mapping_gfp_mask(struct uvm_object *uobj __unused) +{ + return GFP_KERNEL; +} + #endif /* _LINUX_PAGEMAP_H_ */ Index: src/sys/external/bsd/drm2/include/linux/scatterlist.h diff -u src/sys/external/bsd/drm2/include/linux/scatterlist.h:1.4 src/sys/external/bsd/drm2/include/linux/scatterlist.h:1.5 --- src/sys/external/bsd/drm2/include/linux/scatterlist.h:1.4 Sun Dec 19 11:33:31 2021 +++ src/sys/external/bsd/drm2/include/linux/scatterlist.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: scatterlist.h,v 1.4 2021/12/19 11:33:31 riastradh Exp $ */ +/* $NetBSD: scatterlist.h,v 1.5 2021/12/19 11:33:49 riastradh Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -40,6 +40,7 @@ #include <linux/types.h> /* namespace */ +#define __sg_alloc_table_from_pages linux___sg_alloc_table_from_pages #define dma_map_sg linux_dma_map_sg #define dma_map_sg_attrs linux_dma_map_sg_attrs #define dma_unmap_sg linux_dma_unmap_sg @@ -61,6 +62,8 @@ struct sg_table { }; int sg_alloc_table(struct sg_table *, unsigned, gfp_t); +int __sg_alloc_table_from_pages(struct sg_table *, struct page **, unsigned, + bus_size_t, bus_size_t, unsigned, gfp_t); int sg_alloc_table_from_pages(struct sg_table *, struct page **, unsigned, bus_size_t, bus_size_t, gfp_t); int sg_alloc_table_from_bus_dmamem(struct sg_table *, bus_dma_tag_t, Index: src/sys/external/bsd/drm2/include/linux/shmem_fs.h diff -u src/sys/external/bsd/drm2/include/linux/shmem_fs.h:1.2 src/sys/external/bsd/drm2/include/linux/shmem_fs.h:1.3 --- src/sys/external/bsd/drm2/include/linux/shmem_fs.h:1.2 Tue Mar 18 18:20:43 2014 +++ src/sys/external/bsd/drm2/include/linux/shmem_fs.h Sun Dec 19 11:33:49 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: shmem_fs.h,v 1.2 2014/03/18 18:20:43 riastradh Exp $ */ +/* $NetBSD: shmem_fs.h,v 1.3 2021/12/19 11:33:49 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -32,4 +32,55 @@ #ifndef _LINUX_SHMEM_FS_H_ #define _LINUX_SHMEM_FS_H_ +#include <sys/types.h> +#include <sys/param.h> + +#include <sys/rwlock.h> + +#include <lib/libkern/libkern.h> + +#include <uvm/uvm_extern.h> + +#include <linux/err.h> +#include <linux/gfp.h> +#include <linux/mm_types.h> + +static inline struct page * +shmem_read_mapping_page_gfp(struct uvm_object *uobj, voff_t i, gfp_t gfp) +{ + struct vm_page *vm_page; + int error; + + error = uvm_obj_wirepages(uobj, i*PAGE_SIZE, (i + 1)*PAGE_SIZE, NULL); + if (error) + return ERR_PTR(-error); /* XXX errno NetBSD->Linux */ + + rw_enter(uobj->vmobjlock, RW_READER); + vm_page = uvm_pagelookup(uobj, i*PAGE_SIZE); + rw_exit(uobj->vmobjlock); + + KASSERT(vm_page); + return container_of(vm_page, struct page, p_vmp); +} + +static inline struct page * +shmem_read_mapping_page(struct uvm_object *uobj, voff_t i) +{ + return shmem_read_mapping_page_gfp(uobj, i, GFP_KERNEL); +} + +static inline void +shmem_truncate_range(struct uvm_object *uobj, voff_t start, voff_t end) +{ + int flags = PGO_FREE; + + if (start == 0 && end == -1) { + flags |= PGO_ALLPAGES; + } else { + KASSERT(0 <= start); + KASSERT(start <= end); + } + (*uobj->pgops->pgo_put)(uobj, start, end, flags); +} + #endif /* _LINUX_SHMEM_FS_H_ */ Index: src/sys/external/bsd/drm2/include/linux/sched/mm.h diff -u src/sys/external/bsd/drm2/include/linux/sched/mm.h:1.1 src/sys/external/bsd/drm2/include/linux/sched/mm.h:1.2 --- src/sys/external/bsd/drm2/include/linux/sched/mm.h:1.1 Sun Dec 19 00:31:27 2021 +++ src/sys/external/bsd/drm2/include/linux/sched/mm.h Sun Dec 19 11:33:50 2021 @@ -0,0 +1,48 @@ +/* $NetBSD: mm.h,v 1.2 2021/12/19 11:33:50 riastradh Exp $ */ + +/*- + * Copyright (c) 2021 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _LINUX_SCHED_MM_H_ +#define _LINUX_SCHED_MM_H_ + +#include <sys/types.h> + +#include <uvm/uvm_extern.h> + +static inline void +mmgrab(struct vmspace *vm) +{ + uvmspace_addref(vm); +} + +static inline void +mmdrop(struct vmspace *vm) +{ + uvmspace_free(vm); +} + +#endif /* _LINUX_SCHED_MM_H_ */ Index: src/sys/external/bsd/drm2/linux/linux_sg.c diff -u src/sys/external/bsd/drm2/linux/linux_sg.c:1.1 src/sys/external/bsd/drm2/linux/linux_sg.c:1.2 --- src/sys/external/bsd/drm2/linux/linux_sg.c:1.1 Sun Dec 19 11:33:31 2021 +++ src/sys/external/bsd/drm2/linux/linux_sg.c Sun Dec 19 11:33:50 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_sg.c,v 1.1 2021/12/19 11:33:31 riastradh Exp $ */ +/* $NetBSD: linux_sg.c,v 1.2 2021/12/19 11:33:50 riastradh Exp $ */ /*- * Copyright (c) 2021 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_sg.c,v 1.1 2021/12/19 11:33:31 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_sg.c,v 1.2 2021/12/19 11:33:50 riastradh Exp $"); #include <sys/bus.h> #include <sys/errno.h> @@ -54,8 +54,9 @@ sg_alloc_table(struct sg_table *sgt, uns } int -sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pgs, - unsigned npgs, bus_size_t offset, bus_size_t size, gfp_t gfp) +__sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pgs, + unsigned npgs, bus_size_t offset, bus_size_t size, unsigned maxseg, + gfp_t gfp) { unsigned i; int ret; @@ -74,6 +75,15 @@ sg_alloc_table_from_pages(struct sg_tabl } int +sg_alloc_table_from_pages(struct sg_table *sgt, struct page **pgs, + unsigned npgs, bus_size_t offset, bus_size_t size, gfp_t gfp) +{ + + return __sg_alloc_table_from_pages(sgt, pgs, npgs, offset, size, + -1, gfp); +} + +int sg_alloc_table_from_bus_dmamem(struct sg_table *sgt, bus_dma_tag_t dmat, const bus_dma_segment_t *seg, int nseg, gfp_t gfp) {