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
This commit is contained in:
commit
585f2bc8fe
@ -1293,6 +1293,7 @@ void amdgpu_device_pcie_port_wreg(struct amdgpu_device *adev,
|
||||
u32 reg, u32 v);
|
||||
struct dma_fence *amdgpu_device_switch_gang(struct amdgpu_device *adev,
|
||||
struct dma_fence *gang);
|
||||
bool amdgpu_device_has_display_hardware(struct amdgpu_device *adev);
|
||||
|
||||
/* atpx handler */
|
||||
#if defined(CONFIG_VGA_SWITCHEROO)
|
||||
|
@ -171,9 +171,7 @@ int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,
|
||||
(kfd_mem_limit.ttm_mem_used + ttm_mem_needed >
|
||||
kfd_mem_limit.max_ttm_mem_limit) ||
|
||||
(adev && adev->kfd.vram_used + vram_needed >
|
||||
adev->gmc.real_vram_size -
|
||||
atomic64_read(&adev->vram_pin_size) -
|
||||
reserved_for_pt)) {
|
||||
adev->gmc.real_vram_size - reserved_for_pt)) {
|
||||
ret = -ENOMEM;
|
||||
goto release;
|
||||
}
|
||||
|
@ -288,8 +288,10 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,
|
||||
}
|
||||
}
|
||||
|
||||
if (!p->gang_size)
|
||||
return -EINVAL;
|
||||
if (!p->gang_size) {
|
||||
ret = -EINVAL;
|
||||
goto free_partial_kdata;
|
||||
}
|
||||
|
||||
for (i = 0; i < p->gang_size; ++i) {
|
||||
ret = amdgpu_job_alloc(p->adev, num_ibs[i], &p->jobs[i], vm);
|
||||
|
@ -6044,3 +6044,44 @@ struct dma_fence *amdgpu_device_switch_gang(struct amdgpu_device *adev,
|
||||
dma_fence_put(old);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool amdgpu_device_has_display_hardware(struct amdgpu_device *adev)
|
||||
{
|
||||
switch (adev->asic_type) {
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
case CHIP_HAINAN:
|
||||
#endif
|
||||
case CHIP_TOPAZ:
|
||||
/* chips with no display hardware */
|
||||
return false;
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
case CHIP_TAHITI:
|
||||
case CHIP_PITCAIRN:
|
||||
case CHIP_VERDE:
|
||||
case CHIP_OLAND:
|
||||
#endif
|
||||
#ifdef CONFIG_DRM_AMDGPU_CIK
|
||||
case CHIP_BONAIRE:
|
||||
case CHIP_HAWAII:
|
||||
case CHIP_KAVERI:
|
||||
case CHIP_KABINI:
|
||||
case CHIP_MULLINS:
|
||||
#endif
|
||||
case CHIP_TONGA:
|
||||
case CHIP_FIJI:
|
||||
case CHIP_POLARIS10:
|
||||
case CHIP_POLARIS11:
|
||||
case CHIP_POLARIS12:
|
||||
case CHIP_VEGAM:
|
||||
case CHIP_CARRIZO:
|
||||
case CHIP_STONEY:
|
||||
/* chips with display hardware */
|
||||
return true;
|
||||
default:
|
||||
/* IP discovery */
|
||||
if (!adev->ip_versions[DCE_HWIP][0] ||
|
||||
(adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -656,7 +656,7 @@ void amdgpu_gmc_get_vbios_allocations(struct amdgpu_device *adev)
|
||||
}
|
||||
|
||||
if (amdgpu_sriov_vf(adev) ||
|
||||
!amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_DCE)) {
|
||||
!amdgpu_device_has_display_hardware(adev)) {
|
||||
size = 0;
|
||||
} else {
|
||||
size = amdgpu_gmc_get_vbios_fb_size(adev);
|
||||
|
@ -45,6 +45,7 @@ MODULE_FIRMWARE("amdgpu/psp_13_0_0_ta.bin");
|
||||
MODULE_FIRMWARE("amdgpu/psp_13_0_7_sos.bin");
|
||||
MODULE_FIRMWARE("amdgpu/psp_13_0_7_ta.bin");
|
||||
MODULE_FIRMWARE("amdgpu/psp_13_0_10_sos.bin");
|
||||
MODULE_FIRMWARE("amdgpu/psp_13_0_10_ta.bin");
|
||||
|
||||
/* For large FW files the time to complete can be very long */
|
||||
#define USBC_PD_POLLING_LIMIT_S 240
|
||||
|
@ -147,6 +147,14 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
|
||||
/* Number of bytes in PSP footer for firmware. */
|
||||
#define PSP_FOOTER_BYTES 0x100
|
||||
|
||||
/*
|
||||
* DMUB Async to Sync Mechanism Status
|
||||
*/
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_FAIL 1
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT 2
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS 3
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_INVALID 4
|
||||
|
||||
/**
|
||||
* DOC: overview
|
||||
*
|
||||
@ -1637,12 +1645,6 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
|
||||
}
|
||||
}
|
||||
|
||||
if (amdgpu_dm_initialize_drm_device(adev)) {
|
||||
DRM_ERROR(
|
||||
"amdgpu: failed to initialize sw for display support.\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Enable outbox notification only after IRQ handlers are registered and DMUB is alive.
|
||||
* It is expected that DMUB will resend any pending notifications at this point, for
|
||||
* example HPD from DPIA.
|
||||
@ -1650,6 +1652,12 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
|
||||
if (dc_is_dmub_outbox_supported(adev->dm.dc))
|
||||
dc_enable_dmub_outbox(adev->dm.dc);
|
||||
|
||||
if (amdgpu_dm_initialize_drm_device(adev)) {
|
||||
DRM_ERROR(
|
||||
"amdgpu: failed to initialize sw for display support.\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* create fake encoders for MST */
|
||||
dm_dp_create_fake_mst_encoders(adev);
|
||||
|
||||
@ -10109,6 +10117,8 @@ static int amdgpu_dm_set_dmub_async_sync_status(bool is_cmd_aux,
|
||||
*operation_result = AUX_RET_ERROR_TIMEOUT;
|
||||
} else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_FAIL) {
|
||||
*operation_result = AUX_RET_ERROR_ENGINE_ACQUIRE;
|
||||
} else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_INVALID) {
|
||||
*operation_result = AUX_RET_ERROR_INVALID_REPLY;
|
||||
} else {
|
||||
*operation_result = AUX_RET_ERROR_UNKNOWN;
|
||||
}
|
||||
@ -10156,6 +10166,16 @@ int amdgpu_dm_process_dmub_aux_transfer_sync(bool is_cmd_aux, struct dc_context
|
||||
payload->reply[0] = adev->dm.dmub_notify->aux_reply.command;
|
||||
if (!payload->write && adev->dm.dmub_notify->aux_reply.length &&
|
||||
payload->reply[0] == AUX_TRANSACTION_REPLY_AUX_ACK) {
|
||||
|
||||
if (payload->length != adev->dm.dmub_notify->aux_reply.length) {
|
||||
DRM_WARN("invalid read from DPIA AUX %x(%d) got length %d!\n",
|
||||
payload->address, payload->length,
|
||||
adev->dm.dmub_notify->aux_reply.length);
|
||||
return amdgpu_dm_set_dmub_async_sync_status(is_cmd_aux, ctx,
|
||||
DMUB_ASYNC_TO_SYNC_ACCESS_INVALID,
|
||||
(uint32_t *)operation_result);
|
||||
}
|
||||
|
||||
memcpy(payload->data, adev->dm.dmub_notify->aux_reply.data,
|
||||
adev->dm.dmub_notify->aux_reply.length);
|
||||
}
|
||||
|
@ -50,12 +50,6 @@
|
||||
|
||||
#define AMDGPU_DMUB_NOTIFICATION_MAX 5
|
||||
|
||||
/*
|
||||
* DMUB Async to Sync Mechanism Status
|
||||
*/
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_FAIL 1
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT 2
|
||||
#define DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS 3
|
||||
/*
|
||||
#include "include/amdgpu_dal_power_if.h"
|
||||
#include "amdgpu_dm_irq.h"
|
||||
|
@ -412,7 +412,7 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
|
||||
{
|
||||
struct amdgpu_crtc *acrtc = NULL;
|
||||
struct drm_plane *cursor_plane;
|
||||
|
||||
bool is_dcn;
|
||||
int res = -ENOMEM;
|
||||
|
||||
cursor_plane = kzalloc(sizeof(*cursor_plane), GFP_KERNEL);
|
||||
@ -450,8 +450,14 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
|
||||
acrtc->otg_inst = -1;
|
||||
|
||||
dm->adev->mode_info.crtcs[crtc_index] = acrtc;
|
||||
drm_crtc_enable_color_mgmt(&acrtc->base, MAX_COLOR_LUT_ENTRIES,
|
||||
|
||||
/* Don't enable DRM CRTC degamma property for DCE since it doesn't
|
||||
* support programmable degamma anywhere.
|
||||
*/
|
||||
is_dcn = dm->adev->dm.dc->caps.color.dpp.dcn_arch;
|
||||
drm_crtc_enable_color_mgmt(&acrtc->base, is_dcn ? MAX_COLOR_LUT_ENTRIES : 0,
|
||||
true, MAX_COLOR_LUT_ENTRIES);
|
||||
|
||||
drm_mode_crtc_set_gamma_size(&acrtc->base, MAX_COLOR_LEGACY_LUT_ENTRIES);
|
||||
|
||||
return 0;
|
||||
|
@ -2393,6 +2393,26 @@ static enum bp_result get_vram_info_v25(
|
||||
return result;
|
||||
}
|
||||
|
||||
static enum bp_result get_vram_info_v30(
|
||||
struct bios_parser *bp,
|
||||
struct dc_vram_info *info)
|
||||
{
|
||||
struct atom_vram_info_header_v3_0 *info_v30;
|
||||
enum bp_result result = BP_RESULT_OK;
|
||||
|
||||
info_v30 = GET_IMAGE(struct atom_vram_info_header_v3_0,
|
||||
DATA_TABLES(vram_info));
|
||||
|
||||
if (info_v30 == NULL)
|
||||
return BP_RESULT_BADBIOSTABLE;
|
||||
|
||||
info->num_chans = info_v30->channel_num;
|
||||
info->dram_channel_width_bytes = (1 << info_v30->channel_width) / 8;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_integrated_info_v11
|
||||
*
|
||||
@ -3060,6 +3080,16 @@ static enum bp_result bios_parser_get_vram_info(
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
switch (revision.minor) {
|
||||
case 0:
|
||||
result = get_vram_info_v30(bp, info);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return result;
|
||||
}
|
||||
|
@ -87,6 +87,7 @@ static struct hubp_funcs dcn31_hubp_funcs = {
|
||||
.hubp_init = hubp3_init,
|
||||
.set_unbounded_requesting = hubp31_set_unbounded_requesting,
|
||||
.hubp_soft_reset = hubp31_soft_reset,
|
||||
.hubp_set_flip_int = hubp1_set_flip_int,
|
||||
.hubp_in_blank = hubp1_in_blank,
|
||||
.program_extended_blank = hubp31_program_extended_blank,
|
||||
};
|
||||
|
@ -237,7 +237,7 @@ static struct timing_generator_funcs dcn314_tg_funcs = {
|
||||
.clear_optc_underflow = optc1_clear_optc_underflow,
|
||||
.setup_global_swap_lock = NULL,
|
||||
.get_crc = optc1_get_crc,
|
||||
.configure_crc = optc2_configure_crc,
|
||||
.configure_crc = optc1_configure_crc,
|
||||
.set_dsc_config = optc3_set_dsc_config,
|
||||
.get_dsc_status = optc2_get_dsc_status,
|
||||
.set_dwb_source = NULL,
|
||||
|
@ -283,8 +283,7 @@ static uint32_t dcn32_calculate_cab_allocation(struct dc *dc, struct dc_state *c
|
||||
using the max for calculation */
|
||||
|
||||
if (hubp->curs_attr.width > 0) {
|
||||
// Round cursor width to next multiple of 64
|
||||
cursor_size = (((hubp->curs_attr.width + 63) / 64) * 64) * hubp->curs_attr.height;
|
||||
cursor_size = hubp->curs_attr.pitch * hubp->curs_attr.height;
|
||||
|
||||
switch (pipe->stream->cursor_attributes.color_format) {
|
||||
case CURSOR_MODE_MONO:
|
||||
@ -309,9 +308,9 @@ static uint32_t dcn32_calculate_cab_allocation(struct dc *dc, struct dc_state *c
|
||||
cursor_size > 16384) {
|
||||
/* cursor_num_mblk = CEILING(num_cursors*cursor_width*cursor_width*cursor_Bpe/mblk_bytes, 1)
|
||||
*/
|
||||
cache_lines_used += (((hubp->curs_attr.width * hubp->curs_attr.height * cursor_bpp +
|
||||
DCN3_2_MALL_MBLK_SIZE_BYTES - 1) / DCN3_2_MALL_MBLK_SIZE_BYTES) *
|
||||
DCN3_2_MALL_MBLK_SIZE_BYTES) / dc->caps.cache_line_size + 2;
|
||||
cache_lines_used += (((cursor_size + DCN3_2_MALL_MBLK_SIZE_BYTES - 1) /
|
||||
DCN3_2_MALL_MBLK_SIZE_BYTES) * DCN3_2_MALL_MBLK_SIZE_BYTES) /
|
||||
dc->caps.cache_line_size + 2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -727,10 +726,7 @@ void dcn32_update_mall_sel(struct dc *dc, struct dc_state *context)
|
||||
struct hubp *hubp = pipe->plane_res.hubp;
|
||||
|
||||
if (pipe->stream && pipe->plane_state && hubp && hubp->funcs->hubp_update_mall_sel) {
|
||||
//Round cursor width up to next multiple of 64
|
||||
int cursor_width = ((hubp->curs_attr.width + 63) / 64) * 64;
|
||||
int cursor_height = hubp->curs_attr.height;
|
||||
int cursor_size = cursor_width * cursor_height;
|
||||
int cursor_size = hubp->curs_attr.pitch * hubp->curs_attr.height;
|
||||
|
||||
switch (hubp->curs_attr.color_format) {
|
||||
case CURSOR_MODE_MONO:
|
||||
|
@ -1803,6 +1803,12 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
||||
*/
|
||||
context->bw_ctx.dml.soc.dram_clock_change_latency_us =
|
||||
dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us;
|
||||
/* For DCN32/321 need to validate with fclk pstate change latency equal to dummy so
|
||||
* prefetch is scheduled correctly to account for dummy pstate.
|
||||
*/
|
||||
if (dummy_latency_index == 0)
|
||||
context->bw_ctx.dml.soc.fclk_change_latency_us =
|
||||
dc->clk_mgr->bw_params->dummy_pstate_table[dummy_latency_index].dummy_pstate_latency_us;
|
||||
dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, false);
|
||||
maxMpcComb = context->bw_ctx.dml.vba.maxMpcComb;
|
||||
dcfclk_from_fw_based_mclk_switching = context->bw_ctx.dml.vba.DCFCLKState[vlevel][context->bw_ctx.dml.vba.maxMpcComb];
|
||||
@ -1990,6 +1996,10 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
||||
|
||||
context->perf_params.stutter_period_us = context->bw_ctx.dml.vba.StutterPeriod;
|
||||
|
||||
if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching && dummy_latency_index == 0)
|
||||
context->bw_ctx.dml.soc.fclk_change_latency_us =
|
||||
dc->clk_mgr->bw_params->dummy_pstate_table[dummy_latency_index].dummy_pstate_latency_us;
|
||||
|
||||
dcn32_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
|
||||
|
||||
if (!pstate_en)
|
||||
@ -1997,8 +2007,12 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
|
||||
context->bw_ctx.dml.soc.dram_clock_change_latency_us =
|
||||
dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us;
|
||||
|
||||
if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching)
|
||||
if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching) {
|
||||
dcn30_setup_mclk_switch_using_fw_based_vblank_stretch(dc, context);
|
||||
if (dummy_latency_index == 0)
|
||||
context->bw_ctx.dml.soc.fclk_change_latency_us =
|
||||
dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.fclk_change_latency_us;
|
||||
}
|
||||
}
|
||||
|
||||
static void dcn32_get_optimal_dcfclk_fclk_for_uclk(unsigned int uclk_mts,
|
||||
|
@ -718,6 +718,8 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
|
||||
|
||||
do {
|
||||
MaxTotalRDBandwidth = 0;
|
||||
DestinationLineTimesForPrefetchLessThan2 = false;
|
||||
VRatioPrefetchMoreThanMax = false;
|
||||
#ifdef __DML_VBA_DEBUG__
|
||||
dml_print("DML::%s: Start loop: VStartup = %d\n", __func__, mode_lib->vba.VStartupLines);
|
||||
#endif
|
||||
|
@ -46,6 +46,8 @@
|
||||
// Prefetch schedule max vratio
|
||||
#define __DML_MAX_VRATIO_PRE__ 4.0
|
||||
|
||||
#define __DML_VBA_MAX_DST_Y_PRE__ 63.75
|
||||
|
||||
#define BPP_INVALID 0
|
||||
#define BPP_BLENDED_PIPE 0xffffffff
|
||||
|
||||
|
@ -3475,7 +3475,6 @@ bool dml32_CalculatePrefetchSchedule(
|
||||
double min_Lsw;
|
||||
double Tsw_est1 = 0;
|
||||
double Tsw_est3 = 0;
|
||||
double TPreMargin = 0;
|
||||
|
||||
if (v->GPUVMEnable == true && v->HostVMEnable == true)
|
||||
HostVMDynamicLevelsTrips = v->HostVMMaxNonCachedPageTableLevels;
|
||||
@ -3669,6 +3668,7 @@ bool dml32_CalculatePrefetchSchedule(
|
||||
dst_y_prefetch_equ = VStartup - (*TSetup + dml_max(TWait + TCalc, *Tdmdl)) / LineTime -
|
||||
(*DSTYAfterScaler + (double) *DSTXAfterScaler / (double) myPipe->HTotal);
|
||||
|
||||
dst_y_prefetch_equ = dml_min(dst_y_prefetch_equ, __DML_VBA_MAX_DST_Y_PRE__);
|
||||
#ifdef __DML_VBA_DEBUG__
|
||||
dml_print("DML::%s: HTotal = %d\n", __func__, myPipe->HTotal);
|
||||
dml_print("DML::%s: min_Lsw = %f\n", __func__, min_Lsw);
|
||||
@ -3701,8 +3701,6 @@ bool dml32_CalculatePrefetchSchedule(
|
||||
|
||||
dst_y_prefetch_equ = dml_floor(4.0 * (dst_y_prefetch_equ + 0.125), 1) / 4.0;
|
||||
Tpre_rounded = dst_y_prefetch_equ * LineTime;
|
||||
|
||||
TPreMargin = Tpre_rounded - TPreReq;
|
||||
#ifdef __DML_VBA_DEBUG__
|
||||
dml_print("DML::%s: dst_y_prefetch_equ: %f (after round)\n", __func__, dst_y_prefetch_equ);
|
||||
dml_print("DML::%s: LineTime: %f\n", __func__, LineTime);
|
||||
@ -3730,7 +3728,8 @@ bool dml32_CalculatePrefetchSchedule(
|
||||
*VRatioPrefetchY = 0;
|
||||
*VRatioPrefetchC = 0;
|
||||
*RequiredPrefetchPixDataBWLuma = 0;
|
||||
if (dst_y_prefetch_equ > 1 && TPreMargin > 0.0) {
|
||||
if (dst_y_prefetch_equ > 1 &&
|
||||
(Tpre_rounded >= TPreReq || dst_y_prefetch_equ == __DML_VBA_MAX_DST_Y_PRE__)) {
|
||||
double PrefetchBandwidth1;
|
||||
double PrefetchBandwidth2;
|
||||
double PrefetchBandwidth3;
|
||||
|
@ -1156,22 +1156,21 @@ static int smu_smc_hw_setup(struct smu_context *smu)
|
||||
uint64_t features_supported;
|
||||
int ret = 0;
|
||||
|
||||
if (adev->in_suspend && smu_is_dpm_running(smu)) {
|
||||
dev_info(adev->dev, "dpm has been enabled\n");
|
||||
/* this is needed specifically */
|
||||
switch (adev->ip_versions[MP1_HWIP][0]) {
|
||||
case IP_VERSION(11, 0, 7):
|
||||
case IP_VERSION(11, 0, 11):
|
||||
case IP_VERSION(11, 5, 0):
|
||||
case IP_VERSION(11, 0, 12):
|
||||
switch (adev->ip_versions[MP1_HWIP][0]) {
|
||||
case IP_VERSION(11, 0, 7):
|
||||
case IP_VERSION(11, 0, 11):
|
||||
case IP_VERSION(11, 5, 0):
|
||||
case IP_VERSION(11, 0, 12):
|
||||
if (adev->in_suspend && smu_is_dpm_running(smu)) {
|
||||
dev_info(adev->dev, "dpm has been enabled\n");
|
||||
ret = smu_system_features_control(smu, true);
|
||||
if (ret)
|
||||
dev_err(adev->dev, "Failed system features control!\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
ret = smu_init_display_count(smu, 0);
|
||||
|
@ -1388,6 +1388,14 @@ enum smu_cmn2asic_mapping_type {
|
||||
CMN2ASIC_MAPPING_WORKLOAD,
|
||||
};
|
||||
|
||||
enum smu_baco_seq {
|
||||
BACO_SEQ_BACO = 0,
|
||||
BACO_SEQ_MSR,
|
||||
BACO_SEQ_BAMACO,
|
||||
BACO_SEQ_ULPS,
|
||||
BACO_SEQ_COUNT,
|
||||
};
|
||||
|
||||
#define MSG_MAP(msg, index, valid_in_vf) \
|
||||
[SMU_MSG_##msg] = {1, (index), (valid_in_vf)}
|
||||
|
||||
|
@ -147,14 +147,6 @@ struct smu_11_5_power_context {
|
||||
uint32_t max_fast_ppt_limit;
|
||||
};
|
||||
|
||||
enum smu_v11_0_baco_seq {
|
||||
BACO_SEQ_BACO = 0,
|
||||
BACO_SEQ_MSR,
|
||||
BACO_SEQ_BAMACO,
|
||||
BACO_SEQ_ULPS,
|
||||
BACO_SEQ_COUNT,
|
||||
};
|
||||
|
||||
#if defined(SWSMU_CODE_LAYER_L2) || defined(SWSMU_CODE_LAYER_L3)
|
||||
|
||||
int smu_v11_0_init_microcode(struct smu_context *smu);
|
||||
@ -257,7 +249,7 @@ int smu_v11_0_baco_enter(struct smu_context *smu);
|
||||
int smu_v11_0_baco_exit(struct smu_context *smu);
|
||||
|
||||
int smu_v11_0_baco_set_armd3_sequence(struct smu_context *smu,
|
||||
enum smu_v11_0_baco_seq baco_seq);
|
||||
enum smu_baco_seq baco_seq);
|
||||
|
||||
int smu_v11_0_mode1_reset(struct smu_context *smu);
|
||||
|
||||
|
@ -124,14 +124,6 @@ struct smu_13_0_power_context {
|
||||
enum smu_13_0_power_state power_state;
|
||||
};
|
||||
|
||||
enum smu_v13_0_baco_seq {
|
||||
BACO_SEQ_BACO = 0,
|
||||
BACO_SEQ_MSR,
|
||||
BACO_SEQ_BAMACO,
|
||||
BACO_SEQ_ULPS,
|
||||
BACO_SEQ_COUNT,
|
||||
};
|
||||
|
||||
#if defined(SWSMU_CODE_LAYER_L2) || defined(SWSMU_CODE_LAYER_L3)
|
||||
|
||||
int smu_v13_0_init_microcode(struct smu_context *smu);
|
||||
@ -218,6 +210,9 @@ int smu_v13_0_set_azalia_d3_pme(struct smu_context *smu);
|
||||
int smu_v13_0_get_max_sustainable_clocks_by_dc(struct smu_context *smu,
|
||||
struct pp_smu_nv_clock_table *max_clocks);
|
||||
|
||||
int smu_v13_0_baco_set_armd3_sequence(struct smu_context *smu,
|
||||
enum smu_baco_seq baco_seq);
|
||||
|
||||
bool smu_v13_0_baco_is_support(struct smu_context *smu);
|
||||
|
||||
enum smu_baco_state smu_v13_0_baco_get_state(struct smu_context *smu);
|
||||
|
@ -379,6 +379,10 @@ static void sienna_cichlid_check_bxco_support(struct smu_context *smu)
|
||||
((adev->pdev->device == 0x73BF) &&
|
||||
(adev->pdev->revision == 0xCF)) ||
|
||||
((adev->pdev->device == 0x7422) &&
|
||||
(adev->pdev->revision == 0x00)) ||
|
||||
((adev->pdev->device == 0x73A3) &&
|
||||
(adev->pdev->revision == 0x00)) ||
|
||||
((adev->pdev->device == 0x73E3) &&
|
||||
(adev->pdev->revision == 0x00)))
|
||||
smu_baco->platform_support = false;
|
||||
|
||||
|
@ -1576,7 +1576,7 @@ int smu_v11_0_set_azalia_d3_pme(struct smu_context *smu)
|
||||
}
|
||||
|
||||
int smu_v11_0_baco_set_armd3_sequence(struct smu_context *smu,
|
||||
enum smu_v11_0_baco_seq baco_seq)
|
||||
enum smu_baco_seq baco_seq)
|
||||
{
|
||||
return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_ArmD3, baco_seq, NULL);
|
||||
}
|
||||
|
@ -2230,6 +2230,15 @@ int smu_v13_0_gfx_ulv_control(struct smu_context *smu,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int smu_v13_0_baco_set_armd3_sequence(struct smu_context *smu,
|
||||
enum smu_baco_seq baco_seq)
|
||||
{
|
||||
return smu_cmn_send_smc_msg_with_param(smu,
|
||||
SMU_MSG_ArmD3,
|
||||
baco_seq,
|
||||
NULL);
|
||||
}
|
||||
|
||||
bool smu_v13_0_baco_is_support(struct smu_context *smu)
|
||||
{
|
||||
struct smu_baco_context *smu_baco = &smu->smu_baco;
|
||||
|
@ -120,6 +120,7 @@ static struct cmn2asic_msg_mapping smu_v13_0_0_message_map[SMU_MSG_MAX_COUNT] =
|
||||
MSG_MAP(Mode1Reset, PPSMC_MSG_Mode1Reset, 0),
|
||||
MSG_MAP(PrepareMp1ForUnload, PPSMC_MSG_PrepareMp1ForUnload, 0),
|
||||
MSG_MAP(DFCstateControl, PPSMC_MSG_SetExternalClientDfCstateAllow, 0),
|
||||
MSG_MAP(ArmD3, PPSMC_MSG_ArmD3, 0),
|
||||
};
|
||||
|
||||
static struct cmn2asic_mapping smu_v13_0_0_clk_map[SMU_CLK_COUNT] = {
|
||||
@ -1566,6 +1567,31 @@ static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static int smu_v13_0_0_baco_enter(struct smu_context *smu)
|
||||
{
|
||||
struct smu_baco_context *smu_baco = &smu->smu_baco;
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
|
||||
if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev))
|
||||
return smu_v13_0_baco_set_armd3_sequence(smu,
|
||||
smu_baco->maco_support ? BACO_SEQ_BAMACO : BACO_SEQ_BACO);
|
||||
else
|
||||
return smu_v13_0_baco_enter(smu);
|
||||
}
|
||||
|
||||
static int smu_v13_0_0_baco_exit(struct smu_context *smu)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
|
||||
if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) {
|
||||
/* Wait for PMFW handling for the Dstate change */
|
||||
usleep_range(10000, 11000);
|
||||
return smu_v13_0_baco_set_armd3_sequence(smu, BACO_SEQ_ULPS);
|
||||
} else {
|
||||
return smu_v13_0_baco_exit(smu);
|
||||
}
|
||||
}
|
||||
|
||||
static bool smu_v13_0_0_is_mode1_reset_supported(struct smu_context *smu)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
@ -1827,8 +1853,8 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {
|
||||
.baco_is_support = smu_v13_0_baco_is_support,
|
||||
.baco_get_state = smu_v13_0_baco_get_state,
|
||||
.baco_set_state = smu_v13_0_baco_set_state,
|
||||
.baco_enter = smu_v13_0_baco_enter,
|
||||
.baco_exit = smu_v13_0_baco_exit,
|
||||
.baco_enter = smu_v13_0_0_baco_enter,
|
||||
.baco_exit = smu_v13_0_0_baco_exit,
|
||||
.mode1_reset_is_support = smu_v13_0_0_is_mode1_reset_supported,
|
||||
.mode1_reset = smu_v13_0_mode1_reset,
|
||||
.set_mp1_state = smu_v13_0_0_set_mp1_state,
|
||||
|
@ -122,6 +122,7 @@ static struct cmn2asic_msg_mapping smu_v13_0_7_message_map[SMU_MSG_MAX_COUNT] =
|
||||
MSG_MAP(PrepareMp1ForUnload, PPSMC_MSG_PrepareMp1ForUnload, 0),
|
||||
MSG_MAP(SetMGpuFanBoostLimitRpm, PPSMC_MSG_SetMGpuFanBoostLimitRpm, 0),
|
||||
MSG_MAP(DFCstateControl, PPSMC_MSG_SetExternalClientDfCstateAllow, 0),
|
||||
MSG_MAP(ArmD3, PPSMC_MSG_ArmD3, 0),
|
||||
};
|
||||
|
||||
static struct cmn2asic_mapping smu_v13_0_7_clk_map[SMU_CLK_COUNT] = {
|
||||
@ -1578,6 +1579,31 @@ static int smu_v13_0_7_set_mp1_state(struct smu_context *smu,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int smu_v13_0_7_baco_enter(struct smu_context *smu)
|
||||
{
|
||||
struct smu_baco_context *smu_baco = &smu->smu_baco;
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
|
||||
if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev))
|
||||
return smu_v13_0_baco_set_armd3_sequence(smu,
|
||||
smu_baco->maco_support ? BACO_SEQ_BAMACO : BACO_SEQ_BACO);
|
||||
else
|
||||
return smu_v13_0_baco_enter(smu);
|
||||
}
|
||||
|
||||
static int smu_v13_0_7_baco_exit(struct smu_context *smu)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
|
||||
if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) {
|
||||
/* Wait for PMFW handling for the Dstate change */
|
||||
usleep_range(10000, 11000);
|
||||
return smu_v13_0_baco_set_armd3_sequence(smu, BACO_SEQ_ULPS);
|
||||
} else {
|
||||
return smu_v13_0_baco_exit(smu);
|
||||
}
|
||||
}
|
||||
|
||||
static bool smu_v13_0_7_is_mode1_reset_supported(struct smu_context *smu)
|
||||
{
|
||||
struct amdgpu_device *adev = smu->adev;
|
||||
@ -1655,8 +1681,8 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
|
||||
.baco_is_support = smu_v13_0_baco_is_support,
|
||||
.baco_get_state = smu_v13_0_baco_get_state,
|
||||
.baco_set_state = smu_v13_0_baco_set_state,
|
||||
.baco_enter = smu_v13_0_baco_enter,
|
||||
.baco_exit = smu_v13_0_baco_exit,
|
||||
.baco_enter = smu_v13_0_7_baco_enter,
|
||||
.baco_exit = smu_v13_0_7_baco_exit,
|
||||
.mode1_reset_is_support = smu_v13_0_7_is_mode1_reset_supported,
|
||||
.mode1_reset = smu_v13_0_mode1_reset,
|
||||
.set_mp1_state = smu_v13_0_7_set_mp1_state,
|
||||
|
Loading…
x
Reference in New Issue
Block a user