drm/amd/powerplay: maximum the code sharing around metrics table retrieving
authorEvan Quan <evan.quan@amd.com>
Thu, 6 Aug 2020 08:49:19 +0000 (16:49 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 14 Aug 2020 20:22:40 +0000 (16:22 -0400)
Instead of having one copy in each ASIC.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/arcturus_ppt.c
drivers/gpu/drm/amd/powerplay/navi10_ppt.c
drivers/gpu/drm/amd/powerplay/renoir_ppt.c
drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
drivers/gpu/drm/amd/powerplay/smu_cmn.c
drivers/gpu/drm/amd/powerplay/smu_cmn.h

index e59e6fb6f0a801cc6f381a5fc3966cc098611efd..8b1025dc54fd2d891d7e38b6b654429f1b40c678 100644 (file)
@@ -541,49 +541,6 @@ static int arcturus_freqs_in_same_level(int32_t frequency1,
        return (abs(frequency1 - frequency2) <= EPSILON);
 }
 
-static int arcturus_get_metrics_table_locked(struct smu_context *smu,
-                                            SmuMetrics_t *metrics_table,
-                                            bool bypass_cache)
-{
-       struct smu_table_context *smu_table= &smu->smu_table;
-       int ret = 0;
-
-       if (bypass_cache ||
-           !smu_table->metrics_time ||
-           time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(1))) {
-               ret = smu_cmn_update_table(smu,
-                                      SMU_TABLE_SMU_METRICS,
-                                      0,
-                                      smu_table->metrics_table,
-                                      false);
-               if (ret) {
-                       dev_info(smu->adev->dev, "Failed to export SMU metrics table!\n");
-                       return ret;
-               }
-               smu_table->metrics_time = jiffies;
-       }
-
-       if (metrics_table)
-               memcpy(metrics_table, smu_table->metrics_table, sizeof(SmuMetrics_t));
-
-       return 0;
-}
-
-static int arcturus_get_metrics_table(struct smu_context *smu,
-                                     SmuMetrics_t *metrics_table,
-                                     bool bypass_cache)
-{
-       int ret = 0;
-
-       mutex_lock(&smu->metrics_lock);
-       ret = arcturus_get_metrics_table_locked(smu,
-                                               metrics_table,
-                                               bypass_cache);
-       mutex_unlock(&smu->metrics_lock);
-
-       return ret;
-}
-
 static int arcturus_get_smu_metrics_data(struct smu_context *smu,
                                         MetricsMember_t member,
                                         uint32_t *value)
