drm/amd/powerplay: refine smumgr code
1. delete asic_smum_init functions, export asic private functions to smumgr directly, make code more readable. 2. create asic private data in asic_init_func. Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
a0aa70463e
commit
63b55943b3
|
@ -33,6 +33,12 @@ struct pp_hwmgr;
|
||||||
#define smu_lower_32_bits(n) ((uint32_t)(n))
|
#define smu_lower_32_bits(n) ((uint32_t)(n))
|
||||||
#define smu_upper_32_bits(n) ((uint32_t)(((n)>>16)>>16))
|
#define smu_upper_32_bits(n) ((uint32_t)(((n)>>16)>>16))
|
||||||
|
|
||||||
|
extern const struct pp_smumgr_func cz_smu_funcs;
|
||||||
|
extern const struct pp_smumgr_func iceland_smu_funcs;
|
||||||
|
extern const struct pp_smumgr_func tonga_smu_funcs;
|
||||||
|
extern const struct pp_smumgr_func fiji_smu_funcs;
|
||||||
|
extern const struct pp_smumgr_func polaris10_smu_funcs;
|
||||||
|
|
||||||
enum AVFS_BTC_STATUS {
|
enum AVFS_BTC_STATUS {
|
||||||
AVFS_BTC_BOOT = 0,
|
AVFS_BTC_BOOT = 0,
|
||||||
AVFS_BTC_BOOT_STARTEDSMU,
|
AVFS_BTC_BOOT_STARTEDSMU,
|
||||||
|
@ -168,13 +174,6 @@ extern int smu_allocate_memory(void *device, uint32_t size,
|
||||||
void **kptr, void *handle);
|
void **kptr, void *handle);
|
||||||
|
|
||||||
extern int smu_free_memory(void *device, void *handle);
|
extern int smu_free_memory(void *device, void *handle);
|
||||||
|
|
||||||
extern int cz_smum_init(struct pp_smumgr *smumgr);
|
|
||||||
extern int iceland_smum_init(struct pp_smumgr *smumgr);
|
|
||||||
extern int tonga_smum_init(struct pp_smumgr *smumgr);
|
|
||||||
extern int fiji_smum_init(struct pp_smumgr *smumgr);
|
|
||||||
extern int polaris10_smum_init(struct pp_smumgr *smumgr);
|
|
||||||
|
|
||||||
extern int smum_update_sclk_threshold(struct pp_hwmgr *hwmgr);
|
extern int smum_update_sclk_threshold(struct pp_hwmgr *hwmgr);
|
||||||
|
|
||||||
extern int smum_update_smc_table(struct pp_hwmgr *hwmgr, uint32_t type);
|
extern int smum_update_smc_table(struct pp_hwmgr *hwmgr, uint32_t type);
|
||||||
|
|
|
@ -737,9 +737,15 @@ static int cz_start_smu(struct pp_smumgr *smumgr)
|
||||||
|
|
||||||
static int cz_smu_init(struct pp_smumgr *smumgr)
|
static int cz_smu_init(struct pp_smumgr *smumgr)
|
||||||
{
|
{
|
||||||
struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
|
|
||||||
uint64_t mc_addr = 0;
|
uint64_t mc_addr = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
struct cz_smumgr *cz_smu;
|
||||||
|
|
||||||
|
cz_smu = kzalloc(sizeof(struct cz_smumgr), GFP_KERNEL);
|
||||||
|
if (cz_smu == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
smumgr->backend = cz_smu;
|
||||||
|
|
||||||
cz_smu->toc_buffer.data_size = 4096;
|
cz_smu->toc_buffer.data_size = 4096;
|
||||||
cz_smu->smu_buffer.data_size =
|
cz_smu->smu_buffer.data_size =
|
||||||
|
@ -836,7 +842,7 @@ static int cz_smu_fini(struct pp_smumgr *smumgr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct pp_smumgr_func cz_smu_funcs = {
|
const struct pp_smumgr_func cz_smu_funcs = {
|
||||||
.smu_init = cz_smu_init,
|
.smu_init = cz_smu_init,
|
||||||
.smu_fini = cz_smu_fini,
|
.smu_fini = cz_smu_fini,
|
||||||
.start_smu = cz_start_smu,
|
.start_smu = cz_start_smu,
|
||||||
|
@ -850,15 +856,3 @@ static const struct pp_smumgr_func cz_smu_funcs = {
|
||||||
.upload_pptable_settings = cz_upload_pptable_settings,
|
.upload_pptable_settings = cz_upload_pptable_settings,
|
||||||
};
|
};
|
||||||
|
|
||||||
int cz_smum_init(struct pp_smumgr *smumgr)
|
|
||||||
{
|
|
||||||
struct cz_smumgr *cz_smu;
|
|
||||||
|
|
||||||
cz_smu = kzalloc(sizeof(struct cz_smumgr), GFP_KERNEL);
|
|
||||||
if (cz_smu == NULL)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
smumgr->backend = cz_smu;
|
|
||||||
smumgr->smumgr_funcs = &cz_smu_funcs;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -95,8 +95,4 @@ struct cz_smumgr {
|
||||||
struct cz_buffer_entry scratch_buffer[MAX_NUM_SCRATCH];
|
struct cz_buffer_entry scratch_buffer[MAX_NUM_SCRATCH];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pp_smumgr;
|
|
||||||
|
|
||||||
extern int cz_smum_init(struct pp_smumgr *smumgr);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -464,13 +464,20 @@ static bool fiji_is_hw_avfs_present(struct pp_smumgr *smumgr)
|
||||||
*/
|
*/
|
||||||
static int fiji_smu_init(struct pp_smumgr *smumgr)
|
static int fiji_smu_init(struct pp_smumgr *smumgr)
|
||||||
{
|
{
|
||||||
struct fiji_smumgr *priv = (struct fiji_smumgr *)(smumgr->backend);
|
|
||||||
int i;
|
int i;
|
||||||
|
struct fiji_smumgr *fiji_priv = NULL;
|
||||||
|
|
||||||
|
fiji_priv = kzalloc(sizeof(struct fiji_smumgr), GFP_KERNEL);
|
||||||
|
|
||||||
|
if (fiji_priv == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
smumgr->backend = fiji_priv;
|
||||||
|
|
||||||
if (smu7_init(smumgr))
|
if (smu7_init(smumgr))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
priv->avfs.AvfsBtcStatus = AVFS_BTC_BOOT;
|
fiji_priv->avfs.AvfsBtcStatus = AVFS_BTC_BOOT;
|
||||||
if (fiji_is_hw_avfs_present(smumgr))
|
if (fiji_is_hw_avfs_present(smumgr))
|
||||||
/* AVFS Parameter
|
/* AVFS Parameter
|
||||||
* 0 - BTC DC disabled, BTC AC disabled
|
* 0 - BTC DC disabled, BTC AC disabled
|
||||||
|
@ -479,18 +486,18 @@ static int fiji_smu_init(struct pp_smumgr *smumgr)
|
||||||
* 3 - BTC DC enabled, BTC AC enabled
|
* 3 - BTC DC enabled, BTC AC enabled
|
||||||
* Default is 0 - BTC DC disabled, BTC AC disabled
|
* Default is 0 - BTC DC disabled, BTC AC disabled
|
||||||
*/
|
*/
|
||||||
priv->avfs.AvfsBtcParam = 0;
|
fiji_priv->avfs.AvfsBtcParam = 0;
|
||||||
else
|
else
|
||||||
priv->avfs.AvfsBtcStatus = AVFS_BTC_NOTSUPPORTED;
|
fiji_priv->avfs.AvfsBtcStatus = AVFS_BTC_NOTSUPPORTED;
|
||||||
|
|
||||||
for (i = 0; i < SMU73_MAX_LEVELS_GRAPHICS; i++)
|
for (i = 0; i < SMU73_MAX_LEVELS_GRAPHICS; i++)
|
||||||
priv->activity_target[i] = 30;
|
fiji_priv->activity_target[i] = 30;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static const struct pp_smumgr_func fiji_smu_funcs = {
|
const struct pp_smumgr_func fiji_smu_funcs = {
|
||||||
.smu_init = &fiji_smu_init,
|
.smu_init = &fiji_smu_init,
|
||||||
.smu_fini = &smu7_smu_fini,
|
.smu_fini = &smu7_smu_fini,
|
||||||
.start_smu = &fiji_start_smu,
|
.start_smu = &fiji_start_smu,
|
||||||
|
@ -513,18 +520,3 @@ static const struct pp_smumgr_func fiji_smu_funcs = {
|
||||||
.initialize_mc_reg_table = fiji_initialize_mc_reg_table,
|
.initialize_mc_reg_table = fiji_initialize_mc_reg_table,
|
||||||
.is_dpm_running = fiji_is_dpm_running,
|
.is_dpm_running = fiji_is_dpm_running,
|
||||||
};
|
};
|
||||||
|
|
||||||
int fiji_smum_init(struct pp_smumgr *smumgr)
|
|
||||||
{
|
|
||||||
struct fiji_smumgr *fiji_smu = NULL;
|
|
||||||
|
|
||||||
fiji_smu = kzalloc(sizeof(struct fiji_smumgr), GFP_KERNEL);
|
|
||||||
|
|
||||||
if (fiji_smu == NULL)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
smumgr->backend = fiji_smu;
|
|
||||||
smumgr->smumgr_funcs = &fiji_smu_funcs;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -201,17 +201,25 @@ static int iceland_start_smu(struct pp_smumgr *smumgr)
|
||||||
static int iceland_smu_init(struct pp_smumgr *smumgr)
|
static int iceland_smu_init(struct pp_smumgr *smumgr)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct iceland_smumgr *smu_data = (struct iceland_smumgr *)(smumgr->backend);
|
struct iceland_smumgr *iceland_priv = NULL;
|
||||||
|
|
||||||
|
iceland_priv = kzalloc(sizeof(struct iceland_smumgr), GFP_KERNEL);
|
||||||
|
|
||||||
|
if (iceland_priv == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
smumgr->backend = iceland_priv;
|
||||||
|
|
||||||
if (smu7_init(smumgr))
|
if (smu7_init(smumgr))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
for (i = 0; i < SMU71_MAX_LEVELS_GRAPHICS; i++)
|
for (i = 0; i < SMU71_MAX_LEVELS_GRAPHICS; i++)
|
||||||
smu_data->activity_target[i] = 30;
|
iceland_priv->activity_target[i] = 30;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct pp_smumgr_func iceland_smu_funcs = {
|
const struct pp_smumgr_func iceland_smu_funcs = {
|
||||||
.smu_init = &iceland_smu_init,
|
.smu_init = &iceland_smu_init,
|
||||||
.smu_fini = &smu7_smu_fini,
|
.smu_fini = &smu7_smu_fini,
|
||||||
.start_smu = &iceland_start_smu,
|
.start_smu = &iceland_start_smu,
|
||||||
|
@ -234,17 +242,3 @@ static const struct pp_smumgr_func iceland_smu_funcs = {
|
||||||
.is_dpm_running = iceland_is_dpm_running,
|
.is_dpm_running = iceland_is_dpm_running,
|
||||||
};
|
};
|
||||||
|
|
||||||
int iceland_smum_init(struct pp_smumgr *smumgr)
|
|
||||||
{
|
|
||||||
struct iceland_smumgr *iceland_smu = NULL;
|
|
||||||
|
|
||||||
iceland_smu = kzalloc(sizeof(struct iceland_smumgr), GFP_KERNEL);
|
|
||||||
|
|
||||||
if (iceland_smu == NULL)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
smumgr->backend = iceland_smu;
|
|
||||||
smumgr->smumgr_funcs = &iceland_smu_funcs;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -364,9 +364,15 @@ static bool polaris10_is_hw_avfs_present(struct pp_smumgr *smumgr)
|
||||||
|
|
||||||
static int polaris10_smu_init(struct pp_smumgr *smumgr)
|
static int polaris10_smu_init(struct pp_smumgr *smumgr)
|
||||||
{
|
{
|
||||||
struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
|
struct polaris10_smumgr *smu_data;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
smu_data = kzalloc(sizeof(struct polaris10_smumgr), GFP_KERNEL);
|
||||||
|
if (smu_data == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
smumgr->backend = smu_data;
|
||||||
|
|
||||||
if (smu7_init(smumgr))
|
if (smu7_init(smumgr))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -381,7 +387,7 @@ static int polaris10_smu_init(struct pp_smumgr *smumgr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct pp_smumgr_func polaris10_smu_funcs = {
|
const struct pp_smumgr_func polaris10_smu_funcs = {
|
||||||
.smu_init = polaris10_smu_init,
|
.smu_init = polaris10_smu_init,
|
||||||
.smu_fini = smu7_smu_fini,
|
.smu_fini = smu7_smu_fini,
|
||||||
.start_smu = polaris10_start_smu,
|
.start_smu = polaris10_start_smu,
|
||||||
|
@ -404,18 +410,3 @@ static const struct pp_smumgr_func polaris10_smu_funcs = {
|
||||||
.get_mac_definition = polaris10_get_mac_definition,
|
.get_mac_definition = polaris10_get_mac_definition,
|
||||||
.is_dpm_running = polaris10_is_dpm_running,
|
.is_dpm_running = polaris10_is_dpm_running,
|
||||||
};
|
};
|
||||||
|
|
||||||
int polaris10_smum_init(struct pp_smumgr *smumgr)
|
|
||||||
{
|
|
||||||
struct polaris10_smumgr *polaris10_smu = NULL;
|
|
||||||
|
|
||||||
polaris10_smu = kzalloc(sizeof(struct polaris10_smumgr), GFP_KERNEL);
|
|
||||||
|
|
||||||
if (polaris10_smu == NULL)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
smumgr->backend = polaris10_smu;
|
|
||||||
smumgr->smumgr_funcs = &polaris10_smu_funcs;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ MODULE_FIRMWARE("amdgpu/polaris11_smc.bin");
|
||||||
MODULE_FIRMWARE("amdgpu/polaris11_smc_sk.bin");
|
MODULE_FIRMWARE("amdgpu/polaris11_smc_sk.bin");
|
||||||
MODULE_FIRMWARE("amdgpu/polaris12_smc.bin");
|
MODULE_FIRMWARE("amdgpu/polaris12_smc.bin");
|
||||||
|
|
||||||
|
|
||||||
int smum_early_init(struct pp_instance *handle)
|
int smum_early_init(struct pp_instance *handle)
|
||||||
{
|
{
|
||||||
struct pp_smumgr *smumgr;
|
struct pp_smumgr *smumgr;
|
||||||
|
@ -61,23 +62,23 @@ int smum_early_init(struct pp_instance *handle)
|
||||||
|
|
||||||
switch (smumgr->chip_family) {
|
switch (smumgr->chip_family) {
|
||||||
case AMDGPU_FAMILY_CZ:
|
case AMDGPU_FAMILY_CZ:
|
||||||
cz_smum_init(smumgr);
|
smumgr->smumgr_funcs = &cz_smu_funcs;
|
||||||
break;
|
break;
|
||||||
case AMDGPU_FAMILY_VI:
|
case AMDGPU_FAMILY_VI:
|
||||||
switch (smumgr->chip_id) {
|
switch (smumgr->chip_id) {
|
||||||
case CHIP_TOPAZ:
|
case CHIP_TOPAZ:
|
||||||
iceland_smum_init(smumgr);
|
smumgr->smumgr_funcs = &iceland_smu_funcs;
|
||||||
break;
|
break;
|
||||||
case CHIP_TONGA:
|
case CHIP_TONGA:
|
||||||
tonga_smum_init(smumgr);
|
smumgr->smumgr_funcs = &tonga_smu_funcs;
|
||||||
break;
|
break;
|
||||||
case CHIP_FIJI:
|
case CHIP_FIJI:
|
||||||
fiji_smum_init(smumgr);
|
smumgr->smumgr_funcs = &fiji_smu_funcs;
|
||||||
break;
|
break;
|
||||||
case CHIP_POLARIS11:
|
case CHIP_POLARIS11:
|
||||||
case CHIP_POLARIS10:
|
case CHIP_POLARIS10:
|
||||||
case CHIP_POLARIS12:
|
case CHIP_POLARIS12:
|
||||||
polaris10_smum_init(smumgr);
|
smumgr->smumgr_funcs = &polaris10_smu_funcs;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -169,20 +169,25 @@ static int tonga_start_smu(struct pp_smumgr *smumgr)
|
||||||
*/
|
*/
|
||||||
static int tonga_smu_init(struct pp_smumgr *smumgr)
|
static int tonga_smu_init(struct pp_smumgr *smumgr)
|
||||||
{
|
{
|
||||||
struct tonga_smumgr *smu_data = (struct tonga_smumgr *)(smumgr->backend);
|
struct tonga_smumgr *tonga_priv = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
int i;
|
tonga_priv = kzalloc(sizeof(struct tonga_smumgr), GFP_KERNEL);
|
||||||
|
if (tonga_priv == NULL)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
smumgr->backend = tonga_priv;
|
||||||
|
|
||||||
if (smu7_init(smumgr))
|
if (smu7_init(smumgr))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
for (i = 0; i < SMU72_MAX_LEVELS_GRAPHICS; i++)
|
for (i = 0; i < SMU72_MAX_LEVELS_GRAPHICS; i++)
|
||||||
smu_data->activity_target[i] = 30;
|
tonga_priv->activity_target[i] = 30;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct pp_smumgr_func tonga_smu_funcs = {
|
const struct pp_smumgr_func tonga_smu_funcs = {
|
||||||
.smu_init = &tonga_smu_init,
|
.smu_init = &tonga_smu_init,
|
||||||
.smu_fini = &smu7_smu_fini,
|
.smu_fini = &smu7_smu_fini,
|
||||||
.start_smu = &tonga_start_smu,
|
.start_smu = &tonga_start_smu,
|
||||||
|
@ -205,18 +210,3 @@ static const struct pp_smumgr_func tonga_smu_funcs = {
|
||||||
.initialize_mc_reg_table = tonga_initialize_mc_reg_table,
|
.initialize_mc_reg_table = tonga_initialize_mc_reg_table,
|
||||||
.is_dpm_running = tonga_is_dpm_running,
|
.is_dpm_running = tonga_is_dpm_running,
|
||||||
};
|
};
|
||||||
|
|
||||||
int tonga_smum_init(struct pp_smumgr *smumgr)
|
|
||||||
{
|
|
||||||
struct tonga_smumgr *tonga_smu = NULL;
|
|
||||||
|
|
||||||
tonga_smu = kzalloc(sizeof(struct tonga_smumgr), GFP_KERNEL);
|
|
||||||
|
|
||||||
if (tonga_smu == NULL)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
smumgr->backend = tonga_smu;
|
|
||||||
smumgr->smumgr_funcs = &tonga_smu_funcs;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue