Commit efd38d61 authored by Matthew Brost's avatar Matthew Brost
Browse files

drm/xe/vf: Use primary GT ordered work queue on media GT on PTL VF



VF CCS restore is a primary GT operation on which the media GT depends.
Therefore, it doesn't make much sense to run these operations in
parallel. To address this, point the media GT's ordered work queue to
the primary GT's ordered work queue on platforms that require (PTL VFs)
CCS restore as part of VF post-migration recovery.

v7:
 - Remove bool from xe_gt_alloc (Lucas)
v9:
 - Fix typo (Lucas)

Signed-off-by: default avatarMatthew Brost <matthew.brost@intel.com>
Reviewed-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
Link: https://lore.kernel.org/r/20251008214532.3442967-32-matthew.brost@intel.com
parent 673167d9
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -329,6 +329,8 @@ struct xe_device {
		u8 skip_mtcfg:1;
		/** @info.skip_pcode: skip access to PCODE uC */
		u8 skip_pcode:1;
		/** @info.needs_shared_vf_gt_wq: needs shared GT WQ on VF */
		u8 needs_shared_vf_gt_wq:1;
	} info;

	/** @wa_active: keep track of active workarounds */
+14 −4
Original line number Diff line number Diff line
@@ -67,7 +67,11 @@

struct xe_gt *xe_gt_alloc(struct xe_tile *tile)
{
	struct drm_device *drm = &tile_to_xe(tile)->drm;
	struct xe_device *xe = tile_to_xe(tile);
	struct drm_device *drm = &xe->drm;
	bool shared_wq = xe->info.needs_shared_vf_gt_wq && tile->primary_gt &&
		IS_SRIOV_VF(xe);
	struct workqueue_struct *ordered_wq;
	struct xe_gt *gt;

	gt = drmm_kzalloc(drm, sizeof(*gt), GFP_KERNEL);
@@ -75,9 +79,15 @@ struct xe_gt *xe_gt_alloc(struct xe_tile *tile)
		return ERR_PTR(-ENOMEM);

	gt->tile = tile;
	gt->ordered_wq = drmm_alloc_ordered_workqueue(drm, "gt-ordered-wq", WQ_MEM_RECLAIM);
	if (IS_ERR(gt->ordered_wq))
		return ERR_CAST(gt->ordered_wq);
	if (shared_wq && tile->primary_gt->ordered_wq)
		ordered_wq = tile->primary_gt->ordered_wq;
	else
		ordered_wq = drmm_alloc_ordered_workqueue(drm, "gt-ordered-wq",
							  WQ_MEM_RECLAIM);
	if (IS_ERR(ordered_wq))
		return ERR_CAST(ordered_wq);

	gt->ordered_wq = ordered_wq;

	return gt;
}
+2 −0
Original line number Diff line number Diff line
@@ -347,6 +347,7 @@ static const struct xe_device_desc ptl_desc = {
	.has_sriov = true,
	.max_gt_per_tile = 2,
	.needs_scratch = true,
	.needs_shared_vf_gt_wq = true,
};

#undef PLATFORM
@@ -596,6 +597,7 @@ static int xe_info_init_early(struct xe_device *xe,
	xe->info.skip_mtcfg = desc->skip_mtcfg;
	xe->info.skip_pcode = desc->skip_pcode;
	xe->info.needs_scratch = desc->needs_scratch;
	xe->info.needs_shared_vf_gt_wq = desc->needs_shared_vf_gt_wq;

	xe->info.probe_display = IS_ENABLED(CONFIG_DRM_XE_DISPLAY) &&
				 xe_modparam.probe_display &&
+1 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ struct xe_device_desc {
	u8 skip_guc_pc:1;
	u8 skip_mtcfg:1;
	u8 skip_pcode:1;
	u8 needs_shared_vf_gt_wq:1;
};

struct xe_graphics_desc {