Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: Iterate through DRM connectors correctly

Currently, every single piece of code in amdgpu that loops through
connectors does it incorrectly and doesn't use the proper list iteration
helpers, drm_connector_list_iter_begin() and
drm_connector_list_iter_end(). Yeesh.

So, do that.

Cc: Juston Li <juston.li@intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Harry Wentland <hwentlan@amd.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Lyude Paul <lyude@redhat.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Lyude Paul and committed by
Alex Deucher
f8d2d39e 684cd480

+195 -73
+11 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
··· 1022 1022 */ 1023 1023 if (amdgpu_connector->shared_ddc && (ret == connector_status_connected)) { 1024 1024 struct drm_connector *list_connector; 1025 + struct drm_connector_list_iter iter; 1025 1026 struct amdgpu_connector *list_amdgpu_connector; 1026 - list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) { 1027 + 1028 + drm_connector_list_iter_begin(dev, &iter); 1029 + drm_for_each_connector_iter(list_connector, 1030 + &iter) { 1027 1031 if (connector == list_connector) 1028 1032 continue; 1029 1033 list_amdgpu_connector = to_amdgpu_connector(list_connector); ··· 1044 1040 } 1045 1041 } 1046 1042 } 1043 + drm_connector_list_iter_end(&iter); 1047 1044 } 1048 1045 } 1049 1046 } ··· 1506 1501 { 1507 1502 struct drm_device *dev = adev->ddev; 1508 1503 struct drm_connector *connector; 1504 + struct drm_connector_list_iter iter; 1509 1505 struct amdgpu_connector *amdgpu_connector; 1510 1506 struct amdgpu_connector_atom_dig *amdgpu_dig_connector; 1511 1507 struct drm_encoder *encoder; ··· 1521 1515 return; 1522 1516 1523 1517 /* see if we already added it */ 1524 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 1518 + drm_connector_list_iter_begin(dev, &iter); 1519 + drm_for_each_connector_iter(connector, &iter) { 1525 1520 amdgpu_connector = to_amdgpu_connector(connector); 1526 1521 if (amdgpu_connector->connector_id == connector_id) { 1527 1522 amdgpu_connector->devices |= supported_device; 1523 + drm_connector_list_iter_end(&iter); 1528 1524 return; 1529 1525 } 1530 1526 if (amdgpu_connector->ddc_bus && i2c_bus->valid) { ··· 1541 1533 } 1542 1534 } 1543 1535 } 1536 + drm_connector_list_iter_end(&iter); 1544 1537 1545 1538 /* check if it's a dp bridge */ 1546 1539 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
+14 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 3026 3026 struct amdgpu_device *adev; 3027 3027 struct drm_crtc *crtc; 3028 3028 struct drm_connector *connector; 3029 + struct drm_connector_list_iter iter; 3029 3030 int r; 3030 3031 3031 3032 if (dev == NULL || dev->dev_private == NULL) { ··· 3049 3048 if (!amdgpu_device_has_dc_support(adev)) { 3050 3049 /* turn off display hw */ 3051 3050 drm_modeset_lock_all(dev); 3052 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 3053 - drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); 3054 - } 3051 + drm_connector_list_iter_begin(dev, &iter); 3052 + drm_for_each_connector_iter(connector, &iter) 3053 + drm_helper_connector_dpms(connector, 3054 + DRM_MODE_DPMS_OFF); 3055 + drm_connector_list_iter_end(&iter); 3055 3056 drm_modeset_unlock_all(dev); 3056 3057 /* unpin the front buffers and cursors */ 3057 3058 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { ··· 3132 3129 int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon) 3133 3130 { 3134 3131 struct drm_connector *connector; 3132 + struct drm_connector_list_iter iter; 3135 3133 struct amdgpu_device *adev = dev->dev_private; 3136 3134 struct drm_crtc *crtc; 3137 3135 int r = 0; ··· 3203 3199 3204 3200 /* turn on display hw */ 3205 3201 drm_modeset_lock_all(dev); 3206 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 3207 - drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); 3208 - } 3202 + 3203 + drm_connector_list_iter_begin(dev, &iter); 3204 + drm_for_each_connector_iter(connector, &iter) 3205 + drm_helper_connector_dpms(connector, 3206 + DRM_MODE_DPMS_ON); 3207 + drm_connector_list_iter_end(&iter); 3208 + 3209 3209 drm_modeset_unlock_all(dev); 3210 3210 } 3211 3211 amdgpu_fbdev_set_suspend(adev, 0);
+4 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
··· 370 370 struct amdgpu_connector *amdgpu_connector; 371 371 struct drm_encoder *encoder; 372 372 struct amdgpu_encoder *amdgpu_encoder; 373 + struct drm_connector_list_iter iter; 373 374 uint32_t devices; 374 375 int i = 0; 375 376 377 + drm_connector_list_iter_begin(dev, &iter); 376 378 DRM_INFO("AMDGPU Display Connectors\n"); 377 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 379 + drm_for_each_connector_iter(connector, &iter) { 378 380 amdgpu_connector = to_amdgpu_connector(connector); 379 381 DRM_INFO("Connector %d:\n", i); 380 382 DRM_INFO(" %s\n", connector->name); ··· 440 438 } 441 439 i++; 442 440 } 441 + drm_connector_list_iter_end(&iter); 443 442 } 444 443 445 444 /**
+28 -12
drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c
··· 37 37 { 38 38 struct amdgpu_device *adev = dev->dev_private; 39 39 struct drm_connector *connector; 40 + struct drm_connector_list_iter iter; 40 41 struct amdgpu_connector *amdgpu_connector; 41 42 struct drm_encoder *encoder; 42 43 struct amdgpu_encoder *amdgpu_encoder; 43 44 45 + drm_connector_list_iter_begin(dev, &iter); 44 46 /* walk the list and link encoders to connectors */ 45 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 47 + drm_for_each_connector_iter(connector, &iter) { 46 48 amdgpu_connector = to_amdgpu_connector(connector); 47 49 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 48 50 amdgpu_encoder = to_amdgpu_encoder(encoder); ··· 57 55 } 58 56 } 59 57 } 58 + drm_connector_list_iter_end(&iter); 60 59 } 61 60 62 61 void amdgpu_encoder_set_active_device(struct drm_encoder *encoder) ··· 65 62 struct drm_device *dev = encoder->dev; 66 63 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 67 64 struct drm_connector *connector; 65 + struct drm_connector_list_iter iter; 68 66 69 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 67 + drm_connector_list_iter_begin(dev, &iter); 68 + drm_for_each_connector_iter(connector, &iter) { 70 69 if (connector->encoder == encoder) { 71 70 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 72 71 amdgpu_encoder->active_device = amdgpu_encoder->devices & amdgpu_connector->devices; ··· 77 72 amdgpu_connector->devices, encoder->encoder_type); 78 73 } 79 74 } 75 + drm_connector_list_iter_end(&iter); 80 76 } 81 77 82 78 struct drm_connector * ··· 85 79 { 86 80 struct drm_device *dev = encoder->dev; 87 81 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 88 - struct drm_connector *connector; 82 + struct drm_connector *connector, *found = NULL; 83 + struct drm_connector_list_iter iter; 89 84 struct amdgpu_connector *amdgpu_connector; 90 85 91 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 86 + drm_connector_list_iter_begin(dev, &iter); 87 + drm_for_each_connector_iter(connector, &iter) { 92 88 amdgpu_connector = to_amdgpu_connector(connector); 93 - if (amdgpu_encoder->active_device & amdgpu_connector->devices) 94 - return connector; 89 + if (amdgpu_encoder->active_device & amdgpu_connector->devices) { 90 + found = connector; 91 + break; 92 + } 95 93 } 96 - return NULL; 94 + drm_connector_list_iter_end(&iter); 95 + return found; 97 96 } 98 97 99 98 struct drm_connector * ··· 106 95 { 107 96 struct drm_device *dev = encoder->dev; 108 97 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 109 - struct drm_connector *connector; 98 + struct drm_connector *connector, *found = NULL; 99 + struct drm_connector_list_iter iter; 110 100 struct amdgpu_connector *amdgpu_connector; 111 101 112 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 102 + drm_connector_list_iter_begin(dev, &iter); 103 + drm_for_each_connector_iter(connector, &iter) { 113 104 amdgpu_connector = to_amdgpu_connector(connector); 114 - if (amdgpu_encoder->devices & amdgpu_connector->devices) 115 - return connector; 105 + if (amdgpu_encoder->devices & amdgpu_connector->devices) { 106 + found = connector; 107 + break; 108 + } 116 109 } 117 - return NULL; 110 + drm_connector_list_iter_end(&iter); 111 + return found; 118 112 } 119 113 120 114 struct drm_encoder *amdgpu_get_external_encoder(struct drm_encoder *encoder)
+4 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
··· 87 87 struct drm_device *dev = adev->ddev; 88 88 struct drm_mode_config *mode_config = &dev->mode_config; 89 89 struct drm_connector *connector; 90 + struct drm_connector_list_iter iter; 90 91 91 92 mutex_lock(&mode_config->mutex); 92 - list_for_each_entry(connector, &mode_config->connector_list, head) 93 + drm_connector_list_iter_begin(dev, &iter); 94 + drm_for_each_connector_iter(connector, &iter) 93 95 amdgpu_connector_hotplug(connector); 96 + drm_connector_list_iter_end(&iter); 94 97 mutex_unlock(&mode_config->mutex); 95 98 /* Just fire off a uevent and let userspace tell us what to do */ 96 99 drm_helper_hpd_irq_event(dev);
+26 -8
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
··· 330 330 { 331 331 struct drm_device *dev = adev->ddev; 332 332 struct drm_connector *connector; 333 + struct drm_connector_list_iter iter; 333 334 u32 tmp; 334 335 335 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 336 + drm_connector_list_iter_begin(dev, &iter); 337 + drm_for_each_connector_iter(connector, &iter) { 336 338 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 337 339 338 340 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) ··· 370 368 amdgpu_irq_get(adev, &adev->hpd_irq, 371 369 amdgpu_connector->hpd.hpd); 372 370 } 371 + drm_connector_list_iter_end(&iter); 373 372 } 374 373 375 374 /** ··· 385 382 { 386 383 struct drm_device *dev = adev->ddev; 387 384 struct drm_connector *connector; 385 + struct drm_connector_list_iter iter; 388 386 u32 tmp; 389 387 390 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 388 + drm_connector_list_iter_begin(dev, &iter); 389 + drm_for_each_connector_iter(connector, &iter) { 391 390 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 392 391 393 392 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) ··· 402 397 amdgpu_irq_put(adev, &adev->hpd_irq, 403 398 amdgpu_connector->hpd.hpd); 404 399 } 400 + drm_connector_list_iter_end(&iter); 405 401 } 406 402 407 403 static u32 dce_v10_0_hpd_get_gpio_reg(struct amdgpu_device *adev) ··· 1225 1219 static void dce_v10_0_audio_write_latency_fields(struct drm_encoder *encoder, 1226 1220 struct drm_display_mode *mode) 1227 1221 { 1228 - struct amdgpu_device *adev = encoder->dev->dev_private; 1222 + struct drm_device *dev = encoder->dev; 1223 + struct amdgpu_device *adev = dev->dev_private; 1229 1224 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1230 1225 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1231 1226 struct drm_connector *connector; 1227 + struct drm_connector_list_iter iter; 1232 1228 struct amdgpu_connector *amdgpu_connector = NULL; 1233 1229 u32 tmp; 1234 1230 int interlace = 0; ··· 1238 1230 if (!dig || !dig->afmt || !dig->afmt->pin) 1239 1231 return; 1240 1232 1241 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1233 + drm_connector_list_iter_begin(dev, &iter); 1234 + drm_for_each_connector_iter(connector, &iter) { 1242 1235 if (connector->encoder == encoder) { 1243 1236 amdgpu_connector = to_amdgpu_connector(connector); 1244 1237 break; 1245 1238 } 1246 1239 } 1240 + drm_connector_list_iter_end(&iter); 1247 1241 1248 1242 if (!amdgpu_connector) { 1249 1243 DRM_ERROR("Couldn't find encoder's connector\n"); ··· 1271 1261 1272 1262 static void dce_v10_0_audio_write_speaker_allocation(struct drm_encoder *encoder) 1273 1263 { 1274 - struct amdgpu_device *adev = encoder->dev->dev_private; 1264 + struct drm_device *dev = encoder->dev; 1265 + struct amdgpu_device *adev = dev->dev_private; 1275 1266 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1276 1267 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1277 1268 struct drm_connector *connector; 1269 + struct drm_connector_list_iter iter; 1278 1270 struct amdgpu_connector *amdgpu_connector = NULL; 1279 1271 u32 tmp; 1280 1272 u8 *sadb = NULL; ··· 1285 1273 if (!dig || !dig->afmt || !dig->afmt->pin) 1286 1274 return; 1287 1275 1288 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1276 + drm_connector_list_iter_begin(dev, &iter); 1277 + drm_for_each_connector_iter(connector, &iter) { 1289 1278 if (connector->encoder == encoder) { 1290 1279 amdgpu_connector = to_amdgpu_connector(connector); 1291 1280 break; 1292 1281 } 1293 1282 } 1283 + drm_connector_list_iter_end(&iter); 1294 1284 1295 1285 if (!amdgpu_connector) { 1296 1286 DRM_ERROR("Couldn't find encoder's connector\n"); ··· 1327 1313 1328 1314 static void dce_v10_0_audio_write_sad_regs(struct drm_encoder *encoder) 1329 1315 { 1330 - struct amdgpu_device *adev = encoder->dev->dev_private; 1316 + struct drm_device *dev = encoder->dev; 1317 + struct amdgpu_device *adev = dev->dev_private; 1331 1318 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1332 1319 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1333 1320 struct drm_connector *connector; 1321 + struct drm_connector_list_iter iter; 1334 1322 struct amdgpu_connector *amdgpu_connector = NULL; 1335 1323 struct cea_sad *sads; 1336 1324 int i, sad_count; ··· 1355 1339 if (!dig || !dig->afmt || !dig->afmt->pin) 1356 1340 return; 1357 1341 1358 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1342 + drm_connector_list_iter_begin(dev, &iter); 1343 + drm_for_each_connector_iter(connector, &iter) { 1359 1344 if (connector->encoder == encoder) { 1360 1345 amdgpu_connector = to_amdgpu_connector(connector); 1361 1346 break; 1362 1347 } 1363 1348 } 1349 + drm_connector_list_iter_end(&iter); 1364 1350 1365 1351 if (!amdgpu_connector) { 1366 1352 DRM_ERROR("Couldn't find encoder's connector\n");
+26 -8
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
··· 348 348 { 349 349 struct drm_device *dev = adev->ddev; 350 350 struct drm_connector *connector; 351 + struct drm_connector_list_iter iter; 351 352 u32 tmp; 352 353 353 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 354 + drm_connector_list_iter_begin(dev, &iter); 355 + drm_for_each_connector_iter(connector, &iter) { 354 356 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 355 357 356 358 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) ··· 387 385 dce_v11_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd); 388 386 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); 389 387 } 388 + drm_connector_list_iter_end(&iter); 390 389 } 391 390 392 391 /** ··· 402 399 { 403 400 struct drm_device *dev = adev->ddev; 404 401 struct drm_connector *connector; 402 + struct drm_connector_list_iter iter; 405 403 u32 tmp; 406 404 407 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 405 + drm_connector_list_iter_begin(dev, &iter); 406 + drm_for_each_connector_iter(connector, &iter) { 408 407 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 409 408 410 409 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) ··· 418 413 419 414 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); 420 415 } 416 + drm_connector_list_iter_end(&iter); 421 417 } 422 418 423 419 static u32 dce_v11_0_hpd_get_gpio_reg(struct amdgpu_device *adev) ··· 1251 1245 static void dce_v11_0_audio_write_latency_fields(struct drm_encoder *encoder, 1252 1246 struct drm_display_mode *mode) 1253 1247 { 1254 - struct amdgpu_device *adev = encoder->dev->dev_private; 1248 + struct drm_device *dev = encoder->dev; 1249 + struct amdgpu_device *adev = dev->dev_private; 1255 1250 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1256 1251 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1257 1252 struct drm_connector *connector; 1253 + struct drm_connector_list_iter iter; 1258 1254 struct amdgpu_connector *amdgpu_connector = NULL; 1259 1255 u32 tmp; 1260 1256 int interlace = 0; ··· 1264 1256 if (!dig || !dig->afmt || !dig->afmt->pin) 1265 1257 return; 1266 1258 1267 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1259 + drm_connector_list_iter_begin(dev, &iter); 1260 + drm_for_each_connector_iter(connector, &iter) { 1268 1261 if (connector->encoder == encoder) { 1269 1262 amdgpu_connector = to_amdgpu_connector(connector); 1270 1263 break; 1271 1264 } 1272 1265 } 1266 + drm_connector_list_iter_end(&iter); 1273 1267 1274 1268 if (!amdgpu_connector) { 1275 1269 DRM_ERROR("Couldn't find encoder's connector\n"); ··· 1297 1287 1298 1288 static void dce_v11_0_audio_write_speaker_allocation(struct drm_encoder *encoder) 1299 1289 { 1300 - struct amdgpu_device *adev = encoder->dev->dev_private; 1290 + struct drm_device *dev = encoder->dev; 1291 + struct amdgpu_device *adev = dev->dev_private; 1301 1292 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1302 1293 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1303 1294 struct drm_connector *connector; 1295 + struct drm_connector_list_iter iter; 1304 1296 struct amdgpu_connector *amdgpu_connector = NULL; 1305 1297 u32 tmp; 1306 1298 u8 *sadb = NULL; ··· 1311 1299 if (!dig || !dig->afmt || !dig->afmt->pin) 1312 1300 return; 1313 1301 1314 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1302 + drm_connector_list_iter_begin(dev, &iter); 1303 + drm_for_each_connector_iter(connector, &iter) { 1315 1304 if (connector->encoder == encoder) { 1316 1305 amdgpu_connector = to_amdgpu_connector(connector); 1317 1306 break; 1318 1307 } 1319 1308 } 1309 + drm_connector_list_iter_end(&iter); 1320 1310 1321 1311 if (!amdgpu_connector) { 1322 1312 DRM_ERROR("Couldn't find encoder's connector\n"); ··· 1353 1339 1354 1340 static void dce_v11_0_audio_write_sad_regs(struct drm_encoder *encoder) 1355 1341 { 1356 - struct amdgpu_device *adev = encoder->dev->dev_private; 1342 + struct drm_device *dev = encoder->dev; 1343 + struct amdgpu_device *adev = dev->dev_private; 1357 1344 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1358 1345 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1359 1346 struct drm_connector *connector; 1347 + struct drm_connector_list_iter iter; 1360 1348 struct amdgpu_connector *amdgpu_connector = NULL; 1361 1349 struct cea_sad *sads; 1362 1350 int i, sad_count; ··· 1381 1365 if (!dig || !dig->afmt || !dig->afmt->pin) 1382 1366 return; 1383 1367 1384 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1368 + drm_connector_list_iter_begin(dev, &iter); 1369 + drm_for_each_connector_iter(connector, &iter) { 1385 1370 if (connector->encoder == encoder) { 1386 1371 amdgpu_connector = to_amdgpu_connector(connector); 1387 1372 break; 1388 1373 } 1389 1374 } 1375 + drm_connector_list_iter_end(&iter); 1390 1376 1391 1377 if (!amdgpu_connector) { 1392 1378 DRM_ERROR("Couldn't find encoder's connector\n");
+30 -10
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
··· 281 281 { 282 282 struct drm_device *dev = adev->ddev; 283 283 struct drm_connector *connector; 284 + struct drm_connector_list_iter iter; 284 285 u32 tmp; 285 286 286 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 287 + drm_connector_list_iter_begin(dev, &iter); 288 + drm_for_each_connector_iter(connector, &iter) { 287 289 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 288 290 289 291 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) ··· 311 309 dce_v6_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd); 312 310 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); 313 311 } 314 - 312 + drm_connector_list_iter_end(&iter); 315 313 } 316 314 317 315 /** ··· 326 324 { 327 325 struct drm_device *dev = adev->ddev; 328 326 struct drm_connector *connector; 327 + struct drm_connector_list_iter iter; 329 328 u32 tmp; 330 329 331 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 330 + drm_connector_list_iter_begin(dev, &iter); 331 + drm_for_each_connector_iter(connector, &iter) { 332 332 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 333 333 334 334 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) ··· 342 338 343 339 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); 344 340 } 341 + drm_connector_list_iter_end(&iter); 345 342 } 346 343 347 344 static u32 dce_v6_0_hpd_get_gpio_reg(struct amdgpu_device *adev) ··· 1129 1124 static void dce_v6_0_audio_write_latency_fields(struct drm_encoder *encoder, 1130 1125 struct drm_display_mode *mode) 1131 1126 { 1132 - struct amdgpu_device *adev = encoder->dev->dev_private; 1127 + struct drm_device *dev = encoder->dev; 1128 + struct amdgpu_device *adev = dev->dev_private; 1133 1129 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1134 1130 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1135 1131 struct drm_connector *connector; 1132 + struct drm_connector_list_iter iter; 1136 1133 struct amdgpu_connector *amdgpu_connector = NULL; 1137 1134 int interlace = 0; 1138 1135 u32 tmp; 1139 1136 1140 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1137 + drm_connector_list_iter_begin(dev, &iter); 1138 + drm_for_each_connector_iter(connector, &iter) { 1141 1139 if (connector->encoder == encoder) { 1142 1140 amdgpu_connector = to_amdgpu_connector(connector); 1143 1141 break; 1144 1142 } 1145 1143 } 1144 + drm_connector_list_iter_end(&iter); 1146 1145 1147 1146 if (!amdgpu_connector) { 1148 1147 DRM_ERROR("Couldn't find encoder's connector\n"); ··· 1173 1164 1174 1165 static void dce_v6_0_audio_write_speaker_allocation(struct drm_encoder *encoder) 1175 1166 { 1176 - struct amdgpu_device *adev = encoder->dev->dev_private; 1167 + struct drm_device *dev = encoder->dev; 1168 + struct amdgpu_device *adev = dev->dev_private; 1177 1169 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1178 1170 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1179 1171 struct drm_connector *connector; 1172 + struct drm_connector_list_iter iter; 1180 1173 struct amdgpu_connector *amdgpu_connector = NULL; 1181 1174 u8 *sadb = NULL; 1182 1175 int sad_count; 1183 1176 u32 tmp; 1184 1177 1185 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1178 + drm_connector_list_iter_begin(dev, &iter); 1179 + drm_for_each_connector_iter(connector, &iter) { 1186 1180 if (connector->encoder == encoder) { 1187 1181 amdgpu_connector = to_amdgpu_connector(connector); 1188 1182 break; 1189 1183 } 1190 1184 } 1185 + drm_connector_list_iter_end(&iter); 1191 1186 1192 1187 if (!amdgpu_connector) { 1193 1188 DRM_ERROR("Couldn't find encoder's connector\n"); ··· 1234 1221 1235 1222 static void dce_v6_0_audio_write_sad_regs(struct drm_encoder *encoder) 1236 1223 { 1237 - struct amdgpu_device *adev = encoder->dev->dev_private; 1224 + struct drm_device *dev = encoder->dev; 1225 + struct amdgpu_device *adev = dev->dev_private; 1238 1226 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1239 1227 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1240 1228 struct drm_connector *connector; 1229 + struct drm_connector_list_iter iter; 1241 1230 struct amdgpu_connector *amdgpu_connector = NULL; 1242 1231 struct cea_sad *sads; 1243 1232 int i, sad_count; ··· 1259 1244 { ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO }, 1260 1245 }; 1261 1246 1262 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1247 + drm_connector_list_iter_begin(dev, &iter); 1248 + drm_for_each_connector_iter(connector, &iter) { 1263 1249 if (connector->encoder == encoder) { 1264 1250 amdgpu_connector = to_amdgpu_connector(connector); 1265 1251 break; 1266 1252 } 1267 1253 } 1254 + drm_connector_list_iter_end(&iter); 1268 1255 1269 1256 if (!amdgpu_connector) { 1270 1257 DRM_ERROR("Couldn't find encoder's connector\n"); ··· 1649 1632 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1650 1633 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1651 1634 struct drm_connector *connector; 1635 + struct drm_connector_list_iter iter; 1652 1636 struct amdgpu_connector *amdgpu_connector = NULL; 1653 1637 int em = amdgpu_atombios_encoder_get_encoder_mode(encoder); 1654 1638 int bpc = 8; ··· 1657 1639 if (!dig || !dig->afmt) 1658 1640 return; 1659 1641 1660 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1642 + drm_connector_list_iter_begin(dev, &iter); 1643 + drm_for_each_connector_iter(connector, &iter) { 1661 1644 if (connector->encoder == encoder) { 1662 1645 amdgpu_connector = to_amdgpu_connector(connector); 1663 1646 break; 1664 1647 } 1665 1648 } 1649 + drm_connector_list_iter_end(&iter); 1666 1650 1667 1651 if (!amdgpu_connector) { 1668 1652 DRM_ERROR("Couldn't find encoder's connector\n");
+26 -8
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
··· 275 275 { 276 276 struct drm_device *dev = adev->ddev; 277 277 struct drm_connector *connector; 278 + struct drm_connector_list_iter iter; 278 279 u32 tmp; 279 280 280 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 281 + drm_connector_list_iter_begin(dev, &iter); 282 + drm_for_each_connector_iter(connector, &iter) { 281 283 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 282 284 283 285 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) ··· 305 303 dce_v8_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd); 306 304 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); 307 305 } 306 + drm_connector_list_iter_end(&iter); 308 307 } 309 308 310 309 /** ··· 320 317 { 321 318 struct drm_device *dev = adev->ddev; 322 319 struct drm_connector *connector; 320 + struct drm_connector_list_iter iter; 323 321 u32 tmp; 324 322 325 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 323 + drm_connector_list_iter_begin(dev, &iter); 324 + drm_for_each_connector_iter(connector, &iter) { 326 325 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 327 326 328 327 if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) ··· 336 331 337 332 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); 338 333 } 334 + drm_connector_list_iter_end(&iter); 339 335 } 340 336 341 337 static u32 dce_v8_0_hpd_get_gpio_reg(struct amdgpu_device *adev) ··· 1163 1157 static void dce_v8_0_audio_write_latency_fields(struct drm_encoder *encoder, 1164 1158 struct drm_display_mode *mode) 1165 1159 { 1166 - struct amdgpu_device *adev = encoder->dev->dev_private; 1160 + struct drm_device *dev = encoder->dev; 1161 + struct amdgpu_device *adev = dev->dev_private; 1167 1162 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1168 1163 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1169 1164 struct drm_connector *connector; 1165 + struct drm_connector_list_iter iter; 1170 1166 struct amdgpu_connector *amdgpu_connector = NULL; 1171 1167 u32 tmp = 0, offset; 1172 1168 ··· 1177 1169 1178 1170 offset = dig->afmt->pin->offset; 1179 1171 1180 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1172 + drm_connector_list_iter_begin(dev, &iter); 1173 + drm_for_each_connector_iter(connector, &iter) { 1181 1174 if (connector->encoder == encoder) { 1182 1175 amdgpu_connector = to_amdgpu_connector(connector); 1183 1176 break; 1184 1177 } 1185 1178 } 1179 + drm_connector_list_iter_end(&iter); 1186 1180 1187 1181 if (!amdgpu_connector) { 1188 1182 DRM_ERROR("Couldn't find encoder's connector\n"); ··· 1224 1214 1225 1215 static void dce_v8_0_audio_write_speaker_allocation(struct drm_encoder *encoder) 1226 1216 { 1227 - struct amdgpu_device *adev = encoder->dev->dev_private; 1217 + struct drm_device *dev = encoder->dev; 1218 + struct amdgpu_device *adev = dev->dev_private; 1228 1219 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1229 1220 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1230 1221 struct drm_connector *connector; 1222 + struct drm_connector_list_iter iter; 1231 1223 struct amdgpu_connector *amdgpu_connector = NULL; 1232 1224 u32 offset, tmp; 1233 1225 u8 *sadb = NULL; ··· 1240 1228 1241 1229 offset = dig->afmt->pin->offset; 1242 1230 1243 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1231 + drm_connector_list_iter_begin(dev, &iter); 1232 + drm_for_each_connector_iter(connector, &iter) { 1244 1233 if (connector->encoder == encoder) { 1245 1234 amdgpu_connector = to_amdgpu_connector(connector); 1246 1235 break; 1247 1236 } 1248 1237 } 1238 + drm_connector_list_iter_end(&iter); 1249 1239 1250 1240 if (!amdgpu_connector) { 1251 1241 DRM_ERROR("Couldn't find encoder's connector\n"); ··· 1277 1263 1278 1264 static void dce_v8_0_audio_write_sad_regs(struct drm_encoder *encoder) 1279 1265 { 1280 - struct amdgpu_device *adev = encoder->dev->dev_private; 1266 + struct drm_device *dev = encoder->dev; 1267 + struct amdgpu_device *adev = dev->dev_private; 1281 1268 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder); 1282 1269 struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; 1283 1270 u32 offset; 1284 1271 struct drm_connector *connector; 1272 + struct drm_connector_list_iter iter; 1285 1273 struct amdgpu_connector *amdgpu_connector = NULL; 1286 1274 struct cea_sad *sads; 1287 1275 int i, sad_count; ··· 1308 1292 1309 1293 offset = dig->afmt->pin->offset; 1310 1294 1311 - list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) { 1295 + drm_connector_list_iter_begin(dev, &iter); 1296 + drm_for_each_connector_iter(connector, &iter) { 1312 1297 if (connector->encoder == encoder) { 1313 1298 amdgpu_connector = to_amdgpu_connector(connector); 1314 1299 break; 1315 1300 } 1316 1301 } 1302 + drm_connector_list_iter_end(&iter); 1317 1303 1318 1304 if (!amdgpu_connector) { 1319 1305 DRM_ERROR("Couldn't find encoder's connector\n");
+18 -15
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 946 946 { 947 947 struct amdgpu_dm_connector *aconnector; 948 948 struct drm_connector *connector; 949 + struct drm_connector_list_iter iter; 949 950 int ret = 0; 950 951 951 - drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); 952 - 953 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 952 + drm_connector_list_iter_begin(dev, &iter); 953 + drm_for_each_connector_iter(connector, &iter) { 954 954 aconnector = to_amdgpu_dm_connector(connector); 955 955 if (aconnector->dc_link->type == dc_connection_mst_branch && 956 956 aconnector->mst_mgr.aux) { 957 957 DRM_DEBUG_DRIVER("DM_MST: starting TM on aconnector: %p [id: %d]\n", 958 - aconnector, aconnector->base.base.id); 958 + aconnector, 959 + aconnector->base.base.id); 959 960 960 961 ret = drm_dp_mst_topology_mgr_set_mst(&aconnector->mst_mgr, true); 961 962 if (ret < 0) { 962 963 DRM_ERROR("DM_MST: Failed to start MST\n"); 963 - ((struct dc_link *)aconnector->dc_link)->type = dc_connection_single; 964 - return ret; 965 - } 964 + aconnector->dc_link->type = 965 + dc_connection_single; 966 + break; 966 967 } 968 + } 967 969 } 970 + drm_connector_list_iter_end(&iter); 968 971 969 - drm_modeset_unlock(&dev->mode_config.connection_mutex); 970 972 return ret; 971 973 } 972 974 ··· 1011 1009 { 1012 1010 struct amdgpu_dm_connector *aconnector; 1013 1011 struct drm_connector *connector; 1012 + struct drm_connector_list_iter iter; 1014 1013 struct drm_dp_mst_topology_mgr *mgr; 1015 1014 int ret; 1016 1015 bool need_hotplug = false; 1017 1016 1018 - drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); 1019 - 1020 - list_for_each_entry(connector, &dev->mode_config.connector_list, 1021 - head) { 1017 + drm_connector_list_iter_begin(dev, &iter); 1018 + drm_for_each_connector_iter(connector, &iter) { 1022 1019 aconnector = to_amdgpu_dm_connector(connector); 1023 1020 if (aconnector->dc_link->type != dc_connection_mst_branch || 1024 1021 aconnector->mst_port) ··· 1035 1034 } 1036 1035 } 1037 1036 } 1038 - 1039 - drm_modeset_unlock(&dev->mode_config.connection_mutex); 1037 + drm_connector_list_iter_end(&iter); 1040 1038 1041 1039 if (need_hotplug) 1042 1040 drm_kms_helper_hotplug_event(dev); ··· 1217 1217 struct amdgpu_display_manager *dm = &adev->dm; 1218 1218 struct amdgpu_dm_connector *aconnector; 1219 1219 struct drm_connector *connector; 1220 + struct drm_connector_list_iter iter; 1220 1221 struct drm_crtc *crtc; 1221 1222 struct drm_crtc_state *new_crtc_state; 1222 1223 struct dm_crtc_state *dm_new_crtc_state; ··· 1250 1249 s3_handle_mst(ddev, false); 1251 1250 1252 1251 /* Do detection*/ 1253 - list_for_each_entry(connector, &ddev->mode_config.connector_list, head) { 1252 + drm_connector_list_iter_begin(ddev, &iter); 1253 + drm_for_each_connector_iter(connector, &iter) { 1254 1254 aconnector = to_amdgpu_dm_connector(connector); 1255 1255 1256 1256 /* ··· 1279 1277 amdgpu_dm_update_connector_after_detect(aconnector); 1280 1278 mutex_unlock(&aconnector->hpd_lock); 1281 1279 } 1280 + drm_connector_list_iter_end(&iter); 1282 1281 1283 1282 /* Force mode set in atomic commit */ 1284 1283 for_each_new_crtc_in_state(dm->cached_state, crtc, new_crtc_state, i)
+8 -2
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
··· 732 732 { 733 733 struct drm_device *dev = adev->ddev; 734 734 struct drm_connector *connector; 735 + struct drm_connector_list_iter iter; 735 736 736 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 737 + drm_connector_list_iter_begin(dev, &iter); 738 + drm_for_each_connector_iter(connector, &iter) { 737 739 struct amdgpu_dm_connector *amdgpu_dm_connector = 738 740 to_amdgpu_dm_connector(connector); 739 741 ··· 753 751 true); 754 752 } 755 753 } 754 + drm_connector_list_iter_end(&iter); 756 755 } 757 756 758 757 /** ··· 768 765 { 769 766 struct drm_device *dev = adev->ddev; 770 767 struct drm_connector *connector; 768 + struct drm_connector_list_iter iter; 771 769 772 - list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 770 + drm_connector_list_iter_begin(dev, &iter); 771 + drm_for_each_connector_iter(connector, &iter) { 773 772 struct amdgpu_dm_connector *amdgpu_dm_connector = 774 773 to_amdgpu_dm_connector(connector); 775 774 const struct dc_link *dc_link = amdgpu_dm_connector->dc_link; ··· 784 779 false); 785 780 } 786 781 } 782 + drm_connector_list_iter_end(&iter); 787 783 }