Commit def3488e authored by Dmytro Laktyushkin's avatar Dmytro Laktyushkin Committed by Alex Deucher
Browse files

drm/amd/display: refactor HPD to increase flexibility



Currently all dcn revisions have to follow the same codepath for
hotplug detection. This change allows per dcn hpd handling consolidating
hpd code in link_encoder.

Reviewed-by: default avatarDillon Varone <dillon.varone@amd.com>
Signed-off-by: default avatarDmytro Laktyushkin <dmytro.laktyushkin@amd.com>
Signed-off-by: default avatarRoman Li <roman.li@amd.com>
Tested-by: default avatarDan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 6afc422e
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -1708,7 +1708,6 @@ struct dc_scratch_space {
	struct dc_link_status link_status;
	struct dprx_states dprx_states;

	struct gpio *hpd_gpio;
	enum dc_link_fec_state fec_state;
	bool is_dds;
	bool is_display_mux_present;
+46 −1
Original line number Diff line number Diff line
@@ -117,6 +117,8 @@ static const struct link_encoder_funcs dce110_lnk_enc_funcs = {
	.destroy = dce110_link_encoder_destroy,
	.get_max_link_cap = dce110_link_encoder_get_max_link_cap,
	.get_dig_frontend = dce110_get_dig_frontend,
	.get_hpd_state = dce110_get_hpd_state,
	.program_hpd_filter = dce110_program_hpd_filter,
};

static enum bp_result link_transmitter_control(
@@ -851,6 +853,7 @@ void dce110_link_encoder_construct(
	enc110->base.ctx = init_data->ctx;
	enc110->base.id = init_data->encoder;

	enc110->base.hpd_gpio = init_data->hpd_gpio;
	enc110->base.hpd_source = init_data->hpd_source;
	enc110->base.connector = init_data->connector;

@@ -1053,6 +1056,11 @@ void dce110_link_encoder_hw_init(

void dce110_link_encoder_destroy(struct link_encoder **enc)
{
	if ((*enc)->hpd_gpio) {
		dal_gpio_destroy_irq(&(*enc)->hpd_gpio);
		(*enc)->hpd_gpio = NULL;
	}

	kfree(TO_DCE110_LINK_ENC(*enc));
	*enc = NULL;
}
@@ -1751,6 +1759,40 @@ void dce110_link_encoder_get_max_link_cap(struct link_encoder *enc,
	*link_settings = max_link_cap;
}

bool dce110_get_hpd_state(struct link_encoder *enc)
{
	uint32_t state = 0;

	if (!enc->hpd_gpio)
		return false;

	dal_gpio_lock_pin(enc->hpd_gpio);
	dal_gpio_get_value(enc->hpd_gpio, &state);
	dal_gpio_unlock_pin(enc->hpd_gpio);

	return state;
}

bool dce110_program_hpd_filter(struct link_encoder *enc, int delay_on_connect_in_ms, int delay_on_disconnect_in_ms)
{
	/* Setup HPD filtering */
	if (enc->hpd_gpio && dal_gpio_lock_pin(enc->hpd_gpio) == GPIO_RESULT_OK) {
		struct gpio_hpd_config config;

		config.delay_on_connect = delay_on_connect_in_ms;
		config.delay_on_disconnect = delay_on_disconnect_in_ms;

		dal_irq_setup_hpd_filter(enc->hpd_gpio, &config);

		dal_gpio_unlock_pin(enc->hpd_gpio);

		return true;
	} else {
		ASSERT(0);
		return false;
	}
}

#if defined(CONFIG_DRM_AMD_DC_SI)
static const struct link_encoder_funcs dce60_lnk_enc_funcs = {
	.validate_output_with_stream =
@@ -1775,7 +1817,9 @@ static const struct link_encoder_funcs dce60_lnk_enc_funcs = {
	.is_dig_enabled = dce110_is_dig_enabled,
	.destroy = dce110_link_encoder_destroy,
	.get_max_link_cap = dce110_link_encoder_get_max_link_cap,
	.get_dig_frontend = dce110_get_dig_frontend
	.get_dig_frontend = dce110_get_dig_frontend,
	.get_hpd_state = dce110_get_hpd_state,
	.program_hpd_filter = dce110_program_hpd_filter,
};

void dce60_link_encoder_construct(
@@ -1794,6 +1838,7 @@ void dce60_link_encoder_construct(
	enc110->base.ctx = init_data->ctx;
	enc110->base.id = init_data->encoder;

	enc110->base.hpd_gpio = init_data->hpd_gpio;
	enc110->base.hpd_source = init_data->hpd_source;
	enc110->base.connector = init_data->connector;

+3 −5
Original line number Diff line number Diff line
@@ -130,11 +130,6 @@
	SRI(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id), \
	SR(DCI_MEM_PWR_STATUS)

#define LE_DCN10_REG_LIST(id)\
	LE_COMMON_REG_LIST_BASE(id), \
	SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \
	SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \
	SRI(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id)

struct dce110_link_enc_aux_registers {
	uint32_t AUX_CONTROL;
@@ -319,4 +314,7 @@ bool dce110_is_dig_enabled(struct link_encoder *enc);
void dce110_link_encoder_get_max_link_cap(struct link_encoder *enc,
	struct dc_link_settings *link_settings);

bool dce110_get_hpd_state(struct link_encoder *enc);
bool dce110_program_hpd_filter(struct link_encoder *enc, int delay_on_connect_in_ms, int delay_on_disconnect_in_ms);

#endif /* __DC_LINK_ENCODER__DCE110_H__ */
+3 −0
Original line number Diff line number Diff line
@@ -104,6 +104,8 @@ static const struct link_encoder_funcs dcn201_link_enc_funcs = {
	.fec_is_active = enc2_fec_is_active,
	.is_in_alt_mode = dcn201_link_encoder_is_in_alt_mode,
	.get_max_link_cap = dcn201_link_encoder_get_max_link_cap,
	.get_hpd_state = dcn10_get_hpd_state,
	.program_hpd_filter = dcn10_program_hpd_filter,
};

void dcn201_link_encoder_construct(
@@ -125,6 +127,7 @@ void dcn201_link_encoder_construct(
	enc10->base.ctx = init_data->ctx;
	enc10->base.id = init_data->encoder;

	enc10->base.hpd_gpio = init_data->hpd_gpio;
	enc10->base.hpd_source = init_data->hpd_source;
	enc10->base.connector = init_data->connector;

+3 −0
Original line number Diff line number Diff line
@@ -325,6 +325,8 @@ static const struct link_encoder_funcs dcn21_link_enc_funcs = {
	.get_dig_frontend = dcn10_get_dig_frontend,
	.is_in_alt_mode = dcn20_link_encoder_is_in_alt_mode,
	.get_max_link_cap = dcn20_link_encoder_get_max_link_cap,
	.get_hpd_state = dcn10_get_hpd_state,
	.program_hpd_filter = dcn10_program_hpd_filter,
};

void dcn21_link_encoder_construct(
@@ -346,6 +348,7 @@ void dcn21_link_encoder_construct(
	enc10->base.ctx = init_data->ctx;
	enc10->base.id = init_data->encoder;

	enc10->base.hpd_gpio = init_data->hpd_gpio;
	enc10->base.hpd_source = init_data->hpd_source;
	enc10->base.connector = init_data->connector;

Loading