diff options
| author | Dmytro Laktyushkin <dmytro.laktyushkin@amd.com> | 2025-11-07 19:25:42 -0500 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2025-12-08 13:56:40 -0500 |
| commit | def3488eb0fdb386044aced1a8fb2592b1e68896 (patch) | |
| tree | ef1da68fb184779a35f154fdea0aaa2d97019b5e /drivers/gpu/drm/amd/display/dc/dce | |
| parent | 6afc422e1a49d18b63f7042fb1cb6f519a972c8a (diff) | |
| download | linux-next-def3488eb0fdb386044aced1a8fb2592b1e68896.tar.gz linux-next-def3488eb0fdb386044aced1a8fb2592b1e68896.zip | |
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: Dillon Varone <dillon.varone@amd.com>
Signed-off-by: Dmytro Laktyushkin <dmytro.laktyushkin@amd.com>
Signed-off-by: Roman Li <roman.li@amd.com>
Tested-by: Dan Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/display/dc/dce')
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c | 47 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h | 8 |
2 files changed, 49 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c index 87dbb8d7ed27..b44c364519dc 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c @@ -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; diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h index c58b69bc319b..9ba533aa6f88 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h @@ -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__ */ |
