[v2,23/27] drm/amdgpu: Iterate through DRM connectors correctly

Submitted by Lyude Paul on Sept. 3, 2019, 8:46 p.m.

Details

Message ID 20190903204645.25487-24-lyude@redhat.com
State New
Headers show
Series "DP MST Refactors + debugging tools + suspend/resume reprobing" ( rev: 3 2 ) in AMD X.Org drivers

Not browsing as part of any series.

Commit Message

Lyude Paul Sept. 3, 2019, 8:46 p.m.
Currently, every single piece of code in amdgpu that loops through
connectors does it incorrectly and doesn't use the proper list iteration
helpers, drm_connector_list_iter_begin() and
drm_connector_list_iter_end(). Yeesh.

So, do that.

Cc: Juston Li <juston.li@intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Harry Wentland <hwentlan@amd.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Lyude Paul <lyude@redhat.com>
---
 .../gpu/drm/amd/amdgpu/amdgpu_connectors.c    | 13 +++++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    | 20 +++++++---
 drivers/gpu/drm/amd/amdgpu/amdgpu_display.c   |  5 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c  | 40 +++++++++++++------
 drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c       |  5 ++-
 drivers/gpu/drm/amd/amdgpu/dce_v10_0.c        | 34 ++++++++++++----
 drivers/gpu/drm/amd/amdgpu/dce_v11_0.c        | 34 ++++++++++++----
 drivers/gpu/drm/amd/amdgpu/dce_v6_0.c         | 40 ++++++++++++++-----
 drivers/gpu/drm/amd/amdgpu/dce_v8_0.c         | 34 ++++++++++++----
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 33 ++++++++-------
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c | 10 ++++-
 11 files changed, 195 insertions(+), 73 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index ece55c8fa673..bd31bb595c04 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -1022,8 +1022,12 @@  amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
 			 */
 			if (amdgpu_connector->shared_ddc && (ret == connector_status_connected)) {
 				struct drm_connector *list_connector;
+				struct drm_connector_list_iter iter;
 				struct amdgpu_connector *list_amdgpu_connector;
-				list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) {
+
+				drm_connector_list_iter_begin(dev, &iter);
+				drm_for_each_connector_iter(list_connector,
+							    &iter) {
 					if (connector == list_connector)
 						continue;
 					list_amdgpu_connector = to_amdgpu_connector(list_connector);
@@ -1040,6 +1044,7 @@  amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
 						}
 					}
 				}
+				drm_connector_list_iter_end(&iter);
 			}
 		}
 	}
@@ -1501,6 +1506,7 @@  amdgpu_connector_add(struct amdgpu_device *adev,
 {
 	struct drm_device *dev = adev->ddev;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector;
 	struct amdgpu_connector_atom_dig *amdgpu_dig_connector;
 	struct drm_encoder *encoder;
@@ -1515,10 +1521,12 @@  amdgpu_connector_add(struct amdgpu_device *adev,
 		return;
 
 	/* see if we already added it */
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		amdgpu_connector = to_amdgpu_connector(connector);
 		if (amdgpu_connector->connector_id == connector_id) {
 			amdgpu_connector->devices |= supported_device;
+			drm_connector_list_iter_end(&iter);
 			return;
 		}
 		if (amdgpu_connector->ddc_bus && i2c_bus->valid) {
@@ -1533,6 +1541,7 @@  amdgpu_connector_add(struct amdgpu_device *adev,
 			}
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	/* check if it's a dp bridge */
 	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 2f884699eaef..acd39ce9b08e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3004,6 +3004,7 @@  int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
 	struct amdgpu_device *adev;
 	struct drm_crtc *crtc;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	int r;
 
 	if (dev == NULL || dev->dev_private == NULL) {
@@ -3026,9 +3027,11 @@  int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
 	if (!amdgpu_device_has_dc_support(adev)) {
 		/* turn off display hw */
 		drm_modeset_lock_all(dev);
-		list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
-			drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
-		}
+		drm_connector_list_iter_begin(dev, &iter);
+		drm_for_each_connector_iter(connector, &iter)
+			drm_helper_connector_dpms(connector,
+						  DRM_MODE_DPMS_OFF);
+		drm_connector_list_iter_end(&iter);
 		drm_modeset_unlock_all(dev);
 			/* unpin the front buffers and cursors */
 		list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
@@ -3107,6 +3110,7 @@  int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
 int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
 {
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_device *adev = dev->dev_private;
 	struct drm_crtc *crtc;
 	int r = 0;
@@ -3177,9 +3181,13 @@  int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
 
 			/* turn on display hw */
 			drm_modeset_lock_all(dev);
-			list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
-				drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
-			}
+
+			drm_connector_list_iter_begin(dev, &iter);
+			drm_for_each_connector_iter(connector, &iter)
+				drm_helper_connector_dpms(connector,
+							  DRM_MODE_DPMS_ON);
+			drm_connector_list_iter_end(&iter);
+
 			drm_modeset_unlock_all(dev);
 		}
 		amdgpu_fbdev_set_suspend(adev, 0);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
index 1d4aaa9580f4..d2dd59a95e8a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
@@ -370,11 +370,13 @@  void amdgpu_display_print_display_setup(struct drm_device *dev)
 	struct amdgpu_connector *amdgpu_connector;
 	struct drm_encoder *encoder;
 	struct amdgpu_encoder *amdgpu_encoder;
+	struct drm_connector_list_iter iter;
 	uint32_t devices;
 	int i = 0;
 
+	drm_connector_list_iter_begin(dev, &iter);
 	DRM_INFO("AMDGPU Display Connectors\n");
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_for_each_connector_iter(connector, &iter) {
 		amdgpu_connector = to_amdgpu_connector(connector);
 		DRM_INFO("Connector %d:\n", i);
 		DRM_INFO("  %s\n", connector->name);
@@ -438,6 +440,7 @@  void amdgpu_display_print_display_setup(struct drm_device *dev)
 		}
 		i++;
 	}
+	drm_connector_list_iter_end(&iter);
 }
 
 /**
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c
index 571a6dfb473e..61fcf247a638 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c
@@ -37,12 +37,14 @@  amdgpu_link_encoder_connector(struct drm_device *dev)
 {
 	struct amdgpu_device *adev = dev->dev_private;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector;
 	struct drm_encoder *encoder;
 	struct amdgpu_encoder *amdgpu_encoder;
 
+	drm_connector_list_iter_begin(dev, &iter);
 	/* walk the list and link encoders to connectors */
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_for_each_connector_iter(connector, &iter) {
 		amdgpu_connector = to_amdgpu_connector(connector);
 		list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
 			amdgpu_encoder = to_amdgpu_encoder(encoder);
@@ -55,6 +57,7 @@  amdgpu_link_encoder_connector(struct drm_device *dev)
 			}
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 }
 
 void amdgpu_encoder_set_active_device(struct drm_encoder *encoder)
@@ -62,8 +65,10 @@  void amdgpu_encoder_set_active_device(struct drm_encoder *encoder)
 	struct drm_device *dev = encoder->dev;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 			amdgpu_encoder->active_device = amdgpu_encoder->devices & amdgpu_connector->devices;
@@ -72,6 +77,7 @@  void amdgpu_encoder_set_active_device(struct drm_encoder *encoder)
 				  amdgpu_connector->devices, encoder->encoder_type);
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 }
 
 struct drm_connector *
@@ -79,15 +85,20 @@  amdgpu_get_connector_for_encoder(struct drm_encoder *encoder)
 {
 	struct drm_device *dev = encoder->dev;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
-	struct drm_connector *connector;
+	struct drm_connector *connector, *found = NULL;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		amdgpu_connector = to_amdgpu_connector(connector);
-		if (amdgpu_encoder->active_device & amdgpu_connector->devices)
-			return connector;
+		if (amdgpu_encoder->active_device & amdgpu_connector->devices) {
+			found = connector;
+			break;
+		}
 	}
-	return NULL;
+	drm_connector_list_iter_end(&iter);
+	return found;
 }
 
 struct drm_connector *
@@ -95,15 +106,20 @@  amdgpu_get_connector_for_encoder_init(struct drm_encoder *encoder)
 {
 	struct drm_device *dev = encoder->dev;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
-	struct drm_connector *connector;
+	struct drm_connector *connector, *found = NULL;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		amdgpu_connector = to_amdgpu_connector(connector);
-		if (amdgpu_encoder->devices & amdgpu_connector->devices)
-			return connector;
+		if (amdgpu_encoder->devices & amdgpu_connector->devices) {
+			found = connector;
+			break;
+		}
 	}
-	return NULL;
+	drm_connector_list_iter_end(&iter);
+	return found;
 }
 
 struct drm_encoder *amdgpu_get_external_encoder(struct drm_encoder *encoder)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
index 2a3f5ec298db..977e121204e6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
@@ -87,10 +87,13 @@  static void amdgpu_hotplug_work_func(struct work_struct *work)
 	struct drm_device *dev = adev->ddev;
 	struct drm_mode_config *mode_config = &dev->mode_config;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 
 	mutex_lock(&mode_config->mutex);
-	list_for_each_entry(connector, &mode_config->connector_list, head)
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter)
 		amdgpu_connector_hotplug(connector);
+	drm_connector_list_iter_end(&iter);
 	mutex_unlock(&mode_config->mutex);
 	/* Just fire off a uevent and let userspace tell us what to do */
 	drm_helper_hpd_irq_event(dev);
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
index 645550e7caf5..be82871ac3bd 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
@@ -330,9 +330,11 @@  static void dce_v10_0_hpd_init(struct amdgpu_device *adev)
 {
 	struct drm_device *dev = adev->ddev;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	u32 tmp;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 
 		if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
@@ -368,6 +370,7 @@  static void dce_v10_0_hpd_init(struct amdgpu_device *adev)
 		amdgpu_irq_get(adev, &adev->hpd_irq,
 			       amdgpu_connector->hpd.hpd);
 	}
