Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: add pre_asic_init callback for SOC15

We need to restore some registers prior to running asic
init to work around a firmware bug.

Acked-by: Nirmoy Das <nirmoy.das@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+26 -18
+17 -18
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
··· 1075 1075 return amdgpu_gart_table_vram_alloc(adev); 1076 1076 } 1077 1077 1078 + /** 1079 + * gmc_v9_0_save_registers - saves regs 1080 + * 1081 + * @adev: amdgpu_device pointer 1082 + * 1083 + * This saves potential register values that should be 1084 + * restored upon resume 1085 + */ 1086 + static void gmc_v9_0_save_registers(struct amdgpu_device *adev) 1087 + { 1088 + if (adev->asic_type == CHIP_RAVEN) 1089 + adev->gmc.sdpif_register = RREG32_SOC15(DCE, 0, mmDCHUBBUB_SDPIF_MMIO_CNTRL_0); 1090 + } 1091 + 1078 1092 static int gmc_v9_0_sw_init(void *handle) 1079 1093 { 1080 1094 int r, vram_width = 0, vram_type = 0, vram_vendor = 0; ··· 1243 1229 1244 1230 amdgpu_vm_manager_init(adev); 1245 1231 1232 + gmc_v9_0_save_registers(adev); 1233 + 1246 1234 return 0; 1247 1235 } 1248 1236 ··· 1298 1282 * 1299 1283 * This restores register values, saved at suspend. 1300 1284 */ 1301 - static void gmc_v9_0_restore_registers(struct amdgpu_device *adev) 1285 + void gmc_v9_0_restore_registers(struct amdgpu_device *adev) 1302 1286 { 1303 1287 if (adev->asic_type == CHIP_RAVEN) 1304 1288 WREG32_SOC15(DCE, 0, mmDCHUBBUB_SDPIF_MMIO_CNTRL_0, adev->gmc.sdpif_register); ··· 1403 1387 } 1404 1388 1405 1389 /** 1406 - * gmc_v9_0_save_registers - saves regs 1407 - * 1408 - * @adev: amdgpu_device pointer 1409 - * 1410 - * This saves potential register values that should be 1411 - * restored upon resume 1412 - */ 1413 - static void gmc_v9_0_save_registers(struct amdgpu_device *adev) 1414 - { 1415 - if (adev->asic_type == CHIP_RAVEN) 1416 - adev->gmc.sdpif_register = RREG32_SOC15(DCE, 0, mmDCHUBBUB_SDPIF_MMIO_CNTRL_0); 1417 - } 1418 - 1419 - /** 1420 1390 * gmc_v9_0_gart_disable - gart disable 1421 1391 * 1422 1392 * @adev: amdgpu_device pointer ··· 1442 1440 if (r) 1443 1441 return r; 1444 1442 1445 - gmc_v9_0_save_registers(adev); 1446 - 1447 1443 return 0; 1448 1444 } 1449 1445 ··· 1450 1450 int r; 1451 1451 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1452 1452 1453 - gmc_v9_0_restore_registers(adev); 1454 1453 r = gmc_v9_0_hw_init(adev); 1455 1454 if (r) 1456 1455 return r;
+2
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.h
··· 26 26 27 27 extern const struct amd_ip_funcs gmc_v9_0_ip_funcs; 28 28 extern const struct amdgpu_ip_block_version gmc_v9_0_ip_block; 29 + 30 + void gmc_v9_0_restore_registers(struct amdgpu_device *adev); 29 31 #endif
+7
drivers/gpu/drm/amd/amdgpu/soc15.c
··· 1029 1029 return (nak_r + nak_g); 1030 1030 } 1031 1031 1032 + static void soc15_pre_asic_init(struct amdgpu_device *adev) 1033 + { 1034 + gmc_v9_0_restore_registers(adev); 1035 + } 1036 + 1032 1037 static const struct amdgpu_asic_funcs soc15_asic_funcs = 1033 1038 { 1034 1039 .read_disabled_bios = &soc15_read_disabled_bios, ··· 1054 1049 .need_reset_on_init = &soc15_need_reset_on_init, 1055 1050 .get_pcie_replay_count = &soc15_get_pcie_replay_count, 1056 1051 .supports_baco = &soc15_supports_baco, 1052 + .pre_asic_init = &soc15_pre_asic_init, 1057 1053 }; 1058 1054 1059 1055 static const struct amdgpu_asic_funcs vega20_asic_funcs = ··· 1078 1072 .need_reset_on_init = &soc15_need_reset_on_init, 1079 1073 .get_pcie_replay_count = &soc15_get_pcie_replay_count, 1080 1074 .supports_baco = &soc15_supports_baco, 1075 + .pre_asic_init = &soc15_pre_asic_init, 1081 1076 }; 1082 1077 1083 1078 static int soc15_common_early_init(void *handle)