RE: [PATCH v2] drm/amdgpu: Update message IDs to PMFW to correctly gather GFXOFF residency logs

"Deucher, Alexander" <[email protected]>
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <BN9PR12MB51464FFC1E39FC0777D45524F7C62@BN9PR12MB5146.namprd12.prod.outlook.com>
Public

> -----Original Message-----
> From: amd-gfx <[email protected]> On Behalf Of Fares
> Soliman
> Sent: Monday, July 13, 2026 9:26 AM
> To: [email protected]
> Cc: Liang, Richard qi <[email protected]>; Soliman, Fares
> <[email protected]>
> Subject: [PATCH v2] drm/amdgpu: Update message IDs to PMFW to correctly
> gather GFXOFF residency logs
>
> Updates PPSMC_MSGs and set/get functions for gathering GFXOFF logs on
> Van Gogh. Logs are now gathered live rather than starting then stopping
> logging and reading an average value afterwards. This is in accordance to
> changes made in PMFW.
>
> In regards to messageID 0x52, the old interface uses a start/stop parameter,
> and the new one doesn't. The firmware is checked to determine which method
> to use.
>
> v2: added firmware guard to new interface, old interface kept as fallback
>
> Signed-off-by: Fares Soliman <[email protected]>

Acked-by: Alex Deucher <[email protected]>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c   |  4 +-
>  drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h |  2 +-
>  .../pm/swsmu/inc/pmfw_if/smu_v11_5_ppsmc.h    |  6 ++-
>  drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h  |  4 +-
> .../gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c  | 50
> +++++++++++++++----
>  5 files changed, 50 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> index 5c4d4ff001ea..46514a1faf1f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> @@ -1320,8 +1320,8 @@ static ssize_t amdgpu_debugfs_gpr_read(struct file
> *f, char __user *buf,
>   * @size: Number of bytes to read
>   * @pos:  Offset to seek to
>   *
> - * Read the last residency value logged. It doesn't auto update, one needs to
> - * stop logging before getting the current value.
> + * Read a live GFXOFF residency sample from firmware. One needs to
> + start logging
> + * before getting the current value.
>   */
>  static ssize_t amdgpu_debugfs_gfxoff_residency_read(struct file *f, char
> __user *buf,
>                                                   size_t size, loff_t *pos)
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
> b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
> index f8fd93999617..d94e3dcf7f9a 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
> +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
> @@ -1333,7 +1333,7 @@ struct pptable_funcs {
>       u32 (*set_gfx_off_residency)(struct smu_context *smu, bool start);
>
>       /**
> -      * @get_gfx_off_residency: Average GFXOFF residency % during the
> logging interval
> +      * @get_gfx_off_residency: Live GFXOFF residency percentage
>        */
>       u32 (*get_gfx_off_residency)(struct smu_context *smu, uint32_t
> *residency);
>
> diff --git
> a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v11_5_ppsmc.h
> b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v11_5_ppsmc.h
> index 7471e2df2828..4206514765cd 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v11_5_ppsmc.h
> +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v11_5_ppsmc.h
> @@ -110,8 +110,10 @@
>  #define PPSMC_MSG_GetSlowPPTLimit                      0x4C
>  #define PPSMC_MSG_GetGfxOffStatus                   0x50
>  #define PPSMC_MSG_GetGfxOffEntryCount                       0x51
> -#define PPSMC_MSG_LogGfxOffResidency                0x52
> -#define PPSMC_Message_Count                            0x53
> +#define PPSMC_MSG_GfxOffResidencyLogReadSample              0x52
> +#define PPSMC_MSG_StopGfxOffResidencyLogging          0x53
> +#define PPSMC_MSG_StartGfxOffResidencyLogging                 0x56
> +#define PPSMC_Message_Count                            0x57
>
>  //Argument for PPSMC_MSG_GfxDeviceDriverReset  enum { diff --git
> a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
> b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
> index 636ff90923d9..acf03838d49d 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
> +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h
> @@ -252,7 +252,9 @@
>       __SMU_DUMMY_MAP(DriverMode2Reset), \
>       __SMU_DUMMY_MAP(GetGfxOffStatus),                \
>       __SMU_DUMMY_MAP(GetGfxOffEntryCount),            \
> -     __SMU_DUMMY_MAP(LogGfxOffResidency),                    \
> +     __SMU_DUMMY_MAP(StartGfxOffResidencyLogging),           \
> +     __SMU_DUMMY_MAP(GfxOffResidencyLogReadSample),
>       \
> +     __SMU_DUMMY_MAP(StopGfxOffResidencyLogging),            \
>       __SMU_DUMMY_MAP(SetNumBadMemoryPagesRetired),
>       \
>
>       __SMU_DUMMY_MAP(SetBadMemoryPagesRetiredFlagsPerChannel)
> , \
>       __SMU_DUMMY_MAP(AllowGpo),      \
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
> b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
> index 717ba46c8933..1104f8b05b29 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
> @@ -72,6 +72,12 @@ static const struct smu_feature_bits
> vangogh_dpm_features = {
>       }
>  };
>
> +/*
> + * SMU support new GFXOFF residency log interface since version
> +4.63.62.00,
> + * use this to get live readings of GFXOFF residency  */ #define
> +SUPPORT_LIVE_RESIDENCY_MSG_VERSION 0x043f3e00
> +
>  static struct cmn2asic_msg_mapping
> vangogh_message_map[SMU_MSG_MAX_COUNT] = {
>       MSG_MAP(TestMessage,                    PPSMC_MSG_TestMessage,
>               0),
>       MSG_MAP(GetSmuVersion,                  PPSMC_MSG_GetSmuVersion,
>               0),
> @@ -142,7 +148,9 @@ static struct cmn2asic_msg_mapping
> vangogh_message_map[SMU_MSG_MAX_COUNT] = {
>       MSG_MAP(GetSlowPPTLimit,
> PPSMC_MSG_GetSlowPPTLimit,
>       0),
>       MSG_MAP(GetGfxOffStatus,
> PPSMC_MSG_GetGfxOffStatus,                                            0),
>       MSG_MAP(GetGfxOffEntryCount,
> PPSMC_MSG_GetGfxOffEntryCount,                                        0),
> -     MSG_MAP(LogGfxOffResidency,
> PPSMC_MSG_LogGfxOffResidency,                                 0),
> +     MSG_MAP(StartGfxOffResidencyLogging,
> PPSMC_MSG_StartGfxOffResidencyLogging,        0),
> +     MSG_MAP(GfxOffResidencyLogReadSample,
> PPSMC_MSG_GfxOffResidencyLogReadSample,       0),
> +     MSG_MAP(StopGfxOffResidencyLogging,
> PPSMC_MSG_StopGfxOffResidencyLogging,         0),
>  };
>
>  static struct cmn2asic_mapping
> vangogh_feature_mask_map[SMU_FEATURE_COUNT] = { @@ -2450,19
> +2458,32 @@ static int vangogh_set_power_limit(struct smu_context *smu,
> static u32 vangogh_set_gfxoff_residency(struct smu_context *smu, bool
> start)  {
>       int ret = 0;
> -     u32 residency;
>       struct amdgpu_device *adev = smu->adev;
>
>       if (!(adev->pm.pp_feature & PP_GFXOFF_MASK))
>               return 0;
>
> -     ret = smu_cmn_send_smc_msg_with_param(smu,
> SMU_MSG_LogGfxOffResidency,
> -                                           start, &residency);
> -     if (ret)
> -             return ret;
> +     if (smu->smc_fw_version <
> SUPPORT_LIVE_RESIDENCY_MSG_VERSION) {
> +             u32 residency;
> +
> +             ret = smu_cmn_send_smc_msg_with_param(smu,
> SMU_MSG_GfxOffResidencyLogReadSample,
> +                                                     start, &residency);
> +             if (ret)
> +                     return ret;
>
> -     if (!start)
> -             adev->gfx.gfx_off_residency = residency;
> +             if (!start)
> +                     adev->gfx.gfx_off_residency = residency;
> +     } else {
> +             if (start) {
> +                     ret = smu_cmn_send_smc_msg(smu,
> SMU_MSG_StartGfxOffResidencyLogging, NULL);
> +                     if (ret)
> +                             return ret;
> +             } else {
> +                     ret = smu_cmn_send_smc_msg(smu,
> SMU_MSG_StopGfxOffResidencyLogging, NULL);
> +                     if (ret)
> +                             return ret;
> +             }
> +     }
>
>       return ret;
>  }
> @@ -2479,11 +2500,20 @@ static u32 vangogh_set_gfxoff_residency(struct
> smu_context *smu, bool start)
>   */
>  static u32 vangogh_get_gfxoff_residency(struct smu_context *smu, uint32_t
> *residency)  {
> +     int ret = 0;
>       struct amdgpu_device *adev = smu->adev;
>
> -     *residency = adev->gfx.gfx_off_residency;
> +     if (!(adev->pm.pp_feature & PP_GFXOFF_MASK))
> +             return 0;
> +
> +     if (smu->smc_fw_version <
> SUPPORT_LIVE_RESIDENCY_MSG_VERSION) {
> +             *residency = adev->gfx.gfx_off_residency;
> +     } else {
> +             ret = smu_cmn_send_smc_msg(smu,
> SMU_MSG_GfxOffResidencyLogReadSample,
> +                                                             residency);
> +     }
>
> -     return 0;
> +     return ret;
>  }
>
>  /**
> --
> 2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.