+	drm_connector_list_iter_end(&iter);
 }
 
 /**
@@ -382,9 +385,11 @@  static void dce_v10_0_hpd_fini(struct amdgpu_device *adev)
 {
 	struct drm_device *dev = adev->ddev;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	u32 tmp;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 
 		if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
@@ -397,6 +402,7 @@  static void dce_v10_0_hpd_fini(struct amdgpu_device *adev)
 		amdgpu_irq_put(adev, &adev->hpd_irq,
 			       amdgpu_connector->hpd.hpd);
 	}
+	drm_connector_list_iter_end(&iter);
 }
 
 static u32 dce_v10_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
@@ -1219,10 +1225,12 @@  static void dce_v10_0_afmt_audio_select_pin(struct drm_encoder *encoder)
 static void dce_v10_0_audio_write_latency_fields(struct drm_encoder *encoder,
 						struct drm_display_mode *mode)
 {
-	struct amdgpu_device *adev = encoder->dev->dev_private;
+	struct drm_device *dev = encoder->dev;
+	struct amdgpu_device *adev = dev->dev_private;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	u32 tmp;
 	int interlace = 0;
@@ -1230,12 +1238,14 @@  static void dce_v10_0_audio_write_latency_fields(struct drm_encoder *encoder,
 	if (!dig || !dig->afmt || !dig->afmt->pin)
 		return;
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
@@ -1261,10 +1271,12 @@  static void dce_v10_0_audio_write_latency_fields(struct drm_encoder *encoder,
 
 static void dce_v10_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
 {
-	struct amdgpu_device *adev = encoder->dev->dev_private;
+	struct drm_device *dev = encoder->dev;
+	struct amdgpu_device *adev = dev->dev_private;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	u32 tmp;
 	u8 *sadb = NULL;
@@ -1273,12 +1285,14 @@  static void dce_v10_0_audio_write_speaker_allocation(struct drm_encoder *encoder
 	if (!dig || !dig->afmt || !dig->afmt->pin)
 		return;
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
@@ -1313,10 +1327,12 @@  static void dce_v10_0_audio_write_speaker_allocation(struct drm_encoder *encoder
 
 static void dce_v10_0_audio_write_sad_regs(struct drm_encoder *encoder)
 {
-	struct amdgpu_device *adev = encoder->dev->dev_private;
+	struct drm_device *dev = encoder->dev;
+	struct amdgpu_device *adev = dev->dev_private;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	struct cea_sad *sads;
 	int i, sad_count;
@@ -1339,12 +1355,14 @@  static void dce_v10_0_audio_write_sad_regs(struct drm_encoder *encoder)
 	if (!dig || !dig->afmt || !dig->afmt->pin)
 		return;
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
index d9f470632b2c..bde48775cf1b 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
@@ -348,9 +348,11 @@  static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
 {
 	struct drm_device *dev = adev->ddev;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	u32 tmp;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 
 		if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
@@ -385,6 +387,7 @@  static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
 		dce_v11_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
 		amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
 	}
+	drm_connector_list_iter_end(&iter);
 }
 
 /**
@@ -399,9 +402,11 @@  static void dce_v11_0_hpd_fini(struct amdgpu_device *adev)
 {
 	struct drm_device *dev = adev->ddev;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	u32 tmp;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 
 		if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
@@ -413,6 +418,7 @@  static void dce_v11_0_hpd_fini(struct amdgpu_device *adev)
 
 		amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
 	}
+	drm_connector_list_iter_end(&iter);
 }
 
 static u32 dce_v11_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
@@ -1245,10 +1251,12 @@  static void dce_v11_0_afmt_audio_select_pin(struct drm_encoder *encoder)
 static void dce_v11_0_audio_write_latency_fields(struct drm_encoder *encoder,
 						struct drm_display_mode *mode)
 {
-	struct amdgpu_device *adev = encoder->dev->dev_private;
+	struct drm_device *dev = encoder->dev;
+	struct amdgpu_device *adev = dev->dev_private;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	u32 tmp;
 	int interlace = 0;
@@ -1256,12 +1264,14 @@  static void dce_v11_0_audio_write_latency_fields(struct drm_encoder *encoder,
 	if (!dig || !dig->afmt || !dig->afmt->pin)
 		return;
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
@@ -1287,10 +1297,12 @@  static void dce_v11_0_audio_write_latency_fields(struct drm_encoder *encoder,
 
 static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
 {
-	struct amdgpu_device *adev = encoder->dev->dev_private;
+	struct drm_device *dev = encoder->dev;
+	struct amdgpu_device *adev = dev->dev_private;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	u32 tmp;
 	u8 *sadb = NULL;
@@ -1299,12 +1311,14 @@  static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder
 	if (!dig || !dig->afmt || !dig->afmt->pin)
 		return;
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
@@ -1339,10 +1353,12 @@  static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder
 
 static void dce_v11_0_audio_write_sad_regs(struct drm_encoder *encoder)
 {
-	struct amdgpu_device *adev = encoder->dev->dev_private;
+	struct drm_device *dev = encoder->dev;
+	struct amdgpu_device *adev = dev->dev_private;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	struct cea_sad *sads;
 	int i, sad_count;
@@ -1365,12 +1381,14 @@  static void dce_v11_0_audio_write_sad_regs(struct drm_encoder *encoder)
 	if (!dig || !dig->afmt || !dig->afmt->pin)
 		return;
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
index 3eb2e7429269..65f61de931d7 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
@@ -281,9 +281,11 @@  static void dce_v6_0_hpd_init(struct amdgpu_device *adev)
 {
 	struct drm_device *dev = adev->ddev;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	u32 tmp;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 
 		if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
@@ -309,7 +311,7 @@  static void dce_v6_0_hpd_init(struct amdgpu_device *adev)
 		dce_v6_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
 		amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
 	}
-
+	drm_connector_list_iter_end(&iter);
 }
 
 /**
@@ -324,9 +326,11 @@  static void dce_v6_0_hpd_fini(struct amdgpu_device *adev)
 {
 	struct drm_device *dev = adev->ddev;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	u32 tmp;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 
 		if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
@@ -338,6 +342,7 @@  static void dce_v6_0_hpd_fini(struct amdgpu_device *adev)
 
 		amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
 	}
+	drm_connector_list_iter_end(&iter);
 }
 
 static u32 dce_v6_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
@@ -1124,20 +1129,24 @@  static void dce_v6_0_audio_select_pin(struct drm_encoder *encoder)
 static void dce_v6_0_audio_write_latency_fields(struct drm_encoder *encoder,
 						struct drm_display_mode *mode)
 {
-	struct amdgpu_device *adev = encoder->dev->dev_private;
+	struct drm_device *dev = encoder->dev;
+	struct amdgpu_device *adev = dev->dev_private;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	int interlace = 0;
 	u32 tmp;
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
@@ -1164,21 +1173,25 @@  static void dce_v6_0_audio_write_latency_fields(struct drm_encoder *encoder,
 
 static void dce_v6_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
 {
-	struct amdgpu_device *adev = encoder->dev->dev_private;
+	struct drm_device *dev = encoder->dev;
+	struct amdgpu_device *adev = dev->dev_private;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	u8 *sadb = NULL;
 	int sad_count;
 	u32 tmp;
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
@@ -1221,10 +1234,12 @@  static void dce_v6_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
 
 static void dce_v6_0_audio_write_sad_regs(struct drm_encoder *encoder)
 {
-	struct amdgpu_device *adev = encoder->dev->dev_private;
+	struct drm_device *dev = encoder->dev;
+	struct amdgpu_device *adev = dev->dev_private;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	struct cea_sad *sads;
 	int i, sad_count;
@@ -1244,12 +1259,14 @@  static void dce_v6_0_audio_write_sad_regs(struct drm_encoder *encoder)
 		{ ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO },
 	};
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
@@ -1632,6 +1649,7 @@  static void dce_v6_0_afmt_setmode(struct drm_encoder *encoder,
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	int em = amdgpu_atombios_encoder_get_encoder_mode(encoder);
 	int bpc = 8;
@@ -1639,12 +1657,14 @@  static void dce_v6_0_afmt_setmode(struct drm_encoder *encoder,
 	if (!dig || !dig->afmt)
 		return;
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
index a16c5e9e610e..e5f50882a51d 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
@@ -275,9 +275,11 @@  static void dce_v8_0_hpd_init(struct amdgpu_device *adev)
 {
 	struct drm_device *dev = adev->ddev;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	u32 tmp;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 
 		if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
@@ -303,6 +305,7 @@  static void dce_v8_0_hpd_init(struct amdgpu_device *adev)
 		dce_v8_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
 		amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
 	}
+	drm_connector_list_iter_end(&iter);
 }
 
 /**
@@ -317,9 +320,11 @@  static void dce_v8_0_hpd_fini(struct amdgpu_device *adev)
 {
 	struct drm_device *dev = adev->ddev;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	u32 tmp;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
 
 		if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
@@ -331,6 +336,7 @@  static void dce_v8_0_hpd_fini(struct amdgpu_device *adev)
 
 		amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
 	}
+	drm_connector_list_iter_end(&iter);
 }
 
 static u32 dce_v8_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
@@ -1157,10 +1163,12 @@  static void dce_v8_0_afmt_audio_select_pin(struct drm_encoder *encoder)
 static void dce_v8_0_audio_write_latency_fields(struct drm_encoder *encoder,
 						struct drm_display_mode *mode)
 {
-	struct amdgpu_device *adev = encoder->dev->dev_private;
+	struct drm_device *dev = encoder->dev;
+	struct amdgpu_device *adev = dev->dev_private;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	u32 tmp = 0, offset;
 
@@ -1169,12 +1177,14 @@  static void dce_v8_0_audio_write_latency_fields(struct drm_encoder *encoder,
 
 	offset = dig->afmt->pin->offset;
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
@@ -1214,10 +1224,12 @@  static void dce_v8_0_audio_write_latency_fields(struct drm_encoder *encoder,
 
 static void dce_v8_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
 {
-	struct amdgpu_device *adev = encoder->dev->dev_private;
+	struct drm_device *dev = encoder->dev;
+	struct amdgpu_device *adev = dev->dev_private;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	u32 offset, tmp;
 	u8 *sadb = NULL;
@@ -1228,12 +1240,14 @@  static void dce_v8_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
 
 	offset = dig->afmt->pin->offset;
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
@@ -1263,11 +1277,13 @@  static void dce_v8_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
 
 static void dce_v8_0_audio_write_sad_regs(struct drm_encoder *encoder)
 {
-	struct amdgpu_device *adev = encoder->dev->dev_private;
+	struct drm_device *dev = encoder->dev;
+	struct amdgpu_device *adev = dev->dev_private;
 	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
 	struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
 	u32 offset;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct amdgpu_connector *amdgpu_connector = NULL;
 	struct cea_sad *sads;
 	int i, sad_count;
@@ -1292,12 +1308,14 @@  static void dce_v8_0_audio_write_sad_regs(struct drm_encoder *encoder)
 
 	offset = dig->afmt->pin->offset;
 
-	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		if (connector->encoder == encoder) {
 			amdgpu_connector = to_amdgpu_connector(connector);
 			break;
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 
 	if (!amdgpu_connector) {
 		DRM_ERROR("Couldn't find encoder's connector\n");
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 0a71ed1e7762..73630e2940d4 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -896,27 +896,29 @@  static int detect_mst_link_for_all_connectors(struct drm_device *dev)
 {
 	struct amdgpu_dm_connector *aconnector;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	int ret = 0;
 
-	drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
-
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		aconnector = to_amdgpu_dm_connector(connector);
 		if (aconnector->dc_link->type == dc_connection_mst_branch &&
 		    aconnector->mst_mgr.aux) {
 			DRM_DEBUG_DRIVER("DM_MST: starting TM on aconnector: %p [id: %d]\n",
-					aconnector, aconnector->base.base.id);
+					 aconnector,
+					 aconnector->base.base.id);
 
 			ret = drm_dp_mst_topology_mgr_set_mst(&aconnector->mst_mgr, true);
 			if (ret < 0) {
 				DRM_ERROR("DM_MST: Failed to start MST\n");
-				((struct dc_link *)aconnector->dc_link)->type = dc_connection_single;
-				return ret;
-				}
+				aconnector->dc_link->type =
+					dc_connection_single;
+				break;
 			}
+		}
 	}
+	drm_connector_list_iter_end(&iter);
 
-	drm_modeset_unlock(&dev->mode_config.connection_mutex);
 	return ret;
 }
 
@@ -954,14 +956,13 @@  static void s3_handle_mst(struct drm_device *dev, bool suspend)
 {
 	struct amdgpu_dm_connector *aconnector;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct drm_dp_mst_topology_mgr *mgr;
 	int ret;
 	bool need_hotplug = false;
 
-	drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
-
-	list_for_each_entry(connector, &dev->mode_config.connector_list,
-			    head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		aconnector = to_amdgpu_dm_connector(connector);
 		if (aconnector->dc_link->type != dc_connection_mst_branch ||
 		    aconnector->mst_port)
@@ -979,8 +980,7 @@  static void s3_handle_mst(struct drm_device *dev, bool suspend)
 			}
 		}
 	}
-
-	drm_modeset_unlock(&dev->mode_config.connection_mutex);
+	drm_connector_list_iter_end(&iter);
 
 	if (need_hotplug)
 		drm_kms_helper_hotplug_event(dev);
@@ -1162,6 +1162,7 @@  static int dm_resume(void *handle)
 	struct amdgpu_display_manager *dm = &adev->dm;
 	struct amdgpu_dm_connector *aconnector;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 	struct drm_crtc *crtc;
 	struct drm_crtc_state *new_crtc_state;
 	struct dm_crtc_state *dm_new_crtc_state;
@@ -1194,7 +1195,8 @@  static int dm_resume(void *handle)
 	amdgpu_dm_irq_resume_early(adev);
 
 	/* Do detection*/
