Commit 12ea3449 authored by Evan Quan's avatar Evan Quan Committed by Alex Deucher

drm/amd/powerplay: clean up the APIs for bootup clocks

Combine and simplify the logics for retrieving bootup
clocks.
Signed-off-by: default avatarEvan Quan <evan.quan@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 78eb4a36
...@@ -1114,10 +1114,6 @@ static int smu_smc_table_hw_init(struct smu_context *smu, ...@@ -1114,10 +1114,6 @@ static int smu_smc_table_hw_init(struct smu_context *smu,
if (ret) if (ret)
return ret; return ret;
ret = smu_get_clk_info_from_vbios(smu);
if (ret)
return ret;
/* /*
* check if the format_revision in vbios is up to pptable header * check if the format_revision in vbios is up to pptable header
* version, and the structure size is not 0. * version, and the structure size is not 0.
......
...@@ -2457,7 +2457,6 @@ static const struct pptable_funcs arcturus_ppt_funcs = { ...@@ -2457,7 +2457,6 @@ static const struct pptable_funcs arcturus_ppt_funcs = {
.check_fw_status = smu_v11_0_check_fw_status, .check_fw_status = smu_v11_0_check_fw_status,
.setup_pptable = smu_v11_0_setup_pptable, .setup_pptable = smu_v11_0_setup_pptable,
.get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values, .get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values,
.get_clk_info_from_vbios = smu_v11_0_get_clk_info_from_vbios,
.check_pptable = smu_v11_0_check_pptable, .check_pptable = smu_v11_0_check_pptable,
.parse_pptable = smu_v11_0_parse_pptable, .parse_pptable = smu_v11_0_parse_pptable,
.populate_smc_tables = smu_v11_0_populate_smc_pptable, .populate_smc_tables = smu_v11_0_populate_smc_pptable,
......
...@@ -506,7 +506,6 @@ struct pptable_funcs { ...@@ -506,7 +506,6 @@ struct pptable_funcs {
int (*check_fw_status)(struct smu_context *smu); int (*check_fw_status)(struct smu_context *smu);
int (*setup_pptable)(struct smu_context *smu); int (*setup_pptable)(struct smu_context *smu);
int (*get_vbios_bootup_values)(struct smu_context *smu); int (*get_vbios_bootup_values)(struct smu_context *smu);
int (*get_clk_info_from_vbios)(struct smu_context *smu);
int (*check_pptable)(struct smu_context *smu); int (*check_pptable)(struct smu_context *smu);
int (*parse_pptable)(struct smu_context *smu); int (*parse_pptable)(struct smu_context *smu);
int (*populate_smc_tables)(struct smu_context *smu); int (*populate_smc_tables)(struct smu_context *smu);
......
...@@ -162,8 +162,6 @@ int smu_v11_0_setup_pptable(struct smu_context *smu); ...@@ -162,8 +162,6 @@ int smu_v11_0_setup_pptable(struct smu_context *smu);
int smu_v11_0_get_vbios_bootup_values(struct smu_context *smu); int smu_v11_0_get_vbios_bootup_values(struct smu_context *smu);
int smu_v11_0_get_clk_info_from_vbios(struct smu_context *smu);
int smu_v11_0_check_pptable(struct smu_context *smu); int smu_v11_0_check_pptable(struct smu_context *smu);
int smu_v11_0_parse_pptable(struct smu_context *smu); int smu_v11_0_parse_pptable(struct smu_context *smu);
......
...@@ -2319,7 +2319,6 @@ static const struct pptable_funcs navi10_ppt_funcs = { ...@@ -2319,7 +2319,6 @@ static const struct pptable_funcs navi10_ppt_funcs = {
.check_fw_status = smu_v11_0_check_fw_status, .check_fw_status = smu_v11_0_check_fw_status,
.setup_pptable = smu_v11_0_setup_pptable, .setup_pptable = smu_v11_0_setup_pptable,
.get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values, .get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values,
.get_clk_info_from_vbios = smu_v11_0_get_clk_info_from_vbios,
.check_pptable = smu_v11_0_check_pptable, .check_pptable = smu_v11_0_check_pptable,
.parse_pptable = smu_v11_0_parse_pptable, .parse_pptable = smu_v11_0_parse_pptable,
.populate_smc_tables = smu_v11_0_populate_smc_pptable, .populate_smc_tables = smu_v11_0_populate_smc_pptable,
......
...@@ -2457,7 +2457,6 @@ static const struct pptable_funcs sienna_cichlid_ppt_funcs = { ...@@ -2457,7 +2457,6 @@ static const struct pptable_funcs sienna_cichlid_ppt_funcs = {
.check_fw_status = smu_v11_0_check_fw_status, .check_fw_status = smu_v11_0_check_fw_status,
.setup_pptable = smu_v11_0_setup_pptable, .setup_pptable = smu_v11_0_setup_pptable,
.get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values, .get_vbios_bootup_values = smu_v11_0_get_vbios_bootup_values,
.get_clk_info_from_vbios = smu_v11_0_get_clk_info_from_vbios,
.check_pptable = smu_v11_0_check_pptable, .check_pptable = smu_v11_0_check_pptable,
.parse_pptable = smu_v11_0_parse_pptable, .parse_pptable = smu_v11_0_parse_pptable,
.populate_smc_tables = smu_v11_0_populate_smc_pptable, .populate_smc_tables = smu_v11_0_populate_smc_pptable,
......
...@@ -43,8 +43,6 @@ ...@@ -43,8 +43,6 @@
#define smu_get_vbios_bootup_values(smu) \ #define smu_get_vbios_bootup_values(smu) \
((smu)->ppt_funcs->get_vbios_bootup_values ? (smu)->ppt_funcs->get_vbios_bootup_values((smu)) : 0) ((smu)->ppt_funcs->get_vbios_bootup_values ? (smu)->ppt_funcs->get_vbios_bootup_values((smu)) : 0)
#define smu_get_clk_info_from_vbios(smu) \
((smu)->ppt_funcs->get_clk_info_from_vbios ? (smu)->ppt_funcs->get_clk_info_from_vbios((smu)) : 0)
#define smu_check_pptable(smu) \ #define smu_check_pptable(smu) \
((smu)->ppt_funcs->check_pptable ? (smu)->ppt_funcs->check_pptable((smu)) : 0) ((smu)->ppt_funcs->check_pptable ? (smu)->ppt_funcs->check_pptable((smu)) : 0)
#define smu_parse_pptable(smu) \ #define smu_parse_pptable(smu) \
......
...@@ -565,6 +565,32 @@ int smu_v11_0_fini_power(struct smu_context *smu) ...@@ -565,6 +565,32 @@ int smu_v11_0_fini_power(struct smu_context *smu)
return 0; return 0;
} }
static int smu_v11_0_atom_get_smu_clockinfo(struct amdgpu_device *adev,
uint8_t clk_id,
uint8_t syspll_id,
uint32_t *clk_freq)
{
struct atom_get_smu_clock_info_parameters_v3_1 input = {0};
struct atom_get_smu_clock_info_output_parameters_v3_1 *output;
int ret, index;
input.clk_id = clk_id;
input.syspll_id = syspll_id;
input.command = GET_SMU_CLOCK_INFO_V3_1_GET_CLOCK_FREQ;
index = get_index_into_master_table(atom_master_list_of_command_functions_v2_1,
getsmuclockinfo);
ret = amdgpu_atom_execute_table(adev->mode_info.atom_context, index,
(uint32_t *)&input);
if (ret)
return -EINVAL;
output = (struct atom_get_smu_clock_info_output_parameters_v3_1 *)&input;
*clk_freq = le32_to_cpu(output->atom_smu_outputclkfreq.smu_clock_freq_hz) / 10000;
return 0;
}
int smu_v11_0_get_vbios_bootup_values(struct smu_context *smu) int smu_v11_0_get_vbios_bootup_values(struct smu_context *smu)
{ {
int ret, index; int ret, index;
...@@ -623,102 +649,37 @@ int smu_v11_0_get_vbios_bootup_values(struct smu_context *smu) ...@@ -623,102 +649,37 @@ int smu_v11_0_get_vbios_bootup_values(struct smu_context *smu)
smu->smu_table.boot_values.format_revision = header->format_revision; smu->smu_table.boot_values.format_revision = header->format_revision;
smu->smu_table.boot_values.content_revision = header->content_revision; smu->smu_table.boot_values.content_revision = header->content_revision;
return 0; smu_v11_0_atom_get_smu_clockinfo(smu->adev,
} (uint8_t)SMU11_SYSPLL0_SOCCLK_ID,
(uint8_t)0,
&smu->smu_table.boot_values.socclk);
int smu_v11_0_get_clk_info_from_vbios(struct smu_context *smu) smu_v11_0_atom_get_smu_clockinfo(smu->adev,
{ (uint8_t)SMU11_SYSPLL0_DCEFCLK_ID,
int ret, index; (uint8_t)0,
struct amdgpu_device *adev = smu->adev; &smu->smu_table.boot_values.dcefclk);
struct atom_get_smu_clock_info_parameters_v3_1 input = {0};
struct atom_get_smu_clock_info_output_parameters_v3_1 *output;
input.clk_id = SMU11_SYSPLL0_SOCCLK_ID; smu_v11_0_atom_get_smu_clockinfo(smu->adev,
input.command = GET_SMU_CLOCK_INFO_V3_1_GET_CLOCK_FREQ; (uint8_t)SMU11_SYSPLL0_ECLK_ID,
index = get_index_into_master_table(atom_master_list_of_command_functions_v2_1, (uint8_t)0,
getsmuclockinfo); &smu->smu_table.boot_values.eclk);
ret = amdgpu_atom_execute_table(adev->mode_info.atom_context, index,
(uint32_t *)&input);
if (ret)
return -EINVAL;
output = (struct atom_get_smu_clock_info_output_parameters_v3_1 *)&input; smu_v11_0_atom_get_smu_clockinfo(smu->adev,
smu->smu_table.boot_values.socclk = le32_to_cpu(output->atom_smu_outputclkfreq.smu_clock_freq_hz) / 10000; (uint8_t)SMU11_SYSPLL0_VCLK_ID,
(uint8_t)0,
&smu->smu_table.boot_values.vclk);
memset(&input, 0, sizeof(input)); smu_v11_0_atom_get_smu_clockinfo(smu->adev,
input.clk_id = SMU11_SYSPLL0_DCEFCLK_ID; (uint8_t)SMU11_SYSPLL0_DCLK_ID,
input.command = GET_SMU_CLOCK_INFO_V3_1_GET_CLOCK_FREQ; (uint8_t)0,
index = get_index_into_master_table(atom_master_list_of_command_functions_v2_1, &smu->smu_table.boot_values.dclk);
getsmuclockinfo);
ret = amdgpu_atom_execute_table(adev->mode_info.atom_context, index,
(uint32_t *)&input);
if (ret)
return -EINVAL;
output = (struct atom_get_smu_clock_info_output_parameters_v3_1 *)&input;
smu->smu_table.boot_values.dcefclk = le32_to_cpu(output->atom_smu_outputclkfreq.smu_clock_freq_hz) / 10000;
memset(&input, 0, sizeof(input));
input.clk_id = SMU11_SYSPLL0_ECLK_ID;
input.command = GET_SMU_CLOCK_INFO_V3_1_GET_CLOCK_FREQ;
index = get_index_into_master_table(atom_master_list_of_command_functions_v2_1,
getsmuclockinfo);
ret = amdgpu_atom_execute_table(adev->mode_info.atom_context, index,
(uint32_t *)&input);
if (ret)
return -EINVAL;
output = (struct atom_get_smu_clock_info_output_parameters_v3_1 *)&input;
smu->smu_table.boot_values.eclk = le32_to_cpu(output->atom_smu_outputclkfreq.smu_clock_freq_hz) / 10000;
memset(&input, 0, sizeof(input));
input.clk_id = SMU11_SYSPLL0_VCLK_ID;
input.command = GET_SMU_CLOCK_INFO_V3_1_GET_CLOCK_FREQ;
index = get_index_into_master_table(atom_master_list_of_command_functions_v2_1,
getsmuclockinfo);
ret = amdgpu_atom_execute_table(adev->mode_info.atom_context, index,
(uint32_t *)&input);
if (ret)
return -EINVAL;
output = (struct atom_get_smu_clock_info_output_parameters_v3_1 *)&input;
smu->smu_table.boot_values.vclk = le32_to_cpu(output->atom_smu_outputclkfreq.smu_clock_freq_hz) / 10000;
memset(&input, 0, sizeof(input));
input.clk_id = SMU11_SYSPLL0_DCLK_ID;
input.command = GET_SMU_CLOCK_INFO_V3_1_GET_CLOCK_FREQ;
index = get_index_into_master_table(atom_master_list_of_command_functions_v2_1,
getsmuclockinfo);
ret = amdgpu_atom_execute_table(adev->mode_info.atom_context, index,
(uint32_t *)&input);
if (ret)
return -EINVAL;
output = (struct atom_get_smu_clock_info_output_parameters_v3_1 *)&input;
smu->smu_table.boot_values.dclk = le32_to_cpu(output->atom_smu_outputclkfreq.smu_clock_freq_hz) / 10000;
if ((smu->smu_table.boot_values.format_revision == 3) && if ((smu->smu_table.boot_values.format_revision == 3) &&
(smu->smu_table.boot_values.content_revision >= 2)) { (smu->smu_table.boot_values.content_revision >= 2))
memset(&input, 0, sizeof(input)); smu_v11_0_atom_get_smu_clockinfo(smu->adev,
input.clk_id = SMU11_SYSPLL1_0_FCLK_ID; (uint8_t)SMU11_SYSPLL1_0_FCLK_ID,
input.syspll_id = SMU11_SYSPLL1_2_ID; (uint8_t)SMU11_SYSPLL1_2_ID,
input.command = GET_SMU_CLOCK_INFO_V3_1_GET_CLOCK_FREQ; &smu->smu_table.boot_values.fclk);
index = get_index_into_master_table(atom_master_list_of_command_functions_v2_1,
getsmuclockinfo);
ret = amdgpu_atom_execute_table(adev->mode_info.atom_context, index,
(uint32_t *)&input);
if (ret)
return -EINVAL;
output = (struct atom_get_smu_clock_info_output_parameters_v3_1 *)&input;
smu->smu_table.boot_values.fclk = le32_to_cpu(output->atom_smu_outputclkfreq.smu_clock_freq_hz) / 10000;
}
return 0; return 0;
} }
......
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