This source file includes following definitions.
- write_indirect_azalia_reg
- read_indirect_azalia_reg
- is_audio_format_supported
- check_audio_bandwidth_hdmi
- check_audio_bandwidth_dpsst
- check_audio_bandwidth_dpmst
- check_audio_bandwidth
- set_high_bit_rate_capable
- set_video_latency
- set_audio_latency
- dce_aud_az_enable
- dce_aud_az_disable
- dce_aud_az_configure
- get_azalia_clock_info_hdmi
- get_azalia_clock_info_dp
- dce_aud_wall_dto_setup
- dce_aud_endpoint_valid
- dce_aud_hw_init
- dce_aud_destroy
- dce_audio_create
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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
57 static 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
64 REG_SET(AZALIA_F0_CODEC_ENDPOINT_INDEX, 0,
65 AZALIA_ENDPOINT_REG_INDEX, reg_index);
66
67
68 REG_SET(AZALIA_F0_CODEC_ENDPOINT_DATA, 0,
69 AZALIA_ENDPOINT_REG_DATA, reg_data);
70
71 DC_LOG_HW_AUDIO("AUDIO:write_indirect_azalia_reg: index: %u data: %u\n",
72 reg_index, reg_data);
73 }
74
75 static uint32_t read_indirect_azalia_reg(struct audio *audio, uint32_t reg_index)
76 {
77 struct dce_audio *aud = DCE_AUD(audio);
78
79 uint32_t value = 0;
80
81
82 REG_SET(AZALIA_F0_CODEC_ENDPOINT_INDEX, 0,
83 AZALIA_ENDPOINT_REG_INDEX, reg_index);
84
85
86 value = REG_READ(AZALIA_F0_CODEC_ENDPOINT_DATA);
87
88 DC_LOG_HW_AUDIO("AUDIO:read_indirect_azalia_reg: index: %u data: %u\n",
89 reg_index, value);
90
91 return value;
92 }
93
94 static bool is_audio_format_supported(
95 const struct audio_info *audio_info,
96 enum audio_format_code audio_format_code,
97 uint32_t *format_index)
98 {
99 uint32_t index;
100 uint32_t max_channe_index = 0;
101 bool found = false;
102
103 if (audio_info == NULL)
104 return found;
105
106
107 for (index = 0; index < audio_info->mode_count; index++) {
108 if (audio_info->modes[index].format_code == audio_format_code) {
109 if (found) {
110
111
112 if (audio_info->modes[index].channel_count >
113 audio_info->modes[max_channe_index].channel_count) {
114 max_channe_index = index;
115 }
116 } else {
117
118 found = true;
119 max_channe_index = index;
120 }
121 }
122 }
123
124
125 if (found && format_index != NULL)
126 *format_index = max_channe_index;
127
128 return found;
129 }
130
131
132 static void check_audio_bandwidth_hdmi(
133 const struct audio_crtc_info *crtc_info,
134 uint32_t channel_count,
135 union audio_sample_rates *sample_rates)
136 {
137 uint32_t samples;
138 uint32_t h_blank;
139 bool limit_freq_to_48_khz = false;
140 bool limit_freq_to_88_2_khz = false;
141 bool limit_freq_to_96_khz = false;
142 bool limit_freq_to_174_4_khz = false;
143
144
145 if (channel_count > 2) {
146
147
148 if ((crtc_info->requested_pixel_clock_100Hz <= 270000) &&
149 (crtc_info->v_active <= 576) &&
150 !(crtc_info->interlaced) &&
151 !(crtc_info->pixel_repetition == 2 ||
152 crtc_info->pixel_repetition == 4)) {
153 limit_freq_to_48_khz = true;
154
155 } else if ((crtc_info->requested_pixel_clock_100Hz <= 270000) &&
156 (crtc_info->v_active <= 576) &&
157 (crtc_info->interlaced) &&
158 (crtc_info->pixel_repetition == 2)) {
159 limit_freq_to_88_2_khz = true;
160
161 } else if ((crtc_info->requested_pixel_clock_100Hz <= 540000) &&
162 (crtc_info->v_active <= 576) &&
163 !(crtc_info->interlaced)) {
164 limit_freq_to_174_4_khz = true;
165 }
166 }
167
168
169
170
171 h_blank = crtc_info->h_total - crtc_info->h_active;
172
173 if (crtc_info->pixel_repetition)
174 h_blank *= crtc_info->pixel_repetition;
175
176
177 h_blank -= 58;
178
179 h_blank -= 16;
180
181 samples = h_blank * 10;
182
183
184
185 samples /= 32;
186 samples *= crtc_info->v_active;
187
188 samples *= crtc_info->refresh_rate;
189
190 samples /= 10;
191
192
193
194
195
196
197
198
199 switch (crtc_info->color_depth) {
200 case COLOR_DEPTH_888:
201 samples *= 4;
202 break;
203 case COLOR_DEPTH_101010:
204 samples *= 5;
205 break;
206 case COLOR_DEPTH_121212:
207 samples *= 6;
208 break;
209 default:
210 samples *= 4;
211 break;
212 }
213
214 samples /= 4;
215
216
217 if (samples < 88200)
218 limit_freq_to_48_khz = true;
219 else if (samples < 96000)
220 limit_freq_to_88_2_khz = true;
221 else if (samples < 176400)
222 limit_freq_to_96_khz = true;
223 else if (samples < 192000)
224 limit_freq_to_174_4_khz = true;
225
226 if (sample_rates != NULL) {
227
228 if (limit_freq_to_174_4_khz)
229 sample_rates->rate.RATE_192 = 0;
230
231 if (limit_freq_to_96_khz) {
232 sample_rates->rate.RATE_192 = 0;
233 sample_rates->rate.RATE_176_4 = 0;
234 }
235 if (limit_freq_to_88_2_khz) {
236 sample_rates->rate.RATE_192 = 0;
237 sample_rates->rate.RATE_176_4 = 0;
238 sample_rates->rate.RATE_96 = 0;
239 }
240 if (limit_freq_to_48_khz) {
241 sample_rates->rate.RATE_192 = 0;
242 sample_rates->rate.RATE_176_4 = 0;
243 sample_rates->rate.RATE_96 = 0;
244 sample_rates->rate.RATE_88_2 = 0;
245 }
246 }
247 }
248
249
250 static void check_audio_bandwidth_dpsst(
251 const struct audio_crtc_info *crtc_info,
252 uint32_t channel_count,
253 union audio_sample_rates *sample_rates)
254 {
255
256 }
257
258
259 static void check_audio_bandwidth_dpmst(
260 const struct audio_crtc_info *crtc_info,
261 uint32_t channel_count,
262 union audio_sample_rates *sample_rates)
263 {
264
265 }
266
267 static void check_audio_bandwidth(
268 const struct audio_crtc_info *crtc_info,
269 uint32_t channel_count,
270 enum signal_type signal,
271 union audio_sample_rates *sample_rates)
272 {
273 switch (signal) {
274 case SIGNAL_TYPE_HDMI_TYPE_A:
275 check_audio_bandwidth_hdmi(
276 crtc_info, channel_count, sample_rates);
277 break;
278 case SIGNAL_TYPE_EDP:
279 case SIGNAL_TYPE_DISPLAY_PORT:
280 check_audio_bandwidth_dpsst(
281 crtc_info, channel_count, sample_rates);
282 break;
283 case SIGNAL_TYPE_DISPLAY_PORT_MST:
284 check_audio_bandwidth_dpmst(
285 crtc_info, channel_count, sample_rates);
286 break;
287 default:
288 break;
289 }
290 }
291
292
293 static void set_high_bit_rate_capable(
294 struct audio *audio,
295 bool capable)
296 {
297 uint32_t value = 0;
298
299
300 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR);
301
302 set_reg_field_value(value, capable,
303 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR,
304 HBR_CAPABLE);
305
306 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR, value);
307 }
308
309
310 static void set_video_latency(
311 struct audio *audio,
312 int latency_in_ms)
313 {
314 uint32_t value = 0;
315
316 if ((latency_in_ms < 0) || (latency_in_ms > 255))
317 return;
318
319 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC);
320
321 set_reg_field_value(value, latency_in_ms,
322 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
323 VIDEO_LIPSYNC);
324
325 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
326 value);
327 }
328
329
330 static void set_audio_latency(
331 struct audio *audio,
332 int latency_in_ms)
333 {
334 uint32_t value = 0;
335
336 if (latency_in_ms < 0)
337 latency_in_ms = 0;
338
339 if (latency_in_ms > 255)
340 latency_in_ms = 255;
341
342 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC);
343
344 set_reg_field_value(value, latency_in_ms,
345 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
346 AUDIO_LIPSYNC);
347
348 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
349 value);
350 }
351
352 void dce_aud_az_enable(struct audio *audio)
353 {
354 uint32_t value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
355 DC_LOGGER_INIT();
356
357 set_reg_field_value(value, 1,
358 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
359 CLOCK_GATING_DISABLE);
360 set_reg_field_value(value, 1,
361 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
362 AUDIO_ENABLED);
363
364 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
365 set_reg_field_value(value, 0,
366 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
367 CLOCK_GATING_DISABLE);
368 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
369
370 DC_LOG_HW_AUDIO("\n\t========= AUDIO:dce_aud_az_enable: index: %u data: 0x%x\n",
371 audio->inst, value);
372 }
373
374 void dce_aud_az_disable(struct audio *audio)
375 {
376 uint32_t value;
377 DC_LOGGER_INIT();
378
379 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
380 set_reg_field_value(value, 1,
381 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
382 CLOCK_GATING_DISABLE);
383 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
384
385 set_reg_field_value(value, 0,
386 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
387 AUDIO_ENABLED);
388 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
389
390 set_reg_field_value(value, 0,
391 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
392 CLOCK_GATING_DISABLE);
393 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
394 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
395 DC_LOG_HW_AUDIO("\n\t========= AUDIO:dce_aud_az_disable: index: %u data: 0x%x\n",
396 audio->inst, value);
397 }
398
399 void dce_aud_az_configure(
400 struct audio *audio,
401 enum signal_type signal,
402 const struct audio_crtc_info *crtc_info,
403 const struct audio_info *audio_info)
404 {
405 struct dce_audio *aud = DCE_AUD(audio);
406
407 uint32_t speakers = audio_info->flags.info.ALLSPEAKERS;
408 uint32_t value;
409 uint32_t field = 0;
410 enum audio_format_code audio_format_code;
411 uint32_t format_index;
412 uint32_t index;
413 bool is_ac3_supported = false;
414 union audio_sample_rates sample_rate;
415 uint32_t strlen = 0;
416 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
417 set_reg_field_value(value, 1,
418 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
419 CLOCK_GATING_DISABLE);
420 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
421
422
423
424
425
426 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER);
427
428 set_reg_field_value(value,
429 speakers,
430 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
431 SPEAKER_ALLOCATION);
432
433
434
435
436
437
438
439 set_reg_field_value(value,
440 0,
441 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
442 LFE_PLAYBACK_LEVEL);
443
444
445
446
447 set_reg_field_value(value,
448 0,
449 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
450 HDMI_CONNECTION);
451
452 set_reg_field_value(value,
453 0,
454 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
455 DP_CONNECTION);
456
457 field = get_reg_field_value(value,
458 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
459 EXTRA_CONNECTION_INFO);
460
461 field &= ~0x1;
462
463 set_reg_field_value(value,
464 field,
465 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
466 EXTRA_CONNECTION_INFO);
467
468
469 switch (signal) {
470 case SIGNAL_TYPE_HDMI_TYPE_A:
471 set_reg_field_value(value,
472 1,
473 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
474 HDMI_CONNECTION);
475
476 break;
477
478 case SIGNAL_TYPE_EDP:
479 case SIGNAL_TYPE_DISPLAY_PORT:
480 case SIGNAL_TYPE_DISPLAY_PORT_MST:
481 set_reg_field_value(value,
482 1,
483 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
484 DP_CONNECTION);
485 break;
486 default:
487 BREAK_TO_DEBUGGER();
488 break;
489 }
490
491 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, value);
492
493
494
495 for (format_index = 0; format_index < AUDIO_FORMAT_CODE_COUNT;
496 format_index++) {
497 audio_format_code =
498 (AUDIO_FORMAT_CODE_FIRST + format_index);
499
500
501 if (audio_format_code == AUDIO_FORMAT_CODE_1BITAUDIO ||
502 audio_format_code == AUDIO_FORMAT_CODE_DST)
503 continue;
504
505 value = 0;
506
507
508 if (is_audio_format_supported(
509 audio_info, audio_format_code, &index)) {
510 const struct audio_mode *audio_mode =
511 &audio_info->modes[index];
512 union audio_sample_rates sample_rates =
513 audio_mode->sample_rates;
514 uint8_t byte2 = audio_mode->max_bit_rate;
515
516
517 switch (audio_format_code) {
518 case AUDIO_FORMAT_CODE_LINEARPCM: {
519 check_audio_bandwidth(
520 crtc_info,
521 audio_mode->channel_count,
522 signal,
523 &sample_rates);
524
525 byte2 = audio_mode->sample_size;
526
527 set_reg_field_value(value,
528 sample_rates.all,
529 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
530 SUPPORTED_FREQUENCIES_STEREO);
531 }
532 break;
533 case AUDIO_FORMAT_CODE_AC3:
534 is_ac3_supported = true;
535 break;
536 case AUDIO_FORMAT_CODE_DOLBYDIGITALPLUS:
537 case AUDIO_FORMAT_CODE_DTS_HD:
538 case AUDIO_FORMAT_CODE_MAT_MLP:
539 case AUDIO_FORMAT_CODE_DST:
540 case AUDIO_FORMAT_CODE_WMAPRO:
541 byte2 = audio_mode->vendor_specific;
542 break;
543 default:
544 break;
545 }
546
547
548 set_reg_field_value(value,
549 audio_mode->channel_count - 1,
550 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
551 MAX_CHANNELS);
552
553 set_reg_field_value(value,
554 sample_rates.all,
555 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
556 SUPPORTED_FREQUENCIES);
557
558 set_reg_field_value(value,
559 byte2,
560 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
561 DESCRIPTOR_BYTE_2);
562 }
563
564 AZ_REG_WRITE(
565 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0 + format_index,
566 value);
567 }
568
569 if (is_ac3_supported)
570
571 REG_WRITE(AZALIA_F0_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS,
572 0x05);
573
574
575 sample_rate.all = 0;
576 sample_rate.rate.RATE_192 = 1;
577
578 check_audio_bandwidth(
579 crtc_info,
580 8,
581 signal,
582 &sample_rate);
583
584 set_high_bit_rate_capable(audio, sample_rate.rate.RATE_192);
585
586
587 set_video_latency(audio, audio_info->video_latency);
588 set_audio_latency(audio, audio_info->audio_latency);
589
590 value = 0;
591 set_reg_field_value(value, audio_info->manufacture_id,
592 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0,
593 MANUFACTURER_ID);
594
595 set_reg_field_value(value, audio_info->product_id,
596 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0,
597 PRODUCT_ID);
598
599 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0,
600 value);
601
602 value = 0;
603
604
605 while (audio_info->display_name[strlen++] != '\0') {
606 if (strlen >=
607 MAX_HW_AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS)
608 break;
609 }
610 set_reg_field_value(value, strlen,
611 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1,
612 SINK_DESCRIPTION_LEN);
613
614 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1,
615 value);
616 DC_LOG_HW_AUDIO("\n\tAUDIO:az_configure: index: %u data, 0x%x, displayName %s: \n",
617 audio->inst, value, audio_info->display_name);
618
619
620
621
622
623
624
625
626 value = 0;
627
628 set_reg_field_value(value, audio_info->port_id[0],
629 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2,
630 PORT_ID0);
631
632 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2, value);
633
634 value = 0;
635 set_reg_field_value(value, audio_info->port_id[1],
636 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3,
637 PORT_ID1);
638
639 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3, value);
640
641
642
643 value = 0;
644 set_reg_field_value(value, audio_info->display_name[0],
645 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
646 DESCRIPTION0);
647
648 set_reg_field_value(value, audio_info->display_name[1],
649 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
650 DESCRIPTION1);
651
652 set_reg_field_value(value, audio_info->display_name[2],
653 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
654 DESCRIPTION2);
655
656 set_reg_field_value(value, audio_info->display_name[3],
657 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
658 DESCRIPTION3);
659
660 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4, value);
661
662 value = 0;
663 set_reg_field_value(value, audio_info->display_name[4],
664 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
665 DESCRIPTION4);
666
667 set_reg_field_value(value, audio_info->display_name[5],
668 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
669 DESCRIPTION5);
670
671 set_reg_field_value(value, audio_info->display_name[6],
672 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
673 DESCRIPTION6);
674
675 set_reg_field_value(value, audio_info->display_name[7],
676 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
677 DESCRIPTION7);
678
679 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5, value);
680
681 value = 0;
682 set_reg_field_value(value, audio_info->display_name[8],
683 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
684 DESCRIPTION8);
685
686 set_reg_field_value(value, audio_info->display_name[9],
687 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
688 DESCRIPTION9);
689
690 set_reg_field_value(value, audio_info->display_name[10],
691 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
692 DESCRIPTION10);
693
694 set_reg_field_value(value, audio_info->display_name[11],
695 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
696 DESCRIPTION11);
697
698 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6, value);
699
700 value = 0;
701 set_reg_field_value(value, audio_info->display_name[12],
702 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
703 DESCRIPTION12);
704
705 set_reg_field_value(value, audio_info->display_name[13],
706 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
707 DESCRIPTION13);
708
709 set_reg_field_value(value, audio_info->display_name[14],
710 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
711 DESCRIPTION14);
712
713 set_reg_field_value(value, audio_info->display_name[15],
714 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
715 DESCRIPTION15);
716
717 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7, value);
718
719 value = 0;
720 set_reg_field_value(value, audio_info->display_name[16],
721 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8,
722 DESCRIPTION16);
723
724 set_reg_field_value(value, audio_info->display_name[17],
725 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8,
726 DESCRIPTION17);
727
728 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8, value);
729 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
730 set_reg_field_value(value, 0,
731 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
732 CLOCK_GATING_DISABLE);
733 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
734 }
735
736
737
738
739
740
741 static void get_azalia_clock_info_hdmi(
742 uint32_t crtc_pixel_clock_100hz,
743 uint32_t actual_pixel_clock_100Hz,
744 struct azalia_clock_info *azalia_clock_info)
745 {
746
747
748 azalia_clock_info->audio_dto_phase =
749 24 * 10000;
750
751
752
753 azalia_clock_info->audio_dto_module =
754 actual_pixel_clock_100Hz;
755 }
756
757 static void get_azalia_clock_info_dp(
758 uint32_t requested_pixel_clock_100Hz,
759 const struct audio_pll_info *pll_info,
760 struct azalia_clock_info *azalia_clock_info)
761 {
762
763
764
765
766
767
768
769 azalia_clock_info->audio_dto_phase = 24 * 10000;
770
771
772
773 azalia_clock_info->audio_dto_module =
774 pll_info->dp_dto_source_clock_in_khz * 10;
775 }
776
777 void dce_aud_wall_dto_setup(
778 struct audio *audio,
779 enum signal_type signal,
780 const struct audio_crtc_info *crtc_info,
781 const struct audio_pll_info *pll_info)
782 {
783 struct dce_audio *aud = DCE_AUD(audio);
784
785 struct azalia_clock_info clock_info = { 0 };
786
787 if (dc_is_hdmi_signal(signal)) {
788 uint32_t src_sel;
789
790
791
792
793
794
795
796 get_azalia_clock_info_hdmi(
797 crtc_info->requested_pixel_clock_100Hz,
798 crtc_info->calculated_pixel_clock_100Hz,
799 &clock_info);
800
801 DC_LOG_HW_AUDIO("\n%s:Input::requested_pixel_clock_100Hz = %d"\
802 "calculated_pixel_clock_100Hz =%d\n"\
803 "audio_dto_module = %d audio_dto_phase =%d \n\n", __func__,\
804 crtc_info->requested_pixel_clock_100Hz,\
805 crtc_info->calculated_pixel_clock_100Hz,\
806 clock_info.audio_dto_module,\
807 clock_info.audio_dto_phase);
808
809
810
811
812
813
814
815
816
817 src_sel = pll_info->dto_source - DTO_SOURCE_ID0;
818 REG_UPDATE_2(DCCG_AUDIO_DTO_SOURCE,
819 DCCG_AUDIO_DTO0_SOURCE_SEL, src_sel,
820 DCCG_AUDIO_DTO_SEL, 0);
821
822
823 REG_UPDATE(DCCG_AUDIO_DTO0_MODULE,
824 DCCG_AUDIO_DTO0_MODULE, clock_info.audio_dto_module);
825
826
827 REG_UPDATE(DCCG_AUDIO_DTO0_PHASE,
828 DCCG_AUDIO_DTO0_PHASE, clock_info.audio_dto_phase);
829 } else {
830
831
832
833
834
835
836
837 get_azalia_clock_info_dp(
838 crtc_info->requested_pixel_clock_100Hz,
839 pll_info,
840 &clock_info);
841
842
843
844
845 REG_UPDATE(DCCG_AUDIO_DTO_SOURCE,
846 DCCG_AUDIO_DTO_SEL, 1);
847
848
849
850
851
852
853
854
855 REG_UPDATE(DCCG_AUDIO_DTO1_MODULE,
856 DCCG_AUDIO_DTO1_MODULE, clock_info.audio_dto_module);
857
858
859 REG_UPDATE(DCCG_AUDIO_DTO1_PHASE,
860 DCCG_AUDIO_DTO1_PHASE, clock_info.audio_dto_phase);
861
862 REG_UPDATE(DCCG_AUDIO_DTO_SOURCE,
863 DCCG_AUDIO_DTO2_USE_512FBR_DTO, 1);
864
865 }
866 }
867
868 static bool dce_aud_endpoint_valid(struct audio *audio)
869 {
870 uint32_t value;
871 uint32_t port_connectivity;
872
873 value = AZ_REG_READ(
874 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT);
875
876 port_connectivity = get_reg_field_value(value,
877 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT,
878 PORT_CONNECTIVITY);
879
880 return !(port_connectivity == 1);
881 }
882
883
884 void dce_aud_hw_init(
885 struct audio *audio)
886 {
887 uint32_t value;
888 struct dce_audio *aud = DCE_AUD(audio);
889
890
891
892 if (audio->inst != 0)
893 return;
894
895
896
897
898
899
900 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
901 set_reg_field_value(value, 1,
902 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
903 CLOCK_GATING_DISABLE);
904 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
905 REG_UPDATE(AZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES,
906 AUDIO_RATE_CAPABILITIES, 0x70);
907
908
909 REG_UPDATE_2(AZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES,
910 CLKSTOP, 1,
911 EPSS, 1);
912 set_reg_field_value(value, 0,
913 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
914 CLOCK_GATING_DISABLE);
915 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
916 }
917
918 static const struct audio_funcs funcs = {
919 .endpoint_valid = dce_aud_endpoint_valid,
920 .hw_init = dce_aud_hw_init,
921 .wall_dto_setup = dce_aud_wall_dto_setup,
922 .az_enable = dce_aud_az_enable,
923 .az_disable = dce_aud_az_disable,
924 .az_configure = dce_aud_az_configure,
925 .destroy = dce_aud_destroy,
926 };
927 void dce_aud_destroy(struct audio **audio)
928 {
929 struct dce_audio *aud = DCE_AUD(*audio);
930
931 kfree(aud);
932 *audio = NULL;
933 }
934
935 struct audio *dce_audio_create(
936 struct dc_context *ctx,
937 unsigned int inst,
938 const struct dce_audio_registers *reg,
939 const struct dce_audio_shift *shifts,
940 const struct dce_audio_mask *masks
941 )
942 {
943 struct dce_audio *audio = kzalloc(sizeof(*audio), GFP_KERNEL);
944
945 if (audio == NULL) {
946 ASSERT_CRITICAL(audio);
947 return NULL;
948 }
949
950 audio->base.ctx = ctx;
951 audio->base.inst = inst;
952 audio->base.funcs = &funcs;
953
954 audio->regs = reg;
955 audio->shifts = shifts;
956 audio->masks = masks;
957 return &audio->base;
958 }
959