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

Merge tag 'amd-drm-fixes-5.16-2021-12-15' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes

amd-drm-fixes-5.16-2021-12-15:

amdgpu:
- Fix RLC register offset
- GMC fix
- Properly cache SMU FW version on Yellow Carp
- Fix missing callback on DCN3.1
- Reset DMCUB before HW init
- Fix for GMC powergating on PCO
- Fix a possible memory leak in GPU metrics table handling on RN

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211216035239.5787-1-alexander.deucher@amd.com

+32 -16
+2 -2
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
··· 3070 3070 AMD_PG_SUPPORT_CP | 3071 3071 AMD_PG_SUPPORT_GDS | 3072 3072 AMD_PG_SUPPORT_RLC_SMU_HS)) { 3073 - WREG32(mmRLC_JUMP_TABLE_RESTORE, 3074 - adev->gfx.rlc.cp_table_gpu_addr >> 8); 3073 + WREG32_SOC15(GC, 0, mmRLC_JUMP_TABLE_RESTORE, 3074 + adev->gfx.rlc.cp_table_gpu_addr >> 8); 3075 3075 gfx_v9_0_init_gfx_power_gating(adev); 3076 3076 } 3077 3077 }
-1
drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c
··· 162 162 ENABLE_ADVANCED_DRIVER_MODEL, 1); 163 163 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, 164 164 SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); 165 - tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0); 166 165 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, 167 166 MTYPE, MTYPE_UC);/* XXX for emulation. */ 168 167 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1);
-1
drivers/gpu/drm/amd/amdgpu/gfxhub_v2_0.c
··· 196 196 ENABLE_ADVANCED_DRIVER_MODEL, 1); 197 197 tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, 198 198 SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); 199 - tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0); 200 199 tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, 201 200 MTYPE, MTYPE_UC); /* UC, uncached */ 202 201
-1
drivers/gpu/drm/amd/amdgpu/gfxhub_v2_1.c
··· 197 197 ENABLE_ADVANCED_DRIVER_MODEL, 1); 198 198 tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, 199 199 SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); 200 - tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0); 201 200 tmp = REG_SET_FIELD(tmp, GCMC_VM_MX_L1_TLB_CNTL, 202 201 MTYPE, MTYPE_UC); /* UC, uncached */ 203 202
+8
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
··· 1808 1808 return 0; 1809 1809 } 1810 1810 1811 + /* 1812 + * Pair the operations did in gmc_v9_0_hw_init and thus maintain 1813 + * a correct cached state for GMC. Otherwise, the "gate" again 1814 + * operation on S3 resuming will fail due to wrong cached state. 1815 + */ 1816 + if (adev->mmhub.funcs->update_power_gating) 1817 + adev->mmhub.funcs->update_power_gating(adev, false); 1818 + 1811 1819 amdgpu_irq_put(adev, &adev->gmc.ecc_irq, 0); 1812 1820 amdgpu_irq_put(adev, &adev->gmc.vm_fault, 0); 1813 1821
+4 -5
drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
··· 145 145 ENABLE_ADVANCED_DRIVER_MODEL, 1); 146 146 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, 147 147 SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); 148 - tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0); 149 148 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, 150 149 MTYPE, MTYPE_UC);/* XXX for emulation. */ 151 150 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1); ··· 301 302 if (amdgpu_sriov_vf(adev)) 302 303 return; 303 304 304 - if (enable && adev->pg_flags & AMD_PG_SUPPORT_MMHUB) { 305 - amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GMC, true); 306 - 307 - } 305 + if (adev->pg_flags & AMD_PG_SUPPORT_MMHUB) 306 + amdgpu_dpm_set_powergating_by_smu(adev, 307 + AMD_IP_BLOCK_TYPE_GMC, 308 + enable); 308 309 } 309 310 310 311 static int mmhub_v1_0_gart_enable(struct amdgpu_device *adev)
-1
drivers/gpu/drm/amd/amdgpu/mmhub_v1_7.c
··· 165 165 ENABLE_ADVANCED_DRIVER_MODEL, 1); 166 166 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, 167 167 SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); 168 - tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0); 169 168 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, 170 169 MTYPE, MTYPE_UC);/* XXX for emulation. */ 171 170 tmp = REG_SET_FIELD(tmp, MC_VM_MX_L1_TLB_CNTL, ATC_EN, 1);
-1
drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c
··· 267 267 ENABLE_ADVANCED_DRIVER_MODEL, 1); 268 268 tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, 269 269 SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); 270 - tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0); 271 270 tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, 272 271 MTYPE, MTYPE_UC); /* UC, uncached */ 273 272
-1
drivers/gpu/drm/amd/amdgpu/mmhub_v2_3.c
··· 194 194 ENABLE_ADVANCED_DRIVER_MODEL, 1); 195 195 tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, 196 196 SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); 197 - tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, ECO_BITS, 0); 198 197 tmp = REG_SET_FIELD(tmp, MMMC_VM_MX_L1_TLB_CNTL, 199 198 MTYPE, MTYPE_UC); /* UC, uncached */ 200 199
-2
drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c
··· 190 190 tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL, 191 191 SYSTEM_APERTURE_UNMAPPED_ACCESS, 0); 192 192 tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL, 193 - ECO_BITS, 0); 194 - tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL, 195 193 MTYPE, MTYPE_UC);/* XXX for emulation. */ 196 194 tmp = REG_SET_FIELD(tmp, VMSHAREDVC0_MC_VM_MX_L1_TLB_CNTL, 197 195 ATC_EN, 1);
+5
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 1051 1051 return 0; 1052 1052 } 1053 1053 1054 + /* Reset DMCUB if it was previously running - before we overwrite its memory. */ 1055 + status = dmub_srv_hw_reset(dmub_srv); 1056 + if (status != DMUB_STATUS_OK) 1057 + DRM_WARN("Error resetting DMUB HW: %d\n", status); 1058 + 1054 1059 hdr = (const struct dmcub_firmware_header_v1_0 *)dmub_fw->data; 1055 1060 1056 1061 fw_inst_const = dmub_fw->data +
+1
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_init.c
··· 101 101 .z10_restore = dcn31_z10_restore, 102 102 .z10_save_init = dcn31_z10_save_init, 103 103 .set_disp_pattern_generator = dcn30_set_disp_pattern_generator, 104 + .exit_optimized_pwr_state = dcn21_exit_optimized_pwr_state, 104 105 .update_visual_confirm_color = dcn20_update_visual_confirm_color, 105 106 }; 106 107
+6 -1
drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c
··· 1328 1328 pp_dpm_powergate_vce(handle, gate); 1329 1329 break; 1330 1330 case AMD_IP_BLOCK_TYPE_GMC: 1331 - pp_dpm_powergate_mmhub(handle); 1331 + /* 1332 + * For now, this is only used on PICASSO. 1333 + * And only "gate" operation is supported. 1334 + */ 1335 + if (gate) 1336 + pp_dpm_powergate_mmhub(handle); 1332 1337 break; 1333 1338 case AMD_IP_BLOCK_TYPE_GFX: 1334 1339 ret = pp_dpm_powergate_gfx(handle, gate);
+3
drivers/gpu/drm/amd/pm/swsmu/smu12/smu_v12_0.c
··· 191 191 kfree(smu_table->watermarks_table); 192 192 smu_table->watermarks_table = NULL; 193 193 194 + kfree(smu_table->gpu_metrics_table); 195 + smu_table->gpu_metrics_table = NULL; 196 + 194 197 return 0; 195 198 } 196 199
+3
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
··· 198 198 199 199 int smu_v13_0_check_fw_version(struct smu_context *smu) 200 200 { 201 + struct amdgpu_device *adev = smu->adev; 201 202 uint32_t if_version = 0xff, smu_version = 0xff; 202 203 uint16_t smu_major; 203 204 uint8_t smu_minor, smu_debug; ··· 211 210 smu_major = (smu_version >> 16) & 0xffff; 212 211 smu_minor = (smu_version >> 8) & 0xff; 213 212 smu_debug = (smu_version >> 0) & 0xff; 213 + if (smu->is_apu) 214 + adev->pm.fw_version = smu_version; 214 215 215 216 switch (smu->adev->ip_versions[MP1_HWIP][0]) { 216 217 case IP_VERSION(13, 0, 2):