]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/amd/powerplay: cache the watermark settings on system memory
authorEvan Quan <evan.quan@amd.com>
Tue, 31 Dec 2019 02:33:19 +0000 (10:33 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 7 Jan 2020 17:01:15 +0000 (12:01 -0500)
So that we do not need to allocate a piece of VRAM for it. This
is a preparation for coming change which unifies the VRAM address
for all driver tables interaction with SMU.

Signed-off-by: Evan Quan <evan.quan@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
drivers/gpu/drm/amd/powerplay/navi10_ppt.c
drivers/gpu/drm/amd/powerplay/renoir_ppt.c
drivers/gpu/drm/amd/powerplay/smu_v11_0.c
drivers/gpu/drm/amd/powerplay/vega20_ppt.c

index d432ba08968a0657437e336f618a72940c3d3f58..3b6275831004d5bc51291b161c8e0f2133bf3fc2 100644 (file)
@@ -1929,32 +1929,25 @@ int smu_set_df_cstate(struct smu_context *smu,
 
 int smu_write_watermarks_table(struct smu_context *smu)
 {
-       int ret = 0;
-       struct smu_table_context *smu_table = &smu->smu_table;
-       struct smu_table *table = NULL;
+       void *watermarks_table = smu->smu_table.watermarks_table;
 
-       table = &smu_table->tables[SMU_TABLE_WATERMARKS];
-
-       if (!table->cpu_addr)
+       if (!watermarks_table)
                return -EINVAL;
 
-       ret = smu_update_table(smu, SMU_TABLE_WATERMARKS, 0, table->cpu_addr,
+       return smu_update_table(smu,
+                               SMU_TABLE_WATERMARKS,
+                               0,
+                               watermarks_table,
                                true);
-
-       return ret;
 }
 
 int smu_set_watermarks_for_clock_ranges(struct smu_context *smu,
                struct dm_pp_wm_sets_with_clock_ranges_soc15 *clock_ranges)
 {
-       struct smu_table *watermarks;
-       void *table;
-
-       if (!smu->smu_table.tables)
-               return 0;
+       void *table = smu->smu_table.watermarks_table;
 
-       watermarks = &smu->smu_table.tables[SMU_TABLE_WATERMARKS];
-       table = watermarks->cpu_addr;
+       if (!table)
+               return -EINVAL;
 
        mutex_lock(&smu->mutex);
 
index 5ddadd2d90cf67732019c80add90376af5b7f09e..02d33b50e735281540168318560a02d29e592e8f 100644 (file)
@@ -254,6 +254,7 @@ struct smu_table_context
        unsigned long                   metrics_time;
        void                            *metrics_table;
        void                            *clocks_table;
+       void                            *watermarks_table;
 
        void                            *max_sustainable_clocks;
        struct smu_bios_boot_up_values  boot_values;
index 455f1ef23ab8017efc659f097e88947387065fd8..5fcfa6e5c2446533bcafbaf8eac36eefc9bcf401 100644 (file)
@@ -555,6 +555,10 @@ static int navi10_tables_init(struct smu_context *smu, struct smu_table *tables)
                return -ENOMEM;
        smu_table->metrics_time = 0;
 
+       smu_table->watermarks_table = kzalloc(sizeof(Watermarks_t), GFP_KERNEL);
+       if (!smu_table->watermarks_table)
+               return -ENOMEM;
+
        return 0;
 }
 
index e73644beffd964b5f2921b4cdfc101a1b714df94..506cc6bf4bc06d85cc3fffc36cf205655055a382 100644 (file)
@@ -209,6 +209,10 @@ static int renoir_tables_init(struct smu_context *smu, struct smu_table *tables)
                return -ENOMEM;
        smu_table->metrics_time = 0;
 
+       smu_table->watermarks_table = kzalloc(sizeof(Watermarks_t), GFP_KERNEL);
+       if (!smu_table->watermarks_table)
+               return -ENOMEM;
+
        return 0;
 }
 
index a85826471d82c33574ebd095b49b9c7a4e51d80c..6fb93eb6ab390244ec7f0aa97d9b0a16e93df39f 100644 (file)
@@ -450,8 +450,10 @@ int smu_v11_0_fini_smc_tables(struct smu_context *smu)
 
        kfree(smu_table->tables);
        kfree(smu_table->metrics_table);
+       kfree(smu_table->watermarks_table);
        smu_table->tables = NULL;
        smu_table->metrics_table = NULL;
+       smu_table->watermarks_table = NULL;
        smu_table->metrics_time = 0;
 
        ret = smu_v11_0_fini_dpm_context(smu);
index 534c46bc0146b129f5863703c1ccef27581b77c0..27bdcdeb08d973fb33cc47039ca503b60520d7a3 100644 (file)
@@ -338,6 +338,10 @@ static int vega20_tables_init(struct smu_context *smu, struct smu_table *tables)
                return -ENOMEM;
        smu_table->metrics_time = 0;
 
+       smu_table->watermarks_table = kzalloc(sizeof(Watermarks_t), GFP_KERNEL);
+       if (!smu_table->watermarks_table)
+               return -ENOMEM;
+
        return 0;
 }