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)
{