Let's bring a bit of clarity on this 'region' field that is part of vm_bind operation struct. Rename and document to make it more than obvious that it is a region instance and not a mask and also that it should only be used with the prefetch operation itself.
Unified · Split
| @@ -2160,7 +2160,8 @@ static void print_op(struct xe_device *xe, struct drm_gpuva_op *op) · 2159 unmodified lines | |||
| 2160 | static struct drm_gpuva_ops * | 2160 | static struct drm_gpuva_ops * |
| 2161 | vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_bo *bo, | 2161 | vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_bo *bo, |
| 2162 | u64 bo_offset_or_userptr, u64 addr, u64 range, | 2162 | u64 bo_offset_or_userptr, u64 addr, u64 range, |
| 2163 | u32 operation, u32 flags, u8 tile_mask, u32 region) | 2163 | u32 operation, u32 flags, u8 tile_mask, |
| 2164 | u32 prefetch_region) | ||
| 2164 | { | 2165 | { |
| 2165 | struct drm_gem_object *obj = bo ? &bo->ttm.base : NULL; | 2166 | struct drm_gem_object *obj = bo ? &bo->ttm.base : NULL; |
| 2166 | struct drm_gpuva_ops *ops; | 2167 | struct drm_gpuva_ops *ops; |
| @@ -2215,7 +2216,7 @@ vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_bo *bo, · 48 unmodified lines | |||
| 2215 | struct xe_vma_op *op = gpuva_op_to_vma_op(__op); | 2216 | struct xe_vma_op *op = gpuva_op_to_vma_op(__op); |
| 2216 | 2217 | ||
| 2217 | op->tile_mask = tile_mask; | 2218 | op->tile_mask = tile_mask; |
| 2218 | op->prefetch.region = region; | 2219 | op->prefetch.region = prefetch_region; |
| 2219 | } | 2220 | } |
| 2220 | break; | 2221 | break; |
| 2221 | case DRM_XE_VM_BIND_OP_UNMAP_ALL: | 2222 | case DRM_XE_VM_BIND_OP_UNMAP_ALL: |
| @@ -2881,7 +2882,7 @@ static int vm_bind_ioctl_check_args(struct xe_device *xe, · 659 unmodified lines | |||
| 2881 | u32 flags = (*bind_ops)[i].flags; | 2882 | u32 flags = (*bind_ops)[i].flags; |
| 2882 | u32 obj = (*bind_ops)[i].obj; | 2883 | u32 obj = (*bind_ops)[i].obj; |
| 2883 | u64 obj_offset = (*bind_ops)[i].obj_offset; | 2884 | u64 obj_offset = (*bind_ops)[i].obj_offset; |
| 2884 | u32 region = (*bind_ops)[i].region; | 2885 | u32 prefetch_region = (*bind_ops)[i].prefetch_mem_region_instance; |
| 2885 | bool is_null = flags & DRM_XE_VM_BIND_FLAG_NULL; | 2886 | bool is_null = flags & DRM_XE_VM_BIND_FLAG_NULL; |
| 2886 | 2887 | ||
| 2887 | if (i == 0) { | 2888 | if (i == 0) { |
| @@ -2915,9 +2916,9 @@ static int vm_bind_ioctl_check_args(struct xe_device *xe, · 27 unmodified lines | |||
| 2915 | op == DRM_XE_VM_BIND_OP_MAP_USERPTR) || | 2916 | op == DRM_XE_VM_BIND_OP_MAP_USERPTR) || |
| 2916 | XE_IOCTL_DBG(xe, obj && | 2917 | XE_IOCTL_DBG(xe, obj && |
| 2917 | op == DRM_XE_VM_BIND_OP_PREFETCH) || | 2918 | op == DRM_XE_VM_BIND_OP_PREFETCH) || |
| 2918 | XE_IOCTL_DBG(xe, region && | 2919 | XE_IOCTL_DBG(xe, prefetch_region && |
| 2919 | op != DRM_XE_VM_BIND_OP_PREFETCH) || | 2920 | op != DRM_XE_VM_BIND_OP_PREFETCH) || |
| 2920 | XE_IOCTL_DBG(xe, !(BIT(region) & | 2921 | XE_IOCTL_DBG(xe, !(BIT(prefetch_region) & |
| 2921 | xe->info.mem_region_mask)) || | 2922 | xe->info.mem_region_mask)) || |
| 2922 | XE_IOCTL_DBG(xe, obj && | 2923 | XE_IOCTL_DBG(xe, obj && |
| 2923 | op == DRM_XE_VM_BIND_OP_UNMAP)) { | 2924 | op == DRM_XE_VM_BIND_OP_UNMAP)) { |
| @@ -3099,11 +3100,11 @@ int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file) · 175 unmodified lines | |||
| 3099 | u32 flags = bind_ops[i].flags; | 3100 | u32 flags = bind_ops[i].flags; |
| 3100 | u64 obj_offset = bind_ops[i].obj_offset; | 3101 | u64 obj_offset = bind_ops[i].obj_offset; |
| 3101 | u8 tile_mask = bind_ops[i].tile_mask; | 3102 | u8 tile_mask = bind_ops[i].tile_mask; |
| 3102 | u32 region = bind_ops[i].region; | 3103 | u32 prefetch_region = bind_ops[i].prefetch_mem_region_instance; |
| 3103 | 3104 | ||
| 3104 | ops[i] = vm_bind_ioctl_ops_create(vm, bos[i], obj_offset, | 3105 | ops[i] = vm_bind_ioctl_ops_create(vm, bos[i], obj_offset, |
| 3105 | addr, range, op, flags, | 3106 | addr, range, op, flags, |
| 3106 | tile_mask, region); | 3107 | tile_mask, prefetch_region); |
| 3107 | if (IS_ERR(ops[i])) { | 3108 | if (IS_ERR(ops[i])) { |
| 3108 | err = PTR_ERR(ops[i]); | 3109 | err = PTR_ERR(ops[i]); |
| 3109 | ops[i] = NULL; | 3110 | ops[i] = NULL; |
| @@ -673,8 +673,12 @@ struct drm_xe_vm_bind_op { · 672 unmodified lines | |||
| 673 | /** @flags: Bind flags */ | 673 | /** @flags: Bind flags */ |
| 674 | __u32 flags; | 674 | __u32 flags; |
| 675 | 675 | ||
| 676 | /** @mem_region: Memory region to prefetch VMA to, instance not a mask */ | 676 | /** |
| 677 | __u32 region; | 677 | * @prefetch_mem_region_instance: Memory region to prefetch VMA to. |
| 678 | * It is a region instance, not a mask. | ||
| 679 | * To be used only with %DRM_XE_VM_BIND_OP_PREFETCH operation. | ||
| 680 | */ | ||
| 681 | __u32 prefetch_mem_region_instance; | ||
| 678 | 682 | ||
| 679 | /** @reserved: Reserved */ | 683 | /** @reserved: Reserved */ |
| 680 | __u64 reserved[2]; | 684 | __u64 reserved[2]; |