All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Deucher <alexdeucher@gmail.com>
To: Lyude Paul <lyude@redhat.com>
Cc: "Maling list - DRI developers" <dri-devel@lists.freedesktop.org>,
	nouveau <nouveau@lists.freedesktop.org>,
	"amd-gfx list" <amd-gfx@lists.freedesktop.org>,
	"Neil Armstrong" <narmstrong@baylibre.com>,
	"David Airlie" <airlied@linux.ie>,
	"Daniel Vetter" <daniel.vetter@ffwll.ch>,
	"Imre Deak" <imre.deak@intel.com>, "Tao Zhou" <tao.zhou1@amd.com>,
	"Huang Rui" <ray.huang@amd.com>, "Shirish S" <shirish.s@amd.com>,
	"Sam Ravnborg" <sam@ravnborg.org>,
	"Markus Elfring" <elfring@users.sourceforge.net>,
	"Ville Syrjälä" <ville.syrjala@linux.intel.com>,
	"David (ChunMing) Zhou" <David1.Zhou@amd.com>,
	"Mario Kleiner" <mario.kleiner.de@gmail.com>,
	"Yu Zhao" <yuzhao@google.com>,
	"Bhawanpreet Lakha" <Bhawanpreet.Lakha@amd.com>,
	"David Francis" <David.Francis@amd.com>,
	"Jani Nikula" <jani.nikula@intel.com>,
	"Thierry Reding" <treding@nvidia.com>,
	"Harry Wentland" <harry.wentland@amd.com>,
	"Juston Li" <juston.li@intel.com>,
	"Andrey Grodzovsky" <andrey.grodzovsky@amd.com>,
	"Leo Li" <sunpeng.li@amd.com>, "Emily Deng" <Emily.Deng@amd.com>,
	"Russell King" <rmk+kernel@armlinux.org.uk>,
	"Evan Quan" <evan.quan@amd.com>,
	"Harry Wentland" <hwentlan@amd.com>,
	"Felix Kuehling" <Felix.Kuehling@amd.com>,
	"xinhui pan" <xinhui.pan@amd.com>,
	"Michel Dänzer" <michel.daenzer@amd.com>,
	LKML <linux-kernel@vger.kernel.org>,
	"Andrzej Pietrasiewicz" <andrzej.p@collabora.com>,
	"Daniel Vetter" <daniel@ffwll.ch>,
	"Alex Deucher" <alexander.deucher@amd.com>,
	"Colin Ian King" <colin.king@canonical.com>,
	"Nicholas Kazlauskas" <nicholas.kazlauskas@amd.com>,
	"Rex Zhu" <Rex.Zhu@amd.com>,
	"Christian König" <christian.koenig@amd.com>,
	"Hawking Zhang" <Hawking.Zhang@amd.com>
Subject: Re: [PATCH v2 23/27] drm/amdgpu: Iterate through DRM connectors correctly
Date: Fri, 13 Sep 2019 16:45:37 -0400	[thread overview]
Message-ID: <CADnq5_NvhO751ihc64KmkxR_dOWNn5XJ4bJc95CMUEkGkw1Y2Q@mail.gmail.com> (raw)
In-Reply-To: <20190903204645.25487-24-lyude@redhat.com>

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

WARNING: multiple messages have this Message-ID (diff)
From: Alex Deucher <alexdeucher-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Lyude Paul <lyude-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: "Neil Armstrong"
	<narmstrong-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>,
	"David Airlie" <airlied-cv59FeDIM0c@public.gmane.org>,
	nouveau
	<nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org>,
	"Imre Deak" <imre.deak-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
	"Tao Zhou" <tao.zhou1-5C7GfCeVMHo@public.gmane.org>,
	"Maling list - DRI developers"
	<dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org>,
	"Huang Rui" <ray.huang-5C7GfCeVMHo@public.gmane.org>,
	"Andrzej Pietrasiewicz"
	<andrzej.p-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>,
	"Sam Ravnborg" <sam-uyr5N9Q2VtJg9hUCZPvPmw@public.gmane.org>,
	"Markus Elfring"
	<elfring-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>,
	"Ville Syrjälä"
	<ville.syrjala-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>,
	"David (ChunMing) Zhou"
	<David1.Zhou-5C7GfCeVMHo@public.gmane.org>,
	"Mario Kleiner"
	<mario.kleiner.de-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	"Yu Zhao" <yuzhao-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
	"Harry Wentland" <hwentlan-5C7GfCeVMHo@public.gmane.org>,
	"David Francis" <David.Francis-5C7GfCeVMHo@public.gmane.org>,
	"amd-gfx list"
	<amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org>,
	"Leo Li" <sunpeng.li-5C7GfCeVMHo@public.gmane.org>,
	"Daniel Vetter" <daniel.vetter-/w4YWyX8dFk@public.gmane.org>,
	"Thierry Reding"
	<treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>,
	"Harry Wentland" <harry.wentland-5C7GfCeVMHo@public.gmane.org>,
	"Juston Li" <juston.li@int>
