[PATCH] drm/amd/powerplay: honor hw limit on fetching metrics data

Xu, Feifei Feifei.Xu at amd.com
Mon May 13 09:37:46 UTC 2019


Reviewed-by: Feifei Xu <Feifei.Xu at amd.com>

-----Original Message-----
From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On Behalf Of Evan Quan
Sent: Monday, May 13, 2019 5:36 PM
To: amd-gfx at lists.freedesktop.org
Cc: Quan, Evan <Evan.Quan at amd.com>
Subject: [PATCH] drm/amd/powerplay: honor hw limit on fetching metrics data

[CAUTION: External Email]

Request too frequently may get corrupt data.

Change-Id: Ided23ab7dd0143575479644c5030cea71bdc53fd
Signed-off-by: Evan Quan <evan.quan at amd.com>
---
 .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h    |  3 ++
 drivers/gpu/drm/amd/powerplay/smu_v11_0.c     | 33 +++++++++++++++++--
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
index 3a9c253759dc..2cb4cc2a8208 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
@@ -403,6 +403,9 @@ struct smu_context
        uint32_t default_power_profile_mode;

        uint32_t smc_if_version;
+
+       unsigned long metrics_time;
+       void *metrics_table;
 };

 struct pptable_funcs {
diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
index db38e20707f9..87ccca045f36 100644
--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
@@ -369,6 +369,13 @@ static int smu_v11_0_init_power(struct smu_context *smu)
                return -ENOMEM;
        smu_power->power_context_size = sizeof(struct smu_11_0_dpm_context);

+       smu->metrics_time = 0;
+       smu->metrics_table = kzalloc(sizeof(SmuMetrics_t), GFP_KERNEL);
+       if (!smu->metrics_table) {
+               kfree(smu_power->power_context);
+               return -ENOMEM;
+       }
+
        return 0;
 }

@@ -379,7 +386,9 @@ static int smu_v11_0_fini_power(struct smu_context *smu)
        if (!smu_power->power_context || smu_power->power_context_size == 0)
                return -EINVAL;

+       kfree(smu->metrics_table);
        kfree(smu_power->power_context);
+       smu->metrics_table = NULL;
        smu_power->power_context = NULL;
        smu_power->power_context_size = 0;

@@ -1093,6 +1102,26 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu)
        return ret;
 }

+static int smu_v11_0_get_metrics_table(struct smu_context *smu,
+               SmuMetrics_t *metrics_table) {
+       int ret = 0;
+
+       if (!smu->metrics_time || time_after(jiffies, smu->metrics_time + HZ / 1000)) {
+               ret = smu_update_table(smu, TABLE_SMU_METRICS,
+                               (void *)metrics_table, false);
+               if (ret) {
+                       pr_info("Failed to export SMU metrics table!\n");
+                       return ret;
+               }
+               memcpy(smu->metrics_table, metrics_table, sizeof(SmuMetrics_t));
+               smu->metrics_time = jiffies;
+       } else
+               memcpy(metrics_table, smu->metrics_table, 
+ sizeof(SmuMetrics_t));
+
+       return ret;
+}
+
 static int smu_v11_0_get_current_activity_percent(struct smu_context *smu,
                                                  uint32_t *value)  { @@ -1102,7 +1131,7 @@ static int smu_v11_0_get_current_activity_percent(struct smu_context *smu,
        if (!value)
                return -EINVAL;

-       ret = smu_update_table(smu, TABLE_SMU_METRICS, (void *)&metrics, false);
+       ret = smu_v11_0_get_metrics_table(smu, &metrics);
        if (ret)
                return ret;

@@ -1139,7 +1168,7 @@ static int smu_v11_0_get_gpu_power(struct smu_context *smu, uint32_t *value)
        if (!value)
                return -EINVAL;

-       ret = smu_update_table(smu, TABLE_SMU_METRICS, (void *)&metrics, false);
+       ret = smu_v11_0_get_metrics_table(smu, &metrics);
        if (ret)
                return ret;

--
2.21.0

_______________________________________________
amd-gfx mailing list
amd-gfx at lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list