Module Name: src Committed By: riastradh Date: Sun Dec 19 12:08:36 UTC 2021
Modified Files: src/sys/external/bsd/drm2/dist/drm/i915/gem: i915_gem_mman.c Log Message: i915: Use global uoffset in i915 address space, not per-object. This is a little sleazy but it enables us to pass the page range through to the fault routine, which wants it in order to find the memory mapping type. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 \ 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.15 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.16 --- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c:1.15 Sun Dec 19 12:08:27 2021 +++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c Sun Dec 19 12:08:36 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_mman.c,v 1.15 2021/12/19 12:08:27 riastradh Exp $ */ +/* $NetBSD: i915_gem_mman.c,v 1.16 2021/12/19 12:08:36 riastradh Exp $ */ /* * SPDX-License-Identifier: MIT @@ -7,7 +7,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.15 2021/12/19 12:08:27 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.16 2021/12/19 12:08:36 riastradh Exp $"); #include <linux/anon_inodes.h> #include <linux/mman.h> @@ -338,6 +338,8 @@ static vm_fault_t vm_fault_cpu(struct vm paddr_t paddr; int i; + startpage -= drm_vma_node_start(&mmo->vma_node); + for (i = 0; i < npages; i++) { if ((flags & PGO_ALLPAGES) == 0 && i != centeridx) continue; @@ -409,6 +411,7 @@ static vm_fault_t vm_fault_gtt(struct vm #ifdef __NetBSD__ page_offset = (ufi->entry->offset + (vaddr - ufi->entry->start)) >> PAGE_SHIFT; + page_offset -= drm_vma_node_start(&mmo->vma_node); #else /* We don't use vmf->pgoff since that has the fake offset */ page_offset = (vmf->address - area->vm_start) >> PAGE_SHIFT; @@ -566,16 +569,6 @@ i915_gem_fault(struct uvm_faultinfo *ufi KASSERT(ufi->entry->start <= vaddr); KASSERT((ufi->entry->offset & (PAGE_SIZE - 1)) == 0); - KASSERT(ufi->entry->offset <= obj->base.size); - KASSERT((vaddr - ufi->entry->start) <= - (obj->base.size - ufi->entry->offset)); - KASSERTMSG(((size_t)npages << PAGE_SHIFT <= - ((obj->base.size - ufi->entry->offset) - - (vaddr - ufi->entry->start))), - "vaddr=%jx npages=%d obj=%p size=%zu" - " start=%jx offset=%jx", - (uintmax_t)vaddr, npages, obj, obj->base.size, - (uintmax_t)ufi->entry->start, (uintmax_t)ufi->entry->offset); uoffset = ufi->entry->offset + (vaddr - ufi->entry->start); startpage = uoffset >> PAGE_SHIFT; @@ -601,9 +594,14 @@ i915_gem_fault(struct uvm_faultinfo *ufi * without unmapping first! */ KASSERT(node); - KASSERTMSG(startpage == drm_vma_node_start(node), - "map startpage=%lx, node startpage=%lx", - startpage, drm_vma_node_start(node)); + KASSERTMSG((ufi->entry->offset >> PAGE_SHIFT == + drm_vma_node_start(node)), + /* + * Always provided by i915_gem_mmap_object, but in + * principle we could relax this. + */ + "map startpage=%lx =/= node startpage=%lx", + ufi->entry->offset >> PAGE_SHIFT, drm_vma_node_start(node)); mmo = container_of(node, struct i915_mmap_offset, vma_node); KASSERT(obj == mmo->obj); @@ -1078,7 +1076,7 @@ i915_gem_mmap_object(struct drm_device * /* Success! */ *uobjp = &obj->base.gemo_uvmobj; - *uoffsetp = 0; + *uoffsetp = (voff_t)startpage << PAGE_SHIFT; return 0; }