Change-Id: I5cbd25597b02a01e7de28347659139a5e0a30098
Signed-off-by: Rex Zhu <[email protected]>
Reviewed-by: Alex Deucher <[email protected]>
---
 drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c        |   2 +-
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c   | 704 +++++++++++++++++++--
 drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h   |   2 +-
 .../gpu/drm/amd/powerplay/hwmgr/smu7_powertune.c   |  15 +-
 4 files changed, 671 insertions(+), 52 deletions(-)

diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
index cb5627f..2b162ee 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
@@ -70,7 +70,7 @@ int hwmgr_init(struct amd_pp_init *pp_init, struct 
pp_instance *handle)
 
        hwmgr_init_default_caps(hwmgr);
        hwmgr_set_user_specify_caps(hwmgr);
-
+       hwmgr->pp_table_version = PP_TABLE_V1;
        switch (hwmgr->chip_family) {
        case AMDGPU_FAMILY_CZ:
                cz_hwmgr_init(hwmgr);
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
index 4379697..0f9c8f6 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -44,7 +44,7 @@
 #include "smu7_dyn_defaults.h"
 #include "smu7_thermal.h"
 #include "smu7_clockpowergating.h"
-
+#include "processpptables.h"
 
 #define MC_CG_ARB_FREQ_F0           0x0a
 #define MC_CG_ARB_FREQ_F1           0x0b
@@ -191,6 +191,29 @@ static int smu7_enable_voltage_control(struct pp_hwmgr 
*hwmgr)
        return 0;
 }
 
+static int phm_get_svi2_voltage_table_v0(pp_atomctrl_voltage_table 
*voltage_table,
+               struct phm_clock_voltage_dependency_table 
*voltage_dependency_table
+               )
+{
+       uint32_t i;
+
+       PP_ASSERT_WITH_CODE((NULL != voltage_table),
+                       "Voltage Dependency Table empty.", return -EINVAL;);
+
+       voltage_table->mask_low = 0;
+       voltage_table->phase_delay = 0;
+       voltage_table->count = voltage_dependency_table->count;
+
+       for (i = 0; i < voltage_dependency_table->count; i++) {
+               voltage_table->entries[i].value =
+                       voltage_dependency_table->entries[i].v;
+               voltage_table->entries[i].smio_low = 0;
+       }
+
+       return 0;
+}
+
+
 /**
 * Create Voltage Tables.
 *
@@ -202,7 +225,7 @@ static int smu7_construct_voltage_tables(struct pp_hwmgr 
*hwmgr)
        struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
        struct phm_ppt_v1_information *table_info =
                        (struct phm_ppt_v1_information *)hwmgr->pptable;
-       int result;
+       int result = 0;
        uint32_t tmp;
 
        if (SMU7_VOLTAGE_CONTROL_BY_GPIO == data->mvdd_control) {
@@ -213,8 +236,13 @@ static int smu7_construct_voltage_tables(struct pp_hwmgr 
*hwmgr)
                                "Failed to retrieve MVDD table.",
                                return result);
        } else if (SMU7_VOLTAGE_CONTROL_BY_SVID2 == data->mvdd_control) {
-               result = 
phm_get_svi2_mvdd_voltage_table(&(data->mvdd_voltage_table),
-                               table_info->vdd_dep_on_mclk);
+               if (hwmgr->pp_table_version == PP_TABLE_V1)
+                       result = 
phm_get_svi2_mvdd_voltage_table(&(data->mvdd_voltage_table),
+                                       table_info->vdd_dep_on_mclk);
+               else if (hwmgr->pp_table_version == PP_TABLE_V0)
+                       result = 
phm_get_svi2_voltage_table_v0(&(data->mvdd_voltage_table),
+                                       
hwmgr->dyn_state.mvdd_dependency_on_mclk);
+
                PP_ASSERT_WITH_CODE((0 == result),
                                "Failed to retrieve SVI2 MVDD table from 
dependancy table.",
                                return result;);
@@ -228,8 +256,12 @@ static int smu7_construct_voltage_tables(struct pp_hwmgr 
*hwmgr)
                                "Failed to retrieve VDDCI table.",
                                return result);
        } else if (SMU7_VOLTAGE_CONTROL_BY_SVID2 == data->vddci_control) {
-               result = 
phm_get_svi2_vddci_voltage_table(&(data->vddci_voltage_table),
-                               table_info->vdd_dep_on_mclk);
+               if (hwmgr->pp_table_version == PP_TABLE_V1)
+                       result = 
phm_get_svi2_vddci_voltage_table(&(data->vddci_voltage_table),
+                                       table_info->vdd_dep_on_mclk);
+               else if (hwmgr->pp_table_version == PP_TABLE_V0)
+                       result = 
phm_get_svi2_voltage_table_v0(&(data->vddci_voltage_table),
+                                       
hwmgr->dyn_state.vddci_dependency_on_mclk);
                PP_ASSERT_WITH_CODE((0 == result),
                                "Failed to retrieve SVI2 VDDCI table from 
dependancy table.",
                                return result);
@@ -243,13 +275,26 @@ static int smu7_construct_voltage_tables(struct pp_hwmgr 
*hwmgr)
                        "Failed to retrieve SVI2 VDDGFX table from lookup 
table.", return result;);
        }
 
-       if (SMU7_VOLTAGE_CONTROL_BY_SVID2 == data->voltage_control) {
-               result = 
phm_get_svi2_vdd_voltage_table(&(data->vddc_voltage_table),
+
+       if (SMU7_VOLTAGE_CONTROL_BY_GPIO == data->voltage_control) {
+               result = atomctrl_get_voltage_table_v3(hwmgr,
+                                       VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_GPIO_LUT,
+                                       &data->vddc_voltage_table);
+               PP_ASSERT_WITH_CODE((0 == result),
+                       "Failed to retrieve VDDC table.", return result;);
+       } else if (SMU7_VOLTAGE_CONTROL_BY_SVID2 == data->voltage_control) {
+
+               if (hwmgr->pp_table_version == PP_TABLE_V0)
+                       result = 
phm_get_svi2_voltage_table_v0(&data->vddc_voltage_table,
+                                       
hwmgr->dyn_state.vddc_dependency_on_mclk);
+               else if (hwmgr->pp_table_version == PP_TABLE_V1)
+                       result = 
phm_get_svi2_vdd_voltage_table(&(data->vddc_voltage_table),
                                table_info->vddc_lookup_table);
+
                PP_ASSERT_WITH_CODE((0 == result),
-                               "Failed to retrieve SVI2 VDDC table from lookup 
table.",
-                               return result);
+                       "Failed to retrieve SVI2 VDDC table from dependancy 
table.", return result;);
        }
+
        tmp = smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_VDDC);
        PP_ASSERT_WITH_CODE(
                        (data->vddc_voltage_table.count <= tmp),
@@ -480,7 +525,8 @@ static int smu7_setup_default_pcie_table(struct pp_hwmgr 
*hwmgr)
 
        struct phm_ppt_v1_information *table_info =
                        (struct phm_ppt_v1_information *)(hwmgr->pptable);
-       struct phm_ppt_v1_pcie_table *pcie_table = table_info->pcie_table;
+       struct phm_ppt_v1_pcie_table *pcie_table = NULL;
+
        uint32_t i, max_entry;
        uint32_t tmp;
 
@@ -488,6 +534,9 @@ static int smu7_setup_default_pcie_table(struct pp_hwmgr 
*hwmgr)
                        data->use_pcie_power_saving_levels), "No pcie 
performance levels!",
                        return -EINVAL);
 
+       if (table_info != NULL)
+               pcie_table = table_info->pcie_table;
+
        if (data->use_pcie_performance_levels &&
                        !data->use_pcie_power_saving_levels) {
                data->pcie_gen_power_saving = data->pcie_gen_performance;
@@ -563,6 +612,39 @@ static int smu7_setup_default_pcie_table(struct pp_hwmgr 
*hwmgr)
        return 0;
 }
 
+static int smu7_reset_dpm_tables(struct pp_hwmgr *hwmgr)
+{
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+       memset(&(data->dpm_table), 0x00, sizeof(data->dpm_table));
+
+       phm_reset_single_dpm_table(
+                       &data->dpm_table.sclk_table,
+                               smum_get_mac_definition(hwmgr->smumgr,
+                                       SMU_MAX_LEVELS_GRAPHICS),
+                                       MAX_REGULAR_DPM_NUMBER);
+       phm_reset_single_dpm_table(
+                       &data->dpm_table.mclk_table,
+                       smum_get_mac_definition(hwmgr->smumgr,
+                               SMU_MAX_LEVELS_MEMORY), MAX_REGULAR_DPM_NUMBER);
+
+       phm_reset_single_dpm_table(
+                       &data->dpm_table.vddc_table,
+                               smum_get_mac_definition(hwmgr->smumgr,
+                                       SMU_MAX_LEVELS_VDDC),
+                                       MAX_REGULAR_DPM_NUMBER);
+       phm_reset_single_dpm_table(
+                       &data->dpm_table.vddci_table,
+                       smum_get_mac_definition(hwmgr->smumgr,
+                               SMU_MAX_LEVELS_VDDCI), MAX_REGULAR_DPM_NUMBER);
+
+       phm_reset_single_dpm_table(
+                       &data->dpm_table.mvdd_table,
+                               smum_get_mac_definition(hwmgr->smumgr,
+                                       SMU_MAX_LEVELS_MVDD),
+                                       MAX_REGULAR_DPM_NUMBER);
+       return 0;
+}
 /*
  * This function is to initialize all DPM state tables
  * for SMU7 based on the dependency table.
@@ -571,17 +653,108 @@ static int smu7_setup_default_pcie_table(struct pp_hwmgr 
*hwmgr)
  * on the power policy or external client requests,
  * such as UVD request, etc.
  */
