Commit e42ce136 authored by Dillon Varone's avatar Dillon Varone Committed by Alex Deucher
Browse files

drm/amd/display: Fix USBC link creation



[Description]

Add USBC connector ID to align with new VBIOS parsing.

Add seperate DCN321 link encoder due to different PHY version affecting
DP ALT related registers.

Signed-off-by: default avatarDillon Varone <dillon.varone@amd.com>
Acked-by: default avatarJerry Zuo <jerry.zuo@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 543036a2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3224,6 +3224,7 @@ static enum bp_result update_slot_layout_info_v2(
		break;

	case CONNECTOR_ID_DISPLAY_PORT:
	case CONNECTOR_ID_USBC:
		if (record->mini_type == MINI_TYPE_NORMAL) {
			slot_layout_info->connectors[i].connector_type = CONNECTOR_LAYOUT_TYPE_DP;
			slot_layout_info->connectors[i].length = CONNECTOR_SIZE_DP;
+2 −2
Original line number Diff line number Diff line
@@ -522,8 +522,8 @@ static enum bp_result transmitter_control_v2(
		 */
		params.acConfig.ucEncoderSel = 1;

	if (CONNECTOR_ID_DISPLAY_PORT == connector_id
		|| CONNECTOR_ID_USBC == connector_id)
	if (CONNECTOR_ID_DISPLAY_PORT == connector_id ||
	    CONNECTOR_ID_USBC == connector_id)
		/* Bit4: DP connector flag
		 * =0 connector is none-DP connector
		 * =1 connector is DP connector
+6 −0
Original line number Diff line number Diff line
@@ -167,6 +167,7 @@ struct dcn10_link_enc_registers {
	uint32_t DIO_LINKD_CNTL;
	uint32_t DIO_LINKE_CNTL;
	uint32_t DIO_LINKF_CNTL;
	uint32_t DIG_FIFO_CTRL0;
};

#define LE_SF(reg_name, field_name, post_fix)\
@@ -472,11 +473,15 @@ struct dcn10_link_enc_registers {
	type HPO_DP_ENC_SEL;\
	type HPO_HDMI_ENC_SEL

#define DCN32_LINK_ENCODER_REG_FIELD_LIST(type) \
	type DIG_FIFO_OUTPUT_PIXEL_MODE

struct dcn10_link_enc_shift {
	DCN_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
	DCN20_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
	DCN30_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
	DCN31_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
	DCN32_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
};

struct dcn10_link_enc_mask {
@@ -484,6 +489,7 @@ struct dcn10_link_enc_mask {
	DCN20_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
	DCN30_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
	DCN31_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
	DCN32_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
};

struct dcn10_link_encoder {
+3 −0
Original line number Diff line number Diff line
@@ -659,6 +659,9 @@ void enc1_stream_encoder_send_immediate_sdp_message(
void enc1_stream_encoder_stop_dp_info_packets(
	struct stream_encoder *enc);

void enc1_stream_encoder_reset_fifo(
	struct stream_encoder *enc);

void enc1_stream_encoder_dp_blank(
	struct dc_link *link,
	struct stream_encoder *enc);
+13 −2
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#include "stream_encoder.h"
#include "i2caux_interface.h"
#include "dc_bios_types.h"
#include "link_enc_cfg.h"

#include "gpio_service_interface.h"

@@ -125,7 +126,7 @@ bool dcn32_link_encoder_is_in_alt_mode(struct link_encoder *enc)

	if (enc->features.flags.bits.DP_IS_USB_C) {
		/* if value == 1 alt mode is disabled, otherwise it is enabled */
		//REG_GET(RDPCSTX_PHY_CNTL6, RDPCS_PHY_DPALT_DISABLE, &dp_alt_mode_disable);
		REG_GET(RDPCSPIPE_PHY_CNTL6, RDPCS_PHY_DPALT_DISABLE, &dp_alt_mode_disable);
		is_usb_c_alt_mode = (dp_alt_mode_disable == 0);
	}

@@ -142,13 +143,19 @@ void dcn32_link_encoder_get_max_link_cap(struct link_encoder *enc,

	/* in usb c dp2 mode, max lane count is 2 */
	if (enc->funcs->is_in_alt_mode && enc->funcs->is_in_alt_mode(enc)) {
//		REG_GET(RDPCSTX_PHY_CNTL6, RDPCS_PHY_DPALT_DP4, &is_in_usb_c_dp4_mode);
		REG_GET(RDPCSPIPE_PHY_CNTL6, RDPCS_PHY_DPALT_DP4, &is_in_usb_c_dp4_mode);
		if (!is_in_usb_c_dp4_mode)
			link_settings->lane_count = MIN(LANE_COUNT_TWO, link_settings->lane_count);
	}

}

void enc32_set_dig_output_mode(struct link_encoder *enc, uint8_t pix_per_container)
{
	struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
	REG_UPDATE(DIG_FIFO_CTRL0, DIG_FIFO_OUTPUT_PIXEL_MODE, pix_per_container);
}
 
static const struct link_encoder_funcs dcn32_link_enc_funcs = {
	.read_state = link_enc2_read_state,
	.validate_output_with_stream =
@@ -179,6 +186,7 @@ static const struct link_encoder_funcs dcn32_link_enc_funcs = {
	.is_in_alt_mode = dcn32_link_encoder_is_in_alt_mode,
	.get_max_link_cap = dcn32_link_encoder_get_max_link_cap,
	.set_dio_phy_mux = dcn31_link_encoder_set_dio_phy_mux,
	.set_dig_output_mode = enc32_set_dig_output_mode,
};

void dcn32_link_encoder_construct(
@@ -203,6 +211,9 @@ void dcn32_link_encoder_construct(
	enc10->base.hpd_source = init_data->hpd_source;
	enc10->base.connector = init_data->connector;

	if (enc10->base.connector.id == CONNECTOR_ID_USBC)
		enc10->base.features.flags.bits.DP_IS_USB_C = 1;

	enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;

	enc10->base.features = *enc_features;
Loading