Module Name: src Committed By: riastradh Date: Sun Dec 19 11:58:17 UTC 2021
Modified Files: src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_mman.c Log Message: i915: Draft i915_gem_mmap_object. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 \ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.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/drm2/dist/drm/i915/gem/i915_gem_mman.c diff -u src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.9 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.10 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.9 Sun Dec 19 11:57:42 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c Sun Dec 19 11:58:16 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_mman.c,v 1.9 2021/12/19 11:57:42 riastradh Exp $ */ +/* $NetBSD: i915_gem_mman.c,v 1.10 2021/12/19 11:58:16 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,13 +7,15 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.9 2021/12/19 11:57:42 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.10 2021/12/19 11:58:16 riastradh Exp $"); #include <linux/anon_inodes.h> #include <linux/mman.h> #include <linux/pfn_t.h> #include <linux/sizes.h> +#include "drm/drm_gem.h" + #include "gt/intel_gt.h" #include "gt/intel_gt_requests.h" @@ -1023,8 +1025,46 @@ int i915_gem_mmap_object(struct drm_device *dev, off_t byte_offset, size_t nbytes, int prot, struct uvm_object **uobjp, voff_t *uoffsetp, struct file *fp) { - __USE(i915_gem_fault); - panic("NYI"); + const unsigned long startpage = byte_offset >> PAGE_SHIFT; + const unsigned long npages = nbytes >> PAGE_SHIFT; + struct drm_file *file = fp->f_data; + struct drm_vma_offset_node *node; + struct drm_i915_gem_object *obj = NULL; + struct i915_mmap_offset *mmo = NULL; + + if (drm_dev_is_unplugged(dev)) + return -ENODEV; + + rcu_read_lock(); + drm_vma_offset_lock_lookup(dev->vma_offset_manager); + node = drm_vma_offset_exact_lookup_locked(dev->vma_offset_manager, + startpage, npages); + if (node && drm_vma_node_is_allowed(node, file)) { + /* + * Skip 0-refcnted objects as it is in the process of being + * destroyed and will be invalid when the vma manager lock + * is released. + */ + mmo = container_of(node, struct i915_mmap_offset, vma_node); + obj = i915_gem_object_get_rcu(mmo->obj); + } + drm_vma_offset_unlock_lookup(dev->vma_offset_manager); + rcu_read_unlock(); + if (!obj) + return node ? -EACCES : -EINVAL; + + if (i915_gem_object_is_readonly(obj)) { + if (prot & VM_PROT_WRITE) { + i915_gem_object_put(obj); + return -EINVAL; + } + } + + /* Success! */ + drm_gem_object_get(&obj->base); + *uobjp = &obj->base.gemo_uvmobj; + *uoffsetp = 0; + return 0; } #else