dce_audio.c (29497B)
1/* 2 * Copyright 2012-15 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * Authors: AMD 23 * 24 */ 25 26#include <linux/slab.h> 27 28#include "reg_helper.h" 29#include "dce_audio.h" 30#include "dce/dce_11_0_d.h" 31#include "dce/dce_11_0_sh_mask.h" 32 33#define DCE_AUD(audio)\ 34 container_of(audio, struct dce_audio, base) 35 36#define CTX \ 37 aud->base.ctx 38 39#define DC_LOGGER_INIT() 40 41#define REG(reg)\ 42 (aud->regs->reg) 43 44#undef FN 45#define FN(reg_name, field_name) \ 46 aud->shifts->field_name, aud->masks->field_name 47 48#define IX_REG(reg)\ 49 ix ## reg 50 51#define AZ_REG_READ(reg_name) \ 52 read_indirect_azalia_reg(audio, IX_REG(reg_name)) 53 54#define AZ_REG_WRITE(reg_name, value) \ 55 write_indirect_azalia_reg(audio, IX_REG(reg_name), value) 56 57static void write_indirect_azalia_reg(struct audio *audio, 58 uint32_t reg_index, 59 uint32_t reg_data) 60{ 61 struct dce_audio *aud = DCE_AUD(audio); 62 63 /* AZALIA_F0_CODEC_ENDPOINT_INDEX endpoint index */ 64 REG_SET(AZALIA_F0_CODEC_ENDPOINT_INDEX, 0, 65 AZALIA_ENDPOINT_REG_INDEX, reg_index); 66 67 /* AZALIA_F0_CODEC_ENDPOINT_DATA endpoint data */ 68 REG_SET(AZALIA_F0_CODEC_ENDPOINT_DATA, 0, 69 AZALIA_ENDPOINT_REG_DATA, reg_data); 70} 71 72static uint32_t read_indirect_azalia_reg(struct audio *audio, uint32_t reg_index) 73{ 74 struct dce_audio *aud = DCE_AUD(audio); 75 76 uint32_t value = 0; 77 78 /* AZALIA_F0_CODEC_ENDPOINT_INDEX endpoint index */ 79 REG_SET(AZALIA_F0_CODEC_ENDPOINT_INDEX, 0, 80 AZALIA_ENDPOINT_REG_INDEX, reg_index); 81 82 /* AZALIA_F0_CODEC_ENDPOINT_DATA endpoint data */ 83 value = REG_READ(AZALIA_F0_CODEC_ENDPOINT_DATA); 84 85 return value; 86} 87 88static bool is_audio_format_supported( 89 const struct audio_info *audio_info, 90 enum audio_format_code audio_format_code, 91 uint32_t *format_index) 92{ 93 uint32_t index; 94 uint32_t max_channe_index = 0; 95 bool found = false; 96 97 if (audio_info == NULL) 98 return found; 99 100 /* pass through whole array */ 101 for (index = 0; index < audio_info->mode_count; index++) { 102 if (audio_info->modes[index].format_code == audio_format_code) { 103 if (found) { 104 /* format has multiply entries, choose one with 105 * highst number of channels */ 106 if (audio_info->modes[index].channel_count > 107 audio_info->modes[max_channe_index].channel_count) { 108 max_channe_index = index; 109 } 110 } else { 111 /* format found, save it's index */ 112 found = true; 113 max_channe_index = index; 114 } 115 } 116 } 117 118 /* return index */ 119 if (found && format_index != NULL) 120 *format_index = max_channe_index; 121 122 return found; 123} 124 125/*For HDMI, calculate if specified sample rates can fit into a given timing */ 126static void check_audio_bandwidth_hdmi( 127 const struct audio_crtc_info *crtc_info, 128 uint32_t channel_count, 129 union audio_sample_rates *sample_rates) 130{ 131 uint32_t samples; 132 uint32_t h_blank; 133 bool limit_freq_to_48_khz = false; 134 bool limit_freq_to_88_2_khz = false; 135 bool limit_freq_to_96_khz = false; 136 bool limit_freq_to_174_4_khz = false; 137 if (!crtc_info) 138 return; 139 140 /* For two channels supported return whatever sink support,unmodified*/ 141 if (channel_count > 2) { 142 143 /* Based on HDMI spec 1.3 Table 7.5 */ 144 if ((crtc_info->requested_pixel_clock_100Hz <= 270000) && 145 (crtc_info->v_active <= 576) && 146 !(crtc_info->interlaced) && 147 !(crtc_info->pixel_repetition == 2 || 148 crtc_info->pixel_repetition == 4)) { 149 limit_freq_to_48_khz = true; 150 151 } else if ((crtc_info->requested_pixel_clock_100Hz <= 270000) && 152 (crtc_info->v_active <= 576) && 153 (crtc_info->interlaced) && 154 (crtc_info->pixel_repetition == 2)) { 155 limit_freq_to_88_2_khz = true; 156 157 } else if ((crtc_info->requested_pixel_clock_100Hz <= 540000) && 158 (crtc_info->v_active <= 576) && 159 !(crtc_info->interlaced)) { 160 limit_freq_to_174_4_khz = true; 161 } 162 } 163 164 /* Also do some calculation for the available Audio Bandwidth for the 165 * 8 ch (i.e. for the Layout 1 => ch > 2) 166 */ 167 h_blank = crtc_info->h_total - crtc_info->h_active; 168 169 if (crtc_info->pixel_repetition) 170 h_blank *= crtc_info->pixel_repetition; 171 172 /*based on HDMI spec 1.3 Table 7.5 */ 173 h_blank -= 58; 174 /*for Control Period */ 175 h_blank -= 16; 176 177 samples = h_blank * 10; 178 /* Number of Audio Packets (multiplied by 10) per Line (for 8 ch number 179 * of Audio samples per line multiplied by 10 - Layout 1) 180 */ 181 samples /= 32; 182 samples *= crtc_info->v_active; 183 /*Number of samples multiplied by 10, per second */ 184 samples *= crtc_info->refresh_rate; 185 /*Number of Audio samples per second */ 186 samples /= 10; 187 188 /* @todo do it after deep color is implemented 189 * 8xx - deep color bandwidth scaling 190 * Extra bandwidth is avaliable in deep color b/c link runs faster than 191 * pixel rate. This has the effect of allowing more tmds characters to 192 * be transmitted during blank 193 */ 194 195 switch (crtc_info->color_depth) { 196 case COLOR_DEPTH_888: 197 samples *= 4; 198 break; 199 case COLOR_DEPTH_101010: 200 samples *= 5; 201 break; 202 case COLOR_DEPTH_121212: 203 samples *= 6; 204 break; 205 default: 206 samples *= 4; 207 break; 208 } 209 210 samples /= 4; 211 212 /*check limitation*/ 213 if (samples < 88200) 214 limit_freq_to_48_khz = true; 215 else if (samples < 96000) 216 limit_freq_to_88_2_khz = true; 217 else if (samples < 176400) 218 limit_freq_to_96_khz = true; 219 else if (samples < 192000) 220 limit_freq_to_174_4_khz = true; 221 222 if (sample_rates != NULL) { 223 /* limit frequencies */ 224 if (limit_freq_to_174_4_khz) 225 sample_rates->rate.RATE_192 = 0; 226 227 if (limit_freq_to_96_khz) { 228 sample_rates->rate.RATE_192 = 0; 229 sample_rates->rate.RATE_176_4 = 0; 230 } 231 if (limit_freq_to_88_2_khz) { 232 sample_rates->rate.RATE_192 = 0; 233 sample_rates->rate.RATE_176_4 = 0; 234 sample_rates->rate.RATE_96 = 0; 235 } 236 if (limit_freq_to_48_khz) { 237 sample_rates->rate.RATE_192 = 0; 238 sample_rates->rate.RATE_176_4 = 0; 239 sample_rates->rate.RATE_96 = 0; 240 sample_rates->rate.RATE_88_2 = 0; 241 } 242 } 243} 244 245/*For DP SST, calculate if specified sample rates can fit into a given timing */ 246static void check_audio_bandwidth_dpsst( 247 const struct audio_crtc_info *crtc_info, 248 uint32_t channel_count, 249 union audio_sample_rates *sample_rates) 250{ 251 /* do nothing */ 252} 253 254/*For DP MST, calculate if specified sample rates can fit into a given timing */ 255static void check_audio_bandwidth_dpmst( 256 const struct audio_crtc_info *crtc_info, 257 uint32_t channel_count, 258 union audio_sample_rates *sample_rates) 259{ 260 /* do nothing */ 261} 262 263static void check_audio_bandwidth( 264 const struct audio_crtc_info *crtc_info, 265 uint32_t channel_count, 266 enum signal_type signal, 267 union audio_sample_rates *sample_rates) 268{ 269 switch (signal) { 270 case SIGNAL_TYPE_HDMI_TYPE_A: 271 check_audio_bandwidth_hdmi( 272 crtc_info, channel_count, sample_rates); 273 break; 274 case SIGNAL_TYPE_EDP: 275 case SIGNAL_TYPE_DISPLAY_PORT: 276 check_audio_bandwidth_dpsst( 277 crtc_info, channel_count, sample_rates); 278 break; 279 case SIGNAL_TYPE_DISPLAY_PORT_MST: 280 check_audio_bandwidth_dpmst( 281 crtc_info, channel_count, sample_rates); 282 break; 283 default: 284 break; 285 } 286} 287 288/* expose/not expose HBR capability to Audio driver */ 289static void set_high_bit_rate_capable( 290 struct audio *audio, 291 bool capable) 292{ 293 uint32_t value = 0; 294 295 /* set high bit rate audio capable*/ 296 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR); 297 298 set_reg_field_value(value, capable, 299 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR, 300 HBR_CAPABLE); 301 302 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR, value); 303} 304 305/* set video latency in in ms/2+1 */ 306static void set_video_latency( 307 struct audio *audio, 308 int latency_in_ms) 309{ 310 uint32_t value = 0; 311 312 if ((latency_in_ms < 0) || (latency_in_ms > 255)) 313 return; 314 315 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC); 316 317 set_reg_field_value(value, latency_in_ms, 318 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC, 319 VIDEO_LIPSYNC); 320 321 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC, 322 value); 323} 324 325/* set audio latency in in ms/2+1 */ 326static void set_audio_latency( 327 struct audio *audio, 328 int latency_in_ms) 329{ 330 uint32_t value = 0; 331 332 if (latency_in_ms < 0) 333 latency_in_ms = 0; 334 335 if (latency_in_ms > 255) 336 latency_in_ms = 255; 337 338 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC); 339 340 set_reg_field_value(value, latency_in_ms, 341 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC, 342 AUDIO_LIPSYNC); 343 344 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC, 345 value); 346} 347 348void dce_aud_az_enable(struct audio *audio) 349{ 350 uint32_t value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL); 351 DC_LOGGER_INIT(); 352 353 set_reg_field_value(value, 1, 354 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, 355 CLOCK_GATING_DISABLE); 356 set_reg_field_value(value, 1, 357 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, 358 AUDIO_ENABLED); 359 360 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value); 361 set_reg_field_value(value, 0, 362 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, 363 CLOCK_GATING_DISABLE); 364 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value); 365 366 DC_LOG_HW_AUDIO("\n\t========= AUDIO:dce_aud_az_enable: index: %u data: 0x%x\n", 367 audio->inst, value); 368} 369 370void dce_aud_az_disable(struct audio *audio) 371{ 372 uint32_t value; 373 DC_LOGGER_INIT(); 374 375 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL); 376 set_reg_field_value(value, 1, 377 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, 378 CLOCK_GATING_DISABLE); 379 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value); 380 381 set_reg_field_value(value, 0, 382 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, 383 AUDIO_ENABLED); 384 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value); 385 386 set_reg_field_value(value, 0, 387 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, 388 CLOCK_GATING_DISABLE); 389 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value); 390 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL); 391 DC_LOG_HW_AUDIO("\n\t========= AUDIO:dce_aud_az_disable: index: %u data: 0x%x\n", 392 audio->inst, value); 393} 394 395void dce_aud_az_configure( 396 struct audio *audio, 397 enum signal_type signal, 398 const struct audio_crtc_info *crtc_info, 399 const struct audio_info *audio_info) 400{ 401 struct dce_audio *aud = DCE_AUD(audio); 402 403 uint32_t speakers = audio_info->flags.info.ALLSPEAKERS; 404 uint32_t value; 405 uint32_t field = 0; 406 enum audio_format_code audio_format_code; 407 uint32_t format_index; 408 uint32_t index; 409 bool is_ac3_supported = false; 410 union audio_sample_rates sample_rate; 411 uint32_t strlen = 0; 412 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL); 413 set_reg_field_value(value, 1, 414 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, 415 CLOCK_GATING_DISABLE); 416 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value); 417 418 /* Speaker Allocation */ 419 /* 420 uint32_t value; 421 uint32_t field = 0;*/ 422 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER); 423 424 set_reg_field_value(value, 425 speakers, 426 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, 427 SPEAKER_ALLOCATION); 428 429 /* LFE_PLAYBACK_LEVEL = LFEPBL 430 * LFEPBL = 0 : Unknown or refer to other information 431 * LFEPBL = 1 : 0dB playback 432 * LFEPBL = 2 : +10dB playback 433 * LFE_BL = 3 : Reserved 434 */ 435 set_reg_field_value(value, 436 0, 437 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, 438 LFE_PLAYBACK_LEVEL); 439 /* todo: according to reg spec LFE_PLAYBACK_LEVEL is read only. 440 * why are we writing to it? DCE8 does not write this */ 441 442 443 set_reg_field_value(value, 444 0, 445 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, 446 HDMI_CONNECTION); 447 448 set_reg_field_value(value, 449 0, 450 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, 451 DP_CONNECTION); 452 453 field = get_reg_field_value(value, 454 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, 455 EXTRA_CONNECTION_INFO); 456 457 field &= ~0x1; 458 459 set_reg_field_value(value, 460 field, 461 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, 462 EXTRA_CONNECTION_INFO); 463 464 /* set audio for output signal */ 465 switch (signal) { 466 case SIGNAL_TYPE_HDMI_TYPE_A: 467 set_reg_field_value(value, 468 1, 469 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, 470 HDMI_CONNECTION); 471 472 break; 473 474 case SIGNAL_TYPE_EDP: 475 case SIGNAL_TYPE_DISPLAY_PORT: 476 case SIGNAL_TYPE_DISPLAY_PORT_MST: 477 set_reg_field_value(value, 478 1, 479 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, 480 DP_CONNECTION); 481 break; 482 default: 483 BREAK_TO_DEBUGGER(); 484 break; 485 } 486 487 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, value); 488 489 /* Audio Descriptors */ 490 /* pass through all formats */ 491 for (format_index = 0; format_index < AUDIO_FORMAT_CODE_COUNT; 492 format_index++) { 493 audio_format_code = 494 (AUDIO_FORMAT_CODE_FIRST + format_index); 495 496 /* those are unsupported, skip programming */ 497 if (audio_format_code == AUDIO_FORMAT_CODE_1BITAUDIO || 498 audio_format_code == AUDIO_FORMAT_CODE_DST) 499 continue; 500 501 value = 0; 502 503 /* check if supported */ 504 if (is_audio_format_supported( 505 audio_info, audio_format_code, &index)) { 506 const struct audio_mode *audio_mode = 507 &audio_info->modes[index]; 508 union audio_sample_rates sample_rates = 509 audio_mode->sample_rates; 510 uint8_t byte2 = audio_mode->max_bit_rate; 511 uint8_t channel_count = audio_mode->channel_count; 512 513 /* adjust specific properties */ 514 switch (audio_format_code) { 515 case AUDIO_FORMAT_CODE_LINEARPCM: { 516 517 check_audio_bandwidth( 518 crtc_info, 519 channel_count, 520 signal, 521 &sample_rates); 522 523 byte2 = audio_mode->sample_size; 524 525 set_reg_field_value(value, 526 sample_rates.all, 527 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0, 528 SUPPORTED_FREQUENCIES_STEREO); 529 } 530 break; 531 case AUDIO_FORMAT_CODE_AC3: 532 is_ac3_supported = true; 533 break; 534 case AUDIO_FORMAT_CODE_DOLBYDIGITALPLUS: 535 case AUDIO_FORMAT_CODE_DTS_HD: 536 case AUDIO_FORMAT_CODE_MAT_MLP: 537 case AUDIO_FORMAT_CODE_DST: 538 case AUDIO_FORMAT_CODE_WMAPRO: 539 byte2 = audio_mode->vendor_specific; 540 break; 541 default: 542 break; 543 } 544 545 /* fill audio format data */ 546 set_reg_field_value(value, 547 channel_count - 1, 548 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0, 549 MAX_CHANNELS); 550 551 set_reg_field_value(value, 552 sample_rates.all, 553 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0, 554 SUPPORTED_FREQUENCIES); 555 556 set_reg_field_value(value, 557 byte2, 558 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0, 559 DESCRIPTOR_BYTE_2); 560 } /* if */ 561 562 AZ_REG_WRITE( 563 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0 + format_index, 564 value); 565 } /* for */ 566 567 if (is_ac3_supported) 568 /* todo: this reg global. why program global register? */ 569 REG_WRITE(AZALIA_F0_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS, 570 0x05); 571 572 /* check for 192khz/8-Ch support for HBR requirements */ 573 sample_rate.all = 0; 574 sample_rate.rate.RATE_192 = 1; 575 576 check_audio_bandwidth( 577 crtc_info, 578 8, 579 signal, 580 &sample_rate); 581 582 set_high_bit_rate_capable(audio, sample_rate.rate.RATE_192); 583 584 /* Audio and Video Lipsync */ 585 set_video_latency(audio, audio_info->video_latency); 586 set_audio_latency(audio, audio_info->audio_latency); 587 588 value = 0; 589 set_reg_field_value(value, audio_info->manufacture_id, 590 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0, 591 MANUFACTURER_ID); 592 593 set_reg_field_value(value, audio_info->product_id, 594 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0, 595 PRODUCT_ID); 596 597 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0, 598 value); 599 600 value = 0; 601 602 /*get display name string length */ 603 while (audio_info->display_name[strlen++] != '\0') { 604 if (strlen >= 605 MAX_HW_AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS) 606 break; 607 } 608 set_reg_field_value(value, strlen, 609 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1, 610 SINK_DESCRIPTION_LEN); 611 612 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1, 613 value); 614 DC_LOG_HW_AUDIO("\n\tAUDIO:az_configure: index: %u data, 0x%x, displayName %s: \n", 615 audio->inst, value, audio_info->display_name); 616 617 /* 618 *write the port ID: 619 *PORT_ID0 = display index 620 *PORT_ID1 = 16bit BDF 621 *(format MSB->LSB: 8bit Bus, 5bit Device, 3bit Function) 622 */ 623 624 value = 0; 625 626 set_reg_field_value(value, audio_info->port_id[0], 627 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2, 628 PORT_ID0); 629 630 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2, value); 631 632 value = 0; 633 set_reg_field_value(value, audio_info->port_id[1], 634 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3, 635 PORT_ID1); 636 637 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3, value); 638 639 /*write the 18 char monitor string */ 640 641 value = 0; 642 set_reg_field_value(value, audio_info->display_name[0], 643 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4, 644 DESCRIPTION0); 645 646 set_reg_field_value(value, audio_info->display_name[1], 647 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4, 648 DESCRIPTION1); 649 650 set_reg_field_value(value, audio_info->display_name[2], 651 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4, 652 DESCRIPTION2); 653 654 set_reg_field_value(value, audio_info->display_name[3], 655 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4, 656 DESCRIPTION3); 657 658 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4, value); 659 660 value = 0; 661 set_reg_field_value(value, audio_info->display_name[4], 662 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5, 663 DESCRIPTION4); 664 665 set_reg_field_value(value, audio_info->display_name[5], 666 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5, 667 DESCRIPTION5); 668 669 set_reg_field_value(value, audio_info->display_name[6], 670 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5, 671 DESCRIPTION6); 672 673 set_reg_field_value(value, audio_info->display_name[7], 674 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5, 675 DESCRIPTION7); 676 677 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5, value); 678 679 value = 0; 680 set_reg_field_value(value, audio_info->display_name[8], 681 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6, 682 DESCRIPTION8); 683 684 set_reg_field_value(value, audio_info->display_name[9], 685 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6, 686 DESCRIPTION9); 687 688 set_reg_field_value(value, audio_info->display_name[10], 689 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6, 690 DESCRIPTION10); 691 692 set_reg_field_value(value, audio_info->display_name[11], 693 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6, 694 DESCRIPTION11); 695 696 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6, value); 697 698 value = 0; 699 set_reg_field_value(value, audio_info->display_name[12], 700 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7, 701 DESCRIPTION12); 702 703 set_reg_field_value(value, audio_info->display_name[13], 704 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7, 705 DESCRIPTION13); 706 707 set_reg_field_value(value, audio_info->display_name[14], 708 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7, 709 DESCRIPTION14); 710 711 set_reg_field_value(value, audio_info->display_name[15], 712 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7, 713 DESCRIPTION15); 714 715 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7, value); 716 717 value = 0; 718 set_reg_field_value(value, audio_info->display_name[16], 719 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8, 720 DESCRIPTION16); 721 722 set_reg_field_value(value, audio_info->display_name[17], 723 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8, 724 DESCRIPTION17); 725 726 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8, value); 727 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL); 728 set_reg_field_value(value, 0, 729 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, 730 CLOCK_GATING_DISABLE); 731 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value); 732} 733 734/* 735* todo: wall clk related functionality probably belong to clock_src. 736*/ 737 738/* search pixel clock value for Azalia HDMI Audio */ 739static void get_azalia_clock_info_hdmi( 740 uint32_t crtc_pixel_clock_100hz, 741 uint32_t actual_pixel_clock_100Hz, 742 struct azalia_clock_info *azalia_clock_info) 743{ 744 /* audio_dto_phase= 24 * 10,000; 745 * 24MHz in [100Hz] units */ 746 azalia_clock_info->audio_dto_phase = 747 24 * 10000; 748 749 /* audio_dto_module = PCLKFrequency * 10,000; 750 * [khz] -> [100Hz] */ 751 azalia_clock_info->audio_dto_module = 752 actual_pixel_clock_100Hz; 753} 754 755static void get_azalia_clock_info_dp( 756 uint32_t requested_pixel_clock_100Hz, 757 const struct audio_pll_info *pll_info, 758 struct azalia_clock_info *azalia_clock_info) 759{ 760 /* Reported dpDtoSourceClockInkhz value for 761 * DCE8 already adjusted for SS, do not need any 762 * adjustment here anymore 763 */ 764 765 /*audio_dto_phase = 24 * 10,000; 766 * 24MHz in [100Hz] units */ 767 azalia_clock_info->audio_dto_phase = 24 * 10000; 768 769 /*audio_dto_module = dpDtoSourceClockInkhz * 10,000; 770 * [khz] ->[100Hz] */ 771 azalia_clock_info->audio_dto_module = 772 pll_info->dp_dto_source_clock_in_khz * 10; 773} 774 775void dce_aud_wall_dto_setup( 776 struct audio *audio, 777 enum signal_type signal, 778 const struct audio_crtc_info *crtc_info, 779 const struct audio_pll_info *pll_info) 780{ 781 struct dce_audio *aud = DCE_AUD(audio); 782 783 struct azalia_clock_info clock_info = { 0 }; 784 785 if (dc_is_hdmi_tmds_signal(signal)) { 786 uint32_t src_sel; 787 788 /*DTO0 Programming goal: 789 -generate 24MHz, 128*Fs from 24MHz 790 -use DTO0 when an active HDMI port is connected 791 (optionally a DP is connected) */ 792 793 /* calculate DTO settings */ 794 get_azalia_clock_info_hdmi( 795 crtc_info->requested_pixel_clock_100Hz, 796 crtc_info->calculated_pixel_clock_100Hz, 797 &clock_info); 798 799 DC_LOG_HW_AUDIO("\n%s:Input::requested_pixel_clock_100Hz = %d"\ 800 "calculated_pixel_clock_100Hz =%d\n"\ 801 "audio_dto_module = %d audio_dto_phase =%d \n\n", __func__,\ 802 crtc_info->requested_pixel_clock_100Hz,\ 803 crtc_info->calculated_pixel_clock_100Hz,\ 804 clock_info.audio_dto_module,\ 805 clock_info.audio_dto_phase); 806 807 /* On TN/SI, Program DTO source select and DTO select before 808 programming DTO modulo and DTO phase. These bits must be 809 programmed first, otherwise there will be no HDMI audio at boot 810 up. This is a HW sequence change (different from old ASICs). 811 Caution when changing this programming sequence. 812 813 HDMI enabled, using DTO0 814 program master CRTC for DTO0 */ 815 src_sel = pll_info->dto_source - DTO_SOURCE_ID0; 816 REG_UPDATE_2(DCCG_AUDIO_DTO_SOURCE, 817 DCCG_AUDIO_DTO0_SOURCE_SEL, src_sel, 818 DCCG_AUDIO_DTO_SEL, 0); 819 820 /* module */ 821 REG_UPDATE(DCCG_AUDIO_DTO0_MODULE, 822 DCCG_AUDIO_DTO0_MODULE, clock_info.audio_dto_module); 823 824 /* phase */ 825 REG_UPDATE(DCCG_AUDIO_DTO0_PHASE, 826 DCCG_AUDIO_DTO0_PHASE, clock_info.audio_dto_phase); 827 } else { 828 /*DTO1 Programming goal: 829 -generate 24MHz, 512*Fs, 128*Fs from 24MHz 830 -default is to used DTO1, and switch to DTO0 when an audio 831 master HDMI port is connected 832 -use as default for DP 833 834 calculate DTO settings */ 835 get_azalia_clock_info_dp( 836 crtc_info->requested_pixel_clock_100Hz, 837 pll_info, 838 &clock_info); 839 840 /* Program DTO select before programming DTO modulo and DTO 841 phase. default to use DTO1 */ 842 843 REG_UPDATE(DCCG_AUDIO_DTO_SOURCE, 844 DCCG_AUDIO_DTO_SEL, 1); 845 846 /* DCCG_AUDIO_DTO2_USE_512FBR_DTO, 1) 847 * Select 512fs for DP TODO: web register definition 848 * does not match register header file 849 * DCE11 version it's commented out while DCE8 it's set to 1 850 */ 851 852 /* module */ 853 REG_UPDATE(DCCG_AUDIO_DTO1_MODULE, 854 DCCG_AUDIO_DTO1_MODULE, clock_info.audio_dto_module); 855 856 /* phase */ 857 REG_UPDATE(DCCG_AUDIO_DTO1_PHASE, 858 DCCG_AUDIO_DTO1_PHASE, clock_info.audio_dto_phase); 859 860 REG_UPDATE(DCCG_AUDIO_DTO_SOURCE, 861 DCCG_AUDIO_DTO2_USE_512FBR_DTO, 1); 862 863 } 864} 865 866#if defined(CONFIG_DRM_AMD_DC_SI) 867static void dce60_aud_wall_dto_setup( 868 struct audio *audio, 869 enum signal_type signal, 870 const struct audio_crtc_info *crtc_info, 871 const struct audio_pll_info *pll_info) 872{ 873 struct dce_audio *aud = DCE_AUD(audio); 874 875 struct azalia_clock_info clock_info = { 0 }; 876 877 if (dc_is_hdmi_signal(signal)) { 878 uint32_t src_sel; 879 880 /*DTO0 Programming goal: 881 -generate 24MHz, 128*Fs from 24MHz 882 -use DTO0 when an active HDMI port is connected 883 (optionally a DP is connected) */ 884 885 /* calculate DTO settings */ 886 get_azalia_clock_info_hdmi( 887 crtc_info->requested_pixel_clock_100Hz, 888 crtc_info->calculated_pixel_clock_100Hz, 889 &clock_info); 890 891 DC_LOG_HW_AUDIO("\n%s:Input::requested_pixel_clock_100Hz = %d"\ 892 "calculated_pixel_clock_100Hz =%d\n"\ 893 "audio_dto_module = %d audio_dto_phase =%d \n\n", __func__,\ 894 crtc_info->requested_pixel_clock_100Hz,\ 895 crtc_info->calculated_pixel_clock_100Hz,\ 896 clock_info.audio_dto_module,\ 897 clock_info.audio_dto_phase); 898 899 /* On TN/SI, Program DTO source select and DTO select before 900 programming DTO modulo and DTO phase. These bits must be 901 programmed first, otherwise there will be no HDMI audio at boot 902 up. This is a HW sequence change (different from old ASICs). 903 Caution when changing this programming sequence. 904 905 HDMI enabled, using DTO0 906 program master CRTC for DTO0 */ 907 src_sel = pll_info->dto_source - DTO_SOURCE_ID0; 908 REG_UPDATE_2(DCCG_AUDIO_DTO_SOURCE, 909 DCCG_AUDIO_DTO0_SOURCE_SEL, src_sel, 910 DCCG_AUDIO_DTO_SEL, 0); 911 912 /* module */ 913 REG_UPDATE(DCCG_AUDIO_DTO0_MODULE, 914 DCCG_AUDIO_DTO0_MODULE, clock_info.audio_dto_module); 915 916 /* phase */ 917 REG_UPDATE(DCCG_AUDIO_DTO0_PHASE, 918 DCCG_AUDIO_DTO0_PHASE, clock_info.audio_dto_phase); 919 } else { 920 /*DTO1 Programming goal: 921 -generate 24MHz, 128*Fs from 24MHz (DCE6 does not support 512*Fs) 922 -default is to used DTO1, and switch to DTO0 when an audio 923 master HDMI port is connected 924 -use as default for DP 925 926 calculate DTO settings */ 927 get_azalia_clock_info_dp( 928 crtc_info->requested_pixel_clock_100Hz, 929 pll_info, 930 &clock_info); 931 932 /* Program DTO select before programming DTO modulo and DTO 933 phase. default to use DTO1 */ 934 935 REG_UPDATE(DCCG_AUDIO_DTO_SOURCE, 936 DCCG_AUDIO_DTO_SEL, 1); 937 938 /* DCCG_AUDIO_DTO2_USE_512FBR_DTO, 1) 939 * Cannot select 512fs for DP 940 * 941 * DCE6 has no DCCG_AUDIO_DTO2_USE_512FBR_DTO mask 942 */ 943 944 /* module */ 945 REG_UPDATE(DCCG_AUDIO_DTO1_MODULE, 946 DCCG_AUDIO_DTO1_MODULE, clock_info.audio_dto_module); 947 948 /* phase */ 949 REG_UPDATE(DCCG_AUDIO_DTO1_PHASE, 950 DCCG_AUDIO_DTO1_PHASE, clock_info.audio_dto_phase); 951 952 /* DCE6 has no DCCG_AUDIO_DTO2_USE_512FBR_DTO mask in DCCG_AUDIO_DTO_SOURCE reg */ 953 954 } 955} 956#endif 957 958static bool dce_aud_endpoint_valid(struct audio *audio) 959{ 960 uint32_t value; 961 uint32_t port_connectivity; 962 963 value = AZ_REG_READ( 964 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT); 965 966 port_connectivity = get_reg_field_value(value, 967 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT, 968 PORT_CONNECTIVITY); 969 970 return !(port_connectivity == 1); 971} 972 973/* initialize HW state */ 974void dce_aud_hw_init( 975 struct audio *audio) 976{ 977 uint32_t value; 978 struct dce_audio *aud = DCE_AUD(audio); 979 980 /* we only need to program the following registers once, so we only do 981 it for the inst 0*/ 982 if (audio->inst != 0) 983 return; 984 985 /* Suport R5 - 32khz 986 * Suport R6 - 44.1khz 987 * Suport R7 - 48khz 988 */ 989 /*disable clock gating before write to endpoint register*/ 990 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL); 991 set_reg_field_value(value, 1, 992 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, 993 CLOCK_GATING_DISABLE); 994 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value); 995 REG_UPDATE(AZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES, 996 AUDIO_RATE_CAPABILITIES, 0x70); 997 998 /*Keep alive bit to verify HW block in BU. */ 999 REG_UPDATE_2(AZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES, 1000 CLKSTOP, 1, 1001 EPSS, 1); 1002 set_reg_field_value(value, 0, 1003 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, 1004 CLOCK_GATING_DISABLE); 1005 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value); 1006} 1007 1008static const struct audio_funcs funcs = { 1009 .endpoint_valid = dce_aud_endpoint_valid, 1010 .hw_init = dce_aud_hw_init, 1011 .wall_dto_setup = dce_aud_wall_dto_setup, 1012 .az_enable = dce_aud_az_enable, 1013 .az_disable = dce_aud_az_disable, 1014 .az_configure = dce_aud_az_configure, 1015 .destroy = dce_aud_destroy, 1016}; 1017 1018#if defined(CONFIG_DRM_AMD_DC_SI) 1019static const struct audio_funcs dce60_funcs = { 1020 .endpoint_valid = dce_aud_endpoint_valid, 1021 .hw_init = dce_aud_hw_init, 1022 .wall_dto_setup = dce60_aud_wall_dto_setup, 1023 .az_enable = dce_aud_az_enable, 1024 .az_disable = dce_aud_az_disable, 1025 .az_configure = dce_aud_az_configure, 1026 .destroy = dce_aud_destroy, 1027}; 1028#endif 1029 1030void dce_aud_destroy(struct audio **audio) 1031{ 1032 struct dce_audio *aud = DCE_AUD(*audio); 1033 1034 kfree(aud); 1035 *audio = NULL; 1036} 1037 1038struct audio *dce_audio_create( 1039 struct dc_context *ctx, 1040 unsigned int inst, 1041 const struct dce_audio_registers *reg, 1042 const struct dce_audio_shift *shifts, 1043 const struct dce_audio_mask *masks 1044 ) 1045{ 1046 struct dce_audio *audio = kzalloc(sizeof(*audio), GFP_KERNEL); 1047 1048 if (audio == NULL) { 1049 ASSERT_CRITICAL(audio); 1050 return NULL; 1051 } 1052 1053 audio->base.ctx = ctx; 1054 audio->base.inst = inst; 1055 audio->base.funcs = &funcs; 1056 1057 audio->regs = reg; 1058 audio->shifts = shifts; 1059 audio->masks = masks; 1060 return &audio->base; 1061} 1062 1063#if defined(CONFIG_DRM_AMD_DC_SI) 1064struct audio *dce60_audio_create( 1065 struct dc_context *ctx, 1066 unsigned int inst, 1067 const struct dce_audio_registers *reg, 1068 const struct dce_audio_shift *shifts, 1069 const struct dce_audio_mask *masks 1070 ) 1071{ 1072 struct dce_audio *audio = kzalloc(sizeof(*audio), GFP_KERNEL); 1073 1074 if (audio == NULL) { 1075 ASSERT_CRITICAL(audio); 1076 return NULL; 1077 } 1078 1079 audio->base.ctx = ctx; 1080 audio->base.inst = inst; 1081 audio->base.funcs = &dce60_funcs; 1082 1083 audio->regs = reg; 1084 audio->shifts = shifts; 1085 audio->masks = masks; 1086 return &audio->base; 1087} 1088#endif