[PATCH 2/2] drm/amd/pp: Add and initialize OD_dpm_table for CI/VI.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Please include a commit message.  Something like:

Add initial infrastructure for manual dpm control.

With that fixed:

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

________________________________
From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> on behalf of Rex Zhu <Rex.Zhu at amd.com>
Sent: Thursday, January 4, 2018 4:58:30 AM
To: amd-gfx at lists.freedesktop.org
Cc: Zhu, Rex
Subject: [PATCH 2/2] drm/amd/pp: Add and initialize OD_dpm_table for CI/VI.

Change-Id: I05db3fe2a274ce9666a5074c82448bf8bd6e7ee8
Signed-off-by: Rex Zhu <Rex.Zhu at amd.com>
---
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 73 ++++++++++++++++++++++++
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h | 14 +++++
 2 files changed, 87 insertions(+)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
index 9b17cec..863f0d6 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -792,6 +792,74 @@ static int smu7_setup_dpm_tables_v1(struct pp_hwmgr *hwmgr)
         return 0;
 }

+static int smu7_get_voltage_dependency_table(
+                       const struct phm_ppt_v1_clock_voltage_dependency_table *allowed_dep_table,
+                       struct phm_ppt_v1_clock_voltage_dependency_table *dep_table)
+{
+       uint8_t i = 0;
+       PP_ASSERT_WITH_CODE((0 != allowed_dep_table->count),
+                               "Voltage Lookup Table empty",
+                               return -EINVAL);
+
+       dep_table->count = allowed_dep_table->count;
+       for (i=0; i<dep_table->count; i++) {
+               dep_table->entries[i].clk = allowed_dep_table->entries[i].clk;
+               dep_table->entries[i].vddInd = allowed_dep_table->entries[i].vddInd;
+               dep_table->entries[i].vdd_offset = allowed_dep_table->entries[i].vdd_offset;
+               dep_table->entries[i].vddc = allowed_dep_table->entries[i].vddc;
+               dep_table->entries[i].vddgfx = allowed_dep_table->entries[i].vddgfx;
+               dep_table->entries[i].vddci = allowed_dep_table->entries[i].vddci;
+               dep_table->entries[i].mvdd = allowed_dep_table->entries[i].mvdd;
+               dep_table->entries[i].phases = allowed_dep_table->entries[i].phases;
+               dep_table->entries[i].cks_enable = allowed_dep_table->entries[i].cks_enable;
+               dep_table->entries[i].cks_voffset = allowed_dep_table->entries[i].cks_voffset;
+       }
+
+       return 0;
+}
+
+static int smu7_odn_initial_default_setting(struct pp_hwmgr *hwmgr)
+{
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+       struct smu7_odn_dpm_table *odn_table = &(data->odn_dpm_table);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       uint32_t i;
+
+       struct phm_ppt_v1_clock_voltage_dependency_table *dep_sclk_table;
+       struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table;
+
+       if (table_info == NULL)
+               return -EINVAL;
+
+       dep_sclk_table = table_info->vdd_dep_on_sclk;
+       dep_mclk_table = table_info->vdd_dep_on_mclk;
+
+       odn_table->odn_core_clock_dpm_levels.number_of_performance_levels =
+                                               data->dpm_table.sclk_table.count;
+       for (i=0; i<data->dpm_table.sclk_table.count; i++) {
+               odn_table->odn_core_clock_dpm_levels.entries[i].clock =
+                                       data->dpm_table.sclk_table.dpm_levels[i].value;
+               odn_table->odn_core_clock_dpm_levels.entries[i].enabled = true;
+       }
+
+       smu7_get_voltage_dependency_table(dep_sclk_table,
+               (struct phm_ppt_v1_clock_voltage_dependency_table *)&(odn_table->vdd_dependency_on_sclk));
+
+       odn_table->odn_memory_clock_dpm_levels.number_of_performance_levels =
+                                               data->dpm_table.mclk_table.count;
+       for (i=0; i<data->dpm_table.sclk_table.count; i++) {
+               odn_table->odn_memory_clock_dpm_levels.entries[i].clock =
+                                       data->dpm_table.mclk_table.dpm_levels[i].value;
+               odn_table->odn_memory_clock_dpm_levels.entries[i].enabled = true;
+       }
+
+       smu7_get_voltage_dependency_table(dep_mclk_table,
+               (struct phm_ppt_v1_clock_voltage_dependency_table *)&(odn_table->vdd_dependency_on_mclk));
+
+       return 0;
+}
+
 static int smu7_setup_default_dpm_tables(struct pp_hwmgr *hwmgr)
 {
         struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
@@ -808,6 +876,11 @@ static int smu7_setup_default_dpm_tables(struct pp_hwmgr *hwmgr)
         /* save a copy of the default DPM table */
         memcpy(&(data->golden_dpm_table), &(data->dpm_table),
                         sizeof(struct smu7_dpm_table));
+
+       /* initialize ODN table */
+       if (hwmgr->od_enabled)
+               smu7_odn_initial_default_setting(hwmgr);
+
         return 0;
 }

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
index beba25c..8eec974 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
@@ -178,9 +178,23 @@ struct smu7_pcie_perf_range {
         uint16_t  min;
 };

+struct smu7_odn_clock_voltage_dependency_table {
+       uint32_t count;
+       phm_ppt_v1_clock_voltage_dependency_record entries[MAX_REGULAR_DPM_NUMBER];
+};
+
+struct smu7_odn_dpm_table {
+       struct phm_odn_clock_levels             odn_core_clock_dpm_levels;
+       struct phm_odn_clock_levels             odn_memory_clock_dpm_levels;
+       struct smu7_odn_clock_voltage_dependency_table  vdd_dependency_on_sclk;
+       struct smu7_odn_clock_voltage_dependency_table  vdd_dependency_on_mclk;
+       uint32_t                                        odn_mclk_min_limit;
+};
+
 struct smu7_hwmgr {
         struct smu7_dpm_table                   dpm_table;
         struct smu7_dpm_table                   golden_dpm_table;
+       struct smu7_odn_dpm_table               odn_dpm_table;

         uint32_t                                                voting_rights_clients[8];
         uint32_t                                                static_screen_threshold_unit;
--
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx at lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20180104/4453f1b6/attachment.html>


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux