Skip to content

Commit 71ab2f1

Browse files
mwajdeczSasha Levin
authored andcommitted
drm/xe/pf: Reset GuC VF config when unprovisioning critical resource
[ Upstream commit 33f17e2 ] GuC firmware counts received VF configuration KLVs and may start validation of the complete VF config even if some resources where unprovisioned in the meantime, leading to unexpected errors like: $ echo 1 | sudo tee /sys/kernel/debug/dri/0000:00:02.0/gt0/vf1/contexts_quota $ echo 0 | sudo tee /sys/kernel/debug/dri/0000:00:02.0/gt0/vf1/contexts_quota $ echo 1 | sudo tee /sys/kernel/debug/dri/0000:00:02.0/gt0/vf1/doorbells_quota $ echo 0 | sudo tee /sys/kernel/debug/dri/0000:00:02.0/gt0/vf1/doorbells_quota $ echo 1 | sudo tee /sys/kernel/debug/dri/0000:00:02.0/gt0/vf1/ggtt_quota tee: '/sys/kernel/debug/dri/0000:00:02.0/gt0/vf1/ggtt_quota': Input/output error To mitigate this problem trigger explicit VF config reset after unprovisioning any of the critical resources (GGTT, context or doorbell IDs) that GuC is monitoring. Signed-off-by: Michal Wajdeczko <[email protected]> Reviewed-by: Michał Winiarski <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Sasha Levin <[email protected]>
1 parent 5e886f1 commit 71ab2f1

File tree

1 file changed

+33
-4
lines changed

1 file changed

+33
-4
lines changed

drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,26 @@ static int pf_push_full_vf_config(struct xe_gt *gt, unsigned int vfid)
323323
return err;
324324
}
325325

326+
static int pf_push_vf_cfg(struct xe_gt *gt, unsigned int vfid, bool reset)
327+
{
328+
int err = 0;
329+
330+
xe_gt_assert(gt, vfid);
331+
lockdep_assert_held(xe_gt_sriov_pf_master_mutex(gt));
332+
333+
if (reset)
334+
err = pf_send_vf_cfg_reset(gt, vfid);
335+
if (!err)
336+
err = pf_push_full_vf_config(gt, vfid);
337+
338+
return err;
339+
}
340+
341+
static int pf_refresh_vf_cfg(struct xe_gt *gt, unsigned int vfid)
342+
{
343+
return pf_push_vf_cfg(gt, vfid, true);
344+
}
345+
326346
static u64 pf_get_ggtt_alignment(struct xe_gt *gt)
327347
{
328348
struct xe_device *xe = gt_to_xe(gt);
@@ -419,6 +439,10 @@ static int pf_provision_vf_ggtt(struct xe_gt *gt, unsigned int vfid, u64 size)
419439
return err;
420440

421441
pf_release_vf_config_ggtt(gt, config);
442+
443+
err = pf_refresh_vf_cfg(gt, vfid);
444+
if (unlikely(err))
445+
return err;
422446
}
423447
xe_gt_assert(gt, !xe_ggtt_node_allocated(config->ggtt_region));
424448

@@ -744,6 +768,10 @@ static int pf_provision_vf_ctxs(struct xe_gt *gt, unsigned int vfid, u32 num_ctx
744768
return ret;
745769

746770
pf_release_config_ctxs(gt, config);
771+
772+
ret = pf_refresh_vf_cfg(gt, vfid);
773+
if (unlikely(ret))
774+
return ret;
747775
}
748776

749777
if (!num_ctxs)
@@ -1041,6 +1069,10 @@ static int pf_provision_vf_dbs(struct xe_gt *gt, unsigned int vfid, u32 num_dbs)
10411069
return ret;
10421070

10431071
pf_release_config_dbs(gt, config);
1072+
1073+
ret = pf_refresh_vf_cfg(gt, vfid);
1074+
if (unlikely(ret))
1075+
return ret;
10441076
}
10451077

10461078
if (!num_dbs)
@@ -2003,10 +2035,7 @@ int xe_gt_sriov_pf_config_push(struct xe_gt *gt, unsigned int vfid, bool refresh
20032035
xe_gt_assert(gt, vfid);
20042036

20052037
mutex_lock(xe_gt_sriov_pf_master_mutex(gt));
2006-
if (refresh)
2007-
err = pf_send_vf_cfg_reset(gt, vfid);
2008-
if (!err)
2009-
err = pf_push_full_vf_config(gt, vfid);
2038+
err = pf_push_vf_cfg(gt, vfid, refresh);
20102039
mutex_unlock(xe_gt_sriov_pf_master_mutex(gt));
20112040

20122041
if (unlikely(err)) {

0 commit comments

Comments
 (0)