summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/xe/xe_force_wake.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/xe/xe_force_wake.c')
-rw-r--r--drivers/gpu/drm/xe/xe_force_wake.c61
1 files changed, 48 insertions, 13 deletions
diff --git a/drivers/gpu/drm/xe/xe_force_wake.c b/drivers/gpu/drm/xe/xe_force_wake.c
index 4f6784e5abf8..197e2197bd0a 100644
--- a/drivers/gpu/drm/xe/xe_force_wake.c
+++ b/drivers/gpu/drm/xe/xe_force_wake.c
@@ -49,9 +49,6 @@ void xe_force_wake_init_gt(struct xe_gt *gt, struct xe_force_wake *fw)
fw->gt = gt;
spin_lock_init(&fw->lock);
- /* Assuming gen11+ so assert this assumption is correct */
- xe_gt_assert(gt, GRAPHICS_VER(gt_to_xe(gt)) >= 11);
-
if (xe->info.graphics_verx100 >= 1270) {
init_domain(fw, XE_FW_DOMAIN_ID_GT,
FORCEWAKE_GT,
@@ -67,10 +64,7 @@ void xe_force_wake_init_engines(struct xe_gt *gt, struct xe_force_wake *fw)
{
int i, j;
- /* Assuming gen11+ so assert this assumption is correct */
- xe_gt_assert(gt, GRAPHICS_VER(gt_to_xe(gt)) >= 11);
-
- if (!xe_gt_is_media_type(gt))
+ if (xe_gt_is_main_type(gt))
init_domain(fw, XE_FW_DOMAIN_ID_RENDER,
FORCEWAKE_RENDER,
FORCEWAKE_ACK_RENDER);
@@ -154,12 +148,6 @@ static int domain_sleep_wait(struct xe_gt *gt,
return __domain_wait(gt, domain, false);
}
-#define for_each_fw_domain_masked(domain__, mask__, fw__, tmp__) \
- for (tmp__ = (mask__); tmp__; tmp__ &= ~BIT(ffs(tmp__) - 1)) \
- for_each_if((domain__ = ((fw__)->domains + \
- (ffs(tmp__) - 1))) && \
- domain__->reg_ctl.addr)
-
/**
* xe_force_wake_get() : Increase the domain refcount
* @fw: struct xe_force_wake
@@ -172,6 +160,13 @@ static int domain_sleep_wait(struct xe_gt *gt,
* xe_force_wake_ref_has_domain() function. Caller must call
* xe_force_wake_put() function to decrease incremented refcounts.
*
+ * When possible, scope-based forcewake (through CLASS(xe_force_wake, ...) or
+ * xe_with_force_wake()) should be used instead of direct calls to this
+ * function. Direct usage of get/put should only be used when the function
+ * has goto-based flows that can interfere with scope-based cleanup, or when
+ * the lifetime of the forcewake reference does not match a specific scope
+ * (e.g., forcewake obtained in one function and released in a different one).
+ *
* Return: opaque reference to woken domains or zero if none of requested
* domains were awake.
*/
@@ -265,3 +260,43 @@ void xe_force_wake_put(struct xe_force_wake *fw, unsigned int fw_ref)
xe_gt_WARN(gt, ack_fail, "Forcewake domain%s %#x failed to acknowledge sleep request\n",
str_plural(hweight_long(ack_fail)), ack_fail);
}
+
+const char *xe_force_wake_domain_to_str(enum xe_force_wake_domain_id id)
+{
+ switch (id) {
+ case XE_FW_DOMAIN_ID_GT:
+ return "GT";
+ case XE_FW_DOMAIN_ID_RENDER:
+ return "Render";
+ case XE_FW_DOMAIN_ID_MEDIA:
+ return "Media";
+ case XE_FW_DOMAIN_ID_MEDIA_VDBOX0:
+ return "VDBox0";
+ case XE_FW_DOMAIN_ID_MEDIA_VDBOX1:
+ return "VDBox1";
+ case XE_FW_DOMAIN_ID_MEDIA_VDBOX2:
+ return "VDBox2";
+ case XE_FW_DOMAIN_ID_MEDIA_VDBOX3:
+ return "VDBox3";
+ case XE_FW_DOMAIN_ID_MEDIA_VDBOX4:
+ return "VDBox4";
+ case XE_FW_DOMAIN_ID_MEDIA_VDBOX5:
+ return "VDBox5";
+ case XE_FW_DOMAIN_ID_MEDIA_VDBOX6:
+ return "VDBox6";
+ case XE_FW_DOMAIN_ID_MEDIA_VDBOX7:
+ return "VDBox7";
+ case XE_FW_DOMAIN_ID_MEDIA_VEBOX0:
+ return "VEBox0";
+ case XE_FW_DOMAIN_ID_MEDIA_VEBOX1:
+ return "VEBox1";
+ case XE_FW_DOMAIN_ID_MEDIA_VEBOX2:
+ return "VEBox2";
+ case XE_FW_DOMAIN_ID_MEDIA_VEBOX3:
+ return "VEBox3";
+ case XE_FW_DOMAIN_ID_GSC:
+ return "GSC";
+ default:
+ return "Unknown";
+ }
+}