i915/display/hotplug: use drm_kms_helper_connector_hotplug_event()
authorSimon Ser <contact@emersion.fr>
Fri, 23 Jun 2023 09:42:35 +0000 (09:42 +0000)
committerJani Nikula <jani.nikula@intel.com>
Tue, 11 Jul 2023 09:48:40 +0000 (12:48 +0300)
This adds more information to the hotplug uevent and lets user-space
know that it's about a particular connector only.

v2: don't rely on the changed HPD pin bitmask to count changed
    connectors (Jani)

Signed-off-by: Simon Ser <contact@emersion.fr>
Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Gustavo Sousa <gustavo.sousa@intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230623094229.120264-1-contact@emersion.fr
drivers/gpu/drm/i915/display/intel_hotplug.c

index 1160fa20433bd65a649728d92d8f19fd6d706082..0ff5ed46ae1e748b5a8cfd91688ca9c18a15770d 100644 (file)
@@ -376,6 +376,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
        u32 changed = 0, retry = 0;
        u32 hpd_event_bits;
        u32 hpd_retry_bits;
+       struct drm_connector *first_changed_connector = NULL;
+       int changed_connectors = 0;
 
        mutex_lock(&dev_priv->drm.mode_config.mutex);
        drm_dbg_kms(&dev_priv->drm, "running encoder hotplug functions\n");
@@ -428,6 +430,11 @@ static void i915_hotplug_work_func(struct work_struct *work)
                                break;
                        case INTEL_HOTPLUG_CHANGED:
                                changed |= hpd_bit;
+                               changed_connectors++;
+                               if (!first_changed_connector) {
+                                       drm_connector_get(&connector->base);
+                                       first_changed_connector = &connector->base;
+                               }
                                break;
                        case INTEL_HOTPLUG_RETRY:
                                retry |= hpd_bit;
@@ -438,9 +445,14 @@ static void i915_hotplug_work_func(struct work_struct *work)
        drm_connector_list_iter_end(&conn_iter);
        mutex_unlock(&dev_priv->drm.mode_config.mutex);
 
-       if (changed)
+       if (changed_connectors == 1)
+               drm_kms_helper_connector_hotplug_event(first_changed_connector);
+       else if (changed_connectors > 0)
                drm_kms_helper_hotplug_event(&dev_priv->drm);
 
+       if (first_changed_connector)
+               drm_connector_put(first_changed_connector);
+
        /* Remove shared HPD pins that have changed */
        retry &= ~changed;
        if (retry) {