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.

Signed-off-by: Alex Deucher <alexander.deuc...@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 cb5da61f214b..a029e47c2319 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
@@ -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;
-
-       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. */
@@ -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;
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h 
b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h
index e6def283b731..01f0538fba6b 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.13.6

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to