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

Merge tag 'amd-drm-fixes-6.1-2022-11-16' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes

amd-drm-fixes-6.1-2022-11-16:

amdgpu:
- Fix a possible memory leak in ganng submit error path
- DP tunneling fixes
- DCN 3.1 page flip fix
- DCN 3.2.x fixes
- DCN 3.1.4 fixes
- Don't expose degamma on hardware that doesn't support it
- BACO fixes for SMU 11.x
- BACO fixes for SMU 13.x
- Virtual display fix for devices with no display hardware

amdkfd:
- Memory limit regression fix

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

+235 -69
+1
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 1293 1293 u32 reg, u32 v); 1294 1294 struct dma_fence *amdgpu_device_switch_gang(struct amdgpu_device *adev, 1295 1295 struct dma_fence *gang); 1296 + bool amdgpu_device_has_display_hardware(struct amdgpu_device *adev); 1296 1297 1297 1298 /* atpx handler */ 1298 1299 #if defined(CONFIG_VGA_SWITCHEROO)
+1 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
··· 171 171 (kfd_mem_limit.ttm_mem_used + ttm_mem_needed > 172 172 kfd_mem_limit.max_ttm_mem_limit) || 173 173 (adev && adev->kfd.vram_used + vram_needed > 174 - adev->gmc.real_vram_size - 175 - atomic64_read(&adev->vram_pin_size) - 176 - reserved_for_pt)) { 174 + adev->gmc.real_vram_size - reserved_for_pt)) { 177 175 ret = -ENOMEM; 178 176 goto release; 179 177 }
+4 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
··· 288 288 } 289 289 } 290 290 291 - if (!p->gang_size) 292 - return -EINVAL; 291 + if (!p->gang_size) { 292 + ret = -EINVAL; 293 + goto free_partial_kdata; 294 + } 293 295 294 296 for (i = 0; i < p->gang_size; ++i) { 295 297 ret = amdgpu_job_alloc(p->adev, num_ibs[i], &p->jobs[i], vm);
+41
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 6044 6044 dma_fence_put(old); 6045 6045 return NULL; 6046 6046 } 6047 + 6048 + bool amdgpu_device_has_display_hardware(struct amdgpu_device *adev) 6049 + { 6050 + switch (adev->asic_type) { 6051 + #ifdef CONFIG_DRM_AMDGPU_SI 6052 + case CHIP_HAINAN: 6053 + #endif 6054 + case CHIP_TOPAZ: 6055 + /* chips with no display hardware */ 6056 + return false; 6057 + #ifdef CONFIG_DRM_AMDGPU_SI 6058 + case CHIP_TAHITI: 6059 + case CHIP_PITCAIRN: 6060 + case CHIP_VERDE: 6061 + case CHIP_OLAND: 6062 + #endif 6063 + #ifdef CONFIG_DRM_AMDGPU_CIK 6064 + case CHIP_BONAIRE: 6065 + case CHIP_HAWAII: 6066 + case CHIP_KAVERI: 6067 + case CHIP_KABINI: 6068 + case CHIP_MULLINS: 6069 + #endif 6070 + case CHIP_TONGA: 6071 + case CHIP_FIJI: 6072 + case CHIP_POLARIS10: 6073 + case CHIP_POLARIS11: 6074 + case CHIP_POLARIS12: 6075 + case CHIP_VEGAM: 6076 + case CHIP_CARRIZO: 6077 + case CHIP_STONEY: 6078 + /* chips with display hardware */ 6079 + return true; 6080 + default: 6081 + /* IP discovery */ 6082 + if (!adev->ip_versions[DCE_HWIP][0] || 6083 + (adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK)) 6084 + return false; 6085 + return true; 6086 + } 6087 + }
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
··· 656 656 } 657 657 658 658 if (amdgpu_sriov_vf(adev) || 659 - !amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_DCE)) { 659 + !amdgpu_device_has_display_hardware(adev)) { 660 660 size = 0; 661 661 } else { 662 662 size = amdgpu_gmc_get_vbios_fb_size(adev);
+1
drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
··· 45 45 MODULE_FIRMWARE("amdgpu/psp_13_0_7_sos.bin"); 46 46 MODULE_FIRMWARE("amdgpu/psp_13_0_7_ta.bin"); 47 47 MODULE_FIRMWARE("amdgpu/psp_13_0_10_sos.bin"); 48 + MODULE_FIRMWARE("amdgpu/psp_13_0_10_ta.bin"); 48 49 49 50 /* For large FW files the time to complete can be very long */ 50 51 #define USBC_PD_POLLING_LIMIT_S 240
+26 -6
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 147 147 /* Number of bytes in PSP footer for firmware. */ 148 148 #define PSP_FOOTER_BYTES 0x100 149 149 150 + /* 151 + * DMUB Async to Sync Mechanism Status 152 + */ 153 + #define DMUB_ASYNC_TO_SYNC_ACCESS_FAIL 1 154 + #define DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT 2 155 + #define DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS 3 156 + #define DMUB_ASYNC_TO_SYNC_ACCESS_INVALID 4 157 + 150 158 /** 151 159 * DOC: overview 152 160 * ··· 1645 1637 } 1646 1638 } 1647 1639 1648 - if (amdgpu_dm_initialize_drm_device(adev)) { 1649 - DRM_ERROR( 1650 - "amdgpu: failed to initialize sw for display support.\n"); 1651 - goto error; 1652 - } 1653 - 1654 1640 /* Enable outbox notification only after IRQ handlers are registered and DMUB is alive. 1655 1641 * It is expected that DMUB will resend any pending notifications at this point, for 1656 1642 * example HPD from DPIA. 1657 1643 */ 1658 1644 if (dc_is_dmub_outbox_supported(adev->dm.dc)) 1659 1645 dc_enable_dmub_outbox(adev->dm.dc); 1646 + 1647 + if (amdgpu_dm_initialize_drm_device(adev)) { 1648 + DRM_ERROR( 1649 + "amdgpu: failed to initialize sw for display support.\n"); 1650 + goto error; 1651 + } 1660 1652 1661 1653 /* create fake encoders for MST */ 1662 1654 dm_dp_create_fake_mst_encoders(adev); ··· 10117 10109 *operation_result = AUX_RET_ERROR_TIMEOUT; 10118 10110 } else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_FAIL) { 10119 10111 *operation_result = AUX_RET_ERROR_ENGINE_ACQUIRE; 10112 + } else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_INVALID) { 10113 + *operation_result = AUX_RET_ERROR_INVALID_REPLY; 10120 10114 } else { 10121 10115 *operation_result = AUX_RET_ERROR_UNKNOWN; 10122 10116 } ··· 10166 10156 payload->reply[0] = adev->dm.dmub_notify->aux_reply.command; 10167 10157 if (!payload->write && adev->dm.dmub_notify->aux_reply.length && 10168 10158 payload->reply[0] == AUX_TRANSACTION_REPLY_AUX_ACK) { 10159 + 10160 + if (payload->length != adev->dm.dmub_notify->aux_reply.length) { 10161 + DRM_WARN("invalid read from DPIA AUX %x(%d) got length %d!\n", 10162 + payload->address, payload->length, 10163 + adev->dm.dmub_notify->aux_reply.length); 10164 + return amdgpu_dm_set_dmub_async_sync_status(is_cmd_aux, ctx, 10165 + DMUB_ASYNC_TO_SYNC_ACCESS_INVALID, 10166 + (uint32_t *)operation_result); 10167 + } 10168 + 10169 10169 memcpy(payload->data, adev->dm.dmub_notify->aux_reply.data, 10170 10170 adev->dm.dmub_notify->aux_reply.length); 10171 10171 }
-6
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
··· 51 51 #define AMDGPU_DMUB_NOTIFICATION_MAX 5 52 52 53 53 /* 54 - * DMUB Async to Sync Mechanism Status 55 - */ 56 - #define DMUB_ASYNC_TO_SYNC_ACCESS_FAIL 1 57 - #define DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT 2 58 - #define DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS 3 59 - /* 60 54 #include "include/amdgpu_dal_power_if.h" 61 55 #include "amdgpu_dm_irq.h" 62 56 */
+8 -2
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
··· 412 412 { 413 413 struct amdgpu_crtc *acrtc = NULL; 414 414 struct drm_plane *cursor_plane; 415 - 415 + bool is_dcn; 416 416 int res = -ENOMEM; 417 417 418 418 cursor_plane = kzalloc(sizeof(*cursor_plane), GFP_KERNEL); ··· 450 450 acrtc->otg_inst = -1; 451 451 452 452 dm->adev->mode_info.crtcs[crtc_index] = acrtc; 453 - drm_crtc_enable_color_mgmt(&acrtc->base, MAX_COLOR_LUT_ENTRIES, 453 + 454 + /* Don't enable DRM CRTC degamma property for DCE since it doesn't 455 + * support programmable degamma anywhere. 456 + */ 457 + is_dcn = dm->adev->dm.dc->caps.color.dpp.dcn_arch; 458 + drm_crtc_enable_color_mgmt(&acrtc->base, is_dcn ? MAX_COLOR_LUT_ENTRIES : 0, 454 459 true, MAX_COLOR_LUT_ENTRIES); 460 + 455 461 drm_mode_crtc_set_gamma_size(&acrtc->base, MAX_COLOR_LEGACY_LUT_ENTRIES); 456 462 457 463 return 0;
+30
drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
··· 2393 2393 return result; 2394 2394 } 2395 2395 2396 + static enum bp_result get_vram_info_v30( 2397 + struct bios_parser *bp, 2398 + struct dc_vram_info *info) 2399 + { 2400 + struct atom_vram_info_header_v3_0 *info_v30; 2401 + enum bp_result result = BP_RESULT_OK; 2402 + 2403 + info_v30 = GET_IMAGE(struct atom_vram_info_header_v3_0, 2404 + DATA_TABLES(vram_info)); 2405 + 2406 + if (info_v30 == NULL) 2407 + return BP_RESULT_BADBIOSTABLE; 2408 + 2409 + info->num_chans = info_v30->channel_num; 2410 + info->dram_channel_width_bytes = (1 << info_v30->channel_width) / 8; 2411 + 2412 + return result; 2413 + } 2414 + 2415 + 2396 2416 /* 2397 2417 * get_integrated_info_v11 2398 2418 * ··· 3074 3054 break; 3075 3055 case 5: 3076 3056 result = get_vram_info_v25(bp, info); 3057 + break; 3058 + default: 3059 + break; 3060 + } 3061 + break; 3062 + 3063 + case 3: 3064 + switch (revision.minor) { 3065 + case 0: 3066 + result = get_vram_info_v30(bp, info); 3077 3067 break; 3078 3068 default: 3079 3069 break;
+1
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubp.c
··· 87 87 .hubp_init = hubp3_init, 88 88 .set_unbounded_requesting = hubp31_set_unbounded_requesting, 89 89 .hubp_soft_reset = hubp31_soft_reset, 90 + .hubp_set_flip_int = hubp1_set_flip_int, 90 91 .hubp_in_blank = hubp1_in_blank, 91 92 .program_extended_blank = hubp31_program_extended_blank, 92 93 };
+1 -1
drivers/gpu/drm/amd/display/dc/dcn314/dcn314_optc.c
··· 237 237 .clear_optc_underflow = optc1_clear_optc_underflow, 238 238 .setup_global_swap_lock = NULL, 239 239 .get_crc = optc1_get_crc, 240 - .configure_crc = optc2_configure_crc, 240 + .configure_crc = optc1_configure_crc, 241 241 .set_dsc_config = optc3_set_dsc_config, 242 242 .get_dsc_status = optc2_get_dsc_status, 243 243 .set_dwb_source = NULL,
+5 -9
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.c
··· 283 283 using the max for calculation */ 284 284 285 285 if (hubp->curs_attr.width > 0) { 286 - // Round cursor width to next multiple of 64 287 - cursor_size = (((hubp->curs_attr.width + 63) / 64) * 64) * hubp->curs_attr.height; 286 + cursor_size = hubp->curs_attr.pitch * hubp->curs_attr.height; 288 287 289 288 switch (pipe->stream->cursor_attributes.color_format) { 290 289 case CURSOR_MODE_MONO: ··· 308 309 cursor_size > 16384) { 309 310 /* cursor_num_mblk = CEILING(num_cursors*cursor_width*cursor_width*cursor_Bpe/mblk_bytes, 1) 310 311 */ 311 - cache_lines_used += (((hubp->curs_attr.width * hubp->curs_attr.height * cursor_bpp + 312 - DCN3_2_MALL_MBLK_SIZE_BYTES - 1) / DCN3_2_MALL_MBLK_SIZE_BYTES) * 313 - DCN3_2_MALL_MBLK_SIZE_BYTES) / dc->caps.cache_line_size + 2; 312 + cache_lines_used += (((cursor_size + DCN3_2_MALL_MBLK_SIZE_BYTES - 1) / 313 + DCN3_2_MALL_MBLK_SIZE_BYTES) * DCN3_2_MALL_MBLK_SIZE_BYTES) / 314 + dc->caps.cache_line_size + 2; 314 315 } 315 316 break; 316 317 } ··· 726 727 struct hubp *hubp = pipe->plane_res.hubp; 727 728 728 729 if (pipe->stream && pipe->plane_state && hubp && hubp->funcs->hubp_update_mall_sel) { 729 - //Round cursor width up to next multiple of 64 730 - int cursor_width = ((hubp->curs_attr.width + 63) / 64) * 64; 731 - int cursor_height = hubp->curs_attr.height; 732 - int cursor_size = cursor_width * cursor_height; 730 + int cursor_size = hubp->curs_attr.pitch * hubp->curs_attr.height; 733 731 734 732 switch (hubp->curs_attr.color_format) { 735 733 case CURSOR_MODE_MONO:
+15 -1
drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c
··· 1803 1803 */ 1804 1804 context->bw_ctx.dml.soc.dram_clock_change_latency_us = 1805 1805 dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us; 1806 + /* For DCN32/321 need to validate with fclk pstate change latency equal to dummy so 1807 + * prefetch is scheduled correctly to account for dummy pstate. 1808 + */ 1809 + if (dummy_latency_index == 0) 1810 + context->bw_ctx.dml.soc.fclk_change_latency_us = 1811 + dc->clk_mgr->bw_params->dummy_pstate_table[dummy_latency_index].dummy_pstate_latency_us; 1806 1812 dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, false); 1807 1813 maxMpcComb = context->bw_ctx.dml.vba.maxMpcComb; 1808 1814 dcfclk_from_fw_based_mclk_switching = context->bw_ctx.dml.vba.DCFCLKState[vlevel][context->bw_ctx.dml.vba.maxMpcComb]; ··· 1996 1990 1997 1991 context->perf_params.stutter_period_us = context->bw_ctx.dml.vba.StutterPeriod; 1998 1992 1993 + if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching && dummy_latency_index == 0) 1994 + context->bw_ctx.dml.soc.fclk_change_latency_us = 1995 + dc->clk_mgr->bw_params->dummy_pstate_table[dummy_latency_index].dummy_pstate_latency_us; 1996 + 1999 1997 dcn32_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel); 2000 1998 2001 1999 if (!pstate_en) ··· 2007 1997 context->bw_ctx.dml.soc.dram_clock_change_latency_us = 2008 1998 dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us; 2009 1999 2010 - if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching) 2000 + if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching) { 2011 2001 dcn30_setup_mclk_switch_using_fw_based_vblank_stretch(dc, context); 2002 + if (dummy_latency_index == 0) 2003 + context->bw_ctx.dml.soc.fclk_change_latency_us = 2004 + dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.fclk_change_latency_us; 2005 + } 2012 2006 } 2013 2007 2014 2008 static void dcn32_get_optimal_dcfclk_fclk_for_uclk(unsigned int uclk_mts,
+2
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
··· 718 718 719 719 do { 720 720 MaxTotalRDBandwidth = 0; 721 + DestinationLineTimesForPrefetchLessThan2 = false; 722 + VRatioPrefetchMoreThanMax = false; 721 723 #ifdef __DML_VBA_DEBUG__ 722 724 dml_print("DML::%s: Start loop: VStartup = %d\n", __func__, mode_lib->vba.VStartupLines); 723 725 #endif
+2
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.h
··· 46 46 // Prefetch schedule max vratio 47 47 #define __DML_MAX_VRATIO_PRE__ 4.0 48 48 49 + #define __DML_VBA_MAX_DST_Y_PRE__ 63.75 50 + 49 51 #define BPP_INVALID 0 50 52 #define BPP_BLENDED_PIPE 0xffffffff 51 53
+3 -4
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c
··· 3475 3475 double min_Lsw; 3476 3476 double Tsw_est1 = 0; 3477 3477 double Tsw_est3 = 0; 3478 - double TPreMargin = 0; 3479 3478 3480 3479 if (v->GPUVMEnable == true && v->HostVMEnable == true) 3481 3480 HostVMDynamicLevelsTrips = v->HostVMMaxNonCachedPageTableLevels; ··· 3668 3669 dst_y_prefetch_equ = VStartup - (*TSetup + dml_max(TWait + TCalc, *Tdmdl)) / LineTime - 3669 3670 (*DSTYAfterScaler + (double) *DSTXAfterScaler / (double) myPipe->HTotal); 3670 3671 3672 + dst_y_prefetch_equ = dml_min(dst_y_prefetch_equ, __DML_VBA_MAX_DST_Y_PRE__); 3671 3673 #ifdef __DML_VBA_DEBUG__ 3672 3674 dml_print("DML::%s: HTotal = %d\n", __func__, myPipe->HTotal); 3673 3675 dml_print("DML::%s: min_Lsw = %f\n", __func__, min_Lsw); ··· 3701 3701 3702 3702 dst_y_prefetch_equ = dml_floor(4.0 * (dst_y_prefetch_equ + 0.125), 1) / 4.0; 3703 3703 Tpre_rounded = dst_y_prefetch_equ * LineTime; 3704 - 3705 - TPreMargin = Tpre_rounded - TPreReq; 3706 3704 #ifdef __DML_VBA_DEBUG__ 3707 3705 dml_print("DML::%s: dst_y_prefetch_equ: %f (after round)\n", __func__, dst_y_prefetch_equ); 3708 3706 dml_print("DML::%s: LineTime: %f\n", __func__, LineTime); ··· 3728 3730 *VRatioPrefetchY = 0; 3729 3731 *VRatioPrefetchC = 0; 3730 3732 *RequiredPrefetchPixDataBWLuma = 0; 3731 - if (dst_y_prefetch_equ > 1 && TPreMargin > 0.0) { 3733 + if (dst_y_prefetch_equ > 1 && 3734 + (Tpre_rounded >= TPreReq || dst_y_prefetch_equ == __DML_VBA_MAX_DST_Y_PRE__)) { 3732 3735 double PrefetchBandwidth1; 3733 3736 double PrefetchBandwidth2; 3734 3737 double PrefetchBandwidth3;
+11 -12
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
··· 1156 1156 uint64_t features_supported; 1157 1157 int ret = 0; 1158 1158 1159 - if (adev->in_suspend && smu_is_dpm_running(smu)) { 1160 - dev_info(adev->dev, "dpm has been enabled\n"); 1161 - /* this is needed specifically */ 1162 - switch (adev->ip_versions[MP1_HWIP][0]) { 1163 - case IP_VERSION(11, 0, 7): 1164 - case IP_VERSION(11, 0, 11): 1165 - case IP_VERSION(11, 5, 0): 1166 - case IP_VERSION(11, 0, 12): 1159 + switch (adev->ip_versions[MP1_HWIP][0]) { 1160 + case IP_VERSION(11, 0, 7): 1161 + case IP_VERSION(11, 0, 11): 1162 + case IP_VERSION(11, 5, 0): 1163 + case IP_VERSION(11, 0, 12): 1164 + if (adev->in_suspend && smu_is_dpm_running(smu)) { 1165 + dev_info(adev->dev, "dpm has been enabled\n"); 1167 1166 ret = smu_system_features_control(smu, true); 1168 1167 if (ret) 1169 1168 dev_err(adev->dev, "Failed system features control!\n"); 1170 - break; 1171 - default: 1172 - break; 1169 + return ret; 1173 1170 } 1174 - return ret; 1171 + break; 1172 + default: 1173 + break; 1175 1174 } 1176 1175 1177 1176 ret = smu_init_display_count(smu, 0);
+8
drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
··· 1388 1388 CMN2ASIC_MAPPING_WORKLOAD, 1389 1389 }; 1390 1390 1391 + enum smu_baco_seq { 1392 + BACO_SEQ_BACO = 0, 1393 + BACO_SEQ_MSR, 1394 + BACO_SEQ_BAMACO, 1395 + BACO_SEQ_ULPS, 1396 + BACO_SEQ_COUNT, 1397 + }; 1398 + 1391 1399 #define MSG_MAP(msg, index, valid_in_vf) \ 1392 1400 [SMU_MSG_##msg] = {1, (index), (valid_in_vf)} 1393 1401
+1 -9
drivers/gpu/drm/amd/pm/swsmu/inc/smu_v11_0.h
··· 147 147 uint32_t max_fast_ppt_limit; 148 148 }; 149 149 150 - enum smu_v11_0_baco_seq { 151 - BACO_SEQ_BACO = 0, 152 - BACO_SEQ_MSR, 153 - BACO_SEQ_BAMACO, 154 - BACO_SEQ_ULPS, 155 - BACO_SEQ_COUNT, 156 - }; 157 - 158 150 #if defined(SWSMU_CODE_LAYER_L2) || defined(SWSMU_CODE_LAYER_L3) 159 151 160 152 int smu_v11_0_init_microcode(struct smu_context *smu); ··· 249 257 int smu_v11_0_baco_exit(struct smu_context *smu); 250 258 251 259 int smu_v11_0_baco_set_armd3_sequence(struct smu_context *smu, 252 - enum smu_v11_0_baco_seq baco_seq); 260 + enum smu_baco_seq baco_seq); 253 261 254 262 int smu_v11_0_mode1_reset(struct smu_context *smu); 255 263
+3 -8
drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h
··· 124 124 enum smu_13_0_power_state power_state; 125 125 }; 126 126 127 - enum smu_v13_0_baco_seq { 128 - BACO_SEQ_BACO = 0, 129 - BACO_SEQ_MSR, 130 - BACO_SEQ_BAMACO, 131 - BACO_SEQ_ULPS, 132 - BACO_SEQ_COUNT, 133 - }; 134 - 135 127 #if defined(SWSMU_CODE_LAYER_L2) || defined(SWSMU_CODE_LAYER_L3) 136 128 137 129 int smu_v13_0_init_microcode(struct smu_context *smu); ··· 209 217 210 218 int smu_v13_0_get_max_sustainable_clocks_by_dc(struct smu_context *smu, 211 219 struct pp_smu_nv_clock_table *max_clocks); 220 + 221 + int smu_v13_0_baco_set_armd3_sequence(struct smu_context *smu, 222 + enum smu_baco_seq baco_seq); 212 223 213 224 bool smu_v13_0_baco_is_support(struct smu_context *smu); 214 225
+4
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
··· 379 379 ((adev->pdev->device == 0x73BF) && 380 380 (adev->pdev->revision == 0xCF)) || 381 381 ((adev->pdev->device == 0x7422) && 382 + (adev->pdev->revision == 0x00)) || 383 + ((adev->pdev->device == 0x73A3) && 384 + (adev->pdev->revision == 0x00)) || 385 + ((adev->pdev->device == 0x73E3) && 382 386 (adev->pdev->revision == 0x00))) 383 387 smu_baco->platform_support = false; 384 388
+1 -1
drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
··· 1576 1576 } 1577 1577 1578 1578 int smu_v11_0_baco_set_armd3_sequence(struct smu_context *smu, 1579 - enum smu_v11_0_baco_seq baco_seq) 1579 + enum smu_baco_seq baco_seq) 1580 1580 { 1581 1581 return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_ArmD3, baco_seq, NULL); 1582 1582 }
+9
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
··· 2230 2230 return ret; 2231 2231 } 2232 2232 2233 + int smu_v13_0_baco_set_armd3_sequence(struct smu_context *smu, 2234 + enum smu_baco_seq baco_seq) 2235 + { 2236 + return smu_cmn_send_smc_msg_with_param(smu, 2237 + SMU_MSG_ArmD3, 2238 + baco_seq, 2239 + NULL); 2240 + } 2241 + 2233 2242 bool smu_v13_0_baco_is_support(struct smu_context *smu) 2234 2243 { 2235 2244 struct smu_baco_context *smu_baco = &smu->smu_baco;
+28 -2
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
··· 120 120 MSG_MAP(Mode1Reset, PPSMC_MSG_Mode1Reset, 0), 121 121 MSG_MAP(PrepareMp1ForUnload, PPSMC_MSG_PrepareMp1ForUnload, 0), 122 122 MSG_MAP(DFCstateControl, PPSMC_MSG_SetExternalClientDfCstateAllow, 0), 123 + MSG_MAP(ArmD3, PPSMC_MSG_ArmD3, 0), 123 124 }; 124 125 125 126 static struct cmn2asic_mapping smu_v13_0_0_clk_map[SMU_CLK_COUNT] = { ··· 1567 1566 NULL); 1568 1567 } 1569 1568 1569 + static int smu_v13_0_0_baco_enter(struct smu_context *smu) 1570 + { 1571 + struct smu_baco_context *smu_baco = &smu->smu_baco; 1572 + struct amdgpu_device *adev = smu->adev; 1573 + 1574 + if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) 1575 + return smu_v13_0_baco_set_armd3_sequence(smu, 1576 + smu_baco->maco_support ? BACO_SEQ_BAMACO : BACO_SEQ_BACO); 1577 + else 1578 + return smu_v13_0_baco_enter(smu); 1579 + } 1580 + 1581 + static int smu_v13_0_0_baco_exit(struct smu_context *smu) 1582 + { 1583 + struct amdgpu_device *adev = smu->adev; 1584 + 1585 + if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) { 1586 + /* Wait for PMFW handling for the Dstate change */ 1587 + usleep_range(10000, 11000); 1588 + return smu_v13_0_baco_set_armd3_sequence(smu, BACO_SEQ_ULPS); 1589 + } else { 1590 + return smu_v13_0_baco_exit(smu); 1591 + } 1592 + } 1593 + 1570 1594 static bool smu_v13_0_0_is_mode1_reset_supported(struct smu_context *smu) 1571 1595 { 1572 1596 struct amdgpu_device *adev = smu->adev; ··· 1853 1827 .baco_is_support = smu_v13_0_baco_is_support, 1854 1828 .baco_get_state = smu_v13_0_baco_get_state, 1855 1829 .baco_set_state = smu_v13_0_baco_set_state, 1856 - .baco_enter = smu_v13_0_baco_enter, 1857 - .baco_exit = smu_v13_0_baco_exit, 1830 + .baco_enter = smu_v13_0_0_baco_enter, 1831 + .baco_exit = smu_v13_0_0_baco_exit, 1858 1832 .mode1_reset_is_support = smu_v13_0_0_is_mode1_reset_supported, 1859 1833 .mode1_reset = smu_v13_0_mode1_reset, 1860 1834 .set_mp1_state = smu_v13_0_0_set_mp1_state,
+28 -2
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
··· 122 122 MSG_MAP(PrepareMp1ForUnload, PPSMC_MSG_PrepareMp1ForUnload, 0), 123 123 MSG_MAP(SetMGpuFanBoostLimitRpm, PPSMC_MSG_SetMGpuFanBoostLimitRpm, 0), 124 124 MSG_MAP(DFCstateControl, PPSMC_MSG_SetExternalClientDfCstateAllow, 0), 125 + MSG_MAP(ArmD3, PPSMC_MSG_ArmD3, 0), 125 126 }; 126 127 127 128 static struct cmn2asic_mapping smu_v13_0_7_clk_map[SMU_CLK_COUNT] = { ··· 1579 1578 return ret; 1580 1579 } 1581 1580 1581 + static int smu_v13_0_7_baco_enter(struct smu_context *smu) 1582 + { 1583 + struct smu_baco_context *smu_baco = &smu->smu_baco; 1584 + struct amdgpu_device *adev = smu->adev; 1585 + 1586 + if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) 1587 + return smu_v13_0_baco_set_armd3_sequence(smu, 1588 + smu_baco->maco_support ? BACO_SEQ_BAMACO : BACO_SEQ_BACO); 1589 + else 1590 + return smu_v13_0_baco_enter(smu); 1591 + } 1592 + 1593 + static int smu_v13_0_7_baco_exit(struct smu_context *smu) 1594 + { 1595 + struct amdgpu_device *adev = smu->adev; 1596 + 1597 + if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) { 1598 + /* Wait for PMFW handling for the Dstate change */ 1599 + usleep_range(10000, 11000); 1600 + return smu_v13_0_baco_set_armd3_sequence(smu, BACO_SEQ_ULPS); 1601 + } else { 1602 + return smu_v13_0_baco_exit(smu); 1603 + } 1604 + } 1605 + 1582 1606 static bool smu_v13_0_7_is_mode1_reset_supported(struct smu_context *smu) 1583 1607 { 1584 1608 struct amdgpu_device *adev = smu->adev; ··· 1681 1655 .baco_is_support = smu_v13_0_baco_is_support, 1682 1656 .baco_get_state = smu_v13_0_baco_get_state, 1683 1657 .baco_set_state = smu_v13_0_baco_set_state, 1684 - .baco_enter = smu_v13_0_baco_enter, 1685 - .baco_exit = smu_v13_0_baco_exit, 1658 + .baco_enter = smu_v13_0_7_baco_enter, 1659 + .baco_exit = smu_v13_0_7_baco_exit, 1686 1660 .mode1_reset_is_support = smu_v13_0_7_is_mode1_reset_supported, 1687 1661 .mode1_reset = smu_v13_0_mode1_reset, 1688 1662 .set_mp1_state = smu_v13_0_7_set_mp1_state,