diff options
Diffstat (limited to 'drivers/gpu/drm/amd/display')
19 files changed, 152 insertions, 25 deletions
| diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index e4b33c67b634..df9338257ae0 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -2196,6 +2196,7 @@ void amdgpu_dm_update_connector_after_detect(  			drm_connector_update_edid_property(connector,  							   aconnector->edid); +			drm_add_edid_modes(connector, aconnector->edid);  			if (aconnector->dc_link->aux_mode)  				drm_dp_cec_set_edid(&aconnector->dm_dp_aux.aux, diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c index 078b7e344185..2d5c7daaee23 100644 --- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c +++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c @@ -1108,6 +1108,18 @@ static enum bp_result bios_parser_enable_disp_power_gating(  		action);  } +static enum bp_result bios_parser_enable_lvtma_control( +	struct dc_bios *dcb, +	uint8_t uc_pwr_on) +{ +	struct bios_parser *bp = BP_FROM_DCB(dcb); + +	if (!bp->cmd_tbl.enable_lvtma_control) +		return BP_RESULT_FAILURE; + +	return bp->cmd_tbl.enable_lvtma_control(bp, uc_pwr_on); +} +  static bool bios_parser_is_accelerated_mode(  	struct dc_bios *dcb)  { @@ -2208,7 +2220,9 @@ static const struct dc_vbios_funcs vbios_funcs = {  	.get_board_layout_info = bios_get_board_layout_info,  	.pack_data_tables = bios_parser_pack_data_tables, -	.get_atom_dc_golden_table = bios_get_atom_dc_golden_table +	.get_atom_dc_golden_table = bios_get_atom_dc_golden_table, + +	.enable_lvtma_control = bios_parser_enable_lvtma_control  };  static bool bios_parser2_construct( diff --git a/drivers/gpu/drm/amd/display/dc/bios/command_table2.c b/drivers/gpu/drm/amd/display/dc/bios/command_table2.c index bed91572f82a..eb3ae5c3677c 100644 --- a/drivers/gpu/drm/amd/display/dc/bios/command_table2.c +++ b/drivers/gpu/drm/amd/display/dc/bios/command_table2.c @@ -904,6 +904,33 @@ static unsigned int get_smu_clock_info_v3_1(struct bios_parser *bp, uint8_t id)  	return 0;  } +/****************************************************************************** + ****************************************************************************** + ** + **                  LVTMA CONTROL + ** + ****************************************************************************** + *****************************************************************************/ + +static enum bp_result enable_lvtma_control( +	struct bios_parser *bp, +	uint8_t uc_pwr_on); + +static void init_enable_lvtma_control(struct bios_parser *bp) +{ +	/* TODO add switch for table vrsion */ +	bp->cmd_tbl.enable_lvtma_control = enable_lvtma_control; + +} + +static enum bp_result enable_lvtma_control( +	struct bios_parser *bp, +	uint8_t uc_pwr_on) +{ +	enum bp_result result = BP_RESULT_FAILURE; +	return result; +} +  void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp)  {  	init_dig_encoder_control(bp); @@ -919,4 +946,5 @@ void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp)  	init_set_dce_clock(bp);  	init_get_smu_clock_info(bp); +	init_enable_lvtma_control(bp);  } diff --git a/drivers/gpu/drm/amd/display/dc/bios/command_table2.h b/drivers/gpu/drm/amd/display/dc/bios/command_table2.h index 7a2af24dfe60..7bdce013cde5 100644 --- a/drivers/gpu/drm/amd/display/dc/bios/command_table2.h +++ b/drivers/gpu/drm/amd/display/dc/bios/command_table2.h @@ -94,7 +94,8 @@ struct cmd_tbl {  		struct bp_set_dce_clock_parameters *bp_params);  	unsigned int (*get_smu_clock_info)(  			struct bios_parser *bp, uint8_t id); - +	enum bp_result (*enable_lvtma_control)(struct bios_parser *bp, +			uint8_t uc_pwr_on);  };  void dal_firmware_parser_init_cmd_tbl(struct bios_parser *bp); diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c index 4bd6e03a7ef3..117d8aaf2a9b 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c @@ -3286,12 +3286,11 @@ void core_link_disable_stream(struct pipe_ctx *pipe_ctx)  		core_link_set_avmute(pipe_ctx, true);  	} +	dc->hwss.blank_stream(pipe_ctx);  #if defined(CONFIG_DRM_AMD_DC_HDCP)  	update_psp_stream_config(pipe_ctx, true);  #endif -	dc->hwss.blank_stream(pipe_ctx); -  	if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST)  		deallocate_mst_payload(pipe_ctx); diff --git a/drivers/gpu/drm/amd/display/dc/dc_bios_types.h b/drivers/gpu/drm/amd/display/dc/dc_bios_types.h index d06d07042a12..0811f941f430 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_bios_types.h +++ b/drivers/gpu/drm/amd/display/dc/dc_bios_types.h @@ -136,6 +136,10 @@ struct dc_vbios_funcs {  	enum bp_result (*get_atom_dc_golden_table)(  			struct dc_bios *dcb); + +	enum bp_result (*enable_lvtma_control)( +		struct dc_bios *bios, +		uint8_t uc_pwr_on);  };  struct bios_registers { diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_panel_cntl.h b/drivers/gpu/drm/amd/display/dc/dce/dce_panel_cntl.h index 70ec691e14d2..99c68ca9c7e0 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_panel_cntl.h +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_panel_cntl.h @@ -49,7 +49,7 @@  #define DCN_PANEL_CNTL_REG_LIST()\  	DCN_PANEL_CNTL_SR(PWRSEQ_CNTL, LVTMA), \  	DCN_PANEL_CNTL_SR(PWRSEQ_STATE, LVTMA), \ -	DCE_PANEL_CNTL_SR(PWRSEQ_REF_DIV, LVTMA), \ +	DCN_PANEL_CNTL_SR(PWRSEQ_REF_DIV, LVTMA), \  	SR(BL_PWM_CNTL), \  	SR(BL_PWM_CNTL2), \  	SR(BL_PWM_PERIOD_CNTL), \ diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c index 49380ed3aeae..45c9e9027886 100644 --- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c @@ -842,6 +842,17 @@ void dce110_edp_power_control(  		cntl.coherent = false;  		cntl.lanes_number = LANE_COUNT_FOUR;  		cntl.hpd_sel = link->link_enc->hpd_source; + +		if (ctx->dc->ctx->dmub_srv && +				ctx->dc->debug.dmub_command_table) { +			if (cntl.action == TRANSMITTER_CONTROL_POWER_ON) +				bp_result = ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios, +						LVTMA_CONTROL_POWER_ON); +			else +				bp_result = ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios, +						LVTMA_CONTROL_POWER_OFF); +		} +  		bp_result = link_transmitter_control(ctx->dc_bios, &cntl);  		if (!power_up) @@ -919,8 +930,21 @@ void dce110_edp_backlight_control(  		/*edp 1.2*/  	if (cntl.action == TRANSMITTER_CONTROL_BACKLIGHT_ON)  		edp_receiver_ready_T7(link); + +	if (ctx->dc->ctx->dmub_srv && +			ctx->dc->debug.dmub_command_table) { +		if (cntl.action == TRANSMITTER_CONTROL_BACKLIGHT_ON) +			ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios, +					LVTMA_CONTROL_LCD_BLON); +		else +			ctx->dc_bios->funcs->enable_lvtma_control(ctx->dc_bios, +					LVTMA_CONTROL_LCD_BLOFF); +	} +  	link_transmitter_control(ctx->dc_bios, &cntl); + +  	if (enable && link->dpcd_sink_ext_caps.bits.oled)  		msleep(OLED_POST_T7_DELAY); diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c index 07b2f9399671..842abb4c475b 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c @@ -121,35 +121,35 @@ void enc1_update_generic_info_packet(  	switch (packet_index) {  	case 0:  		REG_UPDATE(AFMT_VBI_PACKET_CONTROL1, -				AFMT_GENERIC0_FRAME_UPDATE, 1); +				AFMT_GENERIC0_IMMEDIATE_UPDATE, 1);  		break;  	case 1:  		REG_UPDATE(AFMT_VBI_PACKET_CONTROL1, -				AFMT_GENERIC1_FRAME_UPDATE, 1); +				AFMT_GENERIC1_IMMEDIATE_UPDATE, 1);  		break;  	case 2:  		REG_UPDATE(AFMT_VBI_PACKET_CONTROL1, -				AFMT_GENERIC2_FRAME_UPDATE, 1); +				AFMT_GENERIC2_IMMEDIATE_UPDATE, 1);  		break;  	case 3:  		REG_UPDATE(AFMT_VBI_PACKET_CONTROL1, -				AFMT_GENERIC3_FRAME_UPDATE, 1); +				AFMT_GENERIC3_IMMEDIATE_UPDATE, 1);  		break;  	case 4:  		REG_UPDATE(AFMT_VBI_PACKET_CONTROL1, -				AFMT_GENERIC4_FRAME_UPDATE, 1); +				AFMT_GENERIC4_IMMEDIATE_UPDATE, 1);  		break;  	case 5:  		REG_UPDATE(AFMT_VBI_PACKET_CONTROL1, -				AFMT_GENERIC5_FRAME_UPDATE, 1); +				AFMT_GENERIC5_IMMEDIATE_UPDATE, 1);  		break;  	case 6:  		REG_UPDATE(AFMT_VBI_PACKET_CONTROL1, -				AFMT_GENERIC6_FRAME_UPDATE, 1); +				AFMT_GENERIC6_IMMEDIATE_UPDATE, 1);  		break;  	case 7:  		REG_UPDATE(AFMT_VBI_PACKET_CONTROL1, -				AFMT_GENERIC7_FRAME_UPDATE, 1); +				AFMT_GENERIC7_IMMEDIATE_UPDATE, 1);  		break;  	default:  		break; diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h index ed385b1477be..30eae7459d50 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.h @@ -281,7 +281,14 @@ struct dcn10_stream_enc_registers {  	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC2_FRAME_UPDATE, mask_sh),\  	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC3_FRAME_UPDATE, mask_sh),\  	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC4_FRAME_UPDATE, mask_sh),\ +	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC0_IMMEDIATE_UPDATE, mask_sh),\ +	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC1_IMMEDIATE_UPDATE, mask_sh),\ +	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC2_IMMEDIATE_UPDATE, mask_sh),\ +	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC3_IMMEDIATE_UPDATE, mask_sh),\  	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC4_IMMEDIATE_UPDATE, mask_sh),\ +	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC5_IMMEDIATE_UPDATE, mask_sh),\ +	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC6_IMMEDIATE_UPDATE, mask_sh),\ +	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC7_IMMEDIATE_UPDATE, mask_sh),\  	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC5_FRAME_UPDATE, mask_sh),\  	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC6_FRAME_UPDATE, mask_sh),\  	SE_SF(DIG0_AFMT_VBI_PACKET_CONTROL1, AFMT_GENERIC7_FRAME_UPDATE, mask_sh),\ @@ -345,7 +352,14 @@ struct dcn10_stream_enc_registers {  	type AFMT_GENERIC2_FRAME_UPDATE;\  	type AFMT_GENERIC3_FRAME_UPDATE;\  	type AFMT_GENERIC4_FRAME_UPDATE;\ +	type AFMT_GENERIC0_IMMEDIATE_UPDATE;\ +	type AFMT_GENERIC1_IMMEDIATE_UPDATE;\ +	type AFMT_GENERIC2_IMMEDIATE_UPDATE;\ +	type AFMT_GENERIC3_IMMEDIATE_UPDATE;\  	type AFMT_GENERIC4_IMMEDIATE_UPDATE;\ +	type AFMT_GENERIC5_IMMEDIATE_UPDATE;\ +	type AFMT_GENERIC6_IMMEDIATE_UPDATE;\ +	type AFMT_GENERIC7_IMMEDIATE_UPDATE;\  	type AFMT_GENERIC5_FRAME_UPDATE;\  	type AFMT_GENERIC6_FRAME_UPDATE;\  	type AFMT_GENERIC7_FRAME_UPDATE;\ diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c index 66180b4332f1..c8cfd3ba1c15 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c @@ -1457,8 +1457,8 @@ static void dcn20_update_dchubp_dpp(  	/* Any updates are handled in dc interface, just need to apply existing for plane enable */  	if ((pipe_ctx->update_flags.bits.enable || pipe_ctx->update_flags.bits.opp_changed || -			pipe_ctx->update_flags.bits.scaler || pipe_ctx->update_flags.bits.viewport) -			&& pipe_ctx->stream->cursor_attributes.address.quad_part != 0) { +			pipe_ctx->update_flags.bits.scaler || viewport_changed == true) && +			pipe_ctx->stream->cursor_attributes.address.quad_part != 0) {  		dc->hwss.set_cursor_position(pipe_ctx);  		dc->hwss.set_cursor_attribute(pipe_ctx); diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_link_encoder.h index bf0044f7417e..dcbf28dd72d4 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_link_encoder.h +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_link_encoder.h @@ -167,7 +167,9 @@  	LE_SF(DCIO_SOFT_RESET, UNIPHYB_SOFT_RESET, mask_sh),\  	LE_SF(DCIO_SOFT_RESET, UNIPHYC_SOFT_RESET, mask_sh),\  	LE_SF(DCIO_SOFT_RESET, UNIPHYD_SOFT_RESET, mask_sh),\ -	LE_SF(DCIO_SOFT_RESET, UNIPHYE_SOFT_RESET, mask_sh) +	LE_SF(DCIO_SOFT_RESET, UNIPHYE_SOFT_RESET, mask_sh),\ +	LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL6, RDPCS_PHY_DPALT_DP4, mask_sh),\ +	LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL6, RDPCS_PHY_DPALT_DISABLE, mask_sh)  #define LINK_ENCODER_MASK_SH_LIST_DCN20(mask_sh)\  	LINK_ENCODER_MASK_SH_LIST_DCN10(mask_sh),\ diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c index 790baf552695..9140b3fc767a 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c @@ -3141,7 +3141,7 @@ static bool dcn20_validate_bandwidth_internal(struct dc *dc, struct dc_state *co  	int vlevel = 0;  	int pipe_split_from[MAX_PIPES];  	int pipe_cnt = 0; -	display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_KERNEL); +	display_e2e_pipe_params_st *pipes = kzalloc(dc->res_pool->pipe_count * sizeof(display_e2e_pipe_params_st), GFP_ATOMIC);  	DC_LOGGER_INIT(dc->ctx->logger);  	BW_VAL_TRACE_COUNT(); diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.h index 8e9fd59ccde8..2fbf879cd327 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.h +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dio_link_encoder.h @@ -61,7 +61,10 @@  	DPCS_DCN2_MASK_SH_LIST(mask_sh),\  	LE_SF(DPCSTX0_DPCSTX_TX_CNTL, DPCS_TX_DATA_ORDER_INVERT_18_BIT, mask_sh),\  	LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL0, RDPCS_PHY_TX_VBOOST_LVL, mask_sh),\ -	LE_SF(RDPCSTX0_RDPCSTX_CLOCK_CNTL, RDPCS_TX_CLK_EN, mask_sh) +	LE_SF(RDPCSTX0_RDPCSTX_CLOCK_CNTL, RDPCS_TX_CLK_EN, mask_sh),\ +	LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL6, RDPCS_PHY_DPALT_DP4, mask_sh),\ +	LE_SF(RDPCSTX0_RDPCSTX_PHY_CNTL6, RDPCS_PHY_DPALT_DISABLE, mask_sh) +  void dcn30_link_encoder_construct(  	struct dcn20_link_encoder *enc20, diff --git a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c index 653a571e366d..ebe0cc5b833b 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn30/dcn30_resource.c @@ -491,6 +491,7 @@ static const struct dcn10_link_enc_hpd_registers link_enc_hpd_regs[] = {  [id] = {\  	LE_DCN3_REG_LIST(id), \  	UNIPHY_DCN2_REG_LIST(phyid), \ +	SRI(DP_DPHY_INTERNAL_CTRL, DP, id) \  }  static const struct dce110_aux_registers_shift aux_shift = { diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c b/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c index b54814f11b74..2beb284f89b0 100644 --- a/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c +++ b/drivers/gpu/drm/amd/display/dc/dml/dcn30/display_mode_vba_30.c @@ -63,6 +63,7 @@ typedef struct {  #define BPP_INVALID 0  #define BPP_BLENDED_PIPE 0xffffffff +#define DCN30_MAX_DSC_IMAGE_WIDTH 5184  static void DisplayPipeConfiguration(struct display_mode_lib *mode_lib);  static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerformanceCalculation( @@ -3984,6 +3985,9 @@ void dml30_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l  				} else if (v->PlaneRequiredDISPCLKWithoutODMCombine > v->MaxDispclkRoundedDownToDFSGranularity) {  					v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_2to1;  					v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine2To1; +				} else if (v->DSCEnabled[k] && (v->HActive[k] > DCN30_MAX_DSC_IMAGE_WIDTH)) { +					v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_2to1; +					v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithODMCombine2To1;  				} else {  					v->ODMCombineEnablePerState[i][k] = dm_odm_combine_mode_disabled;  					v->PlaneRequiredDISPCLK = v->PlaneRequiredDISPCLKWithoutODMCombine; diff --git a/drivers/gpu/drm/amd/display/include/bios_parser_types.h b/drivers/gpu/drm/amd/display/include/bios_parser_types.h index c30437ae8395..21011edea337 100644 --- a/drivers/gpu/drm/amd/display/include/bios_parser_types.h +++ b/drivers/gpu/drm/amd/display/include/bios_parser_types.h @@ -101,6 +101,13 @@ enum bp_pipe_control_action {  	ASIC_PIPE_INIT  }; +enum bp_lvtma_control_action { +	LVTMA_CONTROL_LCD_BLOFF = 2, +	LVTMA_CONTROL_LCD_BLON = 3, +	LVTMA_CONTROL_POWER_ON = 12, +	LVTMA_CONTROL_POWER_OFF = 13 +}; +  struct bp_encoder_control {  	enum bp_encoder_control_action action;  	enum engine_id engine_id; diff --git a/drivers/gpu/drm/amd/display/include/fixed31_32.h b/drivers/gpu/drm/amd/display/include/fixed31_32.h index 89ef9f6860e5..16df2a485dd0 100644 --- a/drivers/gpu/drm/amd/display/include/fixed31_32.h +++ b/drivers/gpu/drm/amd/display/include/fixed31_32.h @@ -431,6 +431,9 @@ struct fixed31_32 dc_fixpt_log(struct fixed31_32 arg);   */  static inline struct fixed31_32 dc_fixpt_pow(struct fixed31_32 arg1, struct fixed31_32 arg2)  { +	if (arg1.value == 0) +		return arg2.value == 0 ? dc_fixpt_one : dc_fixpt_zero; +  	return dc_fixpt_exp(  		dc_fixpt_mul(  			dc_fixpt_log(arg1), diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c index 81820f3d6b3b..d988533d4af5 100644 --- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c @@ -324,22 +324,44 @@ static void apply_below_the_range(struct core_freesync *core_freesync,  		/* Choose number of frames to insert based on how close it  		 * can get to the mid point of the variable range. +		 *  - Delta for CEIL: delta_from_mid_point_in_us_1 +		 *  - Delta for FLOOR: delta_from_mid_point_in_us_2  		 */ -		if ((frame_time_in_us / mid_point_frames_ceil) > in_out_vrr->min_duration_in_us && -				(delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2 || -						mid_point_frames_floor < 2)) { +		if ((last_render_time_in_us / mid_point_frames_ceil) < in_out_vrr->min_duration_in_us) { +			/* Check for out of range. +			 * If using CEIL produces a value that is out of range, +			 * then we are forced to use FLOOR. +			 */ +			frames_to_insert = mid_point_frames_floor; +		} else if (mid_point_frames_floor < 2) { +			/* Check if FLOOR would result in non-LFC. In this case +			 * choose to use CEIL +			 */ +			frames_to_insert = mid_point_frames_ceil; +		} else if (delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2) { +			/* If choosing CEIL results in a frame duration that is +			 * closer to the mid point of the range. +			 * Choose CEIL +			 */  			frames_to_insert = mid_point_frames_ceil; -			delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_2 - -					delta_from_mid_point_in_us_1;  		} else { +			/* If choosing FLOOR results in a frame duration that is +			 * closer to the mid point of the range. +			 * Choose FLOOR +			 */  			frames_to_insert = mid_point_frames_floor; -			delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_1 - -					delta_from_mid_point_in_us_2;  		}  		/* Prefer current frame multiplier when BTR is enabled unless it drifts  		 * too far from the midpoint  		 */ +		if (delta_from_mid_point_in_us_1 < delta_from_mid_point_in_us_2) { +			delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_2 - +					delta_from_mid_point_in_us_1; +		} else { +			delta_from_mid_point_delta_in_us = delta_from_mid_point_in_us_1 - +					delta_from_mid_point_in_us_2; +		}  		if (in_out_vrr->btr.frames_to_insert != 0 &&  				delta_from_mid_point_delta_in_us < BTR_DRIFT_MARGIN) {  			if (((last_render_time_in_us / in_out_vrr->btr.frames_to_insert) < | 
