mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
drm/xe/oa: Store forcewake reference in stream structure
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>
This commit is contained in:
@@ -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(>->uc.guc.pc));
|
||||
|
||||
Reference in New Issue
Block a user