diff options
author | Rex Zhu <Rex.Zhu@amd.com> | 2016-12-19 00:10:58 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-01-27 11:12:54 -0500 |
commit | bcb5487bceb30e6c544556dc0931e04040dacf90 (patch) | |
tree | 660b71b4ece5ff53267fa9932b6fb9caef93f017 /drivers/gpu | |
parent | 0d12570aaf5ddf5535569ae5c0ad46bb0aed4b01 (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.c | 136 |
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 | ||
144 | static 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 | |||
180 | static int cz_check_fw_load_finish(struct pp_smumgr *smumgr, | 144 | static 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 | ||
253 | static 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 | |||
281 | static uint8_t cz_translate_firmware_enum_to_arg(struct pp_smumgr *smumgr, | 217 | static 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 | ||
668 | static 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 | |||
708 | static 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 | |||
732 | static int cz_smu_init(struct pp_smumgr *smumgr) | 738 | static 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 | } |