diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3996-drm-amdgpu-Iterate-through-DRM-connectors-correctly.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3996-drm-amdgpu-Iterate-through-DRM-connectors-correctly.patch | 998 |
1 files changed, 998 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3996-drm-amdgpu-Iterate-through-DRM-connectors-correctly.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3996-drm-amdgpu-Iterate-through-DRM-connectors-correctly.patch new file mode 100644 index 00000000..8435d75f --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3996-drm-amdgpu-Iterate-through-DRM-connectors-correctly.patch @@ -0,0 +1,998 @@ +From 2ece5e4d1ded4f21bd19abcc9e36b9745ea19354 Mon Sep 17 00:00:00 2001 +From: Lyude Paul <lyude@redhat.com> +Date: Tue, 3 Sep 2019 16:46:01 -0400 +Subject: [PATCH 3996/4256] drm/amdgpu: Iterate through DRM connectors + correctly +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +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> +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +Signed-off-by: Lyude Paul <lyude@redhat.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.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 69ad6ec0a4f3..b1226ac57515 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; +@@ -1514,10 +1520,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) { +@@ -1532,6 +1540,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 8f7e8911d4f3..9e9617ce9381 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -3027,6 +3027,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) { +@@ -3049,9 +3050,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) { +@@ -3130,6 +3133,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; +@@ -3200,9 +3204,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 543f7a8f6c76..aad642e660b2 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +@@ -368,11 +368,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); +@@ -436,6 +438,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 ec78e2b2015c..02a42e908b1d 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 d391087844e0..708fee1f2466 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +@@ -84,10 +84,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 c35181e2bfe7..b6338d9d871b 100644 +--- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +@@ -327,9 +327,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) +@@ -365,6 +367,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); + } + + /** +@@ -379,9 +382,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) +@@ -394,6 +399,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) +@@ -1216,10 +1222,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; +@@ -1227,12 +1235,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"); +@@ -1258,10 +1268,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; +@@ -1270,12 +1282,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"); +@@ -1310,10 +1324,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; +@@ -1336,12 +1352,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 f459fc70074c..6a5e13f34e8c 100644 +--- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +@@ -345,9 +345,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) +@@ -382,6 +384,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); + } + + /** +@@ -396,9 +399,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) +@@ -410,6 +415,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) +@@ -1242,10 +1248,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; +@@ -1253,12 +1261,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"); +@@ -1284,10 +1294,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; +@@ -1296,12 +1308,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"); +@@ -1336,10 +1350,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; +@@ -1362,12 +1378,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 bcea8a1a6ba6..084d5770b32d 100644 +--- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +@@ -276,9 +276,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) +@@ -304,7 +306,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); + } + + /** +@@ -319,9 +321,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) +@@ -333,6 +337,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) +@@ -1119,20 +1124,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"); +@@ -1159,21 +1168,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"); +@@ -1216,10 +1229,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; +@@ -1239,12 +1254,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"); +@@ -1626,6 +1643,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; +@@ -1633,12 +1651,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 37fd742ab62d..183fc065963a 100644 +--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +@@ -272,9 +272,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) +@@ -300,6 +302,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); + } + + /** +@@ -314,9 +317,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) +@@ -328,6 +333,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) +@@ -1154,10 +1160,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; + +@@ -1166,12 +1174,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"); +@@ -1211,10 +1221,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; +@@ -1225,12 +1237,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"); +@@ -1260,11 +1274,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; +@@ -1289,12 +1305,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 7ade3cbb5552..c654ec649ae5 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -928,27 +928,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; + } + +@@ -991,14 +993,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) +@@ -1016,8 +1017,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); +@@ -1199,6 +1199,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; +@@ -1231,7 +1232,8 @@ static int dm_resume(void *handle) + s3_handle_mst(ddev, false); + + /* 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); + + /* +@@ -1259,6 +1261,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 comit */ + 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 4e6da61d1a93..c68ab269523e 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 +@@ -734,8 +734,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); + +@@ -753,6 +755,7 @@ void amdgpu_dm_hpd_init(struct amdgpu_device *adev) + true); + } + } ++ drm_connector_list_iter_end(&iter); + } + + /** +@@ -767,8 +770,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; +@@ -781,4 +786,5 @@ void amdgpu_dm_hpd_fini(struct amdgpu_device *adev) + false); + } + } ++ drm_connector_list_iter_end(&iter); + } +-- +2.17.1 + |