Revert "drm/amd/powerplay: fix performance drop on Vega10"
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / powerplay / hwmgr / vega10_hwmgr.c
index 05e680d..1a0dccb 100644 (file)
 
 static const uint32_t channel_number[] = {1, 2, 0, 4, 0, 8, 0, 16, 2};
 
-#define MEM_FREQ_LOW_LATENCY        25000
-#define MEM_FREQ_HIGH_LATENCY       80000
-#define MEM_LATENCY_HIGH            245
-#define MEM_LATENCY_LOW             35
-#define MEM_LATENCY_ERR             0xFFFF
-
 #define mmDF_CS_AON0_DramBaseAddress0                                                                  0x0044
 #define mmDF_CS_AON0_DramBaseAddress0_BASE_IDX                                                         0
 
@@ -2414,6 +2408,40 @@ static int vega10_populate_and_upload_avfs_fuse_override(struct pp_hwmgr *hwmgr)
        return result;
 }
 
+static void vega10_check_dpm_table_updated(struct pp_hwmgr *hwmgr)
+{
+       struct vega10_hwmgr *data = hwmgr->backend;
+       struct vega10_odn_dpm_table *odn_table = &(data->odn_dpm_table);
+       struct phm_ppt_v2_information *table_info = hwmgr->pptable;
+       struct phm_ppt_v1_clock_voltage_dependency_table *dep_table;
+       struct phm_ppt_v1_clock_voltage_dependency_table *odn_dep_table;
+       uint32_t i;
+
+       dep_table = table_info->vdd_dep_on_mclk;
+       odn_dep_table = (struct phm_ppt_v1_clock_voltage_dependency_table *)&(odn_table->vdd_dep_on_mclk);
+
+       for (i = 0; i < dep_table->count; i++) {
+               if (dep_table->entries[i].vddc != odn_dep_table->entries[i].vddc) {
+                       data->need_update_dpm_table |= DPMTABLE_OD_UPDATE_VDDC | DPMTABLE_OD_UPDATE_MCLK;
+                       return;
+               }
+       }
+
+       dep_table = table_info->vdd_dep_on_sclk;
+       odn_dep_table = (struct phm_ppt_v1_clock_voltage_dependency_table *)&(odn_table->vdd_dep_on_sclk);
+       for (i = 0; i < dep_table->count; i++) {
+               if (dep_table->entries[i].vddc != odn_dep_table->entries[i].vddc) {
+                       data->need_update_dpm_table |= DPMTABLE_OD_UPDATE_VDDC | DPMTABLE_OD_UPDATE_SCLK;
+                       return;
+               }
+       }
+
+       if (data->need_update_dpm_table & DPMTABLE_OD_UPDATE_VDDC) {
+               data->need_update_dpm_table &= ~DPMTABLE_OD_UPDATE_VDDC;
+               data->need_update_dpm_table |= DPMTABLE_OD_UPDATE_SCLK | DPMTABLE_OD_UPDATE_MCLK;
+       }
+}
+
 /**
 * Initializes the SMC table and uploads it
 *
@@ -2430,6 +2458,7 @@ static int vega10_init_smc_table(struct pp_hwmgr *hwmgr)
        PPTable_t *pp_table = &(data->smc_state_table.pp_table);
        struct pp_atomfwctrl_voltage_table voltage_table;
        struct pp_atomfwctrl_bios_boot_up_values boot_up_values;
+       struct vega10_odn_dpm_table *odn_table = &(data->odn_dpm_table);
 
        result = vega10_setup_default_dpm_tables(hwmgr);
        PP_ASSERT_WITH_CODE(!result,
@@ -2437,8 +2466,14 @@ static int vega10_init_smc_table(struct pp_hwmgr *hwmgr)
                        return result);
 
        /* initialize ODN table */
-       if (hwmgr->od_enabled)
-               vega10_odn_initial_default_setting(hwmgr);
+       if (hwmgr->od_enabled) {
+               if (odn_table->max_vddc) {
+                       data->need_update_dpm_table |= DPMTABLE_OD_UPDATE_SCLK | DPMTABLE_OD_UPDATE_MCLK;
+                       vega10_check_dpm_table_updated(hwmgr);
+               } else {
+                       vega10_odn_initial_default_setting(hwmgr);
+               }
+       }
 
        pp_atomfwctrl_get_voltage_table_v4(hwmgr, VOLTAGE_TYPE_VDDC,
                        VOLTAGE_OBJ_SVID2,  &voltage_table);
@@ -2861,11 +2896,6 @@ static int vega10_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
 
        vega10_enable_disable_PCC_limit_feature(hwmgr, true);
 
-       if ((hwmgr->smu_version == 0x001c2c00) ||
-                       (hwmgr->smu_version == 0x001c2d00))
-               smum_send_msg_to_smc_with_parameter(hwmgr,
-                               PPSMC_MSG_UpdatePkgPwrPidAlpha, 1);
-
        smum_send_msg_to_smc_with_parameter(hwmgr,
                PPSMC_MSG_ConfigureTelemetry, data->config_telemetry);
 