-int smu7_setup_default_dpm_tables(struct pp_hwmgr *hwmgr)
+
+static int smu7_setup_dpm_tables_v0(struct pp_hwmgr *hwmgr)
+{
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+       struct phm_clock_voltage_dependency_table *allowed_vdd_sclk_table =
+               hwmgr->dyn_state.vddc_dependency_on_sclk;
+       struct phm_clock_voltage_dependency_table *allowed_vdd_mclk_table =
+               hwmgr->dyn_state.vddc_dependency_on_mclk;
+       struct phm_cac_leakage_table *std_voltage_table =
+               hwmgr->dyn_state.cac_leakage_table;
+       uint32_t i;
+
+       PP_ASSERT_WITH_CODE(allowed_vdd_sclk_table != NULL,
+               "SCLK dependency table is missing. This table is mandatory", 
return -EINVAL);
+       PP_ASSERT_WITH_CODE(allowed_vdd_sclk_table->count >= 1,
+               "SCLK dependency table has to have is missing. This table is 
mandatory", return -EINVAL);
+
+       PP_ASSERT_WITH_CODE(allowed_vdd_mclk_table != NULL,
+               "MCLK dependency table is missing. This table is mandatory", 
return -1);
+       PP_ASSERT_WITH_CODE(allowed_vdd_mclk_table->count >= 1,
+               "VMCLK dependency table has to have is missing. This table is 
mandatory", return -EINVAL);
+
+
+       /* Initialize Sclk DPM table based on allow Sclk values*/
+       data->dpm_table.sclk_table.count = 0;
+
+       for (i = 0; i < allowed_vdd_sclk_table->count; i++) {
+               if (i == 0 || 
data->dpm_table.sclk_table.dpm_levels[data->dpm_table.sclk_table.count-1].value 
!=
+                               allowed_vdd_sclk_table->entries[i].clk) {
+                       
data->dpm_table.sclk_table.dpm_levels[data->dpm_table.sclk_table.count].value =
+                               allowed_vdd_sclk_table->entries[i].clk;
+                       
data->dpm_table.sclk_table.dpm_levels[data->dpm_table.sclk_table.count].enabled 
= 1; /*(i==0) ? 1 : 0; to do */
+                       data->dpm_table.sclk_table.count++;
+               }
+       }
+
+       PP_ASSERT_WITH_CODE(allowed_vdd_mclk_table != NULL,
+               "MCLK dependency table is missing. This table is mandatory", 
return -1);
+       /* Initialize Mclk DPM table based on allow Mclk values */
+       data->dpm_table.mclk_table.count = 0;
+       for (i = 0; i < allowed_vdd_mclk_table->count; i++) {
+               if (i == 0 || 
data->dpm_table.mclk_table.dpm_levels[data->dpm_table.mclk_table.count-1].value 
!=
+                       allowed_vdd_mclk_table->entries[i].clk) {
+                       
data->dpm_table.mclk_table.dpm_levels[data->dpm_table.mclk_table.count].value =
+                               allowed_vdd_mclk_table->entries[i].clk;
+                       
data->dpm_table.mclk_table.dpm_levels[data->dpm_table.mclk_table.count].enabled 
= 1; /*(i==0) ? 1 : 0; */
+                       data->dpm_table.mclk_table.count++;
+               }
+       }
+
+       /* Initialize Vddc DPM table based on allow Vddc values.  And populate 
corresponding std values. */
+       for (i = 0; i < allowed_vdd_sclk_table->count; i++) {
+               data->dpm_table.vddc_table.dpm_levels[i].value = 
allowed_vdd_mclk_table->entries[i].v;
+               data->dpm_table.vddc_table.dpm_levels[i].param1 = 
std_voltage_table->entries[i].Leakage;
+               /* param1 is for corresponding std voltage */
+               data->dpm_table.vddc_table.dpm_levels[i].enabled = 1;
+       }
+
+       data->dpm_table.vddc_table.count = allowed_vdd_sclk_table->count;
+       allowed_vdd_mclk_table = hwmgr->dyn_state.vddci_dependency_on_mclk;
+
+       if (NULL != allowed_vdd_mclk_table) {
+               /* Initialize Vddci DPM table based on allow Mclk values */
+               for (i = 0; i < allowed_vdd_mclk_table->count; i++) {
+                       data->dpm_table.vddci_table.dpm_levels[i].value = 
allowed_vdd_mclk_table->entries[i].v;
+                       data->dpm_table.vddci_table.dpm_levels[i].enabled = 1;
+               }
+               data->dpm_table.vddci_table.count = 
allowed_vdd_mclk_table->count;
+       }
+
+       allowed_vdd_mclk_table = hwmgr->dyn_state.mvdd_dependency_on_mclk;
+
+       if (NULL != allowed_vdd_mclk_table) {
+               /*
+                * Initialize MVDD DPM table based on allow Mclk
+                * values
+                */
+               for (i = 0; i < allowed_vdd_mclk_table->count; i++) {
+                       data->dpm_table.mvdd_table.dpm_levels[i].value = 
allowed_vdd_mclk_table->entries[i].v;
+                       data->dpm_table.mvdd_table.dpm_levels[i].enabled = 1;
+               }
+               data->dpm_table.mvdd_table.count = 
allowed_vdd_mclk_table->count;
+       }
+
+       return 0;
+}
+
+static int smu7_setup_dpm_tables_v1(struct pp_hwmgr *hwmgr)
 {
        struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
        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 =
-                       table_info->vdd_dep_on_sclk;
-       struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table =
-                       table_info->vdd_dep_on_mclk;
+       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;
 
        PP_ASSERT_WITH_CODE(dep_sclk_table != NULL,
                        "SCLK dependency table is missing.",
@@ -597,18 +770,6 @@ int smu7_setup_default_dpm_tables(struct pp_hwmgr *hwmgr)
                        "MCLK dependency table count is 0",
                        return -EINVAL);
 
-       /* clear the state table to reset everything to default */
-       phm_reset_single_dpm_table(
-                       &data->dpm_table.sclk_table,
-                               smum_get_mac_definition(hwmgr->smumgr,
-                                       SMU_MAX_LEVELS_GRAPHICS),
-                                       MAX_REGULAR_DPM_NUMBER);
-       phm_reset_single_dpm_table(
-                       &data->dpm_table.mclk_table,
-                       smum_get_mac_definition(hwmgr->smumgr,
-                               SMU_MAX_LEVELS_MEMORY), MAX_REGULAR_DPM_NUMBER);
-
-
        /* Initialize Sclk DPM table based on allow Sclk values */
        data->dpm_table.sclk_table.count = 0;
        for (i = 0; i < dep_sclk_table->count; i++) {
@@ -638,13 +799,25 @@ int smu7_setup_default_dpm_tables(struct pp_hwmgr *hwmgr)
                }
        }
 
-       /* setup PCIE gen speed levels */
+       return 0;
+}
+
+int smu7_setup_default_dpm_tables(struct pp_hwmgr *hwmgr)
+{
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+       smu7_reset_dpm_tables(hwmgr);
+
+       if (hwmgr->pp_table_version == PP_TABLE_V1)
+               smu7_setup_dpm_tables_v1(hwmgr);
+       else if (hwmgr->pp_table_version == PP_TABLE_V0)
+               smu7_setup_dpm_tables_v0(hwmgr);
+
        smu7_setup_default_pcie_table(hwmgr);
 
        /* save a copy of the default DPM table */
        memcpy(&(data->golden_dpm_table), &(data->dpm_table),
                        sizeof(struct smu7_dpm_table));
-
        return 0;
 }
 
@@ -1099,7 +1272,7 @@ int smu7_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
        PP_ASSERT_WITH_CODE((0 == tmp_result),
                        "pcie performance request failed!", result = 
tmp_result);
 
-       return result;
+       return 0;
 }
 
 int smu7_disable_dpm_tasks(struct pp_hwmgr *hwmgr)
