Simon Ser
2023-Jun-20 18:15 UTC
[Nouveau] [PATCH] drm/nouveau/disp: use drm_kms_helper_connector_hotplug_event()
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 at emersion.fr>
Cc: Ben Skeggs <bskeggs at redhat.com>
Cc: Lyude Paul <lyude at redhat.com>
Cc: David Airlie <airlied at linux.ie>
Cc: Karol Herbst <kherbst at redhat.com>
---
drivers/gpu/drm/nouveau/nouveau_display.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c
b/drivers/gpu/drm/nouveau/nouveau_display.c
index ec3ffff487fc..99977e5fe716 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -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);
--
2.41.0
Lyude Paul
2023-Jun-21 21:56 UTC
[Nouveau] [PATCH] drm/nouveau/disp: use drm_kms_helper_connector_hotplug_event()
Looks alright! Some comments below On Tue, 2023-06-20 at 18:15 +0000, Simon Ser wrote:> 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 at emersion.fr> > Cc: Ben Skeggs <bskeggs at redhat.com> > Cc: Lyude Paul <lyude at redhat.com> > Cc: David Airlie <airlied at linux.ie> > Cc: Karol Herbst <kherbst at redhat.com> > --- > drivers/gpu/drm/nouveau/nouveau_display.c | 17 ++++++++++++++--- > 1 file changed, 14 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c > index ec3ffff487fc..99977e5fe716 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_display.c > +++ b/drivers/gpu/drm/nouveau/nouveau_display.c > @@ -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);I'm curious if you think there might be an advantage to doing this per- connector even with multiple connectors? Seems like we could do that if we stored changed connectors as a bitmask.> > + 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);-- Cheers, Lyude Paul (she/her) Software Engineer at Red Hat
Apparently Analagous Threads
- [PATCH] drm/nouveau/disp: use drm_kms_helper_connector_hotplug_event()
- [PATCH] drm/nouveau: don't attempt to schedule hpd_work on headless cards
- [PATCH] drm/nouveau: don't attempt to schedule hpd_work on headless cards
- [PATCH] pci/quirks: Add quirk to reset nvgpu at boot for the Lenovo ThinkPad P50
- [PATCH] pci/quirks: Add quirk to reset nvgpu at boot for the Lenovo ThinkPad P50