[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CADnq5_MBPWThcfB+9HN6eYW4izxvJmGueALBLODA76ec2SzNUQ@mail.gmail.com>
Date: Fri, 27 Sep 2019 09:48:36 -0400
From: Alex Deucher <alexdeucher@...il.com>
To: Lyude Paul <lyude@...hat.com>
Cc: Maling list - DRI developers <dri-devel@...ts.freedesktop.org>,
nouveau <nouveau@...ts.freedesktop.org>,
amd-gfx list <amd-gfx@...ts.freedesktop.org>,
Neil Armstrong <narmstrong@...libre.com>,
David Airlie <airlied@...ux.ie>,
Daniel Vetter <daniel.vetter@...ll.ch>,
Imre Deak <imre.deak@...el.com>, Tao Zhou <tao.zhou1@....com>,
Huang Rui <ray.huang@....com>, Shirish S <shirish.s@....com>,
Sam Ravnborg <sam@...nborg.org>,
Markus Elfring <elfring@...rs.sourceforge.net>,
Ville Syrjälä <ville.syrjala@...ux.intel.com>,
"David (ChunMing) Zhou" <David1.Zhou@....com>,
Mario Kleiner <mario.kleiner.de@...il.com>,
Yu Zhao <yuzhao@...gle.com>,
Bhawanpreet Lakha <Bhawanpreet.Lakha@....com>,
David Francis <David.Francis@....com>,
Jani Nikula <jani.nikula@...el.com>,
Thierry Reding <treding@...dia.com>,
Harry Wentland <harry.wentland@....com>,
Juston Li <juston.li@...el.com>,
Andrey Grodzovsky <andrey.grodzovsky@....com>,
Leo Li <sunpeng.li@....com>, Emily Deng <Emily.Deng@....com>,
Russell King <rmk+kernel@...linux.org.uk>,
Evan Quan <evan.quan@....com>,
Harry Wentland <hwentlan@....com>,
Felix Kuehling <Felix.Kuehling@....com>,
xinhui pan <xinhui.pan@....com>,
Michel Dänzer <michel.daenzer@....com>,
LKML <linux-kernel@...r.kernel.org>,
Andrzej Pietrasiewicz <andrzej.p@...labora.com>,
Daniel Vetter <daniel@...ll.ch>,
Alex Deucher <alexander.deucher@....com>,
Colin Ian King <colin.king@...onical.com>,
Nicholas Kazlauskas <nicholas.kazlauskas@....com>,
Rex Zhu <Rex.Zhu@....com>,
Christian König <christian.koenig@....com>,
Hawking Zhang <Hawking.Zhang@....com>
Subject: Re: [PATCH v2 23/27] drm/amdgpu: Iterate through DRM connectors correctly
On Fri, Sep 13, 2019 at 4:45 PM Alex Deucher <alexdeucher@...il.com> wrote:
>
> On Tue, Sep 3, 2019 at 4:49 PM Lyude Paul <lyude@...hat.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@....com>
>
Applied. Thanks!
Alex
> >
> > Cc: Juston Li <juston.li@...el.com>
> > Cc: Imre Deak <imre.deak@...el.com>
> > Cc: Ville Syrjälä <ville.syrjala@...ux.intel.com>
> > Cc: Harry Wentland <hwentlan@....com>
> > Cc: Daniel Vetter <daniel.vetter@...ll.ch>
> > Signed-off-by: Lyude Paul <lyude@...hat.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@...ts.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/amd-gfx
Powered by blists - more mailing lists