From: Rodrigo Vivi <rodrigo.vivi@intel.com>
To: Sk Anirban <sk.anirban@intel.com>
Cc: <intel-xe@lists.freedesktop.org>, <anshuman.gupta@intel.com>,
<badal.nilawar@intel.com>, <riana.tauro@intel.com>,
<karthik.poosa@intel.com>, <raag.jadav@intel.com>,
<soham.purkait@intel.com>, <mallesh.koujalagi@intel.com>,
<vinay.belgaumkar@intel.com>
Subject: Re: [PATCH v3] drm/xe/guc: Eliminate RPe caching for SLPC parameter handling
Date: Thu, 23 Oct 2025 09:08:07 -0400 [thread overview]
Message-ID: <aPootwV2Dugb70gq@intel.com> (raw)
In-Reply-To: <20251016092536.1918086-2-sk.anirban@intel.com>
On Thu, Oct 16, 2025 at 02:55:37PM +0530, Sk Anirban wrote:
> RPe is runtime-determined by PCODE and caching it caused stale values,
> leading to incorrect GuC SLPC parameter settings.
> Drop the cached rpe_freq field and query fresh values from hardware
> on each use to ensure GuC SLPC parameters reflect current RPe.
>
> v2: Remove cached RPe frequency field (Rodrigo)
> v3: Remove extra variable (Vinay)
> Modify function name (Vinay)
>
> Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/5166
> Signed-off-by: Sk Anirban <sk.anirban@intel.com>
> ---
> drivers/gpu/drm/xe/xe_guc_pc.c | 33 ++++++++++++++--------------
> drivers/gpu/drm/xe/xe_guc_pc_types.h | 2 --
> 2 files changed, 17 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_guc_pc.c b/drivers/gpu/drm/xe/xe_guc_pc.c
> index 3c0feb50a1e2..20b2f36c94e0 100644
> --- a/drivers/gpu/drm/xe/xe_guc_pc.c
> +++ b/drivers/gpu/drm/xe/xe_guc_pc.c
> @@ -330,7 +330,7 @@ static int pc_set_min_freq(struct xe_guc_pc *pc, u32 freq)
> * Our goal is to have the admin choices respected.
> */
> pc_action_set_param(pc, SLPC_PARAM_IGNORE_EFFICIENT_FREQUENCY,
> - freq < pc->rpe_freq);
> + freq < xe_guc_pc_get_rpe_freq(pc));
>
> return pc_action_set_param(pc,
> SLPC_PARAM_GLOBAL_MIN_GT_UNSLICE_FREQ_MHZ,
> @@ -375,7 +375,7 @@ static void mtl_update_rpa_value(struct xe_guc_pc *pc)
> pc->rpa_freq = decode_freq(REG_FIELD_GET(MTL_RPA_MASK, reg));
> }
>
> -static void mtl_update_rpe_value(struct xe_guc_pc *pc)
> +static u32 mtl_get_rpe_freq(struct xe_guc_pc *pc)
> {
> struct xe_gt *gt = pc_to_gt(pc);
> u32 reg;
> @@ -385,7 +385,7 @@ static void mtl_update_rpe_value(struct xe_guc_pc *pc)
> else
> reg = xe_mmio_read32(>->mmio, MTL_GT_RPE_FREQUENCY);
>
> - pc->rpe_freq = decode_freq(REG_FIELD_GET(MTL_RPE_MASK, reg));
> + return decode_freq(REG_FIELD_GET(MTL_RPE_MASK, reg));
> }
>
> static void tgl_update_rpa_value(struct xe_guc_pc *pc)
> @@ -408,7 +408,7 @@ static void tgl_update_rpa_value(struct xe_guc_pc *pc)
> }
> }
>
> -static void tgl_update_rpe_value(struct xe_guc_pc *pc)
> +static u32 tgl_get_rpe_freq(struct xe_guc_pc *pc)
> {
> struct xe_gt *gt = pc_to_gt(pc);
> struct xe_device *xe = gt_to_xe(gt);
> @@ -421,10 +421,10 @@ static void tgl_update_rpe_value(struct xe_guc_pc *pc)
> */
> if (xe->info.platform == XE_PVC) {
> reg = xe_mmio_read32(>->mmio, PVC_RP_STATE_CAP);
> - pc->rpe_freq = REG_FIELD_GET(RP1_MASK, reg) * GT_FREQUENCY_MULTIPLIER;
> + return REG_FIELD_GET(RP1_MASK, reg) * GT_FREQUENCY_MULTIPLIER;
please move the above block to a new function pvc_get_rpe_freq,
then use it's GRAPHICS_VER inside xe_guc_pc_get_rpe_freq
or perhaps, kill these 2 functions and place all the code inside
xe_guc_pc_get_rpe_freq()
> } else {
> reg = xe_mmio_read32(>->mmio, FREQ_INFO_REC);
> - pc->rpe_freq = REG_FIELD_GET(RPE_MASK, reg) * GT_FREQUENCY_MULTIPLIER;
> + return REG_FIELD_GET(RPE_MASK, reg) * GT_FREQUENCY_MULTIPLIER;
> }
> }
>
> @@ -433,20 +433,17 @@ static void pc_update_rp_values(struct xe_guc_pc *pc)
> struct xe_gt *gt = pc_to_gt(pc);
> struct xe_device *xe = gt_to_xe(gt);
>
> - if (GRAPHICS_VERx100(xe) >= 1270) {
> + if (GRAPHICS_VERx100(xe) >= 1270)
> mtl_update_rpa_value(pc);
> - mtl_update_rpe_value(pc);
> - } else {
> + else
> tgl_update_rpa_value(pc);
> - tgl_update_rpe_value(pc);
> - }
please do the same for RPa in a separate patch and then
entirely kill this pc_update_rp_values values function.
The logic is the same.
>
> /*
> * RPe is decided at runtime by PCODE. In the rare case where that's
> * smaller than the fused min, we will trust the PCODE and use that
> * as our minimum one.
> */
> - pc->rpn_freq = min(pc->rpn_freq, pc->rpe_freq);
> + pc->rpn_freq = min(pc->rpn_freq, xe_guc_pc_get_rpe_freq(pc));
> }
>
> /**
> @@ -560,9 +557,13 @@ u32 xe_guc_pc_get_rpa_freq(struct xe_guc_pc *pc)
> */
> u32 xe_guc_pc_get_rpe_freq(struct xe_guc_pc *pc)
> {
> - pc_update_rp_values(pc);
> + struct xe_gt *gt = pc_to_gt(pc);
> + struct xe_device *xe = gt_to_xe(gt);
>
> - return pc->rpe_freq;
> + if (GRAPHICS_VERx100(xe) >= 1270)
> + return mtl_get_rpe_freq(pc);
> + else
> + return tgl_get_rpe_freq(pc);
> }
>
> /**
> @@ -1021,7 +1022,7 @@ static int pc_set_mert_freq_cap(struct xe_guc_pc *pc)
> /*
> * Ensure min and max are bound by MERT_FREQ_CAP until driver loads.
> */
> - ret = pc_set_min_freq(pc, min(pc->rpe_freq, pc_max_freq_cap(pc)));
> + ret = pc_set_min_freq(pc, min(xe_guc_pc_get_rpe_freq(pc), pc_max_freq_cap(pc)));
> if (!ret)
> ret = pc_set_max_freq(pc, min(pc->rp0_freq, pc_max_freq_cap(pc)));
>
> @@ -1339,7 +1340,7 @@ static void xe_guc_pc_fini_hw(void *arg)
> XE_WARN_ON(xe_guc_pc_stop(pc));
>
> /* Bind requested freq to mert_freq_cap before unload */
> - pc_set_cur_freq(pc, min(pc_max_freq_cap(pc), pc->rpe_freq));
> + pc_set_cur_freq(pc, min(pc_max_freq_cap(pc), xe_guc_pc_get_rpe_freq(pc)));
>
> xe_force_wake_put(gt_to_fw(pc_to_gt(pc)), fw_ref);
> }
> diff --git a/drivers/gpu/drm/xe/xe_guc_pc_types.h b/drivers/gpu/drm/xe/xe_guc_pc_types.h
> index 5e4ea53fbee6..f27c05d81706 100644
> --- a/drivers/gpu/drm/xe/xe_guc_pc_types.h
> +++ b/drivers/gpu/drm/xe/xe_guc_pc_types.h
> @@ -21,8 +21,6 @@ struct xe_guc_pc {
> u32 rp0_freq;
> /** @rpa_freq: HW RPa frequency - The Achievable one */
> u32 rpa_freq;
> - /** @rpe_freq: HW RPe frequency - The Efficient one */
> - u32 rpe_freq;
> /** @rpn_freq: HW RPN frequency - The Minimum one */
> u32 rpn_freq;
> /** @user_requested_min: Stash the minimum requested freq by user */
> --
> 2.43.0
>
next prev parent reply other threads:[~2025-10-23 13:08 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-16 9:25 [PATCH v3] drm/xe/guc: Eliminate RPe caching for SLPC parameter handling Sk Anirban
2025-10-16 9:36 ` ✓ CI.KUnit: success for drm/xe/guc: Eliminate RPe caching for SLPC parameter handling (rev3) Patchwork
2025-10-16 10:26 ` ✓ Xe.CI.BAT: " Patchwork
2025-10-17 4:46 ` ✗ Xe.CI.Full: failure " Patchwork
2025-10-22 12:28 ` Anirban, Sk
2025-10-22 20:43 ` Rodrigo Vivi
2025-10-23 6:12 ` Anirban, Sk
2025-10-23 13:08 ` Rodrigo Vivi
2025-10-23 13:08 ` Rodrigo Vivi [this message]
2025-10-28 10:00 ` [PATCH v3] drm/xe/guc: Eliminate RPe caching for SLPC parameter handling Anirban, Sk
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aPootwV2Dugb70gq@intel.com \
--to=rodrigo.vivi@intel.com \
--cc=anshuman.gupta@intel.com \
--cc=badal.nilawar@intel.com \
--cc=intel-xe@lists.freedesktop.org \
--cc=karthik.poosa@intel.com \
--cc=mallesh.koujalagi@intel.com \
--cc=raag.jadav@intel.com \
--cc=riana.tauro@intel.com \
--cc=sk.anirban@intel.com \
--cc=soham.purkait@intel.com \
--cc=vinay.belgaumkar@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.