Commit b3892e2b authored by Rex Zhu's avatar Rex Zhu Committed by Alex Deucher

drm/amd/pp: Use atombios api directly in powerplay (v2)

In order to remove the cgs wrapper functions for atombios api.

v2: squash in whitespace cleanup (Alex)
Reviewed-by: default avatarHuang Rui <ray.huang@amd.com>
Signed-off-by: default avatarRex Zhu <Rex.Zhu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e8ee21d2
...@@ -298,7 +298,7 @@ extern int atomctrl_get_memory_pll_dividers_vi(struct pp_hwmgr *hwmgr, ...@@ -298,7 +298,7 @@ extern int atomctrl_get_memory_pll_dividers_vi(struct pp_hwmgr *hwmgr,
extern int atomctrl_get_engine_pll_dividers_kong(struct pp_hwmgr *hwmgr, extern int atomctrl_get_engine_pll_dividers_kong(struct pp_hwmgr *hwmgr,
uint32_t clock_value, uint32_t clock_value,
pp_atomctrl_clock_dividers_kong *dividers); pp_atomctrl_clock_dividers_kong *dividers);
extern int atomctrl_read_efuse(void *device, uint16_t start_index, extern int atomctrl_read_efuse(struct pp_hwmgr *hwmgr, uint16_t start_index,
uint16_t end_index, uint32_t mask, uint32_t *efuse); uint16_t end_index, uint32_t mask, uint32_t *efuse);
extern int atomctrl_calculate_voltage_evv_on_sclk(struct pp_hwmgr *hwmgr, uint8_t voltage_type, extern int atomctrl_calculate_voltage_evv_on_sclk(struct pp_hwmgr *hwmgr, uint8_t voltage_type,
uint32_t sclk, uint16_t virtual_voltage_Id, uint16_t *voltage, uint16_t dpm_level, bool debug); uint32_t sclk, uint16_t virtual_voltage_Id, uint16_t *voltage, uint16_t dpm_level, bool debug);
......
...@@ -23,9 +23,9 @@ ...@@ -23,9 +23,9 @@
#include "ppatomfwctrl.h" #include "ppatomfwctrl.h"
#include "atomfirmware.h" #include "atomfirmware.h"
#include "atom.h"
#include "pp_debug.h" #include "pp_debug.h"
static const union atom_voltage_object_v4 *pp_atomfwctrl_lookup_voltage_type_v4( static const union atom_voltage_object_v4 *pp_atomfwctrl_lookup_voltage_type_v4(
const struct atom_voltage_objects_info_v4_1 *voltage_object_info_table, const struct atom_voltage_objects_info_v4_1 *voltage_object_info_table,
uint8_t voltage_type, uint8_t voltage_mode) uint8_t voltage_type, uint8_t voltage_mode)
...@@ -38,35 +38,34 @@ static const union atom_voltage_object_v4 *pp_atomfwctrl_lookup_voltage_type_v4( ...@@ -38,35 +38,34 @@ static const union atom_voltage_object_v4 *pp_atomfwctrl_lookup_voltage_type_v4(
while (offset < size) { while (offset < size) {
const union atom_voltage_object_v4 *voltage_object = const union atom_voltage_object_v4 *voltage_object =
(const union atom_voltage_object_v4 *)(start + offset); (const union atom_voltage_object_v4 *)(start + offset);
if (voltage_type == voltage_object->gpio_voltage_obj.header.voltage_type && if (voltage_type == voltage_object->gpio_voltage_obj.header.voltage_type &&
voltage_mode == voltage_object->gpio_voltage_obj.header.voltage_mode) voltage_mode == voltage_object->gpio_voltage_obj.header.voltage_mode)
return voltage_object; return voltage_object;
offset += le16_to_cpu(voltage_object->gpio_voltage_obj.header.object_size); offset += le16_to_cpu(voltage_object->gpio_voltage_obj.header.object_size);
} }
return NULL; return NULL;
} }
static struct atom_voltage_objects_info_v4_1 *pp_atomfwctrl_get_voltage_info_table( static struct atom_voltage_objects_info_v4_1 *pp_atomfwctrl_get_voltage_info_table(
struct pp_hwmgr *hwmgr) struct pp_hwmgr *hwmgr)
{ {
const void *table_address; const void *table_address;
uint16_t idx; uint16_t idx;
idx = GetIndexIntoMasterDataTable(voltageobject_info); idx = GetIndexIntoMasterDataTable(voltageobject_info);
table_address = cgs_atom_get_data_table(hwmgr->device, table_address = smu_atom_get_data_table(hwmgr->adev,
idx, NULL, NULL, NULL); idx, NULL, NULL, NULL);
PP_ASSERT_WITH_CODE( PP_ASSERT_WITH_CODE(table_address,
table_address, "Error retrieving BIOS Table Address!",
"Error retrieving BIOS Table Address!", return NULL);
return NULL);
return (struct atom_voltage_objects_info_v4_1 *)table_address; return (struct atom_voltage_objects_info_v4_1 *)table_address;
} }
/** /**
...@@ -167,7 +166,7 @@ static struct atom_gpio_pin_lut_v2_1 *pp_atomfwctrl_get_gpio_lookup_table( ...@@ -167,7 +166,7 @@ static struct atom_gpio_pin_lut_v2_1 *pp_atomfwctrl_get_gpio_lookup_table(
uint16_t idx; uint16_t idx;
idx = GetIndexIntoMasterDataTable(gpio_pin_lut); idx = GetIndexIntoMasterDataTable(gpio_pin_lut);
table_address = cgs_atom_get_data_table(hwmgr->device, table_address = smu_atom_get_data_table(hwmgr->adev,
idx, NULL, NULL, NULL); idx, NULL, NULL, NULL);
PP_ASSERT_WITH_CODE(table_address, PP_ASSERT_WITH_CODE(table_address,
"Error retrieving BIOS Table Address!", "Error retrieving BIOS Table Address!",
...@@ -248,28 +247,30 @@ int pp_atomfwctrl_get_gpu_pll_dividers_vega10(struct pp_hwmgr *hwmgr, ...@@ -248,28 +247,30 @@ int pp_atomfwctrl_get_gpu_pll_dividers_vega10(struct pp_hwmgr *hwmgr,
uint32_t clock_type, uint32_t clock_value, uint32_t clock_type, uint32_t clock_value,
struct pp_atomfwctrl_clock_dividers_soc15 *dividers) struct pp_atomfwctrl_clock_dividers_soc15 *dividers)
{ {
struct amdgpu_device *adev = hwmgr->adev;
struct compute_gpu_clock_input_parameter_v1_8 pll_parameters; struct compute_gpu_clock_input_parameter_v1_8 pll_parameters;
struct compute_gpu_clock_output_parameter_v1_8 *pll_output; struct compute_gpu_clock_output_parameter_v1_8 *pll_output;
int result;
uint32_t idx; uint32_t idx;
pll_parameters.gpuclock_10khz = (uint32_t)clock_value; pll_parameters.gpuclock_10khz = (uint32_t)clock_value;
pll_parameters.gpu_clock_type = clock_type; pll_parameters.gpu_clock_type = clock_type;
idx = GetIndexIntoMasterCmdTable(computegpuclockparam); idx = GetIndexIntoMasterCmdTable(computegpuclockparam);
result = cgs_atom_exec_cmd_table(hwmgr->device, idx, &pll_parameters);
if (amdgpu_atom_execute_table(
if (!result) { adev->mode_info.atom_context, idx, (uint32_t *)&pll_parameters))
pll_output = (struct compute_gpu_clock_output_parameter_v1_8 *) return -EINVAL;
&pll_parameters;
dividers->ulClock = le32_to_cpu(pll_output->gpuclock_10khz); pll_output = (struct compute_gpu_clock_output_parameter_v1_8 *)
dividers->ulDid = le32_to_cpu(pll_output->dfs_did); &pll_parameters;
dividers->ulPll_fb_mult = le32_to_cpu(pll_output->pll_fb_mult); dividers->ulClock = le32_to_cpu(pll_output->gpuclock_10khz);
dividers->ulPll_ss_fbsmult = le32_to_cpu(pll_output->pll_ss_fbsmult); dividers->ulDid = le32_to_cpu(pll_output->dfs_did);
dividers->usPll_ss_slew_frac = le16_to_cpu(pll_output->pll_ss_slew_frac); dividers->ulPll_fb_mult = le32_to_cpu(pll_output->pll_fb_mult);
dividers->ucPll_ss_enable = pll_output->pll_ss_enable; dividers->ulPll_ss_fbsmult = le32_to_cpu(pll_output->pll_ss_fbsmult);
} dividers->usPll_ss_slew_frac = le16_to_cpu(pll_output->pll_ss_slew_frac);
return result; dividers->ucPll_ss_enable = pll_output->pll_ss_enable;
return 0;
} }
int pp_atomfwctrl_get_avfs_information(struct pp_hwmgr *hwmgr, int pp_atomfwctrl_get_avfs_information(struct pp_hwmgr *hwmgr,
...@@ -283,7 +284,7 @@ int pp_atomfwctrl_get_avfs_information(struct pp_hwmgr *hwmgr, ...@@ -283,7 +284,7 @@ int pp_atomfwctrl_get_avfs_information(struct pp_hwmgr *hwmgr,
idx = GetIndexIntoMasterDataTable(asic_profiling_info); idx = GetIndexIntoMasterDataTable(asic_profiling_info);
profile = (struct atom_asic_profiling_info_v4_1 *) profile = (struct atom_asic_profiling_info_v4_1 *)
cgs_atom_get_data_table(hwmgr->device, smu_atom_get_data_table(hwmgr->adev,
idx, NULL, NULL, NULL); idx, NULL, NULL, NULL);
if (!profile) if (!profile)
...@@ -467,7 +468,7 @@ int pp_atomfwctrl_get_gpio_information(struct pp_hwmgr *hwmgr, ...@@ -467,7 +468,7 @@ int pp_atomfwctrl_get_gpio_information(struct pp_hwmgr *hwmgr,
idx = GetIndexIntoMasterDataTable(smu_info); idx = GetIndexIntoMasterDataTable(smu_info);
info = (struct atom_smu_info_v3_1 *) info = (struct atom_smu_info_v3_1 *)
cgs_atom_get_data_table(hwmgr->device, smu_atom_get_data_table(hwmgr->adev,
idx, NULL, NULL, NULL); idx, NULL, NULL, NULL);
if (!info) { if (!info) {
...@@ -489,6 +490,7 @@ int pp_atomfwctrl_get_gpio_information(struct pp_hwmgr *hwmgr, ...@@ -489,6 +490,7 @@ int pp_atomfwctrl_get_gpio_information(struct pp_hwmgr *hwmgr,
int pp_atomfwctrl__get_clk_information_by_clkid(struct pp_hwmgr *hwmgr, BIOS_CLKID id, uint32_t *frequency) int pp_atomfwctrl__get_clk_information_by_clkid(struct pp_hwmgr *hwmgr, BIOS_CLKID id, uint32_t *frequency)
{ {
struct amdgpu_device *adev = hwmgr->adev;
struct atom_get_smu_clock_info_parameters_v3_1 parameters; struct atom_get_smu_clock_info_parameters_v3_1 parameters;
struct atom_get_smu_clock_info_output_parameters_v3_1 *output; struct atom_get_smu_clock_info_output_parameters_v3_1 *output;
uint32_t ix; uint32_t ix;
...@@ -497,13 +499,13 @@ int pp_atomfwctrl__get_clk_information_by_clkid(struct pp_hwmgr *hwmgr, BIOS_CLK ...@@ -497,13 +499,13 @@ int pp_atomfwctrl__get_clk_information_by_clkid(struct pp_hwmgr *hwmgr, BIOS_CLK
parameters.command = GET_SMU_CLOCK_INFO_V3_1_GET_CLOCK_FREQ; parameters.command = GET_SMU_CLOCK_INFO_V3_1_GET_CLOCK_FREQ;
ix = GetIndexIntoMasterCmdTable(getsmuclockinfo); ix = GetIndexIntoMasterCmdTable(getsmuclockinfo);
if (!cgs_atom_exec_cmd_table(hwmgr->device, ix, &parameters)) {
output = (struct atom_get_smu_clock_info_output_parameters_v3_1 *)&parameters; if (amdgpu_atom_execute_table(
*frequency = output->atom_smu_outputclkfreq.smu_clock_freq_hz / 10000; adev->mode_info.atom_context, ix, (uint32_t *)&parameters))
} else { return -EINVAL;
pr_info("Error execute_table getsmuclockinfo!");
return -1; output = (struct atom_get_smu_clock_info_output_parameters_v3_1 *)&parameters;
} *frequency = output->atom_smu_outputclkfreq.smu_clock_freq_hz / 10000;
return 0; return 0;
} }
...@@ -517,7 +519,7 @@ int pp_atomfwctrl_get_vbios_bootup_values(struct pp_hwmgr *hwmgr, ...@@ -517,7 +519,7 @@ int pp_atomfwctrl_get_vbios_bootup_values(struct pp_hwmgr *hwmgr,
ix = GetIndexIntoMasterDataTable(firmwareinfo); ix = GetIndexIntoMasterDataTable(firmwareinfo);
info = (struct atom_firmware_info_v3_1 *) info = (struct atom_firmware_info_v3_1 *)
cgs_atom_get_data_table(hwmgr->device, smu_atom_get_data_table(hwmgr->adev,
ix, NULL, NULL, NULL); ix, NULL, NULL, NULL);
if (!info) { if (!info) {
...@@ -553,7 +555,7 @@ int pp_atomfwctrl_get_smc_dpm_information(struct pp_hwmgr *hwmgr, ...@@ -553,7 +555,7 @@ int pp_atomfwctrl_get_smc_dpm_information(struct pp_hwmgr *hwmgr,
ix = GetIndexIntoMasterDataTable(smc_dpm_info); ix = GetIndexIntoMasterDataTable(smc_dpm_info);
info = (struct atom_smc_dpm_info_v4_1 *) info = (struct atom_smc_dpm_info_v4_1 *)
cgs_atom_get_data_table(hwmgr->device, smu_atom_get_data_table(hwmgr->adev,
ix, NULL, NULL, NULL); ix, NULL, NULL, NULL);
if (!info) { if (!info) {
pr_info("Error retrieving BIOS Table Address!"); pr_info("Error retrieving BIOS Table Address!");
......
...@@ -141,7 +141,7 @@ static const void *get_powerplay_table(struct pp_hwmgr *hwmgr) ...@@ -141,7 +141,7 @@ static const void *get_powerplay_table(struct pp_hwmgr *hwmgr)
if (!table_address) { if (!table_address) {
table_address = (ATOM_Tonga_POWERPLAYTABLE *) table_address = (ATOM_Tonga_POWERPLAYTABLE *)
cgs_atom_get_data_table(hwmgr->device, smu_atom_get_data_table(hwmgr->adev,
index, &size, &frev, &crev); index, &size, &frev, &crev);
hwmgr->soft_pp_table = table_address; /*Cache the result in RAM.*/ hwmgr->soft_pp_table = table_address; /*Cache the result in RAM.*/
hwmgr->soft_pp_table_size = size; hwmgr->soft_pp_table_size = size;
......
...@@ -837,7 +837,7 @@ static const ATOM_PPLIB_POWERPLAYTABLE *get_powerplay_table( ...@@ -837,7 +837,7 @@ static const ATOM_PPLIB_POWERPLAYTABLE *get_powerplay_table(
hwmgr->soft_pp_table = &soft_dummy_pp_table[0]; hwmgr->soft_pp_table = &soft_dummy_pp_table[0];
hwmgr->soft_pp_table_size = sizeof(soft_dummy_pp_table); hwmgr->soft_pp_table_size = sizeof(soft_dummy_pp_table);
} else { } else {
table_addr = cgs_atom_get_data_table(hwmgr->device, table_addr = smu_atom_get_data_table(hwmgr->adev,
GetIndexIntoMasterTable(DATA, PowerPlayInfo), GetIndexIntoMasterTable(DATA, PowerPlayInfo),
&size, &frev, &crev); &size, &frev, &crev);
hwmgr->soft_pp_table = table_addr; hwmgr->soft_pp_table = table_addr;
...@@ -1058,7 +1058,7 @@ static int init_overdrive_limits(struct pp_hwmgr *hwmgr, ...@@ -1058,7 +1058,7 @@ static int init_overdrive_limits(struct pp_hwmgr *hwmgr,
return 0; return 0;
/* We assume here that fw_info is unchanged if this call fails.*/ /* We assume here that fw_info is unchanged if this call fails.*/
fw_info = cgs_atom_get_data_table(hwmgr->device, fw_info = smu_atom_get_data_table(hwmgr->adev,
GetIndexIntoMasterTable(DATA, FirmwareInfo), GetIndexIntoMasterTable(DATA, FirmwareInfo),
&size, &frev, &crev); &size, &frev, &crev);
......
...@@ -2957,8 +2957,7 @@ static int smu7_dpm_patch_boot_state(struct pp_hwmgr *hwmgr, ...@@ -2957,8 +2957,7 @@ static int smu7_dpm_patch_boot_state(struct pp_hwmgr *hwmgr,
/* First retrieve the Boot clocks and VDDC from the firmware info table. /* First retrieve the Boot clocks and VDDC from the firmware info table.
* We assume here that fw_info is unchanged if this call fails. * We assume here that fw_info is unchanged if this call fails.
*/ */
fw_info = (ATOM_FIRMWARE_INFO_V2_2 *)cgs_atom_get_data_table( fw_info = (ATOM_FIRMWARE_INFO_V2_2 *)smu_atom_get_data_table(hwmgr->adev, index,
hwmgr->device, index,
&size, &frev, &crev); &size, &frev, &crev);
if (!fw_info) if (!fw_info)
/* During a test, there is no firmware info table. */ /* During a test, there is no firmware info table. */
......
...@@ -314,8 +314,7 @@ static int smu8_get_system_info_data(struct pp_hwmgr *hwmgr) ...@@ -314,8 +314,7 @@ static int smu8_get_system_info_data(struct pp_hwmgr *hwmgr)
uint8_t frev, crev; uint8_t frev, crev;
uint16_t size; uint16_t size;
info = (ATOM_INTEGRATED_SYSTEM_INFO_V1_9 *) cgs_atom_get_data_table( info = (ATOM_INTEGRATED_SYSTEM_INFO_V1_9 *)smu_atom_get_data_table(hwmgr->adev,
hwmgr->device,
GetIndexIntoMasterTable(DATA, IntegratedSystemInfo), GetIndexIntoMasterTable(DATA, IntegratedSystemInfo),
&size, &frev, &crev); &size, &frev, &crev);
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "pp_debug.h" #include "pp_debug.h"
#include "ppatomctrl.h" #include "ppatomctrl.h"
#include "ppsmc.h" #include "ppsmc.h"
#include "atom.h"
uint8_t convert_to_vid(uint16_t vddc) uint8_t convert_to_vid(uint16_t vddc)
{ {
...@@ -608,3 +609,18 @@ int smu9_register_irq_handlers(struct pp_hwmgr *hwmgr) ...@@ -608,3 +609,18 @@ int smu9_register_irq_handlers(struct pp_hwmgr *hwmgr)
return 0; return 0;
} }
void *smu_atom_get_data_table(void *dev, uint32_t table, uint16_t *size,
uint8_t *frev, uint8_t *crev)
{
struct amdgpu_device *adev = dev;
uint16_t data_start;
if (amdgpu_atom_parse_data_header(
adev->mode_info.atom_context, table, size,
frev, crev, &data_start))
return (uint8_t *)adev->mode_info.atom_context->bios +
data_start;
return NULL;
}
...@@ -82,6 +82,9 @@ int phm_irq_process(struct amdgpu_device *adev, ...@@ -82,6 +82,9 @@ int phm_irq_process(struct amdgpu_device *adev,
int smu9_register_irq_handlers(struct pp_hwmgr *hwmgr); int smu9_register_irq_handlers(struct pp_hwmgr *hwmgr);
void *smu_atom_get_data_table(void *dev, uint32_t table, uint16_t *size,
uint8_t *frev, uint8_t *crev);
#define PHM_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT #define PHM_FIELD_SHIFT(reg, field) reg##__##field##__SHIFT
#define PHM_FIELD_MASK(reg, field) reg##__##field##_MASK #define PHM_FIELD_MASK(reg, field) reg##__##field##_MASK
......
...@@ -52,7 +52,7 @@ static const void *get_powerplay_table(struct pp_hwmgr *hwmgr) ...@@ -52,7 +52,7 @@ static const void *get_powerplay_table(struct pp_hwmgr *hwmgr)
if (!table_address) { if (!table_address) {
table_address = (ATOM_Vega10_POWERPLAYTABLE *) table_address = (ATOM_Vega10_POWERPLAYTABLE *)
cgs_atom_get_data_table(hwmgr->device, index, smu_atom_get_data_table(hwmgr->adev, index,
&size, &frev, &crev); &size, &frev, &crev);
hwmgr->soft_pp_table = table_address; /*Cache the result in RAM.*/ hwmgr->soft_pp_table = table_address; /*Cache the result in RAM.*/
......
...@@ -51,7 +51,7 @@ static const void *get_powerplay_table(struct pp_hwmgr *hwmgr) ...@@ -51,7 +51,7 @@ static const void *get_powerplay_table(struct pp_hwmgr *hwmgr)
if (!table_address) { if (!table_address) {
table_address = (ATOM_Vega12_POWERPLAYTABLE *) table_address = (ATOM_Vega12_POWERPLAYTABLE *)
cgs_atom_get_data_table(hwmgr->device, index, smu_atom_get_data_table(hwmgr->adev, index,
&size, &frev, &crev); &size, &frev, &crev);
hwmgr->soft_pp_table = table_address; /*Cache the result in RAM.*/ hwmgr->soft_pp_table = table_address; /*Cache the result in RAM.*/
......
...@@ -337,7 +337,7 @@ static bool fiji_is_hw_avfs_present(struct pp_hwmgr *hwmgr) ...@@ -337,7 +337,7 @@ static bool fiji_is_hw_avfs_present(struct pp_hwmgr *hwmgr)
if (!hwmgr->not_vf) if (!hwmgr->not_vf)
return false; return false;
if (!atomctrl_read_efuse(hwmgr->device, AVFS_EN_LSB, AVFS_EN_MSB, if (!atomctrl_read_efuse(hwmgr, AVFS_EN_LSB, AVFS_EN_MSB,
mask, &efuse)) { mask, &efuse)) {
if (efuse) if (efuse)
return true; return true;
......
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