Subject: Re: [PATCH v2 23/27] drm/amdgpu: Iterate through DRM connectors correctly
Date: Fri, 13 Sep 2019 16:45:37 -0400	[thread overview]
Message-ID: <CADnq5_NvhO751ihc64KmkxR_dOWNn5XJ4bJc95CMUEkGkw1Y2Q@mail.gmail.com> (raw)
In-Reply-To: <20190903204645.25487-24-lyude-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

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
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

  reply	other threads:[~2019-09-13 20:46 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-03 20:45 [PATCH v2 00/27] DP MST Refactors + debugging tools + suspend/resume reprobing Lyude Paul
2019-09-03 20:45 ` [PATCH v2 01/27] drm/dp_mst: Move link address dumping into a function Lyude Paul
2019-09-25 17:45   ` Sean Paul
2019-09-03 20:45 ` [PATCH v2 02/27] drm/dp_mst: Get rid of list clear in destroy_connector_work Lyude Paul
2019-09-25 17:45   ` Sean Paul
2019-09-03 20:45 ` [PATCH v2 03/27] drm/dp_mst: Destroy MSTBs asynchronously Lyude Paul
2019-09-25 18:16   ` Sean Paul
2019-09-25 20:08     ` Lyude Paul
2019-09-27 13:31       ` Sean Paul
2019-09-27 13:31         ` Sean Paul
2019-10-08  9:45         ` Daniel Vetter
2019-09-03 20:45 ` [PATCH v2 04/27] drm/dp_mst: Move test_calc_pbn_mode() into an actual selftest Lyude Paul
2019-09-03 20:45   ` Lyude Paul
2019-09-25 18:17   ` Sean Paul
2019-09-03 20:45 ` [PATCH v2 05/27] drm/print: Add drm_err_printer() Lyude Paul
2019-09-03 20:45   ` Lyude Paul
2019-09-03 20:45 ` [PATCH v2 06/27] drm/dp_mst: Combine redundant cases in drm_dp_encode_sideband_req() Lyude Paul
2019-09-03 21:35   ` Dave Airlie
2019-09-03 21:57   ` [PATCH v3] " Lyude Paul
2019-09-03 20:45 ` [PATCH v2 07/27] drm/dp_mst: Add sideband down request tracing + selftests Lyude Paul
2019-09-03 20:45   ` Lyude Paul
2019-09-10  9:01   ` Jani Nikula
2019-09-03 20:45 ` [PATCH v2 08/27] drm/dp_mst: Remove PDT teardown in drm_dp_destroy_port() and refactor Lyude Paul
2019-09-03 20:45   ` Lyude Paul
2019-09-25 19:00   ` Sean Paul
2019-09-03 20:45 ` [PATCH v2 09/27] drm/dp_mst: Refactor drm_dp_send_enum_path_resources Lyude Paul
2019-09-03 20:45   ` Lyude Paul
2019-09-03 20:45 ` [PATCH v2 10/27] drm/dp_mst: Remove huge conditional in drm_dp_mst_handle_up_req() Lyude Paul
2019-09-03 20:45   ` Lyude Paul
2019-09-03 20:45 ` [PATCH v2 11/27] drm/dp_mst: Constify guid in drm_dp_get_mst_branch_by_guid() Lyude Paul
2019-09-03 20:45   ` Lyude Paul
2019-09-03 21:41   ` Dave Airlie
2019-09-03 21:41     ` Dave Airlie
2019-09-03 20:45 ` [PATCH v2 12/27] drm/dp_mst: Refactor drm_dp_mst_handle_up_req() Lyude Paul
2019-09-03 20:45   ` Lyude Paul
2019-09-03 20:45 ` [PATCH v2 13/27] drm/dp_mst: Refactor drm_dp_mst_handle_down_rep() Lyude Paul
2019-09-03 20:45 ` [PATCH v2 14/27] drm/dp_mst: Destroy topology_mgr mutexes Lyude Paul
2019-09-03 20:45   ` Lyude Paul
2019-09-25 19:14   ` Sean Paul
2019-09-03 20:45 ` [PATCH v2 15/27] drm/dp_mst: Cleanup drm_dp_send_link_address() a bit Lyude Paul
2019-09-03 20:45   ` Lyude Paul
2019-09-03 21:42   ` Dave Airlie
2019-09-03 20:45 ` [PATCH v2 16/27] drm/dp_mst: Refactor pdt setup/teardown, add more locking Lyude Paul
2019-09-25 19:27   ` Sean Paul
2019-09-25 19:27     ` Sean Paul
2019-09-25 21:00     ` Lyude Paul
2019-09-25 21:00       ` Lyude Paul
2019-09-27 13:30       ` Sean Paul
2019-09-27 13:30         ` Sean Paul
2019-09-03 20:45 ` [PATCH v2 17/27] drm/dp_mst: Rename drm_dp_add_port and drm_dp_update_port Lyude Paul
2019-09-03 20:45   ` Lyude Paul
2019-09-25 19:30   ` Sean Paul
2019-09-03 20:45 ` [PATCH v2 18/27] drm/dp_mst: Remove lies in {up,down}_rep_recv documentation Lyude Paul
2019-09-25 19:32   ` Sean Paul
2019-09-03 20:45 ` [PATCH v2 19/27] drm/dp_mst: Handle UP requests asynchronously Lyude Paul
2019-09-03 20:45   ` Lyude Paul
2019-09-25 19:46   ` Sean Paul
2019-09-03 20:45 ` [PATCH v2 20/27] drm/dp_mst: Protect drm_dp_mst_port members with connection_mutex Lyude Paul
2019-09-25 20:00   ` Sean Paul
2019-09-25 21:01     ` Lyude Paul
2019-09-25 21:01       ` Lyude Paul
2019-09-03 20:45 ` [PATCH v2 21/27] drm/dp_mst: Don't forget to update port->input in drm_dp_mst_handle_conn_stat() Lyude Paul
2019-09-25 20:03   ` Sean Paul
2019-09-03 20:46 ` [PATCH v2 22/27] drm/nouveau: Don't grab runtime PM refs for HPD IRQs Lyude Paul
2019-09-25 20:06   ` Sean Paul
2019-09-03 20:46 ` [PATCH v2 23/27] drm/amdgpu: Iterate through DRM connectors correctly Lyude Paul
2019-09-03 20:46   ` Lyude Paul
2019-09-13 20:45   ` Alex Deucher [this message]
2019-09-13 20:45     ` Alex Deucher
2019-09-27 13:48     ` Alex Deucher
2019-09-27 13:48       ` Alex Deucher
2019-09-03 20:46 ` [PATCH v2 24/27] drm/amdgpu/dm: Resume short HPD IRQs before resuming MST topology Lyude Paul
2019-09-13 20:46   ` Alex Deucher
2019-09-25 20:08   ` Sean Paul
2019-09-25 20:08     ` Sean Paul
2019-09-25 21:52   ` [PATCH v4] " Lyude Paul
2019-09-25 21:52     ` Lyude Paul
2019-09-27 13:29     ` Alex Deucher
2019-09-27 13:29       ` Alex Deucher
2019-09-03 20:46 ` [PATCH v2 25/27] drm/dp_mst: Add basic topology reprobing when resuming Lyude Paul
2019-09-03 20:46   ` Lyude Paul
2019-09-27 13:52   ` Sean Paul
2019-09-27 13:52     ` Sean Paul
2019-10-09 19:06     ` Lyude Paul
2019-10-09 19:06       ` Lyude Paul
2019-09-03 20:46 ` [PATCH v2 26/27] drm/dp_mst: Also print unhashed pointers for malloc/topology references Lyude Paul
2019-09-03 20:46   ` Lyude Paul
2019-09-27 14:25   ` Sean Paul
2019-10-09 19:40     ` Lyude Paul
2019-10-09 19:40       ` Lyude Paul
2019-09-03 20:46 ` [PATCH v2 27/27] drm/dp_mst: Add topology ref history tracking for debugging Lyude Paul
2019-09-27 14:51   ` Sean Paul

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CADnq5_NvhO751ihc64KmkxR_dOWNn5XJ4bJc95CMUEkGkw1Y2Q@mail.gmail.com \
    --to=alexdeucher@gmail.com \
    --cc=Bhawanpreet.Lakha@amd.com \
    --cc=David.Francis@amd.com \
    --cc=David1.Zhou@amd.com \
    --cc=Emily.Deng@amd.com \
    --cc=Felix.Kuehling@amd.com \
    --cc=Hawking.Zhang@amd.com \
    --cc=Rex.Zhu@amd.com \
    --cc=airlied@linux.ie \
    --cc=alexander.deucher@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=andrey.grodzovsky@amd.com \
    --cc=andrzej.p@collabora.com \
    --cc=christian.koenig@amd.com \
    --cc=colin.king@canonical.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=elfring@users.sourceforge.net \
    --cc=evan.quan@amd.com \
    --cc=harry.wentland@amd.com \
    --cc=hwentlan@amd.com \
    --cc=imre.deak@intel.com \
    --cc=jani.nikula@intel.com \
    --cc=juston.li@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lyude@redhat.com \
    --cc=mario.kleiner.de@gmail.com \
    --cc=michel.daenzer@amd.com \
    --cc=narmstrong@baylibre.com \
    --cc=nicholas.kazlauskas@amd.com \
    --cc=nouveau@lists.freedesktop.org \
    --cc=ray.huang@amd.com \
    --cc=rmk+kernel@armlinux.org.uk \
    --cc=sam@ravnborg.org \
    --cc=shirish.s@amd.com \
    --cc=sunpeng.li@amd.com \
    --cc=tao.zhou1@amd.com \
    --cc=treding@nvidia.com \
    --cc=ville.syrjala@linux.intel.com \
    --cc=xinhui.pan@amd.com \
    --cc=yuzhao@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.