@@ -3061,6 +3091,7 @@ static int vega10_apply_state_adjust_rules(struct pp_hwmgr *hwmgr,
                                struct pp_power_state  *request_ps,
                        const struct pp_power_state *current_ps)
 {
+       struct amdgpu_device *adev = hwmgr->adev;
        struct vega10_power_state *vega10_ps =
                                cast_phw_vega10_power_state(&request_ps->hardware);
        uint32_t sclk;
@@ -3086,12 +3117,12 @@ static int vega10_apply_state_adjust_rules(struct pp_hwmgr *hwmgr,
        if (vega10_ps->performance_level_count != 2)
                pr_info("VI should always have 2 performance levels");
 
-       max_limits = (PP_PowerSource_AC == hwmgr->power_source) ?
+       max_limits = adev->pm.ac_power ?
                        &(hwmgr->dyn_state.max_clock_voltage_on_ac) :
                        &(hwmgr->dyn_state.max_clock_voltage_on_dc);
 
        /* Cap clock DPM tables at DC MAX if it is in DC. */
-       if (PP_PowerSource_DC == hwmgr->power_source) {
+       if (!adev->pm.ac_power) {
                for (i = 0; i < vega10_ps->performance_level_count; i++) {
                        if (vega10_ps->performance_levels[i].mem_clock >
                                max_limits->mclk)
@@ -3181,7 +3212,7 @@ static int vega10_apply_state_adjust_rules(struct pp_hwmgr *hwmgr,
                /* Find the lowest MCLK frequency that is within
                 * the tolerable latency defined in DAL
                 */
-               latency = 0;
+               latency = hwmgr->display_config->dce_tolerable_mclk_in_active_latency;
                for (i = 0; i < data->mclk_latency_table.count; i++) {
                        if ((data->mclk_latency_table.entries[i].latency <= latency) &&
                                (data->mclk_latency_table.entries[i].frequency >=
@@ -3765,7 +3796,7 @@ static int vega10_notify_smc_display_config_after_ps_adjustment(
 
        if (i < dpm_table->count) {
                clock_req.clock_type = amd_pp_dcef_clock;
-               clock_req.clock_freq_in_khz = dpm_table->dpm_levels[i].value;
+               clock_req.clock_freq_in_khz = dpm_table->dpm_levels[i].value * 10;
                if (!vega10_display_clock_voltage_request(hwmgr, &clock_req)) {
                        smum_send_msg_to_smc_with_parameter(
                                        hwmgr, PPSMC_MSG_SetMinDeepSleepDcefclk,
@@ -4022,28 +4053,17 @@ static void vega10_get_sclks(struct pp_hwmgr *hwmgr,
                        table_info->vdd_dep_on_sclk;
        uint32_t i;
 
+       clocks->num_levels = 0;
        for (i = 0; i < dep_table->count; i++) {
                if (dep_table->entries[i].clk) {
                        clocks->data[clocks->num_levels].clocks_in_khz =
-                                       dep_table->entries[i].clk;
+                                       dep_table->entries[i].clk * 10;
                        clocks->num_levels++;
                }
        }
 
 }
 
-static uint32_t vega10_get_mem_latency(struct pp_hwmgr *hwmgr,
-               uint32_t clock)
-{
-       if (clock >= MEM_FREQ_LOW_LATENCY &&
-                       clock < MEM_FREQ_HIGH_LATENCY)
-               return MEM_LATENCY_HIGH;
-       else if (clock >= MEM_FREQ_HIGH_LATENCY)
-               return MEM_LATENCY_LOW;
-       else
-               return MEM_LATENCY_ERR;
-}
-
 static void vega10_get_memclocks(struct pp_hwmgr *hwmgr,
                struct pp_clock_levels_with_latency *clocks)
 {
@@ -4052,26 +4072,22 @@ static void vega10_get_memclocks(struct pp_hwmgr *hwmgr,
        struct phm_ppt_v1_clock_voltage_dependency_table *dep_table =
                        table_info->vdd_dep_on_mclk;
        struct vega10_hwmgr *data = hwmgr->backend;
+       uint32_t j = 0;
        uint32_t i;
 
-       clocks->num_levels = 0;
-       data->mclk_latency_table.count = 0;
-
        for (i = 0; i < dep_table->count; i++) {
                if (dep_table->entries[i].clk) {
-                       clocks->data[clocks->num_levels].clocks_in_khz =
-                       data->mclk_latency_table.entries
-                       [data->mclk_latency_table.count].frequency =
-                                       dep_table->entries[i].clk;
-                       clocks->data[clocks->num_levels].latency_in_us =
-                       data->mclk_latency_table.entries
-                       [data->mclk_latency_table.count].latency =
-                                       vega10_get_mem_latency(hwmgr,
-                                               dep_table->entries[i].clk);
-                       clocks->num_levels++;
-                       data->mclk_latency_table.count++;
+
+                       clocks->data[j].clocks_in_khz =
+                                               dep_table->entries[i].clk * 10;
+                       data->mclk_latency_table.entries[j].frequency =
+                                                       dep_table->entries[i].clk;
+                       clocks->data[j].latency_in_us =
+                               data->mclk_latency_table.entries[j].latency = 25;
+                       j++;
                }
        }
+       clocks->num_levels = data->mclk_latency_table.count = j;
 }
 
 static void vega10_get_dcefclocks(struct pp_hwmgr *hwmgr,
@@ -4084,7 +4100,7 @@ static void vega10_get_dcefclocks(struct pp_hwmgr *hwmgr,
        uint32_t i;
 
        for (i = 0; i < dep_table->count; i++) {
-               clocks->data[i].clocks_in_khz = dep_table->entries[i].clk;
+               clocks->data[i].clocks_in_khz = dep_table->entries[i].clk * 10;
                clocks->data[i].latency_in_us = 0;
                clocks->num_levels++;
        }
@@ -4100,7 +4116,7 @@ static void vega10_get_socclocks(struct pp_hwmgr *hwmgr,
        uint32_t i;
 
        for (i = 0; i < dep_table->count; i++) {
-               clocks->data[i].clocks_in_khz = dep_table->entries[i].clk;
+               clocks->data[i].clocks_in_khz = dep_table->entries[i].clk * 10;
                clocks->data[i].latency_in_us = 0;
                clocks->num_levels++;
        }
@@ -4160,7 +4176,7 @@ static int vega10_get_clock_by_type_with_voltage(struct pp_hwmgr *hwmgr,
        }
 
        for (i = 0; i < dep_table->count; i++) {
-               clocks->data[i].clocks_in_khz = dep_table->entries[i].clk;
+               clocks->data[i].clocks_in_khz = dep_table->entries[i].clk  * 10;
                clocks->data[i].voltage_in_mv = (uint32_t)(table_info->vddc_lookup_table->
                                entries[dep_table->entries[i].vddInd].us_vdd);
                clocks->num_levels++;
@@ -4173,9 +4189,10 @@ static int vega10_get_clock_by_type_with_voltage(struct pp_hwmgr *hwmgr,
 }
 
 static int vega10_set_watermarks_for_clocks_ranges(struct pp_hwmgr *hwmgr,
-               struct pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges)
+                                                       void *clock_range)
 {
        struct vega10_hwmgr *data = hwmgr->backend;
+       struct dm_pp_wm_sets_with_clock_ranges_soc15 *wm_with_clock_ranges = clock_range;
        Watermarks_t *table = &(data->smc_state_table.water_marks_table);
        int result = 0;
 
@@ -4695,40 +4712,6 @@ static bool vega10_check_clk_voltage_valid(struct pp_hwmgr *hwmgr,
        return true;
 }
 
-static void vega10_check_dpm_table_updated(struct pp_hwmgr *hwmgr)
-{
-       struct vega10_hwmgr *data = hwmgr->backend;
-       struct vega10_odn_dpm_table *odn_table = &(data->odn_dpm_table);
-       struct phm_ppt_v2_information *table_info = hwmgr->pptable;
-       struct phm_ppt_v1_clock_voltage_dependency_table *dep_table;
-       struct phm_ppt_v1_clock_voltage_dependency_table *odn_dep_table;
-       uint32_t i;
-
-       dep_table = table_info->vdd_dep_on_mclk;
-       odn_dep_table = (struct phm_ppt_v1_clock_voltage_dependency_table *)&(odn_table->vdd_dep_on_mclk);
-
-       for (i = 0; i < dep_table->count; i++) {
-               if (dep_table->entries[i].vddc != odn_dep_table->entries[i].vddc) {
-                       data->need_update_dpm_table |= DPMTABLE_OD_UPDATE_VDDC | DPMTABLE_OD_UPDATE_MCLK;
-                       return;
-               }
-       }
-
-       dep_table = table_info->vdd_dep_on_sclk;
-       odn_dep_table = (struct phm_ppt_v1_clock_voltage_dependency_table *)&(odn_table->vdd_dep_on_sclk);
-       for (i = 0; i < dep_table->count; i++) {
-               if (dep_table->entries[i].vddc != odn_dep_table->entries[i].vddc) {
-                       data->need_update_dpm_table |= DPMTABLE_OD_UPDATE_VDDC | DPMTABLE_OD_UPDATE_SCLK;
-                       return;
-               }
-       }
-
-       if (data->need_update_dpm_table & DPMTABLE_OD_UPDATE_VDDC) {
-               data->need_update_dpm_table &= ~DPMTABLE_OD_UPDATE_VDDC;
-               data->need_update_dpm_table |= DPMTABLE_OD_UPDATE_SCLK | DPMTABLE_OD_UPDATE_MCLK;
-       }
-}
-
 static void vega10_odn_update_soc_table(struct pp_hwmgr *hwmgr,
                                                enum PP_OD_DPM_TABLE_COMMAND type)
 {