drm/amd/display: Implement HDMI Read Request

[Why]
Read Request provides alterative method to polling to
the HDMI sinks that support it.

[How]
Implement Read Request where interrupt can be generated
by the sink.

Reviewed-by: Joshua Aberback <joshua.aberback@amd.com>
Signed-off-by: Chris Park <chris.park@amd.com>
Signed-off-by: Zaeem Mohamed <zaeem.mohamed@amd.com>
Tested-by: Mark Broadworth <mark.broadworth@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Chris Park 2025-03-31 16:04:55 -04:00 committed by Alex Deucher
parent f53d0f48a8
commit 724a4b400b
6 changed files with 30 additions and 0 deletions

View File

@ -1436,6 +1436,7 @@ struct dc_scratch_space {
enum signal_type connector_signal;
enum dc_irq_source irq_source_hpd;
enum dc_irq_source irq_source_hpd_rx;/* aka DP Short Pulse */
enum dc_irq_source irq_source_read_request;/* Read Request */
bool is_hpd_filter_disabled;
bool dp_ss_off;

View File

@ -210,6 +210,7 @@ struct dc_edid_caps {
bool edid_hdmi;
bool hdr_supported;
bool rr_capable;
struct dc_panel_patch panel_patch;
};

View File

@ -411,6 +411,20 @@ enum dc_irq_source dal_irq_get_rx_source(
}
}
enum dc_irq_source dal_irq_get_read_request(
const struct gpio *irq)
{
enum gpio_id id = dal_gpio_get_id(irq);
switch (id) {
case GPIO_ID_HPD:
return (enum dc_irq_source)(DC_IRQ_SOURCE_DCI2C_RR_DDC1 +
dal_gpio_get_enum(irq));
default:
return DC_IRQ_SOURCE_INVALID;
}
}
enum gpio_result dal_irq_setup_hpd_filter(
struct gpio *irq,
struct gpio_hpd_config *config)

View File

@ -168,6 +168,13 @@ enum dc_irq_source {
DC_IRQ_SOURCE_DC5_VLINE2,
DC_IRQ_SOURCE_DC6_VLINE2,
DC_IRQ_SOURCE_DCI2C_RR_DDC1,
DC_IRQ_SOURCE_DCI2C_RR_DDC2,
DC_IRQ_SOURCE_DCI2C_RR_DDC3,
DC_IRQ_SOURCE_DCI2C_RR_DDC4,
DC_IRQ_SOURCE_DCI2C_RR_DDC5,
DC_IRQ_SOURCE_DCI2C_RR_DDC6,
DAL_IRQ_SOURCES_NUMBER
};

View File

@ -464,6 +464,7 @@ static bool construct_phy(struct dc_link *link,
link->irq_source_hpd = DC_IRQ_SOURCE_INVALID;
link->irq_source_hpd_rx = DC_IRQ_SOURCE_INVALID;
link->irq_source_read_request = DC_IRQ_SOURCE_INVALID;
link->link_status.dpcd_caps = &link->dpcd_caps;
link->dc = init_params->dc;
@ -514,6 +515,9 @@ static bool construct_phy(struct dc_link *link,
case CONNECTOR_ID_HDMI_TYPE_A:
link->connector_signal = SIGNAL_TYPE_HDMI_TYPE_A;
if (link->hpd_gpio)
link->irq_source_read_request =
dal_irq_get_read_request(link->hpd_gpio);
break;
case CONNECTOR_ID_SINGLE_LINK_DVID:
case CONNECTOR_ID_SINGLE_LINK_DVII:

View File

@ -86,6 +86,9 @@ enum dc_irq_source dal_irq_get_source(
enum dc_irq_source dal_irq_get_rx_source(
const struct gpio *irq);
enum dc_irq_source dal_irq_get_read_request(
const struct gpio *irq);
enum gpio_result dal_irq_setup_hpd_filter(
struct gpio *irq,
struct gpio_hpd_config *config);