[PATCH v2] drm/amd/pm: Increase cache interval time

Alex Deucher alexdeucher at gmail.com
Tue Aug 5 15:55:57 UTC 2025


On Tue, Aug 5, 2025 at 11:55 AM Alex Deucher <alexdeucher at gmail.com> wrote:
>
> On Tue, Aug 5, 2025 at 11:51 AM Asad Kamal <asad.kamal at amd.com> wrote:
> >
> > Increase cache interval time to 50 ms while fetching system
> > metrics table for smu_v13_0_12 since polling interval is less frequent for
> > this data.
> >
> > v2: Make caching interval soc independent, however customization can be
> > done in soc specific callbacks(Alex/Lijo)
>
> I would split this into two patches, one to add the soc independent
> change, and one to adjust smu 13.0.12.  We also need to implement the
> cache implementation in the smu backend code for other chips.  It
> would be nice to move that logic to a higher level so each smu backend
> doesn't have to implement the caching.

This can be a future optimization.  I don't want to block the smu
13.0.12 updates.

Alex

>
> Alex
>
> >
> > Signed-off-by: Asad Kamal <asad.kamal at amd.com>
> > ---
> >  drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c             | 4 ++++
> >  drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h         | 3 +++
> >  drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c | 9 ++++-----
> >  3 files changed, 11 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> > index dc48a1dd8be4..c62d68d7410f 100644
> > --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> > +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> > @@ -1162,8 +1162,12 @@ static void smu_free_dummy_read_table(struct smu_context *smu)
> >
> >  static int smu_smc_table_sw_init(struct smu_context *smu)
> >  {
> > +       struct smu_table_context *smu_table = &smu->smu_table;
> >         int ret;
> >
> > +       smu_table->tables[SMU_TABLE_TEMP_METRICS].cache_interval =
> > +               AMDGPU_TEMP_METRICS_CACHE_INTERVAL;
> > +
> >         /**
> >          * Create smu_table structure, and init smc tables such as
> >          * TABLE_PPTABLE, TABLE_WATERMARKS, TABLE_SMU_METRICS, and etc.
> > 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 611b381b9147..7a52c00c700e 100644
> > --- a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
> > +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
> > @@ -32,6 +32,8 @@
> >  #include "smu_types.h"
> >  #include "linux/firmware.h"
> >
> > +#define AMDGPU_TEMP_METRICS_CACHE_INTERVAL     50
> > +
> >  #define SMU_THERMAL_MINIMUM_ALERT_TEMP         0
> >  #define SMU_THERMAL_MAXIMUM_ALERT_TEMP         255
> >  #define SMU_TEMPERATURE_UNITS_PER_CENTIGRADES  1000
> > @@ -258,6 +260,7 @@ struct smu_table {
> >         struct amdgpu_bo *bo;
> >         uint32_t version;
> >         unsigned long  metrics_time;
> > +       uint32_t cache_interval;
> >  };
> >
> >  enum smu_perf_level_designation {
> > diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
> > index fca50f6a8ef6..5ead66375d38 100644
> > --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
> > +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
> > @@ -361,18 +361,17 @@ int smu_v13_0_12_get_smu_metrics_data(struct smu_context *smu,
> >         return 0;
> >  }
> >
> > -static int smu_v13_0_12_get_system_metrics_table(struct smu_context *smu, void *metrics_table,
> > -                                                bool bypass_cache)
> > +static int smu_v13_0_12_get_system_metrics_table(struct smu_context *smu, void *metrics_table)
> >  {
> >         struct smu_table_context *smu_table = &smu->smu_table;
> >         uint32_t table_size = smu_table->tables[SMU_TABLE_SMU_METRICS].size;
> >         struct smu_table *table = &smu_table->driver_table;
> >         int ret;
> >
> > -       if (bypass_cache || !smu_table->tables[SMU_TABLE_TEMP_METRICS].metrics_time ||
> > +       if (!smu_table->tables[SMU_TABLE_TEMP_METRICS].metrics_time ||
> >             time_after(jiffies,
> >                        smu_table->tables[SMU_TABLE_TEMP_METRICS].metrics_time +
> > -                      msecs_to_jiffies(1))) {
> > +                      msecs_to_jiffies(smu_table->tables[SMU_TABLE_TEMP_METRICS].cache_interval))) {
> >                 ret = smu_cmn_send_smc_msg(smu, SMU_MSG_GetSystemMetricsTable, NULL);
> >                 if (ret) {
> >                         dev_info(smu->adev->dev,
> > @@ -544,7 +543,7 @@ static ssize_t smu_v13_0_12_get_temp_metrics(struct smu_context *smu,
> >         else if (type  == SMU_TEMP_METRIC_BASEBOARD)
> >                 smu_cmn_init_baseboard_temp_metrics(baseboard_temp_metrics, 1, 0);
> >
> > -       ret = smu_v13_0_12_get_system_metrics_table(smu, metrics, false);
> > +       ret = smu_v13_0_12_get_system_metrics_table(smu, metrics);
> >         if (ret) {
> >                 kfree(metrics);
> >                 return ret;
> > --
> > 2.46.0
> >


More information about the amd-gfx mailing list