mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 15:42:46 +00:00
drm/amdgpu/pp/smu7: cache smu firmware toc
Rather than calculating it everytime we rebuild the toc buffer, calculate it once initially and then just copy the cached results to the vram buffer. Acked-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
82088d5d7d
commit
d92867122c
2 changed files with 53 additions and 38 deletions
|
@ -379,9 +379,7 @@ int smu7_request_smu_load_fw(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
struct smu7_smumgr *smu_data = (struct smu7_smumgr *)(hwmgr->smu_backend);
|
||||
uint32_t fw_to_load;
|
||||
int result = 0;
|
||||
struct SMU_DRAMData_TOC *toc;
|
||||
uint32_t num_entries = 0;
|
||||
int r = 0;
|
||||
|
||||
if (!hwmgr->reload_fw) {
|
||||
pr_info("skip reloading...\n");
|
||||
|
@ -422,49 +420,62 @@ int smu7_request_smu_load_fw(struct pp_hwmgr *hwmgr)
|
|||
+ UCODE_ID_CP_MEC_JT2_MASK;
|
||||
}
|
||||
|
||||
toc = (struct SMU_DRAMData_TOC *)smu_data->header_buffer.kaddr;
|
||||
toc->structure_version = 1;
|
||||
if (!smu_data->toc) {
|
||||
struct SMU_DRAMData_TOC *toc;
|
||||
|
||||
smu_data->toc = kzalloc(sizeof(struct SMU_DRAMData_TOC), GFP_KERNEL);
|
||||
if (!smu_data->toc)
|
||||
return -ENOMEM;
|
||||
toc = smu_data->toc;
|
||||
toc->num_entries = 0;
|
||||
toc->structure_version = 1;
|
||||
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_RLC_G, &toc->entry[num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_CE, &toc->entry[num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_PFP, &toc->entry[num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_ME, &toc->entry[num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_MEC, &toc->entry[num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_MEC_JT1, &toc->entry[num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_MEC_JT2, &toc->entry[num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_SDMA0, &toc->entry[num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_SDMA1, &toc->entry[num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
if (!hwmgr->not_vf)
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_MEC_STORAGE, &toc->entry[num_entries++]),
|
||||
"Failed to Get Firmware Entry.", return -EINVAL);
|
||||
|
||||
toc->num_entries = num_entries;
|
||||
UCODE_ID_RLC_G, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", r = -EINVAL; goto failed);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_CE, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", r = -EINVAL; goto failed);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_PFP, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", r = -EINVAL; goto failed);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_ME, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", r = -EINVAL; goto failed);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_MEC, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", r = -EINVAL; goto failed);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_MEC_JT1, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", r = -EINVAL; goto failed);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_CP_MEC_JT2, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", r = -EINVAL; goto failed);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_SDMA0, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", r = -EINVAL; goto failed);
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_SDMA1, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", r = -EINVAL; goto failed);
|
||||
if (!hwmgr->not_vf)
|
||||
PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(hwmgr,
|
||||
UCODE_ID_MEC_STORAGE, &toc->entry[toc->num_entries++]),
|
||||
"Failed to Get Firmware Entry.", r = -EINVAL; goto failed);
|
||||
}
|
||||
memcpy_toio(smu_data->header_buffer.kaddr, smu_data->toc,
|
||||
sizeof(struct SMU_DRAMData_TOC));
|
||||
smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_DRV_DRAM_ADDR_HI, upper_32_bits(smu_data->header_buffer.mc_addr));
|
||||
smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_DRV_DRAM_ADDR_LO, lower_32_bits(smu_data->header_buffer.mc_addr));
|
||||
|
||||
if (smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_LoadUcodes, fw_to_load))
|
||||
pr_err("Fail to Request SMU Load uCode");
|
||||
|
||||
return result;
|
||||
return r;
|
||||
|
||||
failed:
|
||||
kfree(smu_data->toc);
|
||||
smu_data->toc = NULL;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Check if the FW has been loaded, SMU will not return if loading has not finished. */
|
||||
|
@ -629,6 +640,9 @@ int smu7_smu_fini(struct pp_hwmgr *hwmgr)
|
|||
&smu_data->smu_buffer.mc_addr,
|
||||
&smu_data->smu_buffer.kaddr);
|
||||
|
||||
|
||||
kfree(smu_data->toc);
|
||||
smu_data->toc = NULL;
|
||||
kfree(hwmgr->smu_backend);
|
||||
hwmgr->smu_backend = NULL;
|
||||
return 0;
|
||||
|
|
|
@ -39,6 +39,7 @@ struct smu7_buffer_entry {
|
|||
struct smu7_smumgr {
|
||||
struct smu7_buffer_entry smu_buffer;
|
||||
struct smu7_buffer_entry header_buffer;
|
||||
struct SMU_DRAMData_TOC *toc;
|
||||
|
||||
uint32_t soft_regs_start;
|
||||
uint32_t dpm_table_start;
|
||||
|
|
Loading…
Reference in a new issue