Commit b55ca3bd authored by Likun Gao's avatar Likun Gao Committed by Alex Deucher

drm/amd/powerplay: add function to store overdrive information for smu11

Add vega20_setup_od8_information function to store overdrive information
from powerplay_table to smu_table which will used when setting od8.
Signed-off-by: default avatarLikun Gao <Likun.Gao@amd.com>
Reviewed-by: default avatarKevin Wang <kevin1.wang@amd.com>
Reviewed-by: default avatarEvan Quan <evan.quan@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 2e069391
...@@ -689,6 +689,21 @@ static int smu_hw_fini(void *handle) ...@@ -689,6 +689,21 @@ static int smu_hw_fini(void *handle)
table_context->max_sustainable_clocks = NULL; table_context->max_sustainable_clocks = NULL;
} }
if (table_context->od_feature_capabilities) {
kfree(table_context->od_feature_capabilities);
table_context->od_feature_capabilities = NULL;
}
if (table_context->od_settings_max) {
kfree(table_context->od_settings_max);
table_context->od_settings_max = NULL;
}
if (table_context->od_settings_min) {
kfree(table_context->od_settings_min);
table_context->od_settings_min = NULL;
}
ret = smu_fini_fb_allocations(smu); ret = smu_fini_fb_allocations(smu);
if (ret) if (ret)
return ret; return ret;
......
...@@ -192,6 +192,10 @@ struct smu_table_context ...@@ -192,6 +192,10 @@ struct smu_table_context
struct smu_table memory_pool; struct smu_table memory_pool;
uint16_t software_shutdown_temp; uint16_t software_shutdown_temp;
uint8_t thermal_controller_type; uint8_t thermal_controller_type;
uint8_t *od_feature_capabilities;
uint32_t *od_settings_max;
uint32_t *od_settings_min;
}; };
struct smu_dpm_context { struct smu_dpm_context {
......
...@@ -146,10 +146,92 @@ static int vega20_allocate_dpm_context(struct smu_context *smu) ...@@ -146,10 +146,92 @@ static int vega20_allocate_dpm_context(struct smu_context *smu)
return 0; return 0;
} }
static int vega20_setup_od8_information(struct smu_context *smu)
{
ATOM_Vega20_POWERPLAYTABLE *powerplay_table = NULL;
struct smu_table_context *table_context = &smu->smu_table;
uint32_t od_feature_count, od_feature_array_size,
od_setting_count, od_setting_array_size;
if (!table_context->power_play_table)
return -EINVAL;
powerplay_table = table_context->power_play_table;
if (powerplay_table->OverDrive8Table.ucODTableRevision == 1) {
/* Setup correct ODFeatureCount, and store ODFeatureArray from
* powerplay table to od_feature_capabilities */
od_feature_count =
(le32_to_cpu(powerplay_table->OverDrive8Table.ODFeatureCount) >
ATOM_VEGA20_ODFEATURE_COUNT) ?
ATOM_VEGA20_ODFEATURE_COUNT :
le32_to_cpu(powerplay_table->OverDrive8Table.ODFeatureCount);
od_feature_array_size = sizeof(uint8_t) * od_feature_count;
if (table_context->od_feature_capabilities)
return -EINVAL;
table_context->od_feature_capabilities = kzalloc(od_feature_array_size, GFP_KERNEL);
if (!table_context->od_feature_capabilities)
return -ENOMEM;
memcpy(table_context->od_feature_capabilities,
&powerplay_table->OverDrive8Table.ODFeatureCapabilities,
od_feature_array_size);
/* Setup correct ODSettingCount, and store ODSettingArray from
* powerplay table to od_settings_max and od_setting_min */
od_setting_count =
(le32_to_cpu(powerplay_table->OverDrive8Table.ODSettingCount) >
ATOM_VEGA20_ODSETTING_COUNT) ?
ATOM_VEGA20_ODSETTING_COUNT :
le32_to_cpu(powerplay_table->OverDrive8Table.ODSettingCount);
od_setting_array_size = sizeof(uint32_t) * od_setting_count;
if (table_context->od_settings_max)
return -EINVAL;
table_context->od_settings_max = kzalloc(od_setting_array_size, GFP_KERNEL);
if (!table_context->od_settings_max) {
kfree(table_context->od_feature_capabilities);
table_context->od_feature_capabilities = NULL;
return -ENOMEM;
}
memcpy(table_context->od_settings_max,
&powerplay_table->OverDrive8Table.ODSettingsMax,
od_setting_array_size);
if (table_context->od_settings_min)
return -EINVAL;
table_context->od_settings_min = kzalloc(od_setting_array_size, GFP_KERNEL);
if (!table_context->od_settings_min) {
kfree(table_context->od_feature_capabilities);
table_context->od_feature_capabilities = NULL;
kfree(table_context->od_settings_max);
table_context->od_settings_max = NULL;
return -ENOMEM;
}
memcpy(table_context->od_settings_min,
&powerplay_table->OverDrive8Table.ODSettingsMin,
od_setting_array_size);
}
return 0;
}
static int vega20_store_powerplay_table(struct smu_context *smu) static int vega20_store_powerplay_table(struct smu_context *smu)
{ {
ATOM_Vega20_POWERPLAYTABLE *powerplay_table = NULL; ATOM_Vega20_POWERPLAYTABLE *powerplay_table = NULL;
struct smu_table_context *table_context = &smu->smu_table; struct smu_table_context *table_context = &smu->smu_table;
int ret;
if (!table_context->power_play_table) if (!table_context->power_play_table)
return -EINVAL; return -EINVAL;
...@@ -162,7 +244,9 @@ static int vega20_store_powerplay_table(struct smu_context *smu) ...@@ -162,7 +244,9 @@ static int vega20_store_powerplay_table(struct smu_context *smu)
table_context->software_shutdown_temp = powerplay_table->usSoftwareShutdownTemp; table_context->software_shutdown_temp = powerplay_table->usSoftwareShutdownTemp;
table_context->thermal_controller_type = powerplay_table->ucThermalControllerType; table_context->thermal_controller_type = powerplay_table->ucThermalControllerType;
return 0; ret = vega20_setup_od8_information(smu);
return ret;
} }
static int vega20_append_powerplay_table(struct smu_context *smu) static int vega20_append_powerplay_table(struct smu_context *smu)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment