aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4947-drm-amdgpu-pp-smu7-cache-smu-firmware-toc.patch
diff options
context:
space:
mode:
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.patch158
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
+