-	list_for_each_entry(connector, &ddev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(ddev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		aconnector = to_amdgpu_dm_connector(connector);
 
 		/*
@@ -1222,6 +1224,7 @@  static int dm_resume(void *handle)
 		amdgpu_dm_update_connector_after_detect(aconnector);
 		mutex_unlock(&aconnector->hpd_lock);
 	}
+	drm_connector_list_iter_end(&iter);
 
 	/* Force mode set in atomic commit */
 	for_each_new_crtc_in_state(dm->cached_state, crtc, new_crtc_state, i)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
index fa5d503d379c..64445c4cc4c2 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
@@ -732,8 +732,10 @@  void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
 {
 	struct drm_device *dev = adev->ddev;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		struct amdgpu_dm_connector *amdgpu_dm_connector =
 				to_amdgpu_dm_connector(connector);
 
@@ -751,6 +753,7 @@  void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
 					true);
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 }
 
 /**
@@ -765,8 +768,10 @@  void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
 {
 	struct drm_device *dev = adev->ddev;
 	struct drm_connector *connector;
+	struct drm_connector_list_iter iter;
 
-	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+	drm_connector_list_iter_begin(dev, &iter);
+	drm_for_each_connector_iter(connector, &iter) {
 		struct amdgpu_dm_connector *amdgpu_dm_connector =
 				to_amdgpu_dm_connector(connector);
 		const struct dc_link *dc_link = amdgpu_dm_connector->dc_link;
@@ -779,4 +784,5 @@  void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
 					false);
 		}
 	}
+	drm_connector_list_iter_end(&iter);
 }

Comments

On Tue, Sep 3, 2019 at 4:49 PM Lyude Paul <lyude@redhat.com> wrote:
>
> Currently, every single piece of code in amdgpu that loops through
> connectors does it incorrectly and doesn't use the proper list iteration
> helpers, drm_connector_list_iter_begin() and
> drm_connector_list_iter_end(). Yeesh.
>
> So, do that.

In fairness, I think the origin of this code predated the iterators.
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

>
> Cc: Juston Li <juston.li@intel.com>
> Cc: Imre Deak <imre.deak@intel.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: Harry Wentland <hwentlan@amd.com>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Signed-off-by: Lyude Paul <lyude@redhat.com>
> ---
>  .../gpu/drm/amd/amdgpu/amdgpu_connectors.c    | 13 +++++-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    | 20 +++++++---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_display.c   |  5 ++-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c  | 40 +++++++++++++------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c       |  5 ++-
>  drivers/gpu/drm/amd/amdgpu/dce_v10_0.c        | 34 ++++++++++++----
>  drivers/gpu/drm/amd/amdgpu/dce_v11_0.c        | 34 ++++++++++++----
>  drivers/gpu/drm/amd/amdgpu/dce_v6_0.c         | 40 ++++++++++++++-----
>  drivers/gpu/drm/amd/amdgpu/dce_v8_0.c         | 34 ++++++++++++----
>  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 33 ++++++++-------
>  .../drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c | 10 ++++-
>  11 files changed, 195 insertions(+), 73 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> index ece55c8fa673..bd31bb595c04 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> @@ -1022,8 +1022,12 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
>                          */
>                         if (amdgpu_connector->shared_ddc && (ret == connector_status_connected)) {
>                                 struct drm_connector *list_connector;
> +                               struct drm_connector_list_iter iter;
>                                 struct amdgpu_connector *list_amdgpu_connector;
> -                               list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) {
> +
> +                               drm_connector_list_iter_begin(dev, &iter);
> +                               drm_for_each_connector_iter(list_connector,
> +                                                           &iter) {
>                                         if (connector == list_connector)
>                                                 continue;
>                                         list_amdgpu_connector = to_amdgpu_connector(list_connector);
> @@ -1040,6 +1044,7 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
>                                                 }
>                                         }
>                                 }
> +                               drm_connector_list_iter_end(&iter);
>                         }
>                 }
>         }
> @@ -1501,6 +1506,7 @@ amdgpu_connector_add(struct amdgpu_device *adev,
>  {
>         struct drm_device *dev = adev->ddev;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector;
>         struct amdgpu_connector_atom_dig *amdgpu_dig_connector;
>         struct drm_encoder *encoder;
> @@ -1515,10 +1521,12 @@ amdgpu_connector_add(struct amdgpu_device *adev,
>                 return;
>
>         /* see if we already added it */
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 amdgpu_connector = to_amdgpu_connector(connector);
>                 if (amdgpu_connector->connector_id == connector_id) {
>                         amdgpu_connector->devices |= supported_device;
> +                       drm_connector_list_iter_end(&iter);
>                         return;
>                 }
>                 if (amdgpu_connector->ddc_bus && i2c_bus->valid) {
> @@ -1533,6 +1541,7 @@ amdgpu_connector_add(struct amdgpu_device *adev,
>                         }
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         /* check if it's a dp bridge */
>         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 2f884699eaef..acd39ce9b08e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -3004,6 +3004,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
>         struct amdgpu_device *adev;
>         struct drm_crtc *crtc;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         int r;
>
>         if (dev == NULL || dev->dev_private == NULL) {
> @@ -3026,9 +3027,11 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
>         if (!amdgpu_device_has_dc_support(adev)) {
>                 /* turn off display hw */
>                 drm_modeset_lock_all(dev);
> -               list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> -                       drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
> -               }
> +               drm_connector_list_iter_begin(dev, &iter);
> +               drm_for_each_connector_iter(connector, &iter)
> +                       drm_helper_connector_dpms(connector,
> +                                                 DRM_MODE_DPMS_OFF);
> +               drm_connector_list_iter_end(&iter);
>                 drm_modeset_unlock_all(dev);
>                         /* unpin the front buffers and cursors */
>                 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
> @@ -3107,6 +3110,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
>  int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
>  {
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_device *adev = dev->dev_private;
>         struct drm_crtc *crtc;
>         int r = 0;
> @@ -3177,9 +3181,13 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
>
>                         /* turn on display hw */
>                         drm_modeset_lock_all(dev);
> -                       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> -                               drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
> -                       }
> +
> +                       drm_connector_list_iter_begin(dev, &iter);
> +                       drm_for_each_connector_iter(connector, &iter)
> +                               drm_helper_connector_dpms(connector,
> +                                                         DRM_MODE_DPMS_ON);
> +                       drm_connector_list_iter_end(&iter);
> +
>                         drm_modeset_unlock_all(dev);
>                 }
>                 amdgpu_fbdev_set_suspend(adev, 0);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> index 1d4aaa9580f4..d2dd59a95e8a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> @@ -370,11 +370,13 @@ void amdgpu_display_print_display_setup(struct drm_device *dev)
>         struct amdgpu_connector *amdgpu_connector;
>         struct drm_encoder *encoder;
>         struct amdgpu_encoder *amdgpu_encoder;
> +       struct drm_connector_list_iter iter;
>         uint32_t devices;
>         int i = 0;
>
> +       drm_connector_list_iter_begin(dev, &iter);
>         DRM_INFO("AMDGPU Display Connectors\n");
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_for_each_connector_iter(connector, &iter) {
>                 amdgpu_connector = to_amdgpu_connector(connector);
>                 DRM_INFO("Connector %d:\n", i);
>                 DRM_INFO("  %s\n", connector->name);
> @@ -438,6 +440,7 @@ void amdgpu_display_print_display_setup(struct drm_device *dev)
>                 }
>                 i++;
>         }
> +       drm_connector_list_iter_end(&iter);
>  }
>
>  /**
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c
> index 571a6dfb473e..61fcf247a638 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c
> @@ -37,12 +37,14 @@ amdgpu_link_encoder_connector(struct drm_device *dev)
>  {
>         struct amdgpu_device *adev = dev->dev_private;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector;
>         struct drm_encoder *encoder;
>         struct amdgpu_encoder *amdgpu_encoder;
>
> +       drm_connector_list_iter_begin(dev, &iter);
>         /* walk the list and link encoders to connectors */
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_for_each_connector_iter(connector, &iter) {
>                 amdgpu_connector = to_amdgpu_connector(connector);
>                 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
>                         amdgpu_encoder = to_amdgpu_encoder(encoder);
> @@ -55,6 +57,7 @@ amdgpu_link_encoder_connector(struct drm_device *dev)
>                         }
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>  }
>
>  void amdgpu_encoder_set_active_device(struct drm_encoder *encoder)
> @@ -62,8 +65,10 @@ void amdgpu_encoder_set_active_device(struct drm_encoder *encoder)
>         struct drm_device *dev = encoder->dev;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
>                         amdgpu_encoder->active_device = amdgpu_encoder->devices & amdgpu_connector->devices;
> @@ -72,6 +77,7 @@ void amdgpu_encoder_set_active_device(struct drm_encoder *encoder)
>                                   amdgpu_connector->devices, encoder->encoder_type);
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>  }
>
>  struct drm_connector *
> @@ -79,15 +85,20 @@ amdgpu_get_connector_for_encoder(struct drm_encoder *encoder)
>  {
>         struct drm_device *dev = encoder->dev;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> -       struct drm_connector *connector;
> +       struct drm_connector *connector, *found = NULL;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 amdgpu_connector = to_amdgpu_connector(connector);
> -               if (amdgpu_encoder->active_device & amdgpu_connector->devices)
> -                       return connector;
> +               if (amdgpu_encoder->active_device & amdgpu_connector->devices) {
> +                       found = connector;
> +                       break;
> +               }
>         }
> -       return NULL;
> +       drm_connector_list_iter_end(&iter);
> +       return found;
>  }
>
>  struct drm_connector *
> @@ -95,15 +106,20 @@ amdgpu_get_connector_for_encoder_init(struct drm_encoder *encoder)
>  {
>         struct drm_device *dev = encoder->dev;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> -       struct drm_connector *connector;
> +       struct drm_connector *connector, *found = NULL;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 amdgpu_connector = to_amdgpu_connector(connector);
> -               if (amdgpu_encoder->devices & amdgpu_connector->devices)
> -                       return connector;
> +               if (amdgpu_encoder->devices & amdgpu_connector->devices) {
> +                       found = connector;
> +                       break;
> +               }
>         }
> -       return NULL;
> +       drm_connector_list_iter_end(&iter);
> +       return found;
>  }
>
>  struct drm_encoder *amdgpu_get_external_encoder(struct drm_encoder *encoder)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
> index 2a3f5ec298db..977e121204e6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
> @@ -87,10 +87,13 @@ static void amdgpu_hotplug_work_func(struct work_struct *work)
>         struct drm_device *dev = adev->ddev;
>         struct drm_mode_config *mode_config = &dev->mode_config;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>
>         mutex_lock(&mode_config->mutex);
> -       list_for_each_entry(connector, &mode_config->connector_list, head)
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter)
>                 amdgpu_connector_hotplug(connector);
> +       drm_connector_list_iter_end(&iter);
>         mutex_unlock(&mode_config->mutex);
>         /* Just fire off a uevent and let userspace tell us what to do */
>         drm_helper_hpd_irq_event(dev);
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
> index 645550e7caf5..be82871ac3bd 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
> @@ -330,9 +330,11 @@ static void dce_v10_0_hpd_init(struct amdgpu_device *adev)
>  {
>         struct drm_device *dev = adev->ddev;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         u32 tmp;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
>
>                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> @@ -368,6 +370,7 @@ static void dce_v10_0_hpd_init(struct amdgpu_device *adev)
>                 amdgpu_irq_get(adev, &adev->hpd_irq,
>                                amdgpu_connector->hpd.hpd);
>         }
> +       drm_connector_list_iter_end(&iter);
>  }
>
>  /**
> @@ -382,9 +385,11 @@ static void dce_v10_0_hpd_fini(struct amdgpu_device *adev)
>  {
>         struct drm_device *dev = adev->ddev;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         u32 tmp;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
>
>                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> @@ -397,6 +402,7 @@ static void dce_v10_0_hpd_fini(struct amdgpu_device *adev)
>                 amdgpu_irq_put(adev, &adev->hpd_irq,
>                                amdgpu_connector->hpd.hpd);
>         }
> +       drm_connector_list_iter_end(&iter);
>  }
>
>  static u32 dce_v10_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
> @@ -1219,10 +1225,12 @@ static void dce_v10_0_afmt_audio_select_pin(struct drm_encoder *encoder)
>  static void dce_v10_0_audio_write_latency_fields(struct drm_encoder *encoder,
>                                                 struct drm_display_mode *mode)
>  {
> -       struct amdgpu_device *adev = encoder->dev->dev_private;
> +       struct drm_device *dev = encoder->dev;
> +       struct amdgpu_device *adev = dev->dev_private;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         u32 tmp;
>         int interlace = 0;
> @@ -1230,12 +1238,14 @@ static void dce_v10_0_audio_write_latency_fields(struct drm_encoder *encoder,
>         if (!dig || !dig->afmt || !dig->afmt->pin)
>                 return;
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> @@ -1261,10 +1271,12 @@ static void dce_v10_0_audio_write_latency_fields(struct drm_encoder *encoder,
>
>  static void dce_v10_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
>  {
> -       struct amdgpu_device *adev = encoder->dev->dev_private;
> +       struct drm_device *dev = encoder->dev;
> +       struct amdgpu_device *adev = dev->dev_private;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         u32 tmp;
>         u8 *sadb = NULL;
> @@ -1273,12 +1285,14 @@ static void dce_v10_0_audio_write_speaker_allocation(struct drm_encoder *encoder
>         if (!dig || !dig->afmt || !dig->afmt->pin)
>                 return;
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> @@ -1313,10 +1327,12 @@ static void dce_v10_0_audio_write_speaker_allocation(struct drm_encoder *encoder
>
>  static void dce_v10_0_audio_write_sad_regs(struct drm_encoder *encoder)
>  {
> -       struct amdgpu_device *adev = encoder->dev->dev_private;
> +       struct drm_device *dev = encoder->dev;
> +       struct amdgpu_device *adev = dev->dev_private;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         struct cea_sad *sads;
>         int i, sad_count;
> @@ -1339,12 +1355,14 @@ static void dce_v10_0_audio_write_sad_regs(struct drm_encoder *encoder)
>         if (!dig || !dig->afmt || !dig->afmt->pin)
>                 return;
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
> index d9f470632b2c..bde48775cf1b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
> @@ -348,9 +348,11 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
>  {
>         struct drm_device *dev = adev->ddev;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         u32 tmp;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
>
>                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> @@ -385,6 +387,7 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
>                 dce_v11_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
>                 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
>         }
> +       drm_connector_list_iter_end(&iter);
>  }
>
>  /**
> @@ -399,9 +402,11 @@ static void dce_v11_0_hpd_fini(struct amdgpu_device *adev)
>  {
>         struct drm_device *dev = adev->ddev;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         u32 tmp;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
>
>                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> @@ -413,6 +418,7 @@ static void dce_v11_0_hpd_fini(struct amdgpu_device *adev)
>
>                 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
>         }
> +       drm_connector_list_iter_end(&iter);
>  }
>
>  static u32 dce_v11_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
> @@ -1245,10 +1251,12 @@ static void dce_v11_0_afmt_audio_select_pin(struct drm_encoder *encoder)
>  static void dce_v11_0_audio_write_latency_fields(struct drm_encoder *encoder,
>                                                 struct drm_display_mode *mode)
>  {
> -       struct amdgpu_device *adev = encoder->dev->dev_private;
> +       struct drm_device *dev = encoder->dev;
> +       struct amdgpu_device *adev = dev->dev_private;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         u32 tmp;
>         int interlace = 0;
> @@ -1256,12 +1264,14 @@ static void dce_v11_0_audio_write_latency_fields(struct drm_encoder *encoder,
>         if (!dig || !dig->afmt || !dig->afmt->pin)
>                 return;
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> @@ -1287,10 +1297,12 @@ static void dce_v11_0_audio_write_latency_fields(struct drm_encoder *encoder,
>
>  static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
>  {
> -       struct amdgpu_device *adev = encoder->dev->dev_private;
> +       struct drm_device *dev = encoder->dev;
> +       struct amdgpu_device *adev = dev->dev_private;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         u32 tmp;
>         u8 *sadb = NULL;
> @@ -1299,12 +1311,14 @@ static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder
>         if (!dig || !dig->afmt || !dig->afmt->pin)
>                 return;
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> @@ -1339,10 +1353,12 @@ static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder
>
>  static void dce_v11_0_audio_write_sad_regs(struct drm_encoder *encoder)
>  {
> -       struct amdgpu_device *adev = encoder->dev->dev_private;
> +       struct drm_device *dev = encoder->dev;
> +       struct amdgpu_device *adev = dev->dev_private;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         struct cea_sad *sads;
>         int i, sad_count;
> @@ -1365,12 +1381,14 @@ static void dce_v11_0_audio_write_sad_regs(struct drm_encoder *encoder)
>         if (!dig || !dig->afmt || !dig->afmt->pin)
>                 return;
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> index 3eb2e7429269..65f61de931d7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> @@ -281,9 +281,11 @@ static void dce_v6_0_hpd_init(struct amdgpu_device *adev)
>  {
>         struct drm_device *dev = adev->ddev;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         u32 tmp;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
>
>                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> @@ -309,7 +311,7 @@ static void dce_v6_0_hpd_init(struct amdgpu_device *adev)
>                 dce_v6_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
>                 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
>         }
> -
> +       drm_connector_list_iter_end(&iter);
>  }
>
>  /**
> @@ -324,9 +326,11 @@ static void dce_v6_0_hpd_fini(struct amdgpu_device *adev)
>  {
>         struct drm_device *dev = adev->ddev;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         u32 tmp;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
>
>                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> @@ -338,6 +342,7 @@ static void dce_v6_0_hpd_fini(struct amdgpu_device *adev)
>
>                 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
>         }
> +       drm_connector_list_iter_end(&iter);
>  }
>
>  static u32 dce_v6_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
> @@ -1124,20 +1129,24 @@ static void dce_v6_0_audio_select_pin(struct drm_encoder *encoder)
>  static void dce_v6_0_audio_write_latency_fields(struct drm_encoder *encoder,
>                                                 struct drm_display_mode *mode)
>  {
> -       struct amdgpu_device *adev = encoder->dev->dev_private;
> +       struct drm_device *dev = encoder->dev;
> +       struct amdgpu_device *adev = dev->dev_private;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         int interlace = 0;
>         u32 tmp;
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> @@ -1164,21 +1173,25 @@ static void dce_v6_0_audio_write_latency_fields(struct drm_encoder *encoder,
>
>  static void dce_v6_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
>  {
> -       struct amdgpu_device *adev = encoder->dev->dev_private;
> +       struct drm_device *dev = encoder->dev;
> +       struct amdgpu_device *adev = dev->dev_private;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         u8 *sadb = NULL;
>         int sad_count;
>         u32 tmp;
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> @@ -1221,10 +1234,12 @@ static void dce_v6_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
>
>  static void dce_v6_0_audio_write_sad_regs(struct drm_encoder *encoder)
>  {
> -       struct amdgpu_device *adev = encoder->dev->dev_private;
> +       struct drm_device *dev = encoder->dev;
> +       struct amdgpu_device *adev = dev->dev_private;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         struct cea_sad *sads;
>         int i, sad_count;
> @@ -1244,12 +1259,14 @@ static void dce_v6_0_audio_write_sad_regs(struct drm_encoder *encoder)
>                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO },
>         };
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> @@ -1632,6 +1649,7 @@ static void dce_v6_0_afmt_setmode(struct drm_encoder *encoder,
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         int em = amdgpu_atombios_encoder_get_encoder_mode(encoder);
>         int bpc = 8;
> @@ -1639,12 +1657,14 @@ static void dce_v6_0_afmt_setmode(struct drm_encoder *encoder,
>         if (!dig || !dig->afmt)
>                 return;
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
> index a16c5e9e610e..e5f50882a51d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
> @@ -275,9 +275,11 @@ static void dce_v8_0_hpd_init(struct amdgpu_device *adev)
>  {
>         struct drm_device *dev = adev->ddev;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         u32 tmp;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
>
>                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> @@ -303,6 +305,7 @@ static void dce_v8_0_hpd_init(struct amdgpu_device *adev)
>                 dce_v8_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
>                 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
>         }
> +       drm_connector_list_iter_end(&iter);
>  }
>
>  /**
> @@ -317,9 +320,11 @@ static void dce_v8_0_hpd_fini(struct amdgpu_device *adev)
>  {
>         struct drm_device *dev = adev->ddev;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         u32 tmp;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
>
>                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> @@ -331,6 +336,7 @@ static void dce_v8_0_hpd_fini(struct amdgpu_device *adev)
>
>                 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
>         }
> +       drm_connector_list_iter_end(&iter);
>  }
>
>  static u32 dce_v8_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
> @@ -1157,10 +1163,12 @@ static void dce_v8_0_afmt_audio_select_pin(struct drm_encoder *encoder)
>  static void dce_v8_0_audio_write_latency_fields(struct drm_encoder *encoder,
>                                                 struct drm_display_mode *mode)
>  {
> -       struct amdgpu_device *adev = encoder->dev->dev_private;
> +       struct drm_device *dev = encoder->dev;
> +       struct amdgpu_device *adev = dev->dev_private;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         u32 tmp = 0, offset;
>
> @@ -1169,12 +1177,14 @@ static void dce_v8_0_audio_write_latency_fields(struct drm_encoder *encoder,
>
>         offset = dig->afmt->pin->offset;
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> @@ -1214,10 +1224,12 @@ static void dce_v8_0_audio_write_latency_fields(struct drm_encoder *encoder,
>
>  static void dce_v8_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
>  {
> -       struct amdgpu_device *adev = encoder->dev->dev_private;
> +       struct drm_device *dev = encoder->dev;
> +       struct amdgpu_device *adev = dev->dev_private;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         u32 offset, tmp;
>         u8 *sadb = NULL;
> @@ -1228,12 +1240,14 @@ static void dce_v8_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
>
>         offset = dig->afmt->pin->offset;
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> @@ -1263,11 +1277,13 @@ static void dce_v8_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
>
>  static void dce_v8_0_audio_write_sad_regs(struct drm_encoder *encoder)
>  {
> -       struct amdgpu_device *adev = encoder->dev->dev_private;
> +       struct drm_device *dev = encoder->dev;
> +       struct amdgpu_device *adev = dev->dev_private;
>         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
>         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
>         u32 offset;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct amdgpu_connector *amdgpu_connector = NULL;
>         struct cea_sad *sads;
>         int i, sad_count;
> @@ -1292,12 +1308,14 @@ static void dce_v8_0_audio_write_sad_regs(struct drm_encoder *encoder)
>
>         offset = dig->afmt->pin->offset;
>
> -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 if (connector->encoder == encoder) {
>                         amdgpu_connector = to_amdgpu_connector(connector);
>                         break;
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         if (!amdgpu_connector) {
>                 DRM_ERROR("Couldn't find encoder's connector\n");
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 0a71ed1e7762..73630e2940d4 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -896,27 +896,29 @@ static int detect_mst_link_for_all_connectors(struct drm_device *dev)
>  {
>         struct amdgpu_dm_connector *aconnector;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         int ret = 0;
>
> -       drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
> -
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 aconnector = to_amdgpu_dm_connector(connector);
>                 if (aconnector->dc_link->type == dc_connection_mst_branch &&
>                     aconnector->mst_mgr.aux) {
>                         DRM_DEBUG_DRIVER("DM_MST: starting TM on aconnector: %p [id: %d]\n",
> -                                       aconnector, aconnector->base.base.id);
> +                                        aconnector,
> +                                        aconnector->base.base.id);
>
>                         ret = drm_dp_mst_topology_mgr_set_mst(&aconnector->mst_mgr, true);
>                         if (ret < 0) {
>                                 DRM_ERROR("DM_MST: Failed to start MST\n");
> -                               ((struct dc_link *)aconnector->dc_link)->type = dc_connection_single;
> -                               return ret;
> -                               }
> +                               aconnector->dc_link->type =
> +                                       dc_connection_single;
> +                               break;
>                         }
> +               }
>         }
> +       drm_connector_list_iter_end(&iter);
>
> -       drm_modeset_unlock(&dev->mode_config.connection_mutex);
>         return ret;
>  }
>
> @@ -954,14 +956,13 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend)
>  {
>         struct amdgpu_dm_connector *aconnector;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct drm_dp_mst_topology_mgr *mgr;
>         int ret;
>         bool need_hotplug = false;
>
> -       drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
> -
> -       list_for_each_entry(connector, &dev->mode_config.connector_list,
> -                           head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 aconnector = to_amdgpu_dm_connector(connector);
>                 if (aconnector->dc_link->type != dc_connection_mst_branch ||
>                     aconnector->mst_port)
> @@ -979,8 +980,7 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend)
>                         }
>                 }
>         }
> -
> -       drm_modeset_unlock(&dev->mode_config.connection_mutex);
> +       drm_connector_list_iter_end(&iter);
>
>         if (need_hotplug)
>                 drm_kms_helper_hotplug_event(dev);
> @@ -1162,6 +1162,7 @@ static int dm_resume(void *handle)
>         struct amdgpu_display_manager *dm = &adev->dm;
>         struct amdgpu_dm_connector *aconnector;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>         struct drm_crtc *crtc;
>         struct drm_crtc_state *new_crtc_state;
>         struct dm_crtc_state *dm_new_crtc_state;
> @@ -1194,7 +1195,8 @@ static int dm_resume(void *handle)
>         amdgpu_dm_irq_resume_early(adev);
>
>         /* Do detection*/
> -       list_for_each_entry(connector, &ddev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(ddev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 aconnector = to_amdgpu_dm_connector(connector);
>
>                 /*
> @@ -1222,6 +1224,7 @@ static int dm_resume(void *handle)
>                 amdgpu_dm_update_connector_after_detect(aconnector);
>                 mutex_unlock(&aconnector->hpd_lock);
>         }
> +       drm_connector_list_iter_end(&iter);
>
>         /* Force mode set in atomic commit */
>         for_each_new_crtc_in_state(dm->cached_state, crtc, new_crtc_state, i)
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
> index fa5d503d379c..64445c4cc4c2 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
> @@ -732,8 +732,10 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
>  {
>         struct drm_device *dev = adev->ddev;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 struct amdgpu_dm_connector *amdgpu_dm_connector =
>                                 to_amdgpu_dm_connector(connector);
>
> @@ -751,6 +753,7 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
>                                         true);
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>  }
>
>  /**
> @@ -765,8 +768,10 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
>  {
>         struct drm_device *dev = adev->ddev;
>         struct drm_connector *connector;
> +       struct drm_connector_list_iter iter;
>
> -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> +       drm_connector_list_iter_begin(dev, &iter);
> +       drm_for_each_connector_iter(connector, &iter) {
>                 struct amdgpu_dm_connector *amdgpu_dm_connector =
>                                 to_amdgpu_dm_connector(connector);
>                 const struct dc_link *dc_link = amdgpu_dm_connector->dc_link;
> @@ -779,4 +784,5 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
>                                         false);
>                 }
>         }
> +       drm_connector_list_iter_end(&iter);
>  }
> --
> 2.21.0
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
On Fri, Sep 13, 2019 at 4:45 PM Alex Deucher <alexdeucher@gmail.com> wrote:
>
> On Tue, Sep 3, 2019 at 4:49 PM Lyude Paul <lyude@redhat.com> wrote:
> >
> > Currently, every single piece of code in amdgpu that loops through
> > connectors does it incorrectly and doesn't use the proper list iteration
> > helpers, drm_connector_list_iter_begin() and
> > drm_connector_list_iter_end(). Yeesh.
> >
> > So, do that.
>
> In fairness, I think the origin of this code predated the iterators.
> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
>

Applied.  Thanks!

Alex

> >
> > Cc: Juston Li <juston.li@intel.com>
> > Cc: Imre Deak <imre.deak@intel.com>
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Cc: Harry Wentland <hwentlan@amd.com>
> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> > Signed-off-by: Lyude Paul <lyude@redhat.com>
> > ---
> >  .../gpu/drm/amd/amdgpu/amdgpu_connectors.c    | 13 +++++-
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    | 20 +++++++---
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_display.c   |  5 ++-
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c  | 40 +++++++++++++------
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c       |  5 ++-
> >  drivers/gpu/drm/amd/amdgpu/dce_v10_0.c        | 34 ++++++++++++----
> >  drivers/gpu/drm/amd/amdgpu/dce_v11_0.c        | 34 ++++++++++++----
> >  drivers/gpu/drm/amd/amdgpu/dce_v6_0.c         | 40 ++++++++++++++-----
> >  drivers/gpu/drm/amd/amdgpu/dce_v8_0.c         | 34 ++++++++++++----
> >  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 33 ++++++++-------
> >  .../drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c | 10 ++++-
> >  11 files changed, 195 insertions(+), 73 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> > index ece55c8fa673..bd31bb595c04 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> > @@ -1022,8 +1022,12 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
> >                          */
> >                         if (amdgpu_connector->shared_ddc && (ret == connector_status_connected)) {
> >                                 struct drm_connector *list_connector;
> > +                               struct drm_connector_list_iter iter;
> >                                 struct amdgpu_connector *list_amdgpu_connector;
> > -                               list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) {
> > +
> > +                               drm_connector_list_iter_begin(dev, &iter);
> > +                               drm_for_each_connector_iter(list_connector,
> > +                                                           &iter) {
> >                                         if (connector == list_connector)
> >                                                 continue;
> >                                         list_amdgpu_connector = to_amdgpu_connector(list_connector);
> > @@ -1040,6 +1044,7 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
> >                                                 }
> >                                         }
> >                                 }
> > +                               drm_connector_list_iter_end(&iter);
> >                         }
> >                 }
> >         }
> > @@ -1501,6 +1506,7 @@ amdgpu_connector_add(struct amdgpu_device *adev,
> >  {
> >         struct drm_device *dev = adev->ddev;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector;
> >         struct amdgpu_connector_atom_dig *amdgpu_dig_connector;
> >         struct drm_encoder *encoder;
> > @@ -1515,10 +1521,12 @@ amdgpu_connector_add(struct amdgpu_device *adev,
> >                 return;
> >
> >         /* see if we already added it */
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 amdgpu_connector = to_amdgpu_connector(connector);
> >                 if (amdgpu_connector->connector_id == connector_id) {
> >                         amdgpu_connector->devices |= supported_device;
> > +                       drm_connector_list_iter_end(&iter);
> >                         return;
> >                 }
> >                 if (amdgpu_connector->ddc_bus && i2c_bus->valid) {
> > @@ -1533,6 +1541,7 @@ amdgpu_connector_add(struct amdgpu_device *adev,
> >                         }
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         /* check if it's a dp bridge */
> >         list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> > index 2f884699eaef..acd39ce9b08e 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> > @@ -3004,6 +3004,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
> >         struct amdgpu_device *adev;
> >         struct drm_crtc *crtc;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         int r;
> >
> >         if (dev == NULL || dev->dev_private == NULL) {
> > @@ -3026,9 +3027,11 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
> >         if (!amdgpu_device_has_dc_support(adev)) {
> >                 /* turn off display hw */
> >                 drm_modeset_lock_all(dev);
> > -               list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > -                       drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
> > -               }
> > +               drm_connector_list_iter_begin(dev, &iter);
> > +               drm_for_each_connector_iter(connector, &iter)
> > +                       drm_helper_connector_dpms(connector,
> > +                                                 DRM_MODE_DPMS_OFF);
> > +               drm_connector_list_iter_end(&iter);
> >                 drm_modeset_unlock_all(dev);
> >                         /* unpin the front buffers and cursors */
> >                 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
> > @@ -3107,6 +3110,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon)
> >  int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
> >  {
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_device *adev = dev->dev_private;
> >         struct drm_crtc *crtc;
> >         int r = 0;
> > @@ -3177,9 +3181,13 @@ int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon)
> >
> >                         /* turn on display hw */
> >                         drm_modeset_lock_all(dev);
> > -                       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > -                               drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
> > -                       }
> > +
> > +                       drm_connector_list_iter_begin(dev, &iter);
> > +                       drm_for_each_connector_iter(connector, &iter)
> > +                               drm_helper_connector_dpms(connector,
> > +                                                         DRM_MODE_DPMS_ON);
> > +                       drm_connector_list_iter_end(&iter);
> > +
> >                         drm_modeset_unlock_all(dev);
> >                 }
> >                 amdgpu_fbdev_set_suspend(adev, 0);
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> > index 1d4aaa9580f4..d2dd59a95e8a 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> > @@ -370,11 +370,13 @@ void amdgpu_display_print_display_setup(struct drm_device *dev)
> >         struct amdgpu_connector *amdgpu_connector;
> >         struct drm_encoder *encoder;
> >         struct amdgpu_encoder *amdgpu_encoder;
> > +       struct drm_connector_list_iter iter;
> >         uint32_t devices;
> >         int i = 0;
> >
> > +       drm_connector_list_iter_begin(dev, &iter);
> >         DRM_INFO("AMDGPU Display Connectors\n");
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 amdgpu_connector = to_amdgpu_connector(connector);
> >                 DRM_INFO("Connector %d:\n", i);
> >                 DRM_INFO("  %s\n", connector->name);
> > @@ -438,6 +440,7 @@ void amdgpu_display_print_display_setup(struct drm_device *dev)
> >                 }
> >                 i++;
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >  }
> >
> >  /**
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c
> > index 571a6dfb473e..61fcf247a638 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c
> > @@ -37,12 +37,14 @@ amdgpu_link_encoder_connector(struct drm_device *dev)
> >  {
> >         struct amdgpu_device *adev = dev->dev_private;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector;
> >         struct drm_encoder *encoder;
> >         struct amdgpu_encoder *amdgpu_encoder;
> >
> > +       drm_connector_list_iter_begin(dev, &iter);
> >         /* walk the list and link encoders to connectors */
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 amdgpu_connector = to_amdgpu_connector(connector);
> >                 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
> >                         amdgpu_encoder = to_amdgpu_encoder(encoder);
> > @@ -55,6 +57,7 @@ amdgpu_link_encoder_connector(struct drm_device *dev)
> >                         }
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >  }
> >
> >  void amdgpu_encoder_set_active_device(struct drm_encoder *encoder)
> > @@ -62,8 +65,10 @@ void amdgpu_encoder_set_active_device(struct drm_encoder *encoder)
> >         struct drm_device *dev = encoder->dev;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
> >                         amdgpu_encoder->active_device = amdgpu_encoder->devices & amdgpu_connector->devices;
> > @@ -72,6 +77,7 @@ void amdgpu_encoder_set_active_device(struct drm_encoder *encoder)
> >                                   amdgpu_connector->devices, encoder->encoder_type);
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >  }
> >
> >  struct drm_connector *
> > @@ -79,15 +85,20 @@ amdgpu_get_connector_for_encoder(struct drm_encoder *encoder)
> >  {
> >         struct drm_device *dev = encoder->dev;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> > -       struct drm_connector *connector;
> > +       struct drm_connector *connector, *found = NULL;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 amdgpu_connector = to_amdgpu_connector(connector);
> > -               if (amdgpu_encoder->active_device & amdgpu_connector->devices)
> > -                       return connector;
> > +               if (amdgpu_encoder->active_device & amdgpu_connector->devices) {
> > +                       found = connector;
> > +                       break;
> > +               }
> >         }
> > -       return NULL;
> > +       drm_connector_list_iter_end(&iter);
> > +       return found;
> >  }
> >
> >  struct drm_connector *
> > @@ -95,15 +106,20 @@ amdgpu_get_connector_for_encoder_init(struct drm_encoder *encoder)
> >  {
> >         struct drm_device *dev = encoder->dev;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> > -       struct drm_connector *connector;
> > +       struct drm_connector *connector, *found = NULL;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 amdgpu_connector = to_amdgpu_connector(connector);
> > -               if (amdgpu_encoder->devices & amdgpu_connector->devices)
> > -                       return connector;
> > +               if (amdgpu_encoder->devices & amdgpu_connector->devices) {
> > +                       found = connector;
> > +                       break;
> > +               }
> >         }
> > -       return NULL;
> > +       drm_connector_list_iter_end(&iter);
> > +       return found;
> >  }
> >
> >  struct drm_encoder *amdgpu_get_external_encoder(struct drm_encoder *encoder)
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
> > index 2a3f5ec298db..977e121204e6 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
> > @@ -87,10 +87,13 @@ static void amdgpu_hotplug_work_func(struct work_struct *work)
> >         struct drm_device *dev = adev->ddev;
> >         struct drm_mode_config *mode_config = &dev->mode_config;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >
> >         mutex_lock(&mode_config->mutex);
> > -       list_for_each_entry(connector, &mode_config->connector_list, head)
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter)
> >                 amdgpu_connector_hotplug(connector);
> > +       drm_connector_list_iter_end(&iter);
> >         mutex_unlock(&mode_config->mutex);
> >         /* Just fire off a uevent and let userspace tell us what to do */
> >         drm_helper_hpd_irq_event(dev);
> > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
> > index 645550e7caf5..be82871ac3bd 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
> > @@ -330,9 +330,11 @@ static void dce_v10_0_hpd_init(struct amdgpu_device *adev)
> >  {
> >         struct drm_device *dev = adev->ddev;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         u32 tmp;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
> >
> >                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> > @@ -368,6 +370,7 @@ static void dce_v10_0_hpd_init(struct amdgpu_device *adev)
> >                 amdgpu_irq_get(adev, &adev->hpd_irq,
> >                                amdgpu_connector->hpd.hpd);
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >  }
> >
> >  /**
> > @@ -382,9 +385,11 @@ static void dce_v10_0_hpd_fini(struct amdgpu_device *adev)
> >  {
> >         struct drm_device *dev = adev->ddev;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         u32 tmp;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
> >
> >                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> > @@ -397,6 +402,7 @@ static void dce_v10_0_hpd_fini(struct amdgpu_device *adev)
> >                 amdgpu_irq_put(adev, &adev->hpd_irq,
> >                                amdgpu_connector->hpd.hpd);
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >  }
> >
> >  static u32 dce_v10_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
> > @@ -1219,10 +1225,12 @@ static void dce_v10_0_afmt_audio_select_pin(struct drm_encoder *encoder)
> >  static void dce_v10_0_audio_write_latency_fields(struct drm_encoder *encoder,
> >                                                 struct drm_display_mode *mode)
> >  {
> > -       struct amdgpu_device *adev = encoder->dev->dev_private;
> > +       struct drm_device *dev = encoder->dev;
> > +       struct amdgpu_device *adev = dev->dev_private;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         u32 tmp;
> >         int interlace = 0;
> > @@ -1230,12 +1238,14 @@ static void dce_v10_0_audio_write_latency_fields(struct drm_encoder *encoder,
> >         if (!dig || !dig->afmt || !dig->afmt->pin)
> >                 return;
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > @@ -1261,10 +1271,12 @@ static void dce_v10_0_audio_write_latency_fields(struct drm_encoder *encoder,
> >
> >  static void dce_v10_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
> >  {
> > -       struct amdgpu_device *adev = encoder->dev->dev_private;
> > +       struct drm_device *dev = encoder->dev;
> > +       struct amdgpu_device *adev = dev->dev_private;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         u32 tmp;
> >         u8 *sadb = NULL;
> > @@ -1273,12 +1285,14 @@ static void dce_v10_0_audio_write_speaker_allocation(struct drm_encoder *encoder
> >         if (!dig || !dig->afmt || !dig->afmt->pin)
> >                 return;
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > @@ -1313,10 +1327,12 @@ static void dce_v10_0_audio_write_speaker_allocation(struct drm_encoder *encoder
> >
> >  static void dce_v10_0_audio_write_sad_regs(struct drm_encoder *encoder)
> >  {
> > -       struct amdgpu_device *adev = encoder->dev->dev_private;
> > +       struct drm_device *dev = encoder->dev;
> > +       struct amdgpu_device *adev = dev->dev_private;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         struct cea_sad *sads;
> >         int i, sad_count;
> > @@ -1339,12 +1355,14 @@ static void dce_v10_0_audio_write_sad_regs(struct drm_encoder *encoder)
> >         if (!dig || !dig->afmt || !dig->afmt->pin)
> >                 return;
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
> > index d9f470632b2c..bde48775cf1b 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
> > @@ -348,9 +348,11 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
> >  {
> >         struct drm_device *dev = adev->ddev;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         u32 tmp;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
> >
> >                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> > @@ -385,6 +387,7 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)
> >                 dce_v11_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
> >                 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >  }
> >
> >  /**
> > @@ -399,9 +402,11 @@ static void dce_v11_0_hpd_fini(struct amdgpu_device *adev)
> >  {
> >         struct drm_device *dev = adev->ddev;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         u32 tmp;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
> >
> >                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> > @@ -413,6 +418,7 @@ static void dce_v11_0_hpd_fini(struct amdgpu_device *adev)
> >
> >                 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >  }
> >
> >  static u32 dce_v11_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
> > @@ -1245,10 +1251,12 @@ static void dce_v11_0_afmt_audio_select_pin(struct drm_encoder *encoder)
> >  static void dce_v11_0_audio_write_latency_fields(struct drm_encoder *encoder,
> >                                                 struct drm_display_mode *mode)
> >  {
> > -       struct amdgpu_device *adev = encoder->dev->dev_private;
> > +       struct drm_device *dev = encoder->dev;
> > +       struct amdgpu_device *adev = dev->dev_private;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         u32 tmp;
> >         int interlace = 0;
> > @@ -1256,12 +1264,14 @@ static void dce_v11_0_audio_write_latency_fields(struct drm_encoder *encoder,
> >         if (!dig || !dig->afmt || !dig->afmt->pin)
> >                 return;
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > @@ -1287,10 +1297,12 @@ static void dce_v11_0_audio_write_latency_fields(struct drm_encoder *encoder,
> >
> >  static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
> >  {
> > -       struct amdgpu_device *adev = encoder->dev->dev_private;
> > +       struct drm_device *dev = encoder->dev;
> > +       struct amdgpu_device *adev = dev->dev_private;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         u32 tmp;
> >         u8 *sadb = NULL;
> > @@ -1299,12 +1311,14 @@ static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder
> >         if (!dig || !dig->afmt || !dig->afmt->pin)
> >                 return;
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > @@ -1339,10 +1353,12 @@ static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder
> >
> >  static void dce_v11_0_audio_write_sad_regs(struct drm_encoder *encoder)
> >  {
> > -       struct amdgpu_device *adev = encoder->dev->dev_private;
> > +       struct drm_device *dev = encoder->dev;
> > +       struct amdgpu_device *adev = dev->dev_private;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         struct cea_sad *sads;
> >         int i, sad_count;
> > @@ -1365,12 +1381,14 @@ static void dce_v11_0_audio_write_sad_regs(struct drm_encoder *encoder)
> >         if (!dig || !dig->afmt || !dig->afmt->pin)
> >                 return;
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> > index 3eb2e7429269..65f61de931d7 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
> > @@ -281,9 +281,11 @@ static void dce_v6_0_hpd_init(struct amdgpu_device *adev)
> >  {
> >         struct drm_device *dev = adev->ddev;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         u32 tmp;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
> >
> >                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> > @@ -309,7 +311,7 @@ static void dce_v6_0_hpd_init(struct amdgpu_device *adev)
> >                 dce_v6_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
> >                 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
> >         }
> > -
> > +       drm_connector_list_iter_end(&iter);
> >  }
> >
> >  /**
> > @@ -324,9 +326,11 @@ static void dce_v6_0_hpd_fini(struct amdgpu_device *adev)
> >  {
> >         struct drm_device *dev = adev->ddev;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         u32 tmp;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
> >
> >                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> > @@ -338,6 +342,7 @@ static void dce_v6_0_hpd_fini(struct amdgpu_device *adev)
> >
> >                 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >  }
> >
> >  static u32 dce_v6_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
> > @@ -1124,20 +1129,24 @@ static void dce_v6_0_audio_select_pin(struct drm_encoder *encoder)
> >  static void dce_v6_0_audio_write_latency_fields(struct drm_encoder *encoder,
> >                                                 struct drm_display_mode *mode)
> >  {
> > -       struct amdgpu_device *adev = encoder->dev->dev_private;
> > +       struct drm_device *dev = encoder->dev;
> > +       struct amdgpu_device *adev = dev->dev_private;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         int interlace = 0;
> >         u32 tmp;
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > @@ -1164,21 +1173,25 @@ static void dce_v6_0_audio_write_latency_fields(struct drm_encoder *encoder,
> >
> >  static void dce_v6_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
> >  {
> > -       struct amdgpu_device *adev = encoder->dev->dev_private;
> > +       struct drm_device *dev = encoder->dev;
> > +       struct amdgpu_device *adev = dev->dev_private;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         u8 *sadb = NULL;
> >         int sad_count;
> >         u32 tmp;
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > @@ -1221,10 +1234,12 @@ static void dce_v6_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
> >
> >  static void dce_v6_0_audio_write_sad_regs(struct drm_encoder *encoder)
> >  {
> > -       struct amdgpu_device *adev = encoder->dev->dev_private;
> > +       struct drm_device *dev = encoder->dev;
> > +       struct amdgpu_device *adev = dev->dev_private;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         struct cea_sad *sads;
> >         int i, sad_count;
> > @@ -1244,12 +1259,14 @@ static void dce_v6_0_audio_write_sad_regs(struct drm_encoder *encoder)
> >                 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO },
> >         };
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > @@ -1632,6 +1649,7 @@ static void dce_v6_0_afmt_setmode(struct drm_encoder *encoder,
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         int em = amdgpu_atombios_encoder_get_encoder_mode(encoder);
> >         int bpc = 8;
> > @@ -1639,12 +1657,14 @@ static void dce_v6_0_afmt_setmode(struct drm_encoder *encoder,
> >         if (!dig || !dig->afmt)
> >                 return;
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
> > index a16c5e9e610e..e5f50882a51d 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
> > @@ -275,9 +275,11 @@ static void dce_v8_0_hpd_init(struct amdgpu_device *adev)
> >  {
> >         struct drm_device *dev = adev->ddev;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         u32 tmp;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
> >
> >                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> > @@ -303,6 +305,7 @@ static void dce_v8_0_hpd_init(struct amdgpu_device *adev)
> >                 dce_v8_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
> >                 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >  }
> >
> >  /**
> > @@ -317,9 +320,11 @@ static void dce_v8_0_hpd_fini(struct amdgpu_device *adev)
> >  {
> >         struct drm_device *dev = adev->ddev;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         u32 tmp;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
> >
> >                 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)
> > @@ -331,6 +336,7 @@ static void dce_v8_0_hpd_fini(struct amdgpu_device *adev)
> >
> >                 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >  }
> >
> >  static u32 dce_v8_0_hpd_get_gpio_reg(struct amdgpu_device *adev)
> > @@ -1157,10 +1163,12 @@ static void dce_v8_0_afmt_audio_select_pin(struct drm_encoder *encoder)
> >  static void dce_v8_0_audio_write_latency_fields(struct drm_encoder *encoder,
> >                                                 struct drm_display_mode *mode)
> >  {
> > -       struct amdgpu_device *adev = encoder->dev->dev_private;
> > +       struct drm_device *dev = encoder->dev;
> > +       struct amdgpu_device *adev = dev->dev_private;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         u32 tmp = 0, offset;
> >
> > @@ -1169,12 +1177,14 @@ static void dce_v8_0_audio_write_latency_fields(struct drm_encoder *encoder,
> >
> >         offset = dig->afmt->pin->offset;
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > @@ -1214,10 +1224,12 @@ static void dce_v8_0_audio_write_latency_fields(struct drm_encoder *encoder,
> >
> >  static void dce_v8_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
> >  {
> > -       struct amdgpu_device *adev = encoder->dev->dev_private;
> > +       struct drm_device *dev = encoder->dev;
> > +       struct amdgpu_device *adev = dev->dev_private;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         u32 offset, tmp;
> >         u8 *sadb = NULL;
> > @@ -1228,12 +1240,14 @@ static void dce_v8_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
> >
> >         offset = dig->afmt->pin->offset;
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > @@ -1263,11 +1277,13 @@ static void dce_v8_0_audio_write_speaker_allocation(struct drm_encoder *encoder)
> >
> >  static void dce_v8_0_audio_write_sad_regs(struct drm_encoder *encoder)
> >  {
> > -       struct amdgpu_device *adev = encoder->dev->dev_private;
> > +       struct drm_device *dev = encoder->dev;
> > +       struct amdgpu_device *adev = dev->dev_private;
> >         struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
> >         struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
> >         u32 offset;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct amdgpu_connector *amdgpu_connector = NULL;
> >         struct cea_sad *sads;
> >         int i, sad_count;
> > @@ -1292,12 +1308,14 @@ static void dce_v8_0_audio_write_sad_regs(struct drm_encoder *encoder)
> >
> >         offset = dig->afmt->pin->offset;
> >
> > -       list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 if (connector->encoder == encoder) {
> >                         amdgpu_connector = to_amdgpu_connector(connector);
> >                         break;
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (!amdgpu_connector) {
> >                 DRM_ERROR("Couldn't find encoder's connector\n");
> > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > index 0a71ed1e7762..73630e2940d4 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > @@ -896,27 +896,29 @@ static int detect_mst_link_for_all_connectors(struct drm_device *dev)
> >  {
> >         struct amdgpu_dm_connector *aconnector;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         int ret = 0;
> >
> > -       drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
> > -
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 aconnector = to_amdgpu_dm_connector(connector);
> >                 if (aconnector->dc_link->type == dc_connection_mst_branch &&
> >                     aconnector->mst_mgr.aux) {
> >                         DRM_DEBUG_DRIVER("DM_MST: starting TM on aconnector: %p [id: %d]\n",
> > -                                       aconnector, aconnector->base.base.id);
> > +                                        aconnector,
> > +                                        aconnector->base.base.id);
> >
> >                         ret = drm_dp_mst_topology_mgr_set_mst(&aconnector->mst_mgr, true);
> >                         if (ret < 0) {
> >                                 DRM_ERROR("DM_MST: Failed to start MST\n");
> > -                               ((struct dc_link *)aconnector->dc_link)->type = dc_connection_single;
> > -                               return ret;
> > -                               }
> > +                               aconnector->dc_link->type =
> > +                                       dc_connection_single;
> > +                               break;
> >                         }
> > +               }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> > -       drm_modeset_unlock(&dev->mode_config.connection_mutex);
> >         return ret;
> >  }
> >
> > @@ -954,14 +956,13 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend)
> >  {
> >         struct amdgpu_dm_connector *aconnector;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct drm_dp_mst_topology_mgr *mgr;
> >         int ret;
> >         bool need_hotplug = false;
> >
> > -       drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
> > -
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list,
> > -                           head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 aconnector = to_amdgpu_dm_connector(connector);
> >                 if (aconnector->dc_link->type != dc_connection_mst_branch ||
> >                     aconnector->mst_port)
> > @@ -979,8 +980,7 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend)
> >                         }
> >                 }
> >         }
> > -
> > -       drm_modeset_unlock(&dev->mode_config.connection_mutex);
> > +       drm_connector_list_iter_end(&iter);
> >
> >         if (need_hotplug)
> >                 drm_kms_helper_hotplug_event(dev);
> > @@ -1162,6 +1162,7 @@ static int dm_resume(void *handle)
> >         struct amdgpu_display_manager *dm = &adev->dm;
> >         struct amdgpu_dm_connector *aconnector;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >         struct drm_crtc *crtc;
> >         struct drm_crtc_state *new_crtc_state;
> >         struct dm_crtc_state *dm_new_crtc_state;
> > @@ -1194,7 +1195,8 @@ static int dm_resume(void *handle)
> >         amdgpu_dm_irq_resume_early(adev);
> >
> >         /* Do detection*/
> > -       list_for_each_entry(connector, &ddev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(ddev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 aconnector = to_amdgpu_dm_connector(connector);
> >
> >                 /*
> > @@ -1222,6 +1224,7 @@ static int dm_resume(void *handle)
> >                 amdgpu_dm_update_connector_after_detect(aconnector);
> >                 mutex_unlock(&aconnector->hpd_lock);
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >
> >         /* Force mode set in atomic commit */
> >         for_each_new_crtc_in_state(dm->cached_state, crtc, new_crtc_state, i)
> > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
> > index fa5d503d379c..64445c4cc4c2 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
> > @@ -732,8 +732,10 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
> >  {
> >         struct drm_device *dev = adev->ddev;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 struct amdgpu_dm_connector *amdgpu_dm_connector =
> >                                 to_amdgpu_dm_connector(connector);
> >
> > @@ -751,6 +753,7 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev)
> >                                         true);
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >  }
> >
> >  /**
> > @@ -765,8 +768,10 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
> >  {
> >         struct drm_device *dev = adev->ddev;
> >         struct drm_connector *connector;
> > +       struct drm_connector_list_iter iter;
> >
> > -       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
> > +       drm_connector_list_iter_begin(dev, &iter);
> > +       drm_for_each_connector_iter(connector, &iter) {
> >                 struct amdgpu_dm_connector *amdgpu_dm_connector =
> >                                 to_amdgpu_dm_connector(connector);
> >                 const struct dc_link *dc_link = amdgpu_dm_connector->dc_link;
> > @@ -779,4 +784,5 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev)
> >                                         false);
> >                 }
> >         }
> > +       drm_connector_list_iter_end(&iter);
> >  }
> > --
> > 2.21.0
> >
> > _______________________________________________
> > amd-gfx mailing list
> > amd-gfx@lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/amd-gfx