@@ -1245,7 +1418,8 @@ static void smu7_init_dpm_defaults(struct pp_hwmgr *hwmgr)
                phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
                                PHM_PlatformCaps_ControlVDDCI);
 
-       if (table_info->cac_dtp_table->usClockStretchAmount != 0)
+       if ((hwmgr->pp_table_version != PP_TABLE_V0)
+               && (table_info->cac_dtp_table->usClockStretchAmount != 0))
                phm_cap_set(hwmgr->platform_descriptor.platformCaps,
                                        PHM_PlatformCaps_ClockStretcher);
 
@@ -1275,8 +1449,11 @@ static int smu7_get_evv_voltages(struct pp_hwmgr *hwmgr)
        uint32_t sclk = 0;
        struct phm_ppt_v1_information *table_info =
                        (struct phm_ppt_v1_information *)hwmgr->pptable;
-       struct phm_ppt_v1_clock_voltage_dependency_table *sclk_table =
-                       table_info->vdd_dep_on_sclk;
+       struct phm_ppt_v1_clock_voltage_dependency_table *sclk_table = NULL;
+
+
+       if (table_info != NULL)
+               sclk_table = table_info->vdd_dep_on_sclk;
 
        for (i = 0; i < SMU7_MAX_LEAKAGE_COUNT; i++) {
                vv_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i;
@@ -1312,7 +1489,8 @@ static int smu7_get_evv_voltages(struct pp_hwmgr *hwmgr)
                        }
                } else {
 
-                       if (!phm_get_sclk_for_voltage_evv(hwmgr,
+                       if ((hwmgr->pp_table_version == PP_TABLE_V0)
+                               || !phm_get_sclk_for_voltage_evv(hwmgr,
                                        table_info->vddc_lookup_table, vv_id, 
&sclk)) {
                                if 
(phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
                                                
PHM_PlatformCaps_ClockStretcher)) {
@@ -1355,7 +1533,7 @@ static int smu7_get_evv_voltages(struct pp_hwmgr *hwmgr)
  * @param     pointer to changing voltage
  * @param     pointer to leakage table
  */
-static void smu7_patch_with_vdd_leakage(struct pp_hwmgr *hwmgr,
+static void smu7_patch_ppt_v1_with_vdd_leakage(struct pp_hwmgr *hwmgr,
                uint16_t *voltage, struct smu7_leakage_voltage *leakage_table)
 {
        uint32_t index;
@@ -1389,7 +1567,7 @@ static int smu7_patch_lookup_table_with_leakage(struct 
pp_hwmgr *hwmgr,
        uint32_t i;
 
        for (i = 0; i < lookup_table->count; i++)
-               smu7_patch_with_vdd_leakage(hwmgr,
+               smu7_patch_ppt_v1_with_vdd_leakage(hwmgr,
                                &lookup_table->entries[i].us_vdd, 
leakage_table);
 
        return 0;
@@ -1401,7 +1579,7 @@ static int 
smu7_patch_clock_voltage_limits_with_vddc_leakage(
 {
        struct phm_ppt_v1_information *table_info =
                        (struct phm_ppt_v1_information *)(hwmgr->pptable);
-       smu7_patch_with_vdd_leakage(hwmgr, (uint16_t *)vddc, leakage_table);
+       smu7_patch_ppt_v1_with_vdd_leakage(hwmgr, (uint16_t *)vddc, 
leakage_table);
        hwmgr->dyn_state.max_clock_voltage_on_dc.vddc =
                        table_info->max_clock_voltage_on_dc.vddc;
        return 0;
@@ -1560,7 +1738,7 @@ static int smu7_complete_dependency_tables(struct 
pp_hwmgr *hwmgr)
                if (tmp_result != 0)
                        result = tmp_result;
 
-               smu7_patch_with_vdd_leakage(hwmgr,
+               smu7_patch_ppt_v1_with_vdd_leakage(hwmgr,
                        &table_info->max_clock_voltage_on_dc.vddgfx, 
&(data->vddcgfx_leakage));
        } else {
 
@@ -1598,7 +1776,7 @@ static int smu7_complete_dependency_tables(struct 
pp_hwmgr *hwmgr)
        return result;
 }
 
-static int smu7_set_private_data_based_on_pptable(struct pp_hwmgr *hwmgr)
+static int smu7_set_private_data_based_on_pptable_v1(struct pp_hwmgr *hwmgr)
 {
        struct phm_ppt_v1_information *table_info =
                        (struct phm_ppt_v1_information *)(hwmgr->pptable);
@@ -1643,14 +1821,18 @@ int smu7_patch_voltage_workaround(struct pp_hwmgr 
*hwmgr)
 {
        struct phm_ppt_v1_information *table_info =
                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
-       struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table =
-                       table_info->vdd_dep_on_mclk;
-       struct phm_ppt_v1_voltage_lookup_table *lookup_table =
-                       table_info->vddc_lookup_table;
+       struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table;
+       struct phm_ppt_v1_voltage_lookup_table *lookup_table;
        uint32_t i;
        uint32_t hw_revision, sub_vendor_id, sub_sys_id;
        struct cgs_system_info sys_info = {0};
 
+       if (table_info != NULL) {
+               dep_mclk_table = table_info->vdd_dep_on_mclk;
+               lookup_table = table_info->vddc_lookup_table;
+       } else
+               return 0;
+
        sys_info.size = sizeof(struct cgs_system_info);
 
        sys_info.info_id = CGS_SYSTEM_INFO_PCIE_REV;
@@ -1717,6 +1899,8 @@ static int smu7_thermal_parameter_init(struct pp_hwmgr 
*hwmgr)
                cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, 
ixCNB_PWRMGT_CNTL, temp_reg);
        }
 
+       if (table_info == NULL)
+               return 0;
 
        if (table_info->cac_dtp_table->usDefaultTargetOperatingTemp != 0 &&
                
hwmgr->thermal_controller.advanceFanControlParameters.ucFanControlMode) {
@@ -1769,6 +1953,259 @@ static int smu7_thermal_parameter_init(struct pp_hwmgr 
*hwmgr)
        return 0;
 }
 
+/**
+ * Change virtual leakage voltage to actual value.
+ *
+ * @param     hwmgr  the address of the powerplay hardware manager.
+ * @param     pointer to changing voltage
+ * @param     pointer to leakage table
+ */
+static void smu7_patch_ppt_v0_with_vdd_leakage(struct pp_hwmgr *hwmgr,
+               uint32_t *voltage, struct smu7_leakage_voltage *leakage_table)
+{
+       uint32_t index;
+
+       /* search for leakage voltage ID 0xff01 ~ 0xff08 */
+       for (index = 0; index < leakage_table->count; index++) {
+               /* if this voltage matches a leakage voltage ID */
+               /* patch with actual leakage voltage */
+               if (leakage_table->leakage_id[index] == *voltage) {
+                       *voltage = leakage_table->actual_voltage[index];
+                       break;
+               }
+       }
+
+       if (*voltage > ATOM_VIRTUAL_VOLTAGE_ID0)
+               printk(KERN_ERR "Voltage value looks like a Leakage ID but it's 
not patched \n");
+}
+
+
+static int smu7_patch_vddc(struct pp_hwmgr *hwmgr,
+                             struct phm_clock_voltage_dependency_table *tab)
+{
+       uint16_t i;
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+       if (tab)
+               for (i = 0; i < tab->count; i++)
+                       smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, 
&tab->entries[i].v,
+                                               &data->vddc_leakage);
+
+       return 0;
+}
+
+static int smu7_patch_vddci(struct pp_hwmgr *hwmgr,
+                              struct phm_clock_voltage_dependency_table *tab)
+{
+       uint16_t i;
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+       if (tab)
+               for (i = 0; i < tab->count; i++)
+                       smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, 
&tab->entries[i].v,
+                                                       &data->vddci_leakage);
+
+       return 0;
+}
+
+static int smu7_patch_vce_vddc(struct pp_hwmgr *hwmgr,
+                                 struct phm_vce_clock_voltage_dependency_table 
*tab)
+{
+       uint16_t i;
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+       if (tab)
+               for (i = 0; i < tab->count; i++)
+                       smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, 
&tab->entries[i].v,
+                                                       &data->vddc_leakage);
+
+       return 0;
+}
+
+
+static int smu7_patch_uvd_vddc(struct pp_hwmgr *hwmgr,
+                                 struct phm_uvd_clock_voltage_dependency_table 
*tab)
+{
+       uint16_t i;
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+       if (tab)
+               for (i = 0; i < tab->count; i++)
+                       smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, 
&tab->entries[i].v,
+                                                       &data->vddc_leakage);
+
+       return 0;
+}
+
+static int smu7_patch_vddc_shed_limit(struct pp_hwmgr *hwmgr,
+                                        struct phm_phase_shedding_limits_table 
*tab)
+{
+       uint16_t i;
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+       if (tab)
+               for (i = 0; i < tab->count; i++)
+                       smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, 
&tab->entries[i].Voltage,
+                                                       &data->vddc_leakage);
+
+       return 0;
+}
+
+static int smu7_patch_samu_vddc(struct pp_hwmgr *hwmgr,
+                                  struct 
phm_samu_clock_voltage_dependency_table *tab)
+{
+       uint16_t i;
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+       if (tab)
+               for (i = 0; i < tab->count; i++)
+                       smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, 
&tab->entries[i].v,
+                                                       &data->vddc_leakage);
+
+       return 0;
+}
+
+static int smu7_patch_acp_vddc(struct pp_hwmgr *hwmgr,
+                                 struct phm_acp_clock_voltage_dependency_table 
*tab)
+{
+       uint16_t i;
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+       if (tab)
+               for (i = 0; i < tab->count; i++)
+                       smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, 
&tab->entries[i].v,
+                                       &data->vddc_leakage);
+
+       return 0;
+}
+
+static int smu7_patch_limits_vddc(struct pp_hwmgr *hwmgr,
+                                    struct phm_clock_and_voltage_limits *tab)
+{
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+       if (tab) {
+               smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, (uint32_t 
*)&tab->vddc,
+                                                       &data->vddc_leakage);
+               smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, (uint32_t 
*)&tab->vddci,
+                                                       &data->vddci_leakage);
+       }
+
+       return 0;
+}
+
+static int smu7_patch_cac_vddc(struct pp_hwmgr *hwmgr, struct 
phm_cac_leakage_table *tab)
+{
+       uint32_t i;
+       uint32_t vddc;
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+       if (tab) {
+               for (i = 0; i < tab->count; i++) {
+                       vddc = (uint32_t)(tab->entries[i].Vddc);
+                       smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, &vddc, 
&data->vddc_leakage);
+                       tab->entries[i].Vddc = (uint16_t)vddc;
+               }
+       }
+
+       return 0;
+}
+
+static int smu7_patch_dependency_tables_with_leakage(struct pp_hwmgr *hwmgr)
+{
+       int tmp;
+
+       tmp = smu7_patch_vddc(hwmgr, hwmgr->dyn_state.vddc_dependency_on_sclk);
+       if (tmp)
+               return -EINVAL;
+
+       tmp = smu7_patch_vddc(hwmgr, hwmgr->dyn_state.vddc_dependency_on_mclk);
+       if (tmp)
+               return -EINVAL;
+
+       tmp = smu7_patch_vddc(hwmgr, hwmgr->dyn_state.vddc_dep_on_dal_pwrl);
+       if (tmp)
+               return -EINVAL;
+
+       tmp = smu7_patch_vddci(hwmgr, 
hwmgr->dyn_state.vddci_dependency_on_mclk);
+       if (tmp)
+               return -EINVAL;
+
+       tmp = smu7_patch_vce_vddc(hwmgr, 
hwmgr->dyn_state.vce_clock_voltage_dependency_table);
+       if (tmp)
+               return -EINVAL;
+
+       tmp = smu7_patch_uvd_vddc(hwmgr, 
hwmgr->dyn_state.uvd_clock_voltage_dependency_table);
+       if (tmp)
+               return -EINVAL;
+
+       tmp = smu7_patch_samu_vddc(hwmgr, 
hwmgr->dyn_state.samu_clock_voltage_dependency_table);
+       if (tmp)
+               return -EINVAL;
+
+       tmp = smu7_patch_acp_vddc(hwmgr, 
hwmgr->dyn_state.acp_clock_voltage_dependency_table);
+       if (tmp)
+               return -EINVAL;
+
+       tmp = smu7_patch_vddc_shed_limit(hwmgr, 
hwmgr->dyn_state.vddc_phase_shed_limits_table);
+       if (tmp)
+               return -EINVAL;
+
+       tmp = smu7_patch_limits_vddc(hwmgr, 
&hwmgr->dyn_state.max_clock_voltage_on_ac);
+       if (tmp)
+               return -EINVAL;
+
+       tmp = smu7_patch_limits_vddc(hwmgr, 
&hwmgr->dyn_state.max_clock_voltage_on_dc);
+       if (tmp)
+               return -EINVAL;
+
+       tmp = smu7_patch_cac_vddc(hwmgr, hwmgr->dyn_state.cac_leakage_table);
+       if (tmp)
+               return -EINVAL;
+
+       return 0;
+}
+
+
+static int smu7_set_private_data_based_on_pptable_v0(struct pp_hwmgr *hwmgr)
+{
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+
+       struct phm_clock_voltage_dependency_table *allowed_sclk_vddc_table = 
hwmgr->dyn_state.vddc_dependency_on_sclk;
+       struct phm_clock_voltage_dependency_table *allowed_mclk_vddc_table = 
hwmgr->dyn_state.vddc_dependency_on_mclk;
+       struct phm_clock_voltage_dependency_table *allowed_mclk_vddci_table = 
hwmgr->dyn_state.vddci_dependency_on_mclk;
+
+       PP_ASSERT_WITH_CODE(allowed_sclk_vddc_table != NULL,
+               "VDDC dependency on SCLK table is missing. This table is 
mandatory\n", return -EINVAL);
+       PP_ASSERT_WITH_CODE(allowed_sclk_vddc_table->count >= 1,
+               "VDDC dependency on SCLK table has to have is missing. This 
table is mandatory\n", return -EINVAL);
+
+       PP_ASSERT_WITH_CODE(allowed_mclk_vddc_table != NULL,
+               "VDDC dependency on MCLK table is missing. This table is 
mandatory\n", return -EINVAL);
+       PP_ASSERT_WITH_CODE(allowed_mclk_vddc_table->count >= 1,
+               "VDD dependency on MCLK table has to have is missing. This 
table is mandatory\n", return -EINVAL);
+
+       data->min_vddc_in_pptable = 
(uint16_t)allowed_sclk_vddc_table->entries[0].v;
+       data->max_vddc_in_pptable = 
(uint16_t)allowed_sclk_vddc_table->entries[allowed_sclk_vddc_table->count - 
1].v;
+
+       hwmgr->dyn_state.max_clock_voltage_on_ac.sclk =
+               allowed_sclk_vddc_table->entries[allowed_sclk_vddc_table->count 
- 1].clk;
+       hwmgr->dyn_state.max_clock_voltage_on_ac.mclk =
+               allowed_mclk_vddc_table->entries[allowed_mclk_vddc_table->count 
- 1].clk;
+       hwmgr->dyn_state.max_clock_voltage_on_ac.vddc =
+               allowed_sclk_vddc_table->entries[allowed_sclk_vddc_table->count 
- 1].v;
+
+       if (allowed_mclk_vddci_table != NULL && allowed_mclk_vddci_table->count 
>= 1) {
+               data->min_vddci_in_pptable = 
(uint16_t)allowed_mclk_vddci_table->entries[0].v;
+               data->max_vddci_in_pptable = 
(uint16_t)allowed_mclk_vddci_table->entries[allowed_mclk_vddci_table->count - 
1].v;
+       }
+
+       if (hwmgr->dyn_state.vddci_dependency_on_mclk != NULL && 
hwmgr->dyn_state.vddci_dependency_on_mclk->count > 1)
+               hwmgr->dyn_state.max_clock_voltage_on_ac.vddci = 
hwmgr->dyn_state.vddci_dependency_on_mclk->entries[hwmgr->dyn_state.vddci_dependency_on_mclk->count
 - 1].v;
+
+       return 0;
+}
+
 int smu7_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
 {
        struct smu7_hwmgr *data;
@@ -1791,8 +2228,13 @@ int smu7_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
                return -1;
        }
 
-       smu7_complete_dependency_tables(hwmgr);
-       smu7_set_private_data_based_on_pptable(hwmgr);
+       if (hwmgr->pp_table_version == PP_TABLE_V1) {
+               smu7_complete_dependency_tables(hwmgr);
+               smu7_set_private_data_based_on_pptable_v1(hwmgr);
+       } else if (hwmgr->pp_table_version == PP_TABLE_V0) {
+               smu7_patch_dependency_tables_with_leakage(hwmgr);
+               smu7_set_private_data_based_on_pptable_v0(hwmgr);
+       }
 
        /* Initalize Dynamic State Adjustment Rule Settings */
        result = phm_initializa_dynamic_state_adjustment_rule_settings(hwmgr);
@@ -1890,7 +2332,9 @@ static int smu7_upload_dpm_level_enable_mask(struct 
pp_hwmgr *hwmgr)
 {
        struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
 
-       phm_apply_dal_min_voltage_request(hwmgr);
+       if (hwmgr->pp_table_version == PP_TABLE_V1)
+               phm_apply_dal_min_voltage_request(hwmgr);
+/* TO DO  for v0 iceland and Ci*/
 
        if (!data->sclk_dpm_key_disabled) {
                if (data->dpm_level_enable_mask.sclk_dpm_enable_mask)
@@ -2455,6 +2899,157 @@ static int smu7_get_pp_table_entry(struct pp_hwmgr 
*hwmgr,
        return 0;
 }
 
+
+static int smu7_get_pp_table_entry_callback_func_v0(struct pp_hwmgr *hwmgr,
+                                       struct pp_hw_power_state *power_state,
+                                       unsigned int index, const void 
*clock_info)
+{
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+       struct smu7_power_state  *ps = cast_phw_smu7_power_state(power_state);
+       const ATOM_PPLIB_CI_CLOCK_INFO *visland_clk_info = clock_info;
+       struct smu7_performance_level *performance_level;
+       uint32_t engine_clock, memory_clock;
+       uint16_t pcie_gen_from_bios;
+
+       engine_clock = visland_clk_info->ucEngineClockHigh << 16 | 
visland_clk_info->usEngineClockLow;
+       memory_clock = visland_clk_info->ucMemoryClockHigh << 16 | 
visland_clk_info->usMemoryClockLow;
+
+       if (!(data->mc_micro_code_feature & DISABLE_MC_LOADMICROCODE) && 
memory_clock > data->highest_mclk)
+               data->highest_mclk = memory_clock;
+
+       performance_level = &(ps->performance_levels
+                       [ps->performance_level_count++]);
+
+       PP_ASSERT_WITH_CODE(
+                       (ps->performance_level_count < 
smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_GRAPHICS)),
+                       "Performance levels exceeds SMC limit!",
+                       return -1);
+
+       PP_ASSERT_WITH_CODE(
+                       (ps->performance_level_count <=
+                                       
hwmgr->platform_descriptor.hardwareActivityPerformanceLevels),
+                       "Performance levels exceeds Driver limit!",
+                       return -1);
+
+       /* Performance levels are arranged from low to high. */
+       performance_level->memory_clock = memory_clock;
+       performance_level->engine_clock = engine_clock;
+
+       pcie_gen_from_bios = visland_clk_info->ucPCIEGen;
+
+       performance_level->pcie_gen = get_pcie_gen_support(data->pcie_gen_cap, 
pcie_gen_from_bios);
+       performance_level->pcie_lane = 
get_pcie_lane_support(data->pcie_lane_cap, visland_clk_info->usPCIELane);
+
+       return 0;
+}
+
+static int smu7_get_pp_table_entry_v0(struct pp_hwmgr *hwmgr,
+               unsigned long entry_index, struct pp_power_state *state)
+{
+       int result;
+       struct smu7_power_state *ps;
+       struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
+       struct phm_clock_voltage_dependency_table *dep_mclk_table =
+                       hwmgr->dyn_state.vddci_dependency_on_mclk;
+
+       memset(&state->hardware, 0x00, sizeof(struct pp_hw_power_state));
+
+       state->hardware.magic = PHM_VIslands_Magic;
+
+       ps = (struct smu7_power_state *)(&state->hardware);
+
+       result = pp_tables_get_entry(hwmgr, entry_index, state,
+                       smu7_get_pp_table_entry_callback_func_v0);
+
+       /*
+        * This is the earliest time we have all the dependency table
+        * and the VBIOS boot state as
+        * PP_Tables_GetPowerPlayTableEntry retrieves the VBIOS boot
+        * state if there is only one VDDCI/MCLK level, check if it's
+        * the same as VBIOS boot state
+        */
+       if (dep_mclk_table != NULL && dep_mclk_table->count == 1) {
+               if (dep_mclk_table->entries[0].clk !=
+                               data->vbios_boot_state.mclk_bootup_value)
+                       printk(KERN_ERR "Single MCLK entry VDDCI/MCLK 
dependency table "
+                                       "does not match VBIOS boot MCLK level");
+               if (dep_mclk_table->entries[0].v !=
+                               data->vbios_boot_state.vddci_bootup_value)
+                       printk(KERN_ERR "Single VDDCI entry VDDCI/MCLK 
dependency table "
+                                       "does not match VBIOS boot VDDCI 
level");
+       }
+
+       /* set DC compatible flag if this state supports DC */
+       if (!state->validation.disallowOnDC)
+               ps->dc_compatible = true;
+
+       if (state->classification.flags & PP_StateClassificationFlag_ACPI)
+               data->acpi_pcie_gen = ps->performance_levels[0].pcie_gen;
+
+       ps->uvd_clks.vclk = state->uvd_clocks.VCLK;
+       ps->uvd_clks.dclk = state->uvd_clocks.DCLK;
+
+       if (!result) {
+               uint32_t i;
+
+               switch (state->classification.ui_label) {
+               case PP_StateUILabel_Performance:
+                       data->use_pcie_performance_levels = true;
+
+                       for (i = 0; i < ps->performance_level_count; i++) {
+                               if (data->pcie_gen_performance.max <
+                                               
ps->performance_levels[i].pcie_gen)
+                                       data->pcie_gen_performance.max =
+                                                       
ps->performance_levels[i].pcie_gen;
+
+                               if (data->pcie_gen_performance.min >
+                                               
ps->performance_levels[i].pcie_gen)
+                                       data->pcie_gen_performance.min =
+                                                       
ps->performance_levels[i].pcie_gen;
+
+                               if (data->pcie_lane_performance.max <
+                                               
ps->performance_levels[i].pcie_lane)
+                                       data->pcie_lane_performance.max =
+                                                       
ps->performance_levels[i].pcie_lane;
+
+                               if (data->pcie_lane_performance.min >
+                                               
ps->performance_levels[i].pcie_lane)
+                                       data->pcie_lane_performance.min =
+                                                       
ps->performance_levels[i].pcie_lane;
+                       }
+                       break;
+               case PP_StateUILabel_Battery:
+                       data->use_pcie_power_saving_levels = true;
+
+                       for (i = 0; i < ps->performance_level_count; i++) {
+                               if (data->pcie_gen_power_saving.max <
+                                               
ps->performance_levels[i].pcie_gen)
+                                       data->pcie_gen_power_saving.max =
+                                                       
ps->performance_levels[i].pcie_gen;
+
+                               if (data->pcie_gen_power_saving.min >
+                                               
ps->performance_levels[i].pcie_gen)
+                                       data->pcie_gen_power_saving.min =
+                                                       
ps->performance_levels[i].pcie_gen;
+
+                               if (data->pcie_lane_power_saving.max <
+                                               
ps->performance_levels[i].pcie_lane)
+                                       data->pcie_lane_power_saving.max =
+                                                       
ps->performance_levels[i].pcie_lane;
+
+                               if (data->pcie_lane_power_saving.min >
+                                               
ps->performance_levels[i].pcie_lane)
+                                       data->pcie_lane_power_saving.min =
+                                                       
ps->performance_levels[i].pcie_lane;
+                       }
+                       break;
+               default:
+                       break;
+               }
+       }
+       return 0;
+}
+
 static void
 smu7_print_current_perforce_level(struct pp_hwmgr *hwmgr, struct seq_file *m)
 {
@@ -3609,6 +4204,16 @@ uint8_t smu7_get_sleep_divider_id_from_clock(uint32_t 
clock,
        return i;
 }
 
+static int smu7_get_number_of_powerplay_table_entries_v0(struct pp_hwmgr 
*hwmgr)
+{
+       int result;
+       unsigned long ret = 0;
+
+       result = pp_tables_get_num_of_entries(hwmgr, &ret);
+
+       return result ? 0 : ret;
+}
+
 int smu7_hwmgr_init(struct pp_hwmgr *hwmgr)
 {
        int ret = 0;
@@ -3616,6 +4221,11 @@ int smu7_hwmgr_init(struct pp_hwmgr *hwmgr)
        hwmgr->hwmgr_func = &smu7_hwmgr_funcs;
        hwmgr->pptable_func = &pptable_v1_0_funcs;
        pp_smu7_thermal_initialize(hwmgr);
+       if (hwmgr->pp_table_version == PP_TABLE_V0) {
+               hwmgr->hwmgr_func->get_pp_table_entry = 
&smu7_get_pp_table_entry_v0;
+               hwmgr->hwmgr_func->get_num_of_pp_table_entries = 
smu7_get_number_of_powerplay_table_entries_v0;
+               hwmgr->pptable_func = &pptable_funcs;
+       }
 
        return ret;
 }
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
index 46176c2..039081d 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.h
@@ -208,7 +208,7 @@ struct smu7_hwmgr {
        uint32_t                       pcie_lane_cap;
        uint32_t                       pcie_spc_cap;
        struct smu7_leakage_voltage          vddc_leakage;
-       struct smu7_leakage_voltage          Vddci_leakage;
+       struct smu7_leakage_voltage          vddci_leakage;
        struct smu7_leakage_voltage          vddcgfx_leakage;
 
        uint32_t                             mvdd_control;
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_powertune.c 
b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_powertune.c
index e472480..260fce050 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_powertune.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_powertune.c
@@ -616,8 +616,14 @@ int smu7_enable_power_containment(struct pp_hwmgr *hwmgr)
                        (struct phm_ppt_v1_information *)(hwmgr->pptable);
        int smc_result;
        int result = 0;
+       struct phm_cac_tdp_table *cac_table;
 
        data->power_containment_features = 0;
+       if (hwmgr->pp_table_version == PP_TABLE_V1)
+               cac_table = table_info->cac_dtp_table;
+       else
+               cac_table = hwmgr->dyn_state.cac_dtp_table;
+
        if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
                        PHM_PlatformCaps_PowerContainment)) {
 
@@ -637,8 +643,6 @@ int smu7_enable_power_containment(struct pp_hwmgr *hwmgr)
                        PP_ASSERT_WITH_CODE((0 == smc_result),
                                        "Failed to enable PkgPwrTracking in 
SMC.", result = -1;);
                        if (0 == smc_result) {
-                               struct phm_cac_tdp_table *cac_table =
-                                               table_info->cac_dtp_table;
                                uint32_t default_limit =
                                        
(uint32_t)(cac_table->usMaximumPowerDeliveryLimit * 256);
 
@@ -699,10 +703,15 @@ int smu7_power_control_set_level(struct pp_hwmgr *hwmgr)
 {
        struct phm_ppt_v1_information *table_info =
                        (struct phm_ppt_v1_information *)(hwmgr->pptable);
-       struct phm_cac_tdp_table *cac_table = table_info->cac_dtp_table;
+       struct phm_cac_tdp_table *cac_table;
+
        int adjust_percent, target_tdp;
        int result = 0;
 
+       if (hwmgr->pp_table_version == PP_TABLE_V1)
+               cac_table = table_info->cac_dtp_table;
+       else
+               cac_table = hwmgr->dyn_state.cac_dtp_table;
        if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
                        PHM_PlatformCaps_PowerContainment)) {
                /* adjustment percentage has already been validated */
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to