aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHuang Rui <ray.huang@amd.com>2016-11-01 03:35:38 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-03-29 23:54:33 -0400
commite635ee07456ac686b3c26ab3c5735936faebfb2e (patch)
tree7bca30692c4879c9436134ab3fad8a27b6c0f09d
parent70170d146d0f8d6df6c1edafa70cf983027f7a6e (diff)
drm/amdgpu: use new flag to handle different firmware loading method
This patch introduces a new flag named "amdgpu_firmware_load_type" to handle different firmware loading method. Since Vega10, there are three ways to load firmware. It would be better to use a flag and a fw_load_type kernel parameter to configure it. Acked-by: Christian König <christian.koenig@amd.com> Signed-off-by: Huang Rui <ray.huang@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h10
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c67
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vi.c4
10 files changed, 90 insertions, 20 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index a7108ba94794..c83d7bd5b712 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -81,7 +81,7 @@ extern int amdgpu_pcie_gen2;
81extern int amdgpu_msi; 81extern int amdgpu_msi;
82extern int amdgpu_lockup_timeout; 82extern int amdgpu_lockup_timeout;
83extern int amdgpu_dpm; 83extern int amdgpu_dpm;
84extern int amdgpu_smc_load_fw; 84extern int amdgpu_fw_load_type;
85extern int amdgpu_aspm; 85extern int amdgpu_aspm;
86extern int amdgpu_runtime_pm; 86extern int amdgpu_runtime_pm;
87extern unsigned amdgpu_ip_block_mask; 87extern unsigned amdgpu_ip_block_mask;
@@ -1063,9 +1063,15 @@ struct amdgpu_sdma {
1063/* 1063/*
1064 * Firmware 1064 * Firmware
1065 */ 1065 */
1066enum amdgpu_firmware_load_type {
1067 AMDGPU_FW_LOAD_DIRECT = 0,
1068 AMDGPU_FW_LOAD_SMU,
1069 AMDGPU_FW_LOAD_PSP,
1070};
1071
1066struct amdgpu_firmware { 1072struct amdgpu_firmware {
1067 struct amdgpu_firmware_info ucode[AMDGPU_UCODE_ID_MAXIMUM]; 1073 struct amdgpu_firmware_info ucode[AMDGPU_UCODE_ID_MAXIMUM];
1068 bool smu_load; 1074 enum amdgpu_firmware_load_type load_type;
1069 struct amdgpu_bo *fw_buf; 1075 struct amdgpu_bo *fw_buf;
1070 unsigned int fw_size; 1076 unsigned int fw_size;
1071}; 1077};
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 778d16f835ab..7292f4e7bb1a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -80,7 +80,7 @@ int amdgpu_pcie_gen2 = -1;
80int amdgpu_msi = -1; 80int amdgpu_msi = -1;
81int amdgpu_lockup_timeout = 0; 81int amdgpu_lockup_timeout = 0;
82int amdgpu_dpm = -1; 82int amdgpu_dpm = -1;
83int amdgpu_smc_load_fw = 1; 83int amdgpu_fw_load_type = -1;
84int amdgpu_aspm = -1; 84int amdgpu_aspm = -1;
85int amdgpu_runtime_pm = -1; 85int amdgpu_runtime_pm = -1;
86unsigned amdgpu_ip_block_mask = 0xffffffff; 86unsigned amdgpu_ip_block_mask = 0xffffffff;
@@ -140,8 +140,8 @@ module_param_named(lockup_timeout, amdgpu_lockup_timeout, int, 0444);
140MODULE_PARM_DESC(dpm, "DPM support (1 = enable, 0 = disable, -1 = auto)"); 140MODULE_PARM_DESC(dpm, "DPM support (1 = enable, 0 = disable, -1 = auto)");
141module_param_named(dpm, amdgpu_dpm, int, 0444); 141module_param_named(dpm, amdgpu_dpm, int, 0444);
142 142
143MODULE_PARM_DESC(smc_load_fw, "SMC firmware loading(1 = enable, 0 = disable)"); 143MODULE_PARM_DESC(fw_load_type, "firmware loading type (0 = direct, 1 = SMU, 2 = PSP, -1 = auto)");
144module_param_named(smc_load_fw, amdgpu_smc_load_fw, int, 0444); 144module_param_named(fw_load_type, amdgpu_fw_load_type, int, 0444);
145 145
146MODULE_PARM_DESC(aspm, "ASPM support (1 = enable, 0 = disable, -1 = auto)"); 146MODULE_PARM_DESC(aspm, "ASPM support (1 = enable, 0 = disable, -1 = auto)");
147module_param_named(aspm, amdgpu_aspm, int, 0444); 147module_param_named(aspm, amdgpu_aspm, int, 0444);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
index d56d200a3646..96a5113b948f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
@@ -163,7 +163,7 @@ static int amdgpu_pp_hw_init(void *handle)
163 int ret = 0; 163 int ret = 0;
164 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 164 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
165 165
166 if (adev->pp_enabled && adev->firmware.smu_load) 166 if (adev->pp_enabled && adev->firmware.load_type == AMDGPU_FW_LOAD_SMU)
167 amdgpu_ucode_init_bo(adev); 167 amdgpu_ucode_init_bo(adev);
168 168
169 if (adev->powerplay.ip_funcs->hw_init) 169 if (adev->powerplay.ip_funcs->hw_init)
@@ -190,7 +190,7 @@ static int amdgpu_pp_hw_fini(void *handle)
190 ret = adev->powerplay.ip_funcs->hw_fini( 190 ret = adev->powerplay.ip_funcs->hw_fini(
191 adev->powerplay.pp_handle); 191 adev->powerplay.pp_handle);
192 192
193 if (adev->pp_enabled && adev->firmware.smu_load) 193 if (adev->pp_enabled && adev->firmware.load_type == AMDGPU_FW_LOAD_SMU)
194 amdgpu_ucode_fini_bo(adev); 194 amdgpu_ucode_fini_bo(adev);
195 195
196 return ret; 196 return ret;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
index be16377128c3..73c3e664d99a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
@@ -217,6 +217,49 @@ bool amdgpu_ucode_hdr_version(union amdgpu_firmware_header *hdr,
217 return true; 217 return true;
218} 218}
219 219
220enum amdgpu_firmware_load_type
221amdgpu_ucode_get_load_type(struct amdgpu_device *adev, int load_type)
222{
223 switch (adev->asic_type) {
224#ifdef CONFIG_DRM_AMDGPU_SI
225 case CHIP_TAHITI:
226 case CHIP_PITCAIRN:
227 case CHIP_VERDE:
228 case CHIP_OLAND:
229 return AMDGPU_FW_LOAD_DIRECT;
230#endif
231#ifdef CONFIG_DRM_AMDGPU_CIK
232 case CHIP_BONAIRE:
233 case CHIP_KAVERI:
234 case CHIP_KABINI:
235 case CHIP_HAWAII:
236 case CHIP_MULLINS:
237 return AMDGPU_FW_LOAD_DIRECT;
238#endif
239 case CHIP_TOPAZ:
240 case CHIP_TONGA:
241 case CHIP_FIJI:
242 case CHIP_CARRIZO:
243 case CHIP_STONEY:
244 case CHIP_POLARIS10:
245 case CHIP_POLARIS11:
246 case CHIP_POLARIS12:
247 if (!load_type)
248 return AMDGPU_FW_LOAD_DIRECT;
249 else
250 return AMDGPU_FW_LOAD_SMU;
251 case CHIP_VEGA10:
252 if (!load_type)
253 return AMDGPU_FW_LOAD_DIRECT;
254 else
255 return AMDGPU_FW_LOAD_PSP;
256 default:
257 DRM_ERROR("Unknow firmware load type\n");
258 }
259
260 return AMDGPU_FW_LOAD_DIRECT;
261}
262
220static int amdgpu_ucode_init_single_fw(struct amdgpu_firmware_info *ucode, 263static int amdgpu_ucode_init_single_fw(struct amdgpu_firmware_info *ucode,
221 uint64_t mc_addr, void *kptr) 264 uint64_t mc_addr, void *kptr)
222{ 265{
@@ -273,7 +316,7 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev)
273 uint64_t fw_mc_addr; 316 uint64_t fw_mc_addr;
274 void *fw_buf_ptr = NULL; 317 void *fw_buf_ptr = NULL;
275 uint64_t fw_offset = 0; 318 uint64_t fw_offset = 0;
276 int i, err; 319 int i, err, max;
277 struct amdgpu_firmware_info *ucode = NULL; 320 struct amdgpu_firmware_info *ucode = NULL;
278 const struct common_firmware_header *header = NULL; 321 const struct common_firmware_header *header = NULL;
279 322
@@ -306,7 +349,16 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev)
306 349
307 amdgpu_bo_unreserve(*bo); 350 amdgpu_bo_unreserve(*bo);
308 351
309 for (i = 0; i < AMDGPU_UCODE_ID_MAXIMUM; i++) { 352 /*
353 * if SMU loaded firmware, it needn't add SMC, UVD, and VCE
354 * ucode info here
355 */
356 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
357 max = AMDGPU_UCODE_ID_MAXIMUM - 3;
358 else
359 max = AMDGPU_UCODE_ID_MAXIMUM;
360
361 for (i = 0; i < max; i++) {
310 ucode = &adev->firmware.ucode[i]; 362 ucode = &adev->firmware.ucode[i];
311 if (ucode->fw) { 363 if (ucode->fw) {
312 header = (const struct common_firmware_header *)ucode->fw->data; 364 header = (const struct common_firmware_header *)ucode->fw->data;
@@ -331,7 +383,8 @@ failed_pin:
331failed_reserve: 383failed_reserve:
332 amdgpu_bo_unref(bo); 384 amdgpu_bo_unref(bo);
333failed: 385failed:
334 adev->firmware.smu_load = false; 386 if (err)
387 adev->firmware.load_type = AMDGPU_FW_LOAD_DIRECT;
335 388
336 return err; 389 return err;
337} 390}
@@ -340,8 +393,14 @@ int amdgpu_ucode_fini_bo(struct amdgpu_device *adev)
340{ 393{
341 int i; 394 int i;
342 struct amdgpu_firmware_info *ucode = NULL; 395 struct amdgpu_firmware_info *ucode = NULL;
396 int max;
397
398 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
399 max = AMDGPU_UCODE_ID_MAXIMUM - 3;
400 else
401 max = AMDGPU_UCODE_ID_MAXIMUM;
343 402
344 for (i = 0; i < AMDGPU_UCODE_ID_MAXIMUM; i++) { 403 for (i = 0; i < max; i++) {
345 ucode = &adev->firmware.ucode[i]; 404 ucode = &adev->firmware.ucode[i];
346 if (ucode->fw) { 405 if (ucode->fw) {
347 ucode->mc_addr = 0; 406 ucode->mc_addr = 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
index 19a584cd4527..2b212b04ce54 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
@@ -176,4 +176,7 @@ bool amdgpu_ucode_hdr_version(union amdgpu_firmware_header *hdr,
176int amdgpu_ucode_init_bo(struct amdgpu_device *adev); 176int amdgpu_ucode_init_bo(struct amdgpu_device *adev);
177int amdgpu_ucode_fini_bo(struct amdgpu_device *adev); 177int amdgpu_ucode_fini_bo(struct amdgpu_device *adev);
178 178
179enum amdgpu_firmware_load_type
180amdgpu_ucode_get_load_type(struct amdgpu_device *adev, int load_type);
181
179#endif 182#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c
index dbaedb4f2a6b..9d33e5641419 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik.c
@@ -1785,6 +1785,8 @@ static int cik_common_early_init(void *handle)
1785 return -EINVAL; 1785 return -EINVAL;
1786 } 1786 }
1787 1787
1788 adev->firmware.load_type = amdgpu_ucode_get_load_type(adev, amdgpu_fw_load_type);
1789
1788 amdgpu_get_pcie_info(adev); 1790 amdgpu_get_pcie_info(adev);
1789 1791
1790 return 0; 1792 return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 1e177cd9b46b..423ed68c2e52 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -1040,7 +1040,7 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
1040 } 1040 }
1041 } 1041 }
1042 1042
1043 if (adev->firmware.smu_load) { 1043 if (adev->firmware.load_type == AMDGPU_FW_LOAD_SMU) {
1044 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_PFP]; 1044 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_PFP];
1045 info->ucode_id = AMDGPU_UCODE_ID_CP_PFP; 1045 info->ucode_id = AMDGPU_UCODE_ID_CP_PFP;
1046 info->fw = adev->gfx.pfp_fw; 1046 info->fw = adev->gfx.pfp_fw;
@@ -4253,7 +4253,7 @@ static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev)
4253 gfx_v8_0_init_pg(adev); 4253 gfx_v8_0_init_pg(adev);
4254 4254
4255 if (!adev->pp_enabled) { 4255 if (!adev->pp_enabled) {
4256 if (!adev->firmware.smu_load) { 4256 if (adev->firmware.load_type != AMDGPU_FW_LOAD_SMU) {
4257 /* legacy rlc firmware loading */ 4257 /* legacy rlc firmware loading */
4258 r = gfx_v8_0_rlc_load_microcode(adev); 4258 r = gfx_v8_0_rlc_load_microcode(adev);
4259 if (r) 4259 if (r)
@@ -5269,7 +5269,7 @@ static int gfx_v8_0_cp_resume(struct amdgpu_device *adev)
5269 gfx_v8_0_enable_gui_idle_interrupt(adev, false); 5269 gfx_v8_0_enable_gui_idle_interrupt(adev, false);
5270 5270
5271 if (!adev->pp_enabled) { 5271 if (!adev->pp_enabled) {
5272 if (!adev->firmware.smu_load) { 5272 if (adev->firmware.load_type != AMDGPU_FW_LOAD_SMU) {
5273 /* legacy firmware loading */ 5273 /* legacy firmware loading */
5274 r = gfx_v8_0_cp_gfx_load_microcode(adev); 5274 r = gfx_v8_0_cp_gfx_load_microcode(adev);
5275 if (r) 5275 if (r)
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
index 1a4b351f350b..182de5dc2081 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
@@ -158,7 +158,7 @@ static int sdma_v2_4_init_microcode(struct amdgpu_device *adev)
158 if (adev->sdma.instance[i].feature_version >= 20) 158 if (adev->sdma.instance[i].feature_version >= 20)
159 adev->sdma.instance[i].burst_nop = true; 159 adev->sdma.instance[i].burst_nop = true;
160 160
161 if (adev->firmware.smu_load) { 161 if (adev->firmware.load_type == AMDGPU_FW_LOAD_SMU) {
162 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i]; 162 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i];
163 info->ucode_id = AMDGPU_UCODE_ID_SDMA0 + i; 163 info->ucode_id = AMDGPU_UCODE_ID_SDMA0 + i;
164 info->fw = adev->sdma.instance[i].fw; 164 info->fw = adev->sdma.instance[i].fw;
@@ -562,7 +562,7 @@ static int sdma_v2_4_start(struct amdgpu_device *adev)
562 int r; 562 int r;
563 563
564 if (!adev->pp_enabled) { 564 if (!adev->pp_enabled) {
565 if (!adev->firmware.smu_load) { 565 if (adev->firmware.load_type != AMDGPU_FW_LOAD_SMU) {
566 r = sdma_v2_4_load_microcode(adev); 566 r = sdma_v2_4_load_microcode(adev);
567 if (r) 567 if (r)
568 return r; 568 return r;
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
index 5f7812d1c90d..5be84df27cad 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
@@ -310,7 +310,7 @@ static int sdma_v3_0_init_microcode(struct amdgpu_device *adev)
310 if (adev->sdma.instance[i].feature_version >= 20) 310 if (adev->sdma.instance[i].feature_version >= 20)
311 adev->sdma.instance[i].burst_nop = true; 311 adev->sdma.instance[i].burst_nop = true;
312 312
313 if (adev->firmware.smu_load) { 313 if (adev->firmware.load_type == AMDGPU_FW_LOAD_SMU) {
314 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i]; 314 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA0 + i];
315 info->ucode_id = AMDGPU_UCODE_ID_SDMA0 + i; 315 info->ucode_id = AMDGPU_UCODE_ID_SDMA0 + i;
316 info->fw = adev->sdma.instance[i].fw; 316 info->fw = adev->sdma.instance[i].fw;
@@ -771,7 +771,7 @@ static int sdma_v3_0_start(struct amdgpu_device *adev)
771 int r, i; 771 int r, i;
772 772
773 if (!adev->pp_enabled) { 773 if (!adev->pp_enabled) {
774 if (!adev->firmware.smu_load) { 774 if (adev->firmware.load_type != AMDGPU_FW_LOAD_SMU) {
775 r = sdma_v3_0_load_microcode(adev); 775 r = sdma_v3_0_load_microcode(adev);
776 if (r) 776 if (r)
777 return r; 777 return r;
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c
index 1ff36724fb2a..1fe654e8cb7f 100644
--- a/drivers/gpu/drm/amd/amdgpu/vi.c
+++ b/drivers/gpu/drm/amd/amdgpu/vi.c
@@ -1117,8 +1117,8 @@ static int vi_common_early_init(void *handle)
1117 return -EINVAL; 1117 return -EINVAL;
1118 } 1118 }
1119 1119
1120 if (amdgpu_smc_load_fw && smc_enabled) 1120 /* vi use smc load by default */
1121 adev->firmware.smu_load = true; 1121 adev->firmware.load_type = amdgpu_ucode_get_load_type(adev, amdgpu_fw_load_type);
1122 1122
1123 amdgpu_get_pcie_info(adev); 1123 amdgpu_get_pcie_info(adev);
1124 1124