@@ -594,9 +551,9 @@ static int arcturus_get_smu_metrics_data(struct smu_context *smu,
 
        mutex_lock(&smu->metrics_lock);
 
-       ret = arcturus_get_metrics_table_locked(smu,
-                                               NULL,
-                                               false);
+       ret = smu_cmn_get_metrics_table_locked(smu,
+                                              NULL,
+                                              false);
        if (ret) {
                mutex_unlock(&smu->metrics_lock);
                return ret;
@@ -2305,9 +2262,9 @@ static ssize_t arcturus_get_gpu_metrics(struct smu_context *smu,
        SmuMetrics_t metrics;
        int ret = 0;
 
-       ret = arcturus_get_metrics_table(smu,
-                                        &metrics,
-                                        true);
+       ret = smu_cmn_get_metrics_table(smu,
+                                       &metrics,
+                                       true);
        if (ret)
                return ret;
 
index 82659b781f05c3e923424533710168816c210d3b..42a60769c52f43fe3f1f981f949edd968cf0f3e4 100644 (file)
@@ -504,34 +504,6 @@ err0_out:
        return -ENOMEM;
 }
 
-static int navi10_get_metrics_table_locked(struct smu_context *smu,
-                                          SmuMetrics_t *metrics_table,
-                                          bool bypass_cache)
-{
-       struct smu_table_context *smu_table= &smu->smu_table;
-       int ret = 0;
-
-       if (bypass_cache ||
-           !smu_table->metrics_time ||
-           time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(1))) {
-               ret = smu_cmn_update_table(smu,
-                                      SMU_TABLE_SMU_METRICS,
-                                      0,
-                                      smu_table->metrics_table,
-                                      false);
-               if (ret) {
-                       dev_info(smu->adev->dev, "Failed to export SMU metrics table!\n");
-                       return ret;
-               }
-               smu_table->metrics_time = jiffies;
-       }
-
-       if (metrics_table)
-               memcpy(metrics_table, smu_table->metrics_table, sizeof(SmuMetrics_t));
-
-       return 0;
-}
-
 static int navi10_get_smu_metrics_data(struct smu_context *smu,
                                       MetricsMember_t member,
                                       uint32_t *value)
@@ -547,9 +519,9 @@ static int navi10_get_smu_metrics_data(struct smu_context *smu,
 
        mutex_lock(&smu->metrics_lock);
 
-       ret = navi10_get_metrics_table_locked(smu,
-                                             NULL,
-                                             false);
+       ret = smu_cmn_get_metrics_table_locked(smu,
+                                              NULL,
+                                              false);
        if (ret) {
                mutex_unlock(&smu->metrics_lock);
                return ret;
@@ -2526,14 +2498,15 @@ static ssize_t navi10_get_gpu_metrics(struct smu_context *smu,
 
        mutex_lock(&smu->metrics_lock);
 
-       ret = navi10_get_metrics_table_locked(smu,
-                                             &metrics,
-                                             true);
+       ret = smu_cmn_get_metrics_table_locked(smu,
+                                              NULL,
+                                              true);
        if (ret) {
                mutex_unlock(&smu->metrics_lock);
                return ret;
        }
 
+       memcpy(&metrics, smu_table->metrics_table, sizeof(SmuMetrics_t));
        if (adev->asic_type == CHIP_NAVI12)
                memcpy(&nv12_metrics, smu_table->metrics_table, sizeof(SmuMetrics_NV12_t));
 
index c50c4547fea9d1503d60d277575efc71c264dc1d..186929c31e9e9e3b0b3bea5352fc320eaeedd82f 100644 (file)
@@ -128,36 +128,6 @@ static struct cmn2asic_mapping renoir_workload_map[PP_SMC_POWER_PROFILE_COUNT] =
        WORKLOAD_MAP(PP_SMC_POWER_PROFILE_CUSTOM,               WORKLOAD_PPLIB_CUSTOM_BIT),
 };
 
-static int renoir_get_metrics_table(struct smu_context *smu,
-                                   SmuMetrics_t *metrics_table,
-                                   bool bypass_cache)
-{
-       struct smu_table_context *smu_table= &smu->smu_table;
-       int ret = 0;
-
-       mutex_lock(&smu->metrics_lock);
-
-       if (bypass_cache ||
-           !smu_table->metrics_time ||
-           time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(1))) {
-               ret = smu_cmn_update_table(smu, SMU_TABLE_SMU_METRICS, 0,
-                               (void *)smu_table->metrics_table, false);
-               if (ret) {
-                       dev_info(smu->adev->dev, "Failed to export SMU metrics table!\n");
-                       mutex_unlock(&smu->metrics_lock);
-                       return ret;
-               }
-               smu_table->metrics_time = jiffies;
-       }
-
-       if (metrics_table)
-               memcpy(metrics_table, smu_table->metrics_table, sizeof(SmuMetrics_t));
-
-       mutex_unlock(&smu->metrics_lock);
-
-       return ret;
-}
-
 static int renoir_init_smc_tables(struct smu_context *smu)
 {
        struct smu_table_context *smu_table = &smu->smu_table;
@@ -381,7 +351,7 @@ static int renoir_print_clk_levels(struct smu_context *smu,
 
        memset(&metrics, 0, sizeof(metrics));
 
-       ret = renoir_get_metrics_table(smu, &metrics, false);
+       ret = smu_cmn_get_metrics_table(smu, &metrics, false);
        if (ret)
                return ret;
 
@@ -527,7 +497,7 @@ static int renoir_get_current_clk_freq_by_table(struct smu_context *smu,
        int ret = 0, clk_id = 0;
        SmuMetrics_t metrics;
 
-       ret = renoir_get_metrics_table(smu, &metrics, false);
+       ret = smu_cmn_get_metrics_table(smu, &metrics, false);
        if (ret)
                return ret;
 
@@ -610,7 +580,7 @@ static int renoir_get_gpu_temperature(struct smu_context *smu, uint32_t *value)
        if (!value)
                return -EINVAL;
 
-       ret = renoir_get_metrics_table(smu, &metrics, false);
+       ret = smu_cmn_get_metrics_table(smu, &metrics, false);
        if (ret)
                return ret;
 
@@ -630,7 +600,7 @@ static int renoir_get_current_activity_percent(struct smu_context *smu,
        if (!value)
                return -EINVAL;
 
-       ret = renoir_get_metrics_table(smu, &metrics, false);
+       ret = smu_cmn_get_metrics_table(smu, &metrics, false);
        if (ret)
                return ret;
 
@@ -1016,7 +986,7 @@ static ssize_t renoir_get_gpu_metrics(struct smu_context *smu,
        SmuMetrics_t metrics;
        int ret = 0;
 
-       ret = renoir_get_metrics_table(smu, &metrics, true);
+       ret = smu_cmn_get_metrics_table(smu, &metrics, true);
        if (ret)
                return ret;
 
index bb756b4c284edd2df53b430300042fb4acd33021..c5935f0a065b518d1681912dd49e59c34f42aca0 100644 (file)
@@ -407,49 +407,6 @@ err0_out:
        return -ENOMEM;
 }
 
-static int sienna_cichlid_get_metrics_table_locked(struct smu_context *smu,
-                                                  SmuMetrics_t *metrics_table,
-                                                  bool bypass_cache)
-{
-       struct smu_table_context *smu_table= &smu->smu_table;
-       int ret = 0;
-
-       if (bypass_cache ||
-           !smu_table->metrics_time ||
-           time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(1))) {
-               ret = smu_cmn_update_table(smu,
-                                      SMU_TABLE_SMU_METRICS,
-                                      0,
-                                      smu_table->metrics_table,
-                                      false);
-               if (ret) {
-                       dev_info(smu->adev->dev, "Failed to export SMU metrics table!\n");
-                       return ret;
-               }
-               smu_table->metrics_time = jiffies;
-       }
-
-       if (metrics_table)
-               memcpy(metrics_table, smu_table->metrics_table, sizeof(SmuMetrics_t));
-
-       return 0;
-}
-
-static int sienna_cichlid_get_metrics_table(struct smu_context *smu,
-                                           SmuMetrics_t *metrics_table,
-                                           bool bypass_cache)
-{
-       int ret = 0;
-
-       mutex_lock(&smu->metrics_lock);
-       ret = sienna_cichlid_get_metrics_table_locked(smu,
-                                                     metrics_table,
-                                                     bypass_cache);
-       mutex_unlock(&smu->metrics_lock);
-
-       return ret;
-}
-
 static int sienna_cichlid_get_smu_metrics_data(struct smu_context *smu,
                                               MetricsMember_t member,
                                               uint32_t *value)
@@ -460,9 +417,9 @@ static int sienna_cichlid_get_smu_metrics_data(struct smu_context *smu,
 
        mutex_lock(&smu->metrics_lock);
 
-       ret = sienna_cichlid_get_metrics_table_locked(smu,
-                                                     NULL,
-                                                     false);
+       ret = smu_cmn_get_metrics_table_locked(smu,
+                                              NULL,
+                                              false);
        if (ret) {
                mutex_unlock(&smu->metrics_lock);
                return ret;
@@ -2698,9 +2655,9 @@ static ssize_t sienna_cichlid_get_gpu_metrics(struct smu_context *smu,
        SmuMetrics_t metrics;
        int ret = 0;
 
-       ret = sienna_cichlid_get_metrics_table(smu,
-                                              &metrics,
-                                              true);
+       ret = smu_cmn_get_metrics_table(smu,
+                                       &metrics,
+                                       true);
        if (ret)
                return ret;
 
index 5c23c44c33bdd357200e9790678ab0165baea951..968b734baac057cdb7c9b1e349723ed7ad952337 100644 (file)
@@ -631,3 +631,48 @@ int smu_cmn_write_pptable(struct smu_context *smu)
                                    pptable,
                                    true);
 }
+
+int smu_cmn_get_metrics_table_locked(struct smu_context *smu,
+                                    void *metrics_table,
+                                    bool bypass_cache)
+{
+       struct smu_table_context *smu_table= &smu->smu_table;
+       uint32_t table_size =
+               smu_table->tables[SMU_TABLE_SMU_METRICS].size;
+       int ret = 0;
+
+       if (bypass_cache ||
+           !smu_table->metrics_time ||
+           time_after(jiffies, smu_table->metrics_time + msecs_to_jiffies(1))) {
+               ret = smu_cmn_update_table(smu,
+                                      SMU_TABLE_SMU_METRICS,
+                                      0,
+                                      smu_table->metrics_table,
+                                      false);
+               if (ret) {
+                       dev_info(smu->adev->dev, "Failed to export SMU metrics table!\n");
+                       return ret;
+               }
+               smu_table->metrics_time = jiffies;
+       }
+
+       if (metrics_table)
+               memcpy(metrics_table, smu_table->metrics_table, table_size);
+
+       return 0;
+}
+
+int smu_cmn_get_metrics_table(struct smu_context *smu,
+                             void *metrics_table,
+                             bool bypass_cache)
+{
+       int ret = 0;
+
+       mutex_lock(&smu->metrics_lock);
+       ret = smu_cmn_get_metrics_table_locked(smu,
+                                              metrics_table,
+                                              bypass_cache);
+       mutex_unlock(&smu->metrics_lock);
+
+       return ret;
+}
index 98face8c5fd61b9d0149c0fb94ed76196bdd4bec..6d00ad740c27883cdb28aba058ccb3d21badff58 100644 (file)
@@ -79,5 +79,13 @@ int smu_cmn_write_watermarks_table(struct smu_context *smu);
 
 int smu_cmn_write_pptable(struct smu_context *smu);
 
+int smu_cmn_get_metrics_table_locked(struct smu_context *smu,
+                                    void *metrics_table,
+                                    bool bypass_cache);
+
+int smu_cmn_get_metrics_table(struct smu_context *smu,
+                             void *metrics_table,
+                             bool bypass_cache);
+
 #endif
 #endif