drm/i915/hpd: Replace the loop-within-loop with two independent loops
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 5 Feb 2020 18:35:42 +0000 (20:35 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 20 Feb 2020 19:47:23 +0000 (21:47 +0200)
No point in looping over all connectors for each hpd pin. Just loop
over each connector first and deal with each one's hpd pin. Then
loop over all the hpd pins to mark them as enabled again.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200205183546.9291-2-ville.syrjala@linux.intel.com
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/display/intel_hotplug.c

index 127a2f28c1acc24c626837ec6ab02efaa784e0a7..531021002e3421e1e00ee779f8ae199be27b7e37 100644 (file)
@@ -242,36 +242,39 @@ static void intel_hpd_irq_storm_reenable_work(struct work_struct *work)
                container_of(work, typeof(*dev_priv),
                             hotplug.reenable_work.work);
        struct drm_device *dev = &dev_priv->drm;
+       struct drm_connector_list_iter conn_iter;
+       struct intel_connector *connector;
        intel_wakeref_t wakeref;
        enum hpd_pin pin;
 
        wakeref = intel_runtime_pm_get(&dev_priv->runtime_pm);
 
        spin_lock_irq(&dev_priv->irq_lock);
-       for_each_hpd_pin(pin) {
-               struct drm_connector_list_iter conn_iter;
-               struct intel_connector *connector;
 
-               if (dev_priv->hotplug.stats[pin].state != HPD_DISABLED)
+       drm_connector_list_iter_begin(dev, &conn_iter);
+       for_each_intel_connector_iter(connector, &conn_iter) {
+               pin = intel_connector_hpd_pin(connector);
+               if (pin == HPD_NONE ||
+                   dev_priv->hotplug.stats[pin].state != HPD_DISABLED)
                        continue;
 
-               dev_priv->hotplug.stats[pin].state = HPD_ENABLED;
-
-               drm_connector_list_iter_begin(dev, &conn_iter);
-               for_each_intel_connector_iter(connector, &conn_iter) {
-                       if (intel_connector_hpd_pin(connector) == pin) {
-                               if (connector->base.polled != connector->polled)
-                                       DRM_DEBUG_DRIVER("Reenabling HPD on connector %s\n",
-                                                        connector->base.name);
-                               connector->base.polled = connector->polled;
-                               if (!connector->base.polled)
-                                       connector->base.polled = DRM_CONNECTOR_POLL_HPD;
-                       }
-               }
-               drm_connector_list_iter_end(&conn_iter);
+               if (connector->base.polled != connector->polled)
+                       DRM_DEBUG_DRIVER("Reenabling HPD on connector %s\n",
+                                        connector->base.name);
+               connector->base.polled = connector->polled;
+               if (!connector->base.polled)
+                       connector->base.polled = DRM_CONNECTOR_POLL_HPD;
+       }
+       drm_connector_list_iter_end(&conn_iter);
+
+       for_each_hpd_pin(pin) {
+               if (dev_priv->hotplug.stats[pin].state == HPD_DISABLED)
+                       dev_priv->hotplug.stats[pin].state = HPD_ENABLED;
        }
+
        if (dev_priv->display_irqs_enabled && dev_priv->display.hpd_irq_setup)
                dev_priv->display.hpd_irq_setup(dev_priv);
+
        spin_unlock_irq(&dev_priv->irq_lock);
 
        intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);