drm/amd/powerplay: add DPMCLOCKS table implementation
authorAaron Liu <aaron.liu@amd.com>
Tue, 30 Jul 2019 03:28:27 +0000 (11:28 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 22 Aug 2019 22:38:05 +0000 (17:38 -0500)
This patch adds add DPMCLOCKS table implementation
Rename smu_populate_smc_pptable to smu_populate_smc_tables

Signed-off-by: Aaron Liu <aaron.liu@amd.com>
Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
Reviewed-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Kevin Wang <kevin1.wang@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/renoir_ppt.c
drivers/gpu/drm/amd/powerplay/smu_v11_0.c
drivers/gpu/drm/amd/powerplay/smu_v12_0.c

index 95972901db1475c5f5b2510b3d9c72b0224bc4f5..935f277e2438988595a79f7d1146e09ab6ea3f45 100644 (file)
@@ -1150,7 +1150,7 @@ static int smu_smc_table_hw_init(struct smu_context *smu,
         * type of clks.
         */
        if (initialize) {
-               ret = smu_populate_smc_pptable(smu);
+               ret = smu_populate_smc_tables(smu);
                if (ret)
                        return ret;
 
index 4d156e5ab2e8b457495f6680df75c91be29cae4a..c42691a9afd349e6349af61cc40061de5b08c166 100644 (file)
@@ -253,6 +253,7 @@ struct smu_table_context
        void                            *hardcode_pptable;
        unsigned long                   metrics_time;
        void                            *metrics_table;
+       void                            *clocks_table;
 
        void                            *max_sustainable_clocks;
        struct smu_bios_boot_up_values  boot_values;
@@ -473,7 +474,7 @@ struct smu_funcs
        int (*get_clk_info_from_vbios)(struct smu_context *smu);
        int (*check_pptable)(struct smu_context *smu);
        int (*parse_pptable)(struct smu_context *smu);
-       int (*populate_smc_pptable)(struct smu_context *smu);
+       int (*populate_smc_tables)(struct smu_context *smu);
        int (*check_fw_version)(struct smu_context *smu);
        int (*powergate_sdma)(struct smu_context *smu, bool gate);
        int (*powergate_vcn)(struct smu_context *smu, bool gate);
@@ -568,8 +569,8 @@ struct smu_funcs
        ((smu)->funcs->check_pptable ? (smu)->funcs->check_pptable((smu)) : 0)
 #define smu_parse_pptable(smu) \
        ((smu)->funcs->parse_pptable ? (smu)->funcs->parse_pptable((smu)) : 0)
-#define smu_populate_smc_pptable(smu) \
-       ((smu)->funcs->populate_smc_pptable ? (smu)->funcs->populate_smc_pptable((smu)) : 0)
+#define smu_populate_smc_tables(smu) \
+       ((smu)->funcs->populate_smc_tables ? (smu)->funcs->populate_smc_tables((smu)) : 0)
 #define smu_check_fw_version(smu) \
        ((smu)->funcs->check_fw_version ? (smu)->funcs->check_fw_version((smu)) : 0)
 #define smu_write_pptable(smu) \
index c8e0d79de43ecd9adf439a947a4e27a1c55468c5..de43159564a57eba89ee938476f7189717749fee 100644 (file)
@@ -140,6 +140,8 @@ static int renoir_get_smu_table_index(struct smu_context *smc, uint32_t index)
 
 static int renoir_tables_init(struct smu_context *smu, struct smu_table *tables)
 {
+       struct smu_table_context *smu_table = &smu->smu_table;
+
        SMU_TABLE_INIT(tables, SMU_TABLE_WATERMARKS, sizeof(Watermarks_t),
                PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
        SMU_TABLE_INIT(tables, SMU_TABLE_DPMCLOCKS, sizeof(DpmClocks_t),
@@ -147,6 +149,10 @@ static int renoir_tables_init(struct smu_context *smu, struct smu_table *tables)
        SMU_TABLE_INIT(tables, SMU_TABLE_SMU_METRICS, sizeof(SmuMetrics_t),
                PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
 
+       smu_table->clocks_table = kzalloc(sizeof(DpmClocks_t), GFP_KERNEL);
+       if (!smu_table->clocks_table)
+               return -ENOMEM;
+
        return 0;
 }
 
index e163ec6f4cb84a5449d88e3b0516baa99ac2425d..fa0b0256e0bc43591279f9d8dfdc6d683b9465dc 100644 (file)
@@ -1736,7 +1736,7 @@ static const struct smu_funcs smu_v11_0_funcs = {
        .notify_memory_pool_location = smu_v11_0_notify_memory_pool_location,
        .check_pptable = smu_v11_0_check_pptable,
        .parse_pptable = smu_v11_0_parse_pptable,
-       .populate_smc_pptable = smu_v11_0_populate_smc_pptable,
+       .populate_smc_tables = smu_v11_0_populate_smc_pptable,
        .write_pptable = smu_v11_0_write_pptable,
        .write_watermarks_table = smu_v11_0_write_watermarks_table,
        .set_min_dcef_deep_sleep = smu_v11_0_set_min_dcef_deep_sleep,
index 76a6c4b7b63caebebaaf4b513396f61092b3a7f4..0f5d08ae71ae7e417e636cd28da7e53b786fe2c6 100644 (file)
@@ -295,11 +295,30 @@ static int smu_v12_0_fini_smc_tables(struct smu_context *smu)
        if (!smu_table->tables || smu_table->table_count == 0)
                return -EINVAL;
 
+       kfree(smu_table->clocks_table);
        kfree(smu_table->tables);
+
+       smu_table->clocks_table = NULL;
        smu_table->tables = NULL;
 
        return 0;
 }
+
+static int smu_v12_0_populate_smc_tables(struct smu_context *smu)
+{
+       struct smu_table_context *smu_table = &smu->smu_table;
+       struct smu_table *table = NULL;
+
+       table = &smu_table->tables[SMU_TABLE_DPMCLOCKS];
+       if (!table)
+               return -EINVAL;
+
+       if (!table->cpu_addr)
+               return -EINVAL;
+
+       return smu_update_table(smu, SMU_TABLE_DPMCLOCKS, 0, smu_table->clocks_table, false);
+}
+
 static const struct smu_funcs smu_v12_0_funcs = {
        .check_fw_status = smu_v12_0_check_fw_status,
        .check_fw_version = smu_v12_0_check_fw_version,
@@ -312,6 +331,7 @@ static const struct smu_funcs smu_v12_0_funcs = {
        .gfx_off_control = smu_v12_0_gfx_off_control,
        .init_smc_tables = smu_v12_0_init_smc_tables,
        .fini_smc_tables = smu_v12_0_fini_smc_tables,
+       .populate_smc_tables = smu_v12_0_populate_smc_tables,
 };
 
 void smu_v12_0_set_smu_funcs(struct smu_context *smu)