aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorRex Zhu <Rex.Zhu@amd.com>2016-12-19 00:10:58 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-01-27 11:12:54 -0500
commitbcb5487bceb30e6c544556dc0931e04040dacf90 (patch)
tree660b71b4ece5ff53267fa9932b6fb9caef93f017 /drivers/gpu
parent0d12570aaf5ddf5535569ae5c0ad46bb0aed4b01 (diff)
drm/amd/powerplay: refine code in cz_smumgr.c
cz_smu_init will be called in sw_init. so it should not touch other blocks's firmware as they were not ready. Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> Reviewed-by: Huang Rui <ray.huang@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c136
1 files changed, 70 insertions, 66 deletions
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
index 46052306d0f5..1f5148e1f3de 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
@@ -141,42 +141,6 @@ static int cz_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr,
141 return cz_send_msg_to_smc(smumgr, msg); 141 return cz_send_msg_to_smc(smumgr, msg);
142} 142}
143 143
144static int cz_request_smu_load_fw(struct pp_smumgr *smumgr)
145{
146 struct cz_smumgr *cz_smu = (struct cz_smumgr *)(smumgr->backend);
147 uint32_t smc_address;
148
149 if (!smumgr->reload_fw) {
150 pr_info("skip reloading...\n");
151 return 0;
152 }
153
154 smc_address = SMU8_FIRMWARE_HEADER_LOCATION +
155 offsetof(struct SMU8_Firmware_Header, UcodeLoadStatus);
156
157 cz_write_smc_sram_dword(smumgr, smc_address, 0, smc_address+4);
158
159 cz_send_msg_to_smc_with_parameter(smumgr,
160 PPSMC_MSG_DriverDramAddrHi,
161 cz_smu->toc_buffer.mc_addr_high);
162
163 cz_send_msg_to_smc_with_parameter(smumgr,
164 PPSMC_MSG_DriverDramAddrLo,
165 cz_smu->toc_buffer.mc_addr_low);
166
167 cz_send_msg_to_smc(smumgr, PPSMC_MSG_InitJobs);
168
169 cz_send_msg_to_smc_with_parameter(smumgr,
170 PPSMC_MSG_ExecuteJob,
171 cz_smu->toc_entry_aram);
172 cz_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_ExecuteJob,
173 cz_smu->toc_entry_power_profiling_index);
174
175 return cz_send_msg_to_smc_with_parameter(smumgr,
176 PPSMC_MSG_ExecuteJob,
177 cz_smu->toc_entry_initialize_index);
178}
179
180static int cz_check_fw_load_finish(struct pp_smumgr *smumgr, 144static int cz_check_fw_load_finish(struct pp_smumgr *smumgr,
181 uint32_t firmware) 145 uint32_t firmware)
182{ 146{
@@ -250,34 +214,6 @@ static int cz_load_mec_firmware(struct pp_smumgr *smumgr)
250 return 0; 214 return 0;
251} 215}
252 216
253static int cz_start_smu(struct pp_smumgr *smumgr)
254{
255 int ret = 0;
256 uint32_t fw_to_check = UCODE_ID_RLC_G_MASK |
257 UCODE_ID_SDMA0_MASK |
258 UCODE_ID_SDMA1_MASK |
259 UCODE_ID_CP_CE_MASK |
260 UCODE_ID_CP_ME_MASK |
261 UCODE_ID_CP_PFP_MASK |
262 UCODE_ID_CP_MEC_JT1_MASK |
263 UCODE_ID_CP_MEC_JT2_MASK;
264
265 if (smumgr->chip_id == CHIP_STONEY)
266 fw_to_check &= ~(UCODE_ID_SDMA1_MASK | UCODE_ID_CP_MEC_JT2_MASK);
267
268 ret = cz_request_smu_load_fw(smumgr);
269 if (ret)
270 pr_err("SMU firmware load failed\n");
271
272 cz_check_fw_load_finish(smumgr, fw_to_check);
273
274 ret = cz_load_mec_firmware(smumgr);
275 if (ret)
276 pr_err("Mec Firmware load failed\n");
277
278 return ret;
279}
280
281static uint8_t cz_translate_firmware_enum_to_arg(struct pp_smumgr *smumgr, 217static uint8_t cz_translate_firmware_enum_to_arg(struct pp_smumgr *smumgr,
282 enum cz_scratch_entry firmware_enum) 218 enum cz_scratch_entry firmware_enum)
283{ 219{
@@ -729,6 +665,76 @@ static int cz_upload_pptable_settings(struct pp_smumgr *smumgr)
729 return 0; 665 return 0;
730} 666}
731 667
668static int cz_request_smu_load_fw(struct pp_smumgr *smumgr)
669{
670 struct cz_smumgr *cz_smu = (struct cz_smumgr *)(smumgr->backend);
671 uint32_t smc_address;
672
673 if (!smumgr->reload_fw) {
674 pr_info("skip reloading...\n");
675 return 0;
676 }
677
678 cz_smu_populate_firmware_entries(smumgr);
679
680 cz_smu_construct_toc(smumgr);
681
682 smc_address = SMU8_FIRMWARE_HEADER_LOCATION +
683 offsetof(struct SMU8_Firmware_Header, UcodeLoadStatus);
684
685 cz_write_smc_sram_dword(smumgr, smc_address, 0, smc_address+4);
686
687 cz_send_msg_to_smc_with_parameter(smumgr,
688 PPSMC_MSG_DriverDramAddrHi,
689 cz_smu->toc_buffer.mc_addr_high);
690
691 cz_send_msg_to_smc_with_parameter(smumgr,
692 PPSMC_MSG_DriverDramAddrLo,
693 cz_smu->toc_buffer.mc_addr_low);
694
695 cz_send_msg_to_smc(smumgr, PPSMC_MSG_InitJobs);
696
697 cz_send_msg_to_smc_with_parameter(smumgr,
698 PPSMC_MSG_ExecuteJob,
699 cz_smu->toc_entry_aram);
700 cz_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_ExecuteJob,
701 cz_smu->toc_entry_power_profiling_index);
702
703 return cz_send_msg_to_smc_with_parameter(smumgr,
704 PPSMC_MSG_ExecuteJob,
705 cz_smu->toc_entry_initialize_index);
706}
707
708static int cz_start_smu(struct pp_smumgr *smumgr)
709{
710 int ret = 0;
711 uint32_t fw_to_check = 0;
712
713 fw_to_check = UCODE_ID_RLC_G_MASK |
714 UCODE_ID_SDMA0_MASK |
715 UCODE_ID_SDMA1_MASK |
716 UCODE_ID_CP_CE_MASK |
717 UCODE_ID_CP_ME_MASK |
718 UCODE_ID_CP_PFP_MASK |
719 UCODE_ID_CP_MEC_JT1_MASK |
720 UCODE_ID_CP_MEC_JT2_MASK;
721
722 if (smumgr->chip_id == CHIP_STONEY)
723 fw_to_check &= ~(UCODE_ID_SDMA1_MASK | UCODE_ID_CP_MEC_JT2_MASK);
724
725 ret = cz_request_smu_load_fw(smumgr);
726 if (ret)
727 pr_err("SMU firmware load failed\n");
728
729 cz_check_fw_load_finish(smumgr, fw_to_check);
730
731 ret = cz_load_mec_firmware(smumgr);
732 if (ret)
733 pr_err("Mec Firmware load failed\n");
734
735 return ret;
736}
737
732static int cz_smu_init(struct pp_smumgr *smumgr) 738static int cz_smu_init(struct pp_smumgr *smumgr)
733{ 739{
734 struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend; 740 struct cz_smumgr *cz_smu = (struct cz_smumgr *)smumgr->backend;
@@ -769,7 +775,6 @@ static int cz_smu_init(struct pp_smumgr *smumgr)
769 cz_smu->smu_buffer.mc_addr_high = smu_upper_32_bits(mc_addr); 775 cz_smu->smu_buffer.mc_addr_high = smu_upper_32_bits(mc_addr);
770 cz_smu->smu_buffer.mc_addr_low = smu_lower_32_bits(mc_addr); 776 cz_smu->smu_buffer.mc_addr_low = smu_lower_32_bits(mc_addr);
771 777
772 cz_smu_populate_firmware_entries(smumgr);
773 if (0 != cz_smu_populate_single_scratch_entry(smumgr, 778 if (0 != cz_smu_populate_single_scratch_entry(smumgr,
774 CZ_SCRATCH_ENTRY_UCODE_ID_RLC_SCRATCH, 779 CZ_SCRATCH_ENTRY_UCODE_ID_RLC_SCRATCH,
775 UCODE_ID_RLC_SCRATCH_SIZE_BYTE, 780 UCODE_ID_RLC_SCRATCH_SIZE_BYTE,
@@ -808,7 +813,6 @@ static int cz_smu_init(struct pp_smumgr *smumgr)
808 pr_err("Error when Populate Firmware Entry.\n"); 813 pr_err("Error when Populate Firmware Entry.\n");
809 return -1; 814 return -1;
810 } 815 }
811 cz_smu_construct_toc(smumgr);
812 816
813 return 0; 817 return 0;
814} 818}