mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-30 06:02:14 -04:00
Merge tag 'drm-xe-fixes-2026-03-26' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-fixes
- Fix UAF in SRIOV migration restore (Winiarski) - Updates to HW W/a (Roper) - VMBind remap fix (Auld) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patch.msgid.link/acUgq2q2DrCUzFql@intel.com
This commit is contained in:
@@ -553,6 +553,7 @@
|
||||
#define ENABLE_SMP_LD_RENDER_SURFACE_CONTROL REG_BIT(44 - 32)
|
||||
#define FORCE_SLM_FENCE_SCOPE_TO_TILE REG_BIT(42 - 32)
|
||||
#define FORCE_UGM_FENCE_SCOPE_TO_TILE REG_BIT(41 - 32)
|
||||
#define L3_128B_256B_WRT_DIS REG_BIT(40 - 32)
|
||||
#define MAXREQS_PER_BANK REG_GENMASK(39 - 32, 37 - 32)
|
||||
#define DISABLE_128B_EVICTION_COMMAND_UDW REG_BIT(36 - 32)
|
||||
|
||||
|
||||
@@ -1442,9 +1442,9 @@ static int op_check_svm_userptr(struct xe_vm *vm, struct xe_vma_op *op,
|
||||
err = vma_check_userptr(vm, op->map.vma, pt_update);
|
||||
break;
|
||||
case DRM_GPUVA_OP_REMAP:
|
||||
if (op->remap.prev)
|
||||
if (op->remap.prev && !op->remap.skip_prev)
|
||||
err = vma_check_userptr(vm, op->remap.prev, pt_update);
|
||||
if (!err && op->remap.next)
|
||||
if (!err && op->remap.next && !op->remap.skip_next)
|
||||
err = vma_check_userptr(vm, op->remap.next, pt_update);
|
||||
break;
|
||||
case DRM_GPUVA_OP_UNMAP:
|
||||
@@ -2198,12 +2198,12 @@ static int op_prepare(struct xe_vm *vm,
|
||||
|
||||
err = unbind_op_prepare(tile, pt_update_ops, old);
|
||||
|
||||
if (!err && op->remap.prev) {
|
||||
if (!err && op->remap.prev && !op->remap.skip_prev) {
|
||||
err = bind_op_prepare(vm, tile, pt_update_ops,
|
||||
op->remap.prev, false);
|
||||
pt_update_ops->wait_vm_bookkeep = true;
|
||||
}
|
||||
if (!err && op->remap.next) {
|
||||
if (!err && op->remap.next && !op->remap.skip_next) {
|
||||
err = bind_op_prepare(vm, tile, pt_update_ops,
|
||||
op->remap.next, false);
|
||||
pt_update_ops->wait_vm_bookkeep = true;
|
||||
@@ -2428,10 +2428,10 @@ static void op_commit(struct xe_vm *vm,
|
||||
|
||||
unbind_op_commit(vm, tile, pt_update_ops, old, fence, fence2);
|
||||
|
||||
if (op->remap.prev)
|
||||
if (op->remap.prev && !op->remap.skip_prev)
|
||||
bind_op_commit(vm, tile, pt_update_ops, op->remap.prev,
|
||||
fence, fence2, false);
|
||||
if (op->remap.next)
|
||||
if (op->remap.next && !op->remap.skip_next)
|
||||
bind_op_commit(vm, tile, pt_update_ops, op->remap.next,
|
||||
fence, fence2, false);
|
||||
break;
|
||||
|
||||
@@ -341,6 +341,8 @@ ssize_t xe_sriov_packet_write_single(struct xe_device *xe, unsigned int vfid,
|
||||
ret = xe_sriov_pf_migration_restore_produce(xe, vfid, *data);
|
||||
if (ret) {
|
||||
xe_sriov_packet_free(*data);
|
||||
*data = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -2554,7 +2554,6 @@ static int xe_vma_op_commit(struct xe_vm *vm, struct xe_vma_op *op)
|
||||
if (!err && op->remap.skip_prev) {
|
||||
op->remap.prev->tile_present =
|
||||
tile_present;
|
||||
op->remap.prev = NULL;
|
||||
}
|
||||
}
|
||||
if (op->remap.next) {
|
||||
@@ -2564,11 +2563,13 @@ static int xe_vma_op_commit(struct xe_vm *vm, struct xe_vma_op *op)
|
||||
if (!err && op->remap.skip_next) {
|
||||
op->remap.next->tile_present =
|
||||
tile_present;
|
||||
op->remap.next = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Adjust for partial unbind after removing VMA from VM */
|
||||
/*
|
||||
* Adjust for partial unbind after removing VMA from VM. In case
|
||||
* of unwind we might need to undo this later.
|
||||
*/
|
||||
if (!err) {
|
||||
op->base.remap.unmap->va->va.addr = op->remap.start;
|
||||
op->base.remap.unmap->va->va.range = op->remap.range;
|
||||
@@ -2687,6 +2688,8 @@ static int vm_bind_ioctl_ops_parse(struct xe_vm *vm, struct drm_gpuva_ops *ops,
|
||||
|
||||
op->remap.start = xe_vma_start(old);
|
||||
op->remap.range = xe_vma_size(old);
|
||||
op->remap.old_start = op->remap.start;
|
||||
op->remap.old_range = op->remap.range;
|
||||
|
||||
flags |= op->base.remap.unmap->va->flags & XE_VMA_CREATE_MASK;
|
||||
if (op->base.remap.prev) {
|
||||
@@ -2835,8 +2838,19 @@ static void xe_vma_op_unwind(struct xe_vm *vm, struct xe_vma_op *op,
|
||||
xe_svm_notifier_lock(vm);
|
||||
vma->gpuva.flags &= ~XE_VMA_DESTROYED;
|
||||
xe_svm_notifier_unlock(vm);
|
||||
if (post_commit)
|
||||
if (post_commit) {
|
||||
/*
|
||||
* Restore the old va range, in case of the
|
||||
* prev/next skip optimisation. Otherwise what
|
||||
* we re-insert here could be smaller than the
|
||||
* original range.
|
||||
*/
|
||||
op->base.remap.unmap->va->va.addr =
|
||||
op->remap.old_start;
|
||||
op->base.remap.unmap->va->va.range =
|
||||
op->remap.old_range;
|
||||
xe_vm_insert_vma(vm, vma);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -373,6 +373,10 @@ struct xe_vma_op_remap {
|
||||
u64 start;
|
||||
/** @range: range of the VMA unmap */
|
||||
u64 range;
|
||||
/** @old_start: Original start of the VMA we unmap */
|
||||
u64 old_start;
|
||||
/** @old_range: Original range of the VMA we unmap */
|
||||
u64 old_range;
|
||||
/** @skip_prev: skip prev rebind */
|
||||
bool skip_prev;
|
||||
/** @skip_next: skip next rebind */
|
||||
|
||||
@@ -247,7 +247,8 @@ static const struct xe_rtp_entry_sr gt_was[] = {
|
||||
LSN_DIM_Z_WGT_MASK,
|
||||
LSN_LNI_WGT(1) | LSN_LNE_WGT(1) |
|
||||
LSN_DIM_X_WGT(1) | LSN_DIM_Y_WGT(1) |
|
||||
LSN_DIM_Z_WGT(1)))
|
||||
LSN_DIM_Z_WGT(1)),
|
||||
SET(LSC_CHICKEN_BIT_0_UDW, L3_128B_256B_WRT_DIS))
|
||||
},
|
||||
|
||||
/* Xe2_HPM */
|
||||
|
||||
Reference in New Issue
Block a user