diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4947-drm-amdgpu-pp-smu7-cache-smu-firmware-toc.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4947-drm-amdgpu-pp-smu7-cache-smu-firmware-toc.patch | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4947-drm-amdgpu-pp-smu7-cache-smu-firmware-toc.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4947-drm-amdgpu-pp-smu7-cache-smu-firmware-toc.patch new file mode 100644 index 00000000..06599d3a --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4947-drm-amdgpu-pp-smu7-cache-smu-firmware-toc.patch @@ -0,0 +1,158 @@ +From aa74e7ef96a1df80053d8f9447836d834f8ad8c5 Mon Sep 17 00:00:00 2001 +From: Alex Deucher <alexander.deucher@amd.com> +Date: Thu, 12 Jul 2018 00:38:23 -0500 +Subject: [PATCH 4947/5725] drm/amdgpu/pp/smu7: cache smu firmware toc +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +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> +--- + drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c | 92 +++++++++++++--------- + drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h | 1 + + 2 files changed, 54 insertions(+), 39 deletions(-) + +diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c +index a29ffe4..cc56a24 100644 +--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c ++++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c +@@ -381,9 +381,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"); +@@ -424,49 +422,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; +- +- 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); ++ if (!smu_data->toc) { ++ struct SMU_DRAMData_TOC *toc; + +- toc->num_entries = num_entries; ++ 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[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. */ +@@ -631,6 +642,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; +diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h +index e6def28..01f0538f 100644 +--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h ++++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h +@@ -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; +-- +2.7.4 + |