]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/oa: Store forcewake reference in stream structure
authorMatt Roper <matthew.d.roper@intel.com>
Mon, 10 Nov 2025 23:20:21 +0000 (15:20 -0800)
committerMatt Roper <matthew.d.roper@intel.com>
Thu, 13 Nov 2025 22:05:51 +0000 (14:05 -0800)
Calls to xe_force_wake_put() should generally pass the exact reference
returned by xe_force_wake_get().  Since OA grabs and releases forcewake
in different functions, xe_oa_stream_destroy() is currently calling put
with a hardcoded ALL mask.  Although this works for now, it's somewhat
fragile in case OA moves to more precise power domain management in the
future.

Stash the original reference obtained during stream initialization
inside the stream structure so that we can use it directly when the
stream is destroyed.

Cc: Ashutosh Dixit <ashutosh.dixit@intel.com>
Reviewed-by: Gustavo Sousa <gustavo.sousa@intel.com>
Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com>
Link: https://patch.msgid.link/20251110232017.1475869-35-matthew.d.roper@intel.com
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
drivers/gpu/drm/xe/xe_oa.c
drivers/gpu/drm/xe/xe_oa_types.h

index 7a13a7bd99a682025b56ba3c6fb47724c830d5a7..87a2bf53d66127e331fb72856cba3a2f84f9f2c0 100644 (file)
@@ -870,7 +870,7 @@ static void xe_oa_stream_destroy(struct xe_oa_stream *stream)
 
        xe_oa_free_oa_buffer(stream);
 
-       xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL);
+       xe_force_wake_put(gt_to_fw(gt), stream->fw_ref);
        xe_pm_runtime_put(stream->oa->xe);
 
        /* Wa_1509372804:pvc: Unset the override of GUCRC mode to enable rc6 */
@@ -1717,7 +1717,6 @@ static int xe_oa_stream_init(struct xe_oa_stream *stream,
                             struct xe_oa_open_param *param)
 {
        struct xe_gt *gt = param->hwe->gt;
-       unsigned int fw_ref;
        int ret;
 
        stream->exec_q = param->exec_q;
@@ -1772,8 +1771,8 @@ static int xe_oa_stream_init(struct xe_oa_stream *stream,
 
        /* Take runtime pm ref and forcewake to disable RC6 */
        xe_pm_runtime_get(stream->oa->xe);
-       fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
-       if (!xe_force_wake_ref_has_domain(fw_ref, XE_FORCEWAKE_ALL)) {
+       stream->fw_ref = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL);
+       if (!xe_force_wake_ref_has_domain(stream->fw_ref, XE_FORCEWAKE_ALL)) {
                ret = -ETIMEDOUT;
                goto err_fw_put;
        }
@@ -1818,7 +1817,7 @@ err_put_k_exec_q:
 err_free_oa_buf:
        xe_oa_free_oa_buffer(stream);
 err_fw_put:
-       xe_force_wake_put(gt_to_fw(gt), fw_ref);
+       xe_force_wake_put(gt_to_fw(gt), stream->fw_ref);
        xe_pm_runtime_put(stream->oa->xe);
        if (stream->override_gucrc)
                xe_gt_WARN_ON(gt, xe_guc_pc_unset_gucrc_mode(&gt->uc.guc.pc));
index daf701b5d48b9d5d05c461dce815d71b50281987..cf080f4121893e79cb6b9bb575cd1524b3792c63 100644 (file)
@@ -264,5 +264,8 @@ struct xe_oa_stream {
 
        /** @syncs: syncs to wait on and to signal */
        struct xe_sync_entry *syncs;
+
+       /** @fw_ref: Forcewake reference */
+       unsigned int fw_ref;
 };
 #endif