]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: Implement HDMI Read Request
authorChris Park <chris.park@amd.com>
Mon, 31 Mar 2025 20:04:55 +0000 (16:04 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 21 Apr 2025 15:27:25 +0000 (11:27 -0400)
[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>
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/dc/dc_types.h
drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c
drivers/gpu/drm/amd/display/dc/irq_types.h
drivers/gpu/drm/amd/display/dc/link/link_factory.c
drivers/gpu/drm/amd/display/include/gpio_service_interface.h

index 7624b909497eea7f723485a1c6a8bac05c85c501..04b1c7b331a6eabe52380d51cc64e68e4ee22efb 100644 (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;
index 9bfa9ac1b05f5a8dba76509667564757ddaa254c..ab1adc836018e65019e80e98031a1d3b8a4a71b6 100644 (file)
@@ -210,6 +210,7 @@ struct dc_edid_caps {
 
        bool edid_hdmi;
        bool hdr_supported;
+       bool rr_capable;
 
        struct dc_panel_patch panel_patch;
 };
index b099989d9364f64fc330e1dad3f3af02e173ebdd..942d9f0b6df254f0ad79f6dcbc8ff8cd9d4b9552 100644 (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)
index eadab0a2afebe74c4fcdf8b7a7b27c1aef740ac5..a2f7b933bebf9b0514298b52a0a1ae391553f5a5 100644 (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
 };
 
index 70f54bdbbc64ece17baa7c9139947b63bc0ece9d..0125f2cfc114aa18aeba2d12fde6b83b426c4408 100644 (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:
index 7e3240e73c1fcd4e636433b6b419775b3349bf61..63813009a3a680ec39638bac09484467683fc5e8 100644 (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);