The DisplayPort standard defines a special kind of HPD events called
IRQ_HPD. These events are used to notify DP Source about the events on
the Sink side.

Extend drm_connector_funcs::oob_hotplug_event() to pass the
notifications about the IRQ_HPD events down to the individual drivers,
letting them handle those as required.

Signed-off-by: Dmitry Baryshkov <[email protected]>
---
 drivers/gpu/drm/display/drm_bridge_connector.c | 17 ++++++++++-------
 drivers/gpu/drm/drm_connector.c                |  2 +-
 drivers/gpu/drm/i915/display/intel_dp.c        |  3 ++-
 include/drm/drm_connector.h                    |  3 ++-
 4 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c 
b/drivers/gpu/drm/display/drm_bridge_connector.c
index 649969fca141..046efd913064 100644
--- a/drivers/gpu/drm/display/drm_bridge_connector.c
+++ b/drivers/gpu/drm/display/drm_bridge_connector.c
@@ -141,7 +141,8 @@ struct drm_bridge_connector {
  */
 
 static void drm_bridge_connector_hpd_notify(struct drm_connector *connector,
-                                           enum drm_connector_status status)
+                                           enum drm_connector_status status,
+                                           enum drm_connector_status_extra 
extra_status)
 {
        struct drm_bridge_connector *bridge_connector =
                to_drm_bridge_connector(connector);
@@ -154,7 +155,8 @@ static void drm_bridge_connector_hpd_notify(struct 
drm_connector *connector,
 }
 
 static void drm_bridge_connector_handle_hpd(struct drm_bridge_connector 
*drm_bridge_connector,
-                                           enum drm_connector_status status)
+                                           enum drm_connector_status status,
+                                           enum drm_connector_status_extra 
extra_status)
 {
        struct drm_connector *connector = &drm_bridge_connector->base;
        struct drm_device *dev = connector->dev;
@@ -163,7 +165,7 @@ static void drm_bridge_connector_handle_hpd(struct 
drm_bridge_connector *drm_bri
        connector->status = status;
        mutex_unlock(&dev->mode_config.mutex);
 
-       drm_bridge_connector_hpd_notify(connector, status);
+       drm_bridge_connector_hpd_notify(connector, status, extra_status);
 
        drm_kms_helper_connector_hotplug_event(connector);
 }
@@ -171,16 +173,17 @@ static void drm_bridge_connector_handle_hpd(struct 
drm_bridge_connector *drm_bri
 static void drm_bridge_connector_hpd_cb(void *cb_data,
                                        enum drm_connector_status status)
 {
-       drm_bridge_connector_handle_hpd(cb_data, status);
+       drm_bridge_connector_handle_hpd(cb_data, status, 
DRM_CONNECTOR_NO_EXTRA_STATUS);
 }
 
 static void drm_bridge_connector_oob_hotplug_event(struct drm_connector 
*connector,
-                                                  enum drm_connector_status 
status)
+                                                  enum drm_connector_status 
status,
+                                                  enum 
drm_connector_status_extra extra_status)
 {
        struct drm_bridge_connector *bridge_connector =
                to_drm_bridge_connector(connector);
 
-       drm_bridge_connector_handle_hpd(bridge_connector, status);
+       drm_bridge_connector_handle_hpd(bridge_connector, status, extra_status);
 }
 
 static void drm_bridge_connector_enable_hpd(struct drm_connector *connector)
@@ -223,7 +226,7 @@ drm_bridge_connector_detect(struct drm_connector 
*connector, bool force)
                if (hdmi)
                        drm_atomic_helper_connector_hdmi_hotplug(connector, 
status);
 
-               drm_bridge_connector_hpd_notify(connector, status);
+               drm_bridge_connector_hpd_notify(connector, status, 
DRM_CONNECTOR_NO_EXTRA_STATUS);
        } else {
                switch (connector->connector_type) {
                case DRM_MODE_CONNECTOR_DPI:
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index bb128dd0263a..d99019fdea9c 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -3528,7 +3528,7 @@ void drm_connector_dp_oob_status(struct fwnode_handle 
*connector_fwnode,
                return;
 
        if (connector->funcs->oob_hotplug_event)
-               connector->funcs->oob_hotplug_event(connector, status);
+               connector->funcs->oob_hotplug_event(connector, status, 
extra_status);
 
        drm_connector_put(connector);
 }
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 85d3aa3b9894..31acb3129723 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -6990,7 +6990,8 @@ static int intel_dp_connector_atomic_check(struct 
drm_connector *_connector,
 }
 
 static void intel_dp_oob_hotplug_event(struct drm_connector *_connector,
-                                      enum drm_connector_status hpd_state)
+                                      enum drm_connector_status hpd_state,
+                                      enum drm_connector_status_extra 
extra_status)
 {
        struct intel_connector *connector = to_intel_connector(_connector);
        struct intel_display *display = to_intel_display(connector);
diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
index 105da7c94910..5784bb9c4021 100644
--- a/include/drm/drm_connector.h
+++ b/include/drm/drm_connector.h
@@ -1720,7 +1720,8 @@ struct drm_connector_funcs {
         * has been received from a source outside the display driver / device.
         */
        void (*oob_hotplug_event)(struct drm_connector *connector,
-                                 enum drm_connector_status status);
+                                 enum drm_connector_status status,
+                                 enum drm_connector_status_extra extra_status);
 
        /**
         * @debugfs_init:

-- 
2.47.3

Reply via email to