drm/nouveau/disp: use drm_kms_helper_connector_hotplug_event()
authorSimon Ser <contact@emersion.fr>
Tue, 20 Jun 2023 18:15:51 +0000 (18:15 +0000)
committerSimon Ser <contact@emersion.fr>
Mon, 10 Jul 2023 07:45:56 +0000 (09:45 +0200)
This adds more information to the hotplug uevent and lets user-space
know that it's about a particular connector only.

Signed-off-by: Simon Ser <contact@emersion.fr>
Cc: Ben Skeggs <bskeggs@redhat.com>
Cc: Lyude Paul <lyude@redhat.com>
Cc: David Airlie <airlied@linux.ie>
Cc: Karol Herbst <kherbst@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230620181547.272476-1-contact@emersion.fr
drivers/gpu/drm/nouveau/nouveau_display.c

index ec3ffff487fcd349007ecd3b8f9da609461926d4..99977e5fe71612600fafd471b6aff025070bac63 100644 (file)
@@ -465,7 +465,8 @@ nouveau_display_hpd_work(struct work_struct *work)
        struct drm_connector *connector;
        struct drm_connector_list_iter conn_iter;
        u32 pending;
-       bool changed = false;
+       int changed = 0;
+       struct drm_connector *first_changed_connector = NULL;
 
        pm_runtime_get_sync(dev->dev);
 
@@ -509,7 +510,12 @@ nouveau_display_hpd_work(struct work_struct *work)
                if (old_epoch_counter == connector->epoch_counter)
                        continue;
 
-               changed = true;
+               changed++;
+               if (!first_changed_connector) {
+                       drm_connector_get(connector);
+                       first_changed_connector = connector;
+               }
+
                drm_dbg_kms(dev, "[CONNECTOR:%d:%s] status updated from %s to %s (epoch counter %llu->%llu)\n",
                            connector->base.id, connector->name,
                            drm_get_connector_status_name(old_status),
@@ -520,9 +526,14 @@ nouveau_display_hpd_work(struct work_struct *work)
        drm_connector_list_iter_end(&conn_iter);
        mutex_unlock(&dev->mode_config.mutex);
 
-       if (changed)
+       if (changed == 1)
+               drm_kms_helper_connector_hotplug_event(first_changed_connector);
+       else if (changed > 0)
                drm_kms_helper_hotplug_event(dev);
 
+       if (first_changed_connector)
+               drm_connector_put(first_changed_connector);
+
        pm_runtime_mark_last_busy(drm->dev->dev);
 noop:
        pm_runtime_put_autosuspend(dev->dev);