From: Chris Park <chris.p...@amd.com>

[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.aberb...@amd.com>
Signed-off-by: Chris Park <chris.p...@amd.com>
Signed-off-by: Zaeem Mohamed <zaeem.moha...@amd.com>
---
 drivers/gpu/drm/amd/display/dc/dc.h                |  1 +
 drivers/gpu/drm/amd/display/dc/dc_types.h          |  1 +
 drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c | 14 ++++++++++++++
 drivers/gpu/drm/amd/display/dc/irq_types.h         |  7 +++++++
 drivers/gpu/drm/amd/display/dc/link/link_factory.c |  4 ++++
 .../amd/display/include/gpio_service_interface.h   |  3 +++
 6 files changed, 30 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/dc.h 
b/drivers/gpu/drm/amd/display/dc/dc.h
index 7624b909497e..04b1c7b331a6 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -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;
diff --git a/drivers/gpu/drm/amd/display/dc/dc_types.h 
b/drivers/gpu/drm/amd/display/dc/dc_types.h
index 9bfa9ac1b05f..ab1adc836018 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_types.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_types.h
@@ -210,6 +210,7 @@ struct dc_edid_caps {
 
        bool edid_hdmi;
        bool hdr_supported;
+       bool rr_capable;
 
        struct dc_panel_patch panel_patch;
 };
diff --git a/drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c 
b/drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c
index b099989d9364..942d9f0b6df2 100644
--- a/drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c
+++ b/drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c
@@ -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)
diff --git a/drivers/gpu/drm/amd/display/dc/irq_types.h 
b/drivers/gpu/drm/amd/display/dc/irq_types.h
index eadab0a2afeb..a2f7b933bebf 100644
--- a/drivers/gpu/drm/amd/display/dc/irq_types.h
+++ b/drivers/gpu/drm/amd/display/dc/irq_types.h
@@ -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
 };
 
diff --git a/drivers/gpu/drm/amd/display/dc/link/link_factory.c 
b/drivers/gpu/drm/amd/display/dc/link/link_factory.c
index 70f54bdbbc64..0125f2cfc114 100644
--- a/drivers/gpu/drm/amd/display/dc/link/link_factory.c
+++ b/drivers/gpu/drm/amd/display/dc/link/link_factory.c
@@ -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:
diff --git a/drivers/gpu/drm/amd/display/include/gpio_service_interface.h 
b/drivers/gpu/drm/amd/display/include/gpio_service_interface.h
index 7e3240e73c1f..63813009a3a6 100644
--- a/drivers/gpu/drm/amd/display/include/gpio_service_interface.h
+++ b/drivers/gpu/drm/amd/display/include/gpio_service_interface.h
@@ -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);
-- 
2.34.1

Reply via email to