diff --git a/sys/external/bsd/drm2/dist/drm/i915/i915_cmd_parser.c b/sys/external/bsd/drm2/dist/drm/i915/i915_cmd_parser.c index f5a9e57a3ea4..0b5f1bc2c242 100644 --- a/sys/external/bsd/drm2/dist/drm/i915/i915_cmd_parser.c +++ b/sys/external/bsd/drm2/dist/drm/i915/i915_cmd_parser.c @@ -861,7 +861,7 @@ find_reg(const struct drm_i915_reg_descriptor *table, } static u32 *vmap_batch(struct drm_i915_gem_object *obj, - unsigned start, unsigned len) + unsigned start, unsigned len, unsigned *mapped_len) { #ifdef __NetBSD__ /* Round to an integral number of pages starting on page boundary. */ @@ -880,6 +880,7 @@ static u32 *vmap_batch(struct drm_i915_gem_object *obj, uao_reference(obj->base.filp); /* Caller will take care of finding the offset in the page. */ + *mapped_len = len0; return (void *)va; #else int i; @@ -920,8 +921,9 @@ finish: static u32 *copy_batch(struct drm_i915_gem_object *dest_obj, struct drm_i915_gem_object *src_obj, u32 batch_start_offset, - u32 batch_len) + u32 batch_len, u32 *mapped_len) { + unsigned src_mapped_len; int needs_clflush = 0; void *src_base, *src; void *dst = NULL; @@ -940,7 +942,8 @@ static u32 *copy_batch(struct drm_i915_gem_object *dest_obj, return ERR_PTR(ret); } - src_base = vmap_batch(src_obj, batch_start_offset, batch_len); + src_base = vmap_batch(src_obj, batch_start_offset, batch_len, + &src_mapped_len); if (!src_base) { DRM_DEBUG_DRIVER("CMD: Failed to vmap batch\n"); ret = -ENOMEM; @@ -953,7 +956,7 @@ static u32 *copy_batch(struct drm_i915_gem_object *dest_obj, goto unmap_src; } - dst = vmap_batch(dest_obj, 0, batch_len); + dst = vmap_batch(dest_obj, 0, batch_len, mapped_len); if (!dst) { DRM_DEBUG_DRIVER("CMD: Failed to vmap shadow batch\n"); ret = -ENOMEM; @@ -968,7 +971,10 @@ static u32 *copy_batch(struct drm_i915_gem_object *dest_obj, unmap_src: #ifdef __NetBSD__ - uvm_unmap(kernel_map, (vaddr_t)src_base, batch_len); + { + vaddr_t start0 = (vaddr_t)src_base; + uvm_unmap(kernel_map, start0, start0 + src_mapped_len); + } #else vunmap(src_base); #endif @@ -1145,13 +1151,14 @@ int i915_parse_cmds(struct intel_engine_cs *ring, bool is_master) { u32 *cmd, *batch_base, *batch_end; + unsigned mapped_len; static const struct drm_i915_cmd_descriptor zero_default_desc; struct drm_i915_cmd_descriptor default_desc = zero_default_desc; bool oacontrol_set = false; /* OACONTROL tracking. See check_cmd() */ int ret = 0; batch_base = copy_batch(shadow_batch_obj, batch_obj, - batch_start_offset, batch_len); + batch_start_offset, batch_len, &mapped_len); if (IS_ERR(batch_base)) { DRM_DEBUG_DRIVER("CMD: Failed to copy batch\n"); return PTR_ERR(batch_base); @@ -1224,7 +1231,8 @@ int i915_parse_cmds(struct intel_engine_cs *ring, } #ifdef __NetBSD__ - uvm_unmap(kernel_map, (vaddr_t)batch_base, batch_obj->base.size); + vaddr_t start0 = (vaddr_t)batch_base; + uvm_unmap(kernel_map, start0, start0 + mapped_len); #else vunmap(batch_base); #endif