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

drm/radeon: rework audio detect (v4)

1. Always assign audio function pointers even if the display does
not support audio. We need to properly disable the audio stream
when when using a non-audio capable monitor. Fixes purple line
on some hdmi monitors.

2. Check if a pin is in use by another encoder before disabling
it.

v2: make sure we've fetched the edid before checking audio and
look up the encoder before calling audio_detect since
connector->encoder may not be assigned yet. Separate
pin and afmt. They are allocated at different times and
have no dependency on eachother.
v3: fix connector fetching in encoder functions
v4: fix missed dig->pin check in dce6_afmt_write_latency_fields

bugs:
https://bugzilla.kernel.org/show_bug.cgi?id=93701
https://bugzilla.redhat.com/show_bug.cgi?id=1236337
https://bugs.freedesktop.org/show_bug.cgi?id=91041

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org

+106 -124
+28 -34
drivers/gpu/drm/radeon/dce6_afmt.c
··· 93 93 struct radeon_device *rdev = encoder->dev->dev_private; 94 94 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 95 95 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 96 - u32 offset; 97 96 98 - if (!dig || !dig->afmt || !dig->afmt->pin) 97 + if (!dig || !dig->afmt || !dig->pin) 99 98 return; 100 99 101 - offset = dig->afmt->offset; 102 - 103 - WREG32(AFMT_AUDIO_SRC_CONTROL + offset, 104 - AFMT_AUDIO_SRC_SELECT(dig->afmt->pin->id)); 100 + WREG32(AFMT_AUDIO_SRC_CONTROL + dig->afmt->offset, 101 + AFMT_AUDIO_SRC_SELECT(dig->pin->id)); 105 102 } 106 103 107 104 void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, 108 - struct drm_connector *connector, struct drm_display_mode *mode) 105 + struct drm_connector *connector, 106 + struct drm_display_mode *mode) 109 107 { 110 108 struct radeon_device *rdev = encoder->dev->dev_private; 111 109 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 112 110 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 113 - u32 tmp = 0, offset; 111 + u32 tmp = 0; 114 112 115 - if (!dig || !dig->afmt || !dig->afmt->pin) 113 + if (!dig || !dig->afmt || !dig->pin) 116 114 return; 117 - 118 - offset = dig->afmt->pin->offset; 119 115 120 116 if (mode->flags & DRM_MODE_FLAG_INTERLACE) { 121 117 if (connector->latency_present[1]) ··· 126 130 else 127 131 tmp = VIDEO_LIPSYNC(0) | AUDIO_LIPSYNC(0); 128 132 } 129 - WREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC, tmp); 133 + WREG32_ENDPOINT(dig->pin->offset, 134 + AZ_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC, tmp); 130 135 } 131 136 132 137 void dce6_afmt_hdmi_write_speaker_allocation(struct drm_encoder *encoder, 133 - u8 *sadb, int sad_count) 138 + u8 *sadb, int sad_count) 134 139 { 135 140 struct radeon_device *rdev = encoder->dev->dev_private; 136 141 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 137 142 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 138 - u32 offset, tmp; 143 + u32 tmp; 139 144 140 - if (!dig || !dig->afmt || !dig->afmt->pin) 145 + if (!dig || !dig->afmt || !dig->pin) 141 146 return; 142 147 143 - offset = dig->afmt->pin->offset; 144 - 145 148 /* program the speaker allocation */ 146 - tmp = RREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER); 149 + tmp = RREG32_ENDPOINT(dig->pin->offset, 150 + AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER); 147 151 tmp &= ~(DP_CONNECTION | SPEAKER_ALLOCATION_MASK); 148 152 /* set HDMI mode */ 149 153 tmp |= HDMI_CONNECTION; ··· 151 155 tmp |= SPEAKER_ALLOCATION(sadb[0]); 152 156 else 153 157 tmp |= SPEAKER_ALLOCATION(5); /* stereo */ 154 - WREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, tmp); 158 + WREG32_ENDPOINT(dig->pin->offset, 159 + AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, tmp); 155 160 } 156 161 157 162 void dce6_afmt_dp_write_speaker_allocation(struct drm_encoder *encoder, 158 - u8 *sadb, int sad_count) 163 + u8 *sadb, int sad_count) 159 164 { 160 165 struct radeon_device *rdev = encoder->dev->dev_private; 161 166 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 162 167 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 163 - u32 offset, tmp; 168 + u32 tmp; 164 169 165 - if (!dig || !dig->afmt || !dig->afmt->pin) 170 + if (!dig || !dig->afmt || !dig->pin) 166 171 return; 167 172 168 - offset = dig->afmt->pin->offset; 169 - 170 173 /* program the speaker allocation */ 171 - tmp = RREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER); 174 + tmp = RREG32_ENDPOINT(dig->pin->offset, 175 + AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER); 172 176 tmp &= ~(HDMI_CONNECTION | SPEAKER_ALLOCATION_MASK); 173 177 /* set DP mode */ 174 178 tmp |= DP_CONNECTION; ··· 176 180 tmp |= SPEAKER_ALLOCATION(sadb[0]); 177 181 else 178 182 tmp |= SPEAKER_ALLOCATION(5); /* stereo */ 179 - WREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, tmp); 183 + WREG32_ENDPOINT(dig->pin->offset, 184 + AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, tmp); 180 185 } 181 186 182 187 void dce6_afmt_write_sad_regs(struct drm_encoder *encoder, 183 - struct cea_sad *sads, int sad_count) 188 + struct cea_sad *sads, int sad_count) 184 189 { 185 - u32 offset; 186 190 int i; 187 191 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 188 192 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; ··· 202 206 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO }, 203 207 }; 204 208 205 - if (!dig || !dig->afmt || !dig->afmt->pin) 209 + if (!dig || !dig->afmt || !dig->pin) 206 210 return; 207 - 208 - offset = dig->afmt->pin->offset; 209 211 210 212 for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) { 211 213 u32 value = 0; ··· 231 237 232 238 value |= SUPPORTED_FREQUENCIES_STEREO(stereo_freqs); 233 239 234 - WREG32_ENDPOINT(offset, eld_reg_to_type[i][0], value); 240 + WREG32_ENDPOINT(dig->pin->offset, eld_reg_to_type[i][0], value); 235 241 } 236 242 } 237 243 ··· 247 253 } 248 254 249 255 void dce6_hdmi_audio_set_dto(struct radeon_device *rdev, 250 - struct radeon_crtc *crtc, unsigned int clock) 256 + struct radeon_crtc *crtc, unsigned int clock) 251 257 { 252 258 /* Two dtos; generally use dto0 for HDMI */ 253 259 u32 value = 0; ··· 266 272 } 267 273 268 274 void dce6_dp_audio_set_dto(struct radeon_device *rdev, 269 - struct radeon_crtc *crtc, unsigned int clock) 275 + struct radeon_crtc *crtc, unsigned int clock) 270 276 { 271 277 /* Two dtos; generally use dto1 for DP */ 272 278 u32 value = 0;
+61 -84
drivers/gpu/drm/radeon/radeon_audio.c
··· 245 245 static void radeon_audio_enable(struct radeon_device *rdev, 246 246 struct r600_audio_pin *pin, u8 enable_mask) 247 247 { 248 + struct drm_encoder *encoder; 249 + struct radeon_encoder *radeon_encoder; 250 + struct radeon_encoder_atom_dig *dig; 251 + int pin_count = 0; 252 + 253 + if (!pin) 254 + return; 255 + 256 + if (rdev->mode_info.mode_config_initialized) { 257 + list_for_each_entry(encoder, &rdev->ddev->mode_config.encoder_list, head) { 258 + if (radeon_encoder_is_digital(encoder)) { 259 + radeon_encoder = to_radeon_encoder(encoder); 260 + dig = radeon_encoder->enc_priv; 261 + if (dig->pin == pin) 262 + pin_count++; 263 + } 264 + } 265 + 266 + if ((pin_count > 1) && (enable_mask == 0)) 267 + return; 268 + } 269 + 248 270 if (rdev->audio.funcs->enable) 249 271 rdev->audio.funcs->enable(rdev, pin, enable_mask); 250 272 } ··· 358 336 359 337 static void radeon_audio_write_sad_regs(struct drm_encoder *encoder) 360 338 { 361 - struct radeon_encoder *radeon_encoder; 362 - struct drm_connector *connector; 363 - struct radeon_connector *radeon_connector = NULL; 339 + struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 340 + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 364 341 struct cea_sad *sads; 365 342 int sad_count; 366 343 367 - list_for_each_entry(connector, 368 - &encoder->dev->mode_config.connector_list, head) { 369 - if (connector->encoder == encoder) { 370 - radeon_connector = to_radeon_connector(connector); 371 - break; 372 - } 373 - } 374 - 375 - if (!radeon_connector) { 376 - DRM_ERROR("Couldn't find encoder's connector\n"); 344 + if (!connector) 377 345 return; 378 - } 379 346 380 347 sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads); 381 348 if (sad_count <= 0) { ··· 372 361 return; 373 362 } 374 363 BUG_ON(!sads); 375 - 376 - radeon_encoder = to_radeon_encoder(encoder); 377 364 378 365 if (radeon_encoder->audio && radeon_encoder->audio->write_sad_regs) 379 366 radeon_encoder->audio->write_sad_regs(encoder, sads, sad_count); ··· 381 372 382 373 static void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder) 383 374 { 375 + struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 384 376 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 385 - struct drm_connector *connector; 386 - struct radeon_connector *radeon_connector = NULL; 387 377 u8 *sadb = NULL; 388 378 int sad_count; 389 379 390 - list_for_each_entry(connector, 391 - &encoder->dev->mode_config.connector_list, head) { 392 - if (connector->encoder == encoder) { 393 - radeon_connector = to_radeon_connector(connector); 394 - break; 395 - } 396 - } 397 - 398 - if (!radeon_connector) { 399 - DRM_ERROR("Couldn't find encoder's connector\n"); 380 + if (!connector) 400 381 return; 401 - } 402 382 403 - sad_count = drm_edid_to_speaker_allocation( 404 - radeon_connector_edid(connector), &sadb); 383 + sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector), 384 + &sadb); 405 385 if (sad_count < 0) { 406 386 DRM_DEBUG("Couldn't read Speaker Allocation Data Block: %d\n", 407 387 sad_count); ··· 404 406 } 405 407 406 408 static void radeon_audio_write_latency_fields(struct drm_encoder *encoder, 407 - struct drm_display_mode *mode) 409 + struct drm_display_mode *mode) 408 410 { 409 - struct radeon_encoder *radeon_encoder; 410 - struct drm_connector *connector; 411 - struct radeon_connector *radeon_connector = 0; 411 + struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 412 + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 412 413 413 - list_for_each_entry(connector, 414 - &encoder->dev->mode_config.connector_list, head) { 415 - if (connector->encoder == encoder) { 416 - radeon_connector = to_radeon_connector(connector); 417 - break; 418 - } 419 - } 420 - 421 - if (!radeon_connector) { 422 - DRM_ERROR("Couldn't find encoder's connector\n"); 414 + if (!connector) 423 415 return; 424 - } 425 - 426 - radeon_encoder = to_radeon_encoder(encoder); 427 416 428 417 if (radeon_encoder->audio && radeon_encoder->audio->write_latency_fields) 429 418 radeon_encoder->audio->write_latency_fields(encoder, connector, mode); ··· 436 451 } 437 452 438 453 void radeon_audio_detect(struct drm_connector *connector, 454 + struct drm_encoder *encoder, 439 455 enum drm_connector_status status) 440 456 { 441 - struct radeon_device *rdev; 442 - struct radeon_encoder *radeon_encoder; 457 + struct drm_device *dev = connector->dev; 458 + struct radeon_device *rdev = dev->dev_private; 459 + struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 443 460 struct radeon_encoder_atom_dig *dig; 444 - 445 - if (!connector || !connector->encoder) 446 - return; 447 - 448 - rdev = connector->encoder->dev->dev_private; 449 461 450 462 if (!radeon_audio_chipset_supported(rdev)) 451 463 return; 452 464 453 - radeon_encoder = to_radeon_encoder(connector->encoder); 465 + if (!radeon_encoder_is_digital(encoder)) 466 + return; 467 + 454 468 dig = radeon_encoder->enc_priv; 455 469 456 470 if (status == connector_status_connected) { 457 - if (!drm_detect_monitor_audio(radeon_connector_edid(connector))) { 458 - radeon_encoder->audio = NULL; 459 - return; 460 - } 461 - 462 471 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { 463 472 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 464 473 ··· 465 486 radeon_encoder->audio = rdev->audio.hdmi_funcs; 466 487 } 467 488 468 - dig->afmt->pin = radeon_audio_get_pin(connector->encoder); 469 - radeon_audio_enable(rdev, dig->afmt->pin, 0xf); 489 + if (drm_detect_monitor_audio(radeon_connector_edid(connector))) { 490 + if (!dig->pin) 491 + dig->pin = radeon_audio_get_pin(encoder); 492 + radeon_audio_enable(rdev, dig->pin, 0xf); 493 + } else { 494 + radeon_audio_enable(rdev, dig->pin, 0); 495 + dig->pin = NULL; 496 + } 470 497 } else { 471 - radeon_audio_enable(rdev, dig->afmt->pin, 0); 472 - dig->afmt->pin = NULL; 498 + radeon_audio_enable(rdev, dig->pin, 0); 499 + dig->pin = NULL; 473 500 } 474 501 } 475 502 ··· 503 518 } 504 519 505 520 static int radeon_audio_set_avi_packet(struct drm_encoder *encoder, 506 - struct drm_display_mode *mode) 521 + struct drm_display_mode *mode) 507 522 { 508 523 struct radeon_device *rdev = encoder->dev->dev_private; 509 524 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 510 525 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 511 - struct drm_connector *connector; 512 - struct radeon_connector *radeon_connector = NULL; 526 + struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 513 527 u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE]; 514 528 struct hdmi_avi_infoframe frame; 515 529 int err; 516 530 517 - list_for_each_entry(connector, 518 - &encoder->dev->mode_config.connector_list, head) { 519 - if (connector->encoder == encoder) { 520 - radeon_connector = to_radeon_connector(connector); 521 - break; 522 - } 523 - } 524 - 525 - if (!radeon_connector) { 526 - DRM_ERROR("Couldn't find encoder's connector\n"); 527 - return -ENOENT; 528 - } 531 + if (!connector) 532 + return -EINVAL; 529 533 530 534 err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode); 531 535 if (err < 0) { ··· 537 563 return err; 538 564 } 539 565 540 - if (dig && dig->afmt && 541 - radeon_encoder->audio && radeon_encoder->audio->set_avi_packet) 566 + if (dig && dig->afmt && radeon_encoder->audio && 567 + radeon_encoder->audio->set_avi_packet) 542 568 radeon_encoder->audio->set_avi_packet(rdev, dig->afmt->offset, 543 569 buffer, sizeof(buffer)); 544 570 ··· 719 745 } 720 746 721 747 static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, 722 - struct drm_display_mode *mode) 748 + struct drm_display_mode *mode) 723 749 { 724 750 struct drm_device *dev = encoder->dev; 725 751 struct radeon_device *rdev = dev->dev_private; ··· 729 755 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 730 756 struct radeon_connector_atom_dig *dig_connector = 731 757 radeon_connector->con_priv; 758 + 759 + if (!connector) 760 + return; 732 761 733 762 if (!dig || !dig->afmt) 734 763 return; ··· 751 774 } 752 775 753 776 void radeon_audio_mode_set(struct drm_encoder *encoder, 754 - struct drm_display_mode *mode) 777 + struct drm_display_mode *mode) 755 778 { 756 779 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 757 780
+2 -1
drivers/gpu/drm/radeon/radeon_audio.h
··· 68 68 69 69 int radeon_audio_init(struct radeon_device *rdev); 70 70 void radeon_audio_detect(struct drm_connector *connector, 71 - enum drm_connector_status status); 71 + struct drm_encoder *encoder, 72 + enum drm_connector_status status); 72 73 u32 radeon_audio_endpoint_rreg(struct radeon_device *rdev, 73 74 u32 offset, u32 reg); 74 75 void radeon_audio_endpoint_wreg(struct radeon_device *rdev,
+14 -4
drivers/gpu/drm/radeon/radeon_connectors.c
··· 1379 1379 /* updated in get modes as well since we need to know if it's analog or digital */ 1380 1380 radeon_connector_update_scratch_regs(connector, ret); 1381 1381 1382 - if (radeon_audio != 0) 1383 - radeon_audio_detect(connector, ret); 1382 + if ((radeon_audio != 0) && radeon_connector->use_digital) { 1383 + const struct drm_connector_helper_funcs *connector_funcs = 1384 + connector->helper_private; 1385 + 1386 + encoder = connector_funcs->best_encoder(connector); 1387 + if (encoder && (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)) { 1388 + radeon_connector_get_edid(connector); 1389 + radeon_audio_detect(connector, encoder, ret); 1390 + } 1391 + } 1384 1392 1385 1393 exit: 1386 1394 pm_runtime_mark_last_busy(connector->dev->dev); ··· 1725 1717 1726 1718 radeon_connector_update_scratch_regs(connector, ret); 1727 1719 1728 - if (radeon_audio != 0) 1729 - radeon_audio_detect(connector, ret); 1720 + if ((radeon_audio != 0) && encoder) { 1721 + radeon_connector_get_edid(connector); 1722 + radeon_audio_detect(connector, encoder, ret); 1723 + } 1730 1724 1731 1725 out: 1732 1726 pm_runtime_mark_last_busy(connector->dev->dev);
+1 -1
drivers/gpu/drm/radeon/radeon_mode.h
··· 237 237 int offset; 238 238 bool last_buffer_filled_status; 239 239 int id; 240 - struct r600_audio_pin *pin; 241 240 }; 242 241 243 242 struct radeon_mode_info { ··· 438 439 uint8_t backlight_level; 439 440 int panel_mode; 440 441 struct radeon_afmt *afmt; 442 + struct r600_audio_pin *pin; 441 443 int active_mst_links; 442 444 }; 443 445