Loading...
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 "reg_helper.h"
27#include "dce_audio.h"
28#include "dce/dce_11_0_d.h"
29#include "dce/dce_11_0_sh_mask.h"
30
31#define DCE_AUD(audio)\
32 container_of(audio, struct dce_audio, base)
33
34#define CTX \
35 aud->base.ctx
36
37#define DC_LOGGER_INIT()
38
39#define REG(reg)\
40 (aud->regs->reg)
41
42#undef FN
43#define FN(reg_name, field_name) \
44 aud->shifts->field_name, aud->masks->field_name
45
46#define IX_REG(reg)\
47 ix ## reg
48
49#define AZ_REG_READ(reg_name) \
50 read_indirect_azalia_reg(audio, IX_REG(reg_name))
51
52#define AZ_REG_WRITE(reg_name, value) \
53 write_indirect_azalia_reg(audio, IX_REG(reg_name), value)
54
55static void write_indirect_azalia_reg(struct audio *audio,
56 uint32_t reg_index,
57 uint32_t reg_data)
58{
59 struct dce_audio *aud = DCE_AUD(audio);
60
61 /* AZALIA_F0_CODEC_ENDPOINT_INDEX endpoint index */
62 REG_SET(AZALIA_F0_CODEC_ENDPOINT_INDEX, 0,
63 AZALIA_ENDPOINT_REG_INDEX, reg_index);
64
65 /* AZALIA_F0_CODEC_ENDPOINT_DATA endpoint data */
66 REG_SET(AZALIA_F0_CODEC_ENDPOINT_DATA, 0,
67 AZALIA_ENDPOINT_REG_DATA, reg_data);
68}
69
70static uint32_t read_indirect_azalia_reg(struct audio *audio, uint32_t reg_index)
71{
72 struct dce_audio *aud = DCE_AUD(audio);
73
74 uint32_t value = 0;
75
76 /* AZALIA_F0_CODEC_ENDPOINT_INDEX endpoint index */
77 REG_SET(AZALIA_F0_CODEC_ENDPOINT_INDEX, 0,
78 AZALIA_ENDPOINT_REG_INDEX, reg_index);
79
80 /* AZALIA_F0_CODEC_ENDPOINT_DATA endpoint data */
81 value = REG_READ(AZALIA_F0_CODEC_ENDPOINT_DATA);
82
83 return value;
84}
85
86static bool is_audio_format_supported(
87 const struct audio_info *audio_info,
88 enum audio_format_code audio_format_code,
89 uint32_t *format_index)
90{
91 uint32_t index;
92 uint32_t max_channe_index = 0;
93 bool found = false;
94
95 if (audio_info == NULL)
96 return found;
97
98 /* pass through whole array */
99 for (index = 0; index < audio_info->mode_count; index++) {
100 if (audio_info->modes[index].format_code == audio_format_code) {
101 if (found) {
102 /* format has multiply entries, choose one with
103 * highst number of channels */
104 if (audio_info->modes[index].channel_count >
105 audio_info->modes[max_channe_index].channel_count) {
106 max_channe_index = index;
107 }
108 } else {
109 /* format found, save it's index */
110 found = true;
111 max_channe_index = index;
112 }
113 }
114 }
115
116 /* return index */
117 if (found && format_index != NULL)
118 *format_index = max_channe_index;
119
120 return found;
121}
122
123/*For HDMI, calculate if specified sample rates can fit into a given timing */
124static void check_audio_bandwidth_hdmi(
125 const struct audio_crtc_info *crtc_info,
126 uint32_t channel_count,
127 union audio_sample_rates *sample_rates)
128{
129 uint32_t samples;
130 uint32_t h_blank;
131 bool limit_freq_to_48_khz = false;
132 bool limit_freq_to_88_2_khz = false;
133 bool limit_freq_to_96_khz = false;
134 bool limit_freq_to_174_4_khz = false;
135 if (!crtc_info)
136 return;
137
138 /* For two channels supported return whatever sink support,unmodified*/
139 if (channel_count > 2) {
140
141 /* Based on HDMI spec 1.3 Table 7.5 */
142 if ((crtc_info->requested_pixel_clock_100Hz <= 270000) &&
143 (crtc_info->v_active <= 576) &&
144 !(crtc_info->interlaced) &&
145 !(crtc_info->pixel_repetition == 2 ||
146 crtc_info->pixel_repetition == 4)) {
147 limit_freq_to_48_khz = true;
148
149 } else if ((crtc_info->requested_pixel_clock_100Hz <= 270000) &&
150 (crtc_info->v_active <= 576) &&
151 (crtc_info->interlaced) &&
152 (crtc_info->pixel_repetition == 2)) {
153 limit_freq_to_88_2_khz = true;
154
155 } else if ((crtc_info->requested_pixel_clock_100Hz <= 540000) &&
156 (crtc_info->v_active <= 576) &&
157 !(crtc_info->interlaced)) {
158 limit_freq_to_174_4_khz = true;
159 }
160 }
161
162 /* Also do some calculation for the available Audio Bandwidth for the
163 * 8 ch (i.e. for the Layout 1 => ch > 2)
164 */
165 h_blank = crtc_info->h_total - crtc_info->h_active;
166
167 if (crtc_info->pixel_repetition)
168 h_blank *= crtc_info->pixel_repetition;
169
170 /*based on HDMI spec 1.3 Table 7.5 */
171 h_blank -= 58;
172 /*for Control Period */
173 h_blank -= 16;
174
175 samples = h_blank * 10;
176 /* Number of Audio Packets (multiplied by 10) per Line (for 8 ch number
177 * of Audio samples per line multiplied by 10 - Layout 1)
178 */
179 samples /= 32;
180 samples *= crtc_info->v_active;
181 /*Number of samples multiplied by 10, per second */
182 samples *= crtc_info->refresh_rate;
183 /*Number of Audio samples per second */
184 samples /= 10;
185
186 /* @todo do it after deep color is implemented
187 * 8xx - deep color bandwidth scaling
188 * Extra bandwidth is avaliable in deep color b/c link runs faster than
189 * pixel rate. This has the effect of allowing more tmds characters to
190 * be transmitted during blank
191 */
192
193 switch (crtc_info->color_depth) {
194 case COLOR_DEPTH_888:
195 samples *= 4;
196 break;
197 case COLOR_DEPTH_101010:
198 samples *= 5;
199 break;
200 case COLOR_DEPTH_121212:
201 samples *= 6;
202 break;
203 default:
204 samples *= 4;
205 break;
206 }
207
208 samples /= 4;
209
210 /*check limitation*/
211 if (samples < 88200)
212 limit_freq_to_48_khz = true;
213 else if (samples < 96000)
214 limit_freq_to_88_2_khz = true;
215 else if (samples < 176400)
216 limit_freq_to_96_khz = true;
217 else if (samples < 192000)
218 limit_freq_to_174_4_khz = true;
219
220 if (sample_rates != NULL) {
221 /* limit frequencies */
222 if (limit_freq_to_174_4_khz)
223 sample_rates->rate.RATE_192 = 0;
224
225 if (limit_freq_to_96_khz) {
226 sample_rates->rate.RATE_192 = 0;
227 sample_rates->rate.RATE_176_4 = 0;
228 }
229 if (limit_freq_to_88_2_khz) {
230 sample_rates->rate.RATE_192 = 0;
231 sample_rates->rate.RATE_176_4 = 0;
232 sample_rates->rate.RATE_96 = 0;
233 }
234 if (limit_freq_to_48_khz) {
235 sample_rates->rate.RATE_192 = 0;
236 sample_rates->rate.RATE_176_4 = 0;
237 sample_rates->rate.RATE_96 = 0;
238 sample_rates->rate.RATE_88_2 = 0;
239 }
240 }
241}
242static struct fixed31_32 get_link_symbol_clk_freq_mhz(enum dc_link_rate link_rate)
243{
244 switch (link_rate) {
245 case LINK_RATE_LOW:
246 return dc_fixpt_from_int(162); /* 162 MHz */
247 case LINK_RATE_HIGH:
248 return dc_fixpt_from_int(270); /* 270 MHz */
249 case LINK_RATE_HIGH2:
250 return dc_fixpt_from_int(540); /* 540 MHz */
251 case LINK_RATE_HIGH3:
252 return dc_fixpt_from_int(810); /* 810 MHz */
253 case LINK_RATE_UHBR10:
254 return dc_fixpt_from_fraction(3125, 10); /* 312.5 MHz */
255 case LINK_RATE_UHBR13_5:
256 return dc_fixpt_from_fraction(421875, 1000); /* 421.875 MHz */
257 case LINK_RATE_UHBR20:
258 return dc_fixpt_from_int(625); /* 625 MHz */
259 default:
260 /* Unexpected case, this requires debug if encountered. */
261 ASSERT(0);
262 return dc_fixpt_from_int(0);
263 }
264}
265
266struct dp_audio_layout_config {
267 uint8_t layouts_per_sample_denom;
268 uint8_t symbols_per_layout;
269 uint8_t max_layouts_per_audio_sdp;
270};
271
272static void get_audio_layout_config(
273 uint32_t channel_count,
274 enum dp_link_encoding encoding,
275 struct dp_audio_layout_config *output)
276{
277 /* Assuming L-PCM audio. Current implementation uses max 1 layout per SDP,
278 * with each layout being the same size (8ch layout).
279 */
280 if (encoding == DP_8b_10b_ENCODING) {
281 if (channel_count == 2) {
282 output->layouts_per_sample_denom = 4;
283 output->symbols_per_layout = 40;
284 output->max_layouts_per_audio_sdp = 1;
285 } else if (channel_count == 8 || channel_count == 6) {
286 output->layouts_per_sample_denom = 1;
287 output->symbols_per_layout = 40;
288 output->max_layouts_per_audio_sdp = 1;
289 }
290 } else if (encoding == DP_128b_132b_ENCODING) {
291 if (channel_count == 2) {
292 output->layouts_per_sample_denom = 4;
293 output->symbols_per_layout = 10;
294 output->max_layouts_per_audio_sdp = 1;
295 } else if (channel_count == 8 || channel_count == 6) {
296 output->layouts_per_sample_denom = 1;
297 output->symbols_per_layout = 10;
298 output->max_layouts_per_audio_sdp = 1;
299 }
300 }
301}
302
303static uint32_t get_av_stream_map_lane_count(
304 enum dp_link_encoding encoding,
305 enum dc_lane_count lane_count,
306 bool is_mst)
307{
308 uint32_t av_stream_map_lane_count = 0;
309
310 if (encoding == DP_8b_10b_ENCODING) {
311 if (!is_mst)
312 av_stream_map_lane_count = lane_count;
313 else
314 av_stream_map_lane_count = 4;
315 } else if (encoding == DP_128b_132b_ENCODING) {
316 av_stream_map_lane_count = 4;
317 }
318
319 ASSERT(av_stream_map_lane_count != 0);
320
321 return av_stream_map_lane_count;
322}
323
324static uint32_t get_audio_sdp_overhead(
325 enum dp_link_encoding encoding,
326 enum dc_lane_count lane_count,
327 bool is_mst)
328{
329 uint32_t audio_sdp_overhead = 0;
330
331 if (encoding == DP_8b_10b_ENCODING) {
332 if (is_mst)
333 audio_sdp_overhead = 16; /* 4 * 2 + 8 */
334 else
335 audio_sdp_overhead = lane_count * 2 + 8;
336 } else if (encoding == DP_128b_132b_ENCODING) {
337 audio_sdp_overhead = 10; /* 4 x 2.5 */
338 }
339
340 ASSERT(audio_sdp_overhead != 0);
341
342 return audio_sdp_overhead;
343}
344
345static uint32_t calculate_required_audio_bw_in_symbols(
346 const struct audio_crtc_info *crtc_info,
347 const struct dp_audio_layout_config *layout_config,
348 uint32_t channel_count,
349 uint32_t sample_rate_hz,
350 uint32_t av_stream_map_lane_count,
351 uint32_t audio_sdp_overhead)
352{
353 /* DP spec recommends between 1.05 to 1.1 safety margin to prevent sample under-run */
354 struct fixed31_32 audio_sdp_margin = dc_fixpt_from_fraction(110, 100);
355 struct fixed31_32 horizontal_line_freq_khz = dc_fixpt_from_fraction(
356 crtc_info->requested_pixel_clock_100Hz, crtc_info->h_total * 10);
357 struct fixed31_32 samples_per_line;
358 struct fixed31_32 layouts_per_line;
359 struct fixed31_32 symbols_per_sdp_max_layout;
360 struct fixed31_32 remainder;
361 uint32_t num_sdp_with_max_layouts;
362 uint32_t required_symbols_per_hblank;
363
364 samples_per_line = dc_fixpt_from_fraction(sample_rate_hz, 1000);
365 samples_per_line = dc_fixpt_div(samples_per_line, horizontal_line_freq_khz);
366 layouts_per_line = dc_fixpt_div_int(samples_per_line, layout_config->layouts_per_sample_denom);
367
368 num_sdp_with_max_layouts = dc_fixpt_floor(
369 dc_fixpt_div_int(layouts_per_line, layout_config->max_layouts_per_audio_sdp));
370 symbols_per_sdp_max_layout = dc_fixpt_from_int(
371 layout_config->max_layouts_per_audio_sdp * layout_config->symbols_per_layout);
372 symbols_per_sdp_max_layout = dc_fixpt_add_int(symbols_per_sdp_max_layout, audio_sdp_overhead);
373 symbols_per_sdp_max_layout = dc_fixpt_mul(symbols_per_sdp_max_layout, audio_sdp_margin);
374 required_symbols_per_hblank = num_sdp_with_max_layouts;
375 required_symbols_per_hblank *= ((dc_fixpt_ceil(symbols_per_sdp_max_layout) + av_stream_map_lane_count) /
376 av_stream_map_lane_count) * av_stream_map_lane_count;
377
378 if (num_sdp_with_max_layouts != dc_fixpt_ceil(
379 dc_fixpt_div_int(layouts_per_line, layout_config->max_layouts_per_audio_sdp))) {
380 remainder = dc_fixpt_sub_int(layouts_per_line,
381 num_sdp_with_max_layouts * layout_config->max_layouts_per_audio_sdp);
382 remainder = dc_fixpt_mul_int(remainder, layout_config->symbols_per_layout);
383 remainder = dc_fixpt_add_int(remainder, audio_sdp_overhead);
384 remainder = dc_fixpt_mul(remainder, audio_sdp_margin);
385 required_symbols_per_hblank += ((dc_fixpt_ceil(remainder) + av_stream_map_lane_count) /
386 av_stream_map_lane_count) * av_stream_map_lane_count;
387 }
388
389 return required_symbols_per_hblank;
390}
391
392/* Current calculation only applicable for 8b/10b MST and 128b/132b SST/MST.
393 */
394static uint32_t calculate_available_hblank_bw_in_symbols(
395 const struct audio_crtc_info *crtc_info,
396 const struct audio_dp_link_info *dp_link_info)
397{
398 uint64_t hblank = crtc_info->h_total - crtc_info->h_active;
399 struct fixed31_32 hblank_time_msec =
400 dc_fixpt_from_fraction(hblank * 10, crtc_info->requested_pixel_clock_100Hz);
401 struct fixed31_32 lsclkfreq_mhz =
402 get_link_symbol_clk_freq_mhz(dp_link_info->link_rate);
403 struct fixed31_32 average_stream_sym_bw_frac;
404 struct fixed31_32 peak_stream_bw_kbps;
405 struct fixed31_32 bits_per_pixel;
406 struct fixed31_32 link_bw_kbps;
407 struct fixed31_32 available_stream_sym_count;
408 uint32_t available_hblank_bw = 0; /* in stream symbols */
409
410 if (crtc_info->dsc_bits_per_pixel) {
411 bits_per_pixel = dc_fixpt_from_fraction(crtc_info->dsc_bits_per_pixel, 16);
412 } else {
413 switch (crtc_info->color_depth) {
414 case COLOR_DEPTH_666:
415 bits_per_pixel = dc_fixpt_from_int(6);
416 break;
417 case COLOR_DEPTH_888:
418 bits_per_pixel = dc_fixpt_from_int(8);
419 break;
420 case COLOR_DEPTH_101010:
421 bits_per_pixel = dc_fixpt_from_int(10);
422 break;
423 case COLOR_DEPTH_121212:
424 bits_per_pixel = dc_fixpt_from_int(12);
425 break;
426 default:
427 /* Default to commonly supported color depth. */
428 bits_per_pixel = dc_fixpt_from_int(8);
429 break;
430 }
431
432 bits_per_pixel = dc_fixpt_mul_int(bits_per_pixel, 3);
433
434 if (crtc_info->pixel_encoding == PIXEL_ENCODING_YCBCR422) {
435 bits_per_pixel = dc_fixpt_div_int(bits_per_pixel, 3);
436 bits_per_pixel = dc_fixpt_mul_int(bits_per_pixel, 2);
437 } else if (crtc_info->pixel_encoding == PIXEL_ENCODING_YCBCR420) {
438 bits_per_pixel = dc_fixpt_div_int(bits_per_pixel, 2);
439 }
440 }
441
442 /* Use simple stream BW calculation because mainlink overhead is
443 * accounted for separately in the audio BW calculations.
444 */
445 peak_stream_bw_kbps = dc_fixpt_from_fraction(crtc_info->requested_pixel_clock_100Hz, 10);
446 peak_stream_bw_kbps = dc_fixpt_mul(peak_stream_bw_kbps, bits_per_pixel);
447 link_bw_kbps = dc_fixpt_from_int(dp_link_info->link_bandwidth_kbps);
448 average_stream_sym_bw_frac = dc_fixpt_div(peak_stream_bw_kbps, link_bw_kbps);
449
450 available_stream_sym_count = dc_fixpt_mul_int(hblank_time_msec, 1000);
451 available_stream_sym_count = dc_fixpt_mul(available_stream_sym_count, lsclkfreq_mhz);
452 available_stream_sym_count = dc_fixpt_mul(available_stream_sym_count, average_stream_sym_bw_frac);
453 available_hblank_bw = dc_fixpt_floor(available_stream_sym_count);
454 available_hblank_bw *= dp_link_info->lane_count;
455 available_hblank_bw -= crtc_info->dsc_num_slices * 4; /* EOC overhead */
456
457 if (available_hblank_bw < dp_link_info->hblank_min_symbol_width)
458 available_hblank_bw = dp_link_info->hblank_min_symbol_width;
459
460 if (available_hblank_bw < 12)
461 available_hblank_bw = 0;
462 else
463 available_hblank_bw -= 12; /* Main link overhead */
464
465 return available_hblank_bw;
466}
467
468static void check_audio_bandwidth_dp(
469 const struct audio_crtc_info *crtc_info,
470 const struct audio_dp_link_info *dp_link_info,
471 uint32_t channel_count,
472 union audio_sample_rates *sample_rates)
473{
474 struct dp_audio_layout_config layout_config = {0};
475 uint32_t available_hblank_bw;
476 uint32_t av_stream_map_lane_count;
477 uint32_t audio_sdp_overhead;
478
479 /* TODO: Add validation for SST 8b/10 case */
480 if (!dp_link_info->is_mst && dp_link_info->encoding == DP_8b_10b_ENCODING)
481 return;
482
483 available_hblank_bw = calculate_available_hblank_bw_in_symbols(
484 crtc_info, dp_link_info);
485 av_stream_map_lane_count = get_av_stream_map_lane_count(
486 dp_link_info->encoding, dp_link_info->lane_count, dp_link_info->is_mst);
487 audio_sdp_overhead = get_audio_sdp_overhead(
488 dp_link_info->encoding, dp_link_info->lane_count, dp_link_info->is_mst);
489 get_audio_layout_config(
490 channel_count, dp_link_info->encoding, &layout_config);
491
492 if (layout_config.max_layouts_per_audio_sdp == 0 ||
493 layout_config.symbols_per_layout == 0 ||
494 layout_config.layouts_per_sample_denom == 0) {
495 return;
496 }
497 if (available_hblank_bw < calculate_required_audio_bw_in_symbols(
498 crtc_info, &layout_config, channel_count, 192000,
499 av_stream_map_lane_count, audio_sdp_overhead))
500 sample_rates->rate.RATE_192 = 0;
501 if (available_hblank_bw < calculate_required_audio_bw_in_symbols(
502 crtc_info, &layout_config, channel_count, 176400,
503 av_stream_map_lane_count, audio_sdp_overhead))
504 sample_rates->rate.RATE_176_4 = 0;
505 if (available_hblank_bw < calculate_required_audio_bw_in_symbols(
506 crtc_info, &layout_config, channel_count, 96000,
507 av_stream_map_lane_count, audio_sdp_overhead))
508 sample_rates->rate.RATE_96 = 0;
509 if (available_hblank_bw < calculate_required_audio_bw_in_symbols(
510 crtc_info, &layout_config, channel_count, 88200,
511 av_stream_map_lane_count, audio_sdp_overhead))
512 sample_rates->rate.RATE_88_2 = 0;
513 if (available_hblank_bw < calculate_required_audio_bw_in_symbols(
514 crtc_info, &layout_config, channel_count, 48000,
515 av_stream_map_lane_count, audio_sdp_overhead))
516 sample_rates->rate.RATE_48 = 0;
517 if (available_hblank_bw < calculate_required_audio_bw_in_symbols(
518 crtc_info, &layout_config, channel_count, 44100,
519 av_stream_map_lane_count, audio_sdp_overhead))
520 sample_rates->rate.RATE_44_1 = 0;
521 if (available_hblank_bw < calculate_required_audio_bw_in_symbols(
522 crtc_info, &layout_config, channel_count, 32000,
523 av_stream_map_lane_count, audio_sdp_overhead))
524 sample_rates->rate.RATE_32 = 0;
525}
526
527static void check_audio_bandwidth(
528 const struct audio_crtc_info *crtc_info,
529 const struct audio_dp_link_info *dp_link_info,
530 uint32_t channel_count,
531 enum signal_type signal,
532 union audio_sample_rates *sample_rates)
533{
534 switch (signal) {
535 case SIGNAL_TYPE_HDMI_TYPE_A:
536 check_audio_bandwidth_hdmi(
537 crtc_info, channel_count, sample_rates);
538 break;
539 case SIGNAL_TYPE_EDP:
540 case SIGNAL_TYPE_DISPLAY_PORT:
541 case SIGNAL_TYPE_DISPLAY_PORT_MST:
542 check_audio_bandwidth_dp(
543 crtc_info, dp_link_info, channel_count, sample_rates);
544 break;
545 default:
546 break;
547 }
548}
549
550/* expose/not expose HBR capability to Audio driver */
551static void set_high_bit_rate_capable(
552 struct audio *audio,
553 bool capable)
554{
555 uint32_t value = 0;
556
557 /* set high bit rate audio capable*/
558 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR);
559
560 set_reg_field_value(value, capable,
561 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR,
562 HBR_CAPABLE);
563
564 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR, value);
565}
566
567/* set video latency in ms/2+1 */
568static void set_video_latency(
569 struct audio *audio,
570 int latency_in_ms)
571{
572 uint32_t value = 0;
573
574 if ((latency_in_ms < 0) || (latency_in_ms > 255))
575 return;
576
577 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC);
578
579 set_reg_field_value(value, latency_in_ms,
580 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
581 VIDEO_LIPSYNC);
582
583 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
584 value);
585}
586
587/* set audio latency in ms/2+1 */
588static void set_audio_latency(
589 struct audio *audio,
590 int latency_in_ms)
591{
592 uint32_t value = 0;
593
594 if (latency_in_ms < 0)
595 latency_in_ms = 0;
596
597 if (latency_in_ms > 255)
598 latency_in_ms = 255;
599
600 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC);
601
602 set_reg_field_value(value, latency_in_ms,
603 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
604 AUDIO_LIPSYNC);
605
606 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
607 value);
608}
609
610void dce_aud_az_enable(struct audio *audio)
611{
612 uint32_t value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
613 DC_LOGGER_INIT();
614
615 set_reg_field_value(value, 1,
616 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
617 CLOCK_GATING_DISABLE);
618 set_reg_field_value(value, 1,
619 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
620 AUDIO_ENABLED);
621
622 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
623 set_reg_field_value(value, 0,
624 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
625 CLOCK_GATING_DISABLE);
626 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
627
628 DC_LOG_HW_AUDIO("\n\t========= AUDIO:dce_aud_az_enable: index: %u data: 0x%x\n",
629 audio->inst, value);
630}
631
632void dce_aud_az_disable(struct audio *audio)
633{
634 uint32_t value;
635 DC_LOGGER_INIT();
636
637 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
638 set_reg_field_value(value, 1,
639 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
640 CLOCK_GATING_DISABLE);
641 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
642
643 set_reg_field_value(value, 0,
644 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
645 AUDIO_ENABLED);
646 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
647
648 set_reg_field_value(value, 0,
649 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
650 CLOCK_GATING_DISABLE);
651 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
652 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
653 DC_LOG_HW_AUDIO("\n\t========= AUDIO:dce_aud_az_disable: index: %u data: 0x%x\n",
654 audio->inst, value);
655}
656
657void dce_aud_az_configure(
658 struct audio *audio,
659 enum signal_type signal,
660 const struct audio_crtc_info *crtc_info,
661 const struct audio_info *audio_info,
662 const struct audio_dp_link_info *dp_link_info)
663{
664 struct dce_audio *aud = DCE_AUD(audio);
665
666 uint32_t speakers = audio_info->flags.info.ALLSPEAKERS;
667 uint32_t value;
668 uint32_t field = 0;
669 enum audio_format_code audio_format_code;
670 uint32_t format_index;
671 uint32_t index;
672 bool is_ac3_supported = false;
673 union audio_sample_rates sample_rate;
674 uint32_t strlen = 0;
675
676 if (signal == SIGNAL_TYPE_VIRTUAL)
677 return;
678
679 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
680 set_reg_field_value(value, 1,
681 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
682 CLOCK_GATING_DISABLE);
683 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
684
685 /* Speaker Allocation */
686 /*
687 uint32_t value;
688 uint32_t field = 0;*/
689 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER);
690
691 set_reg_field_value(value,
692 speakers,
693 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
694 SPEAKER_ALLOCATION);
695
696 /* LFE_PLAYBACK_LEVEL = LFEPBL
697 * LFEPBL = 0 : Unknown or refer to other information
698 * LFEPBL = 1 : 0dB playback
699 * LFEPBL = 2 : +10dB playback
700 * LFE_BL = 3 : Reserved
701 */
702 set_reg_field_value(value,
703 0,
704 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
705 LFE_PLAYBACK_LEVEL);
706 /* todo: according to reg spec LFE_PLAYBACK_LEVEL is read only.
707 * why are we writing to it? DCE8 does not write this */
708
709
710 set_reg_field_value(value,
711 0,
712 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
713 HDMI_CONNECTION);
714
715 set_reg_field_value(value,
716 0,
717 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
718 DP_CONNECTION);
719
720 field = get_reg_field_value(value,
721 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
722 EXTRA_CONNECTION_INFO);
723
724 field &= ~0x1;
725
726 set_reg_field_value(value,
727 field,
728 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
729 EXTRA_CONNECTION_INFO);
730
731 /* set audio for output signal */
732 switch (signal) {
733 case SIGNAL_TYPE_HDMI_TYPE_A:
734 set_reg_field_value(value,
735 1,
736 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
737 HDMI_CONNECTION);
738
739 break;
740
741 case SIGNAL_TYPE_EDP:
742 case SIGNAL_TYPE_DISPLAY_PORT:
743 case SIGNAL_TYPE_DISPLAY_PORT_MST:
744 set_reg_field_value(value,
745 1,
746 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
747 DP_CONNECTION);
748 break;
749 default:
750 BREAK_TO_DEBUGGER();
751 break;
752 }
753
754 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, value);
755
756 /* ACP Data - Supports AI */
757 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_ACP_DATA);
758
759 set_reg_field_value(
760 value,
761 audio_info->flags.info.SUPPORT_AI,
762 AZALIA_F0_CODEC_PIN_CONTROL_ACP_DATA,
763 SUPPORTS_AI);
764
765 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_ACP_DATA, value);
766
767 /* Audio Descriptors */
768 /* pass through all formats */
769 for (format_index = 0; format_index < AUDIO_FORMAT_CODE_COUNT;
770 format_index++) {
771 audio_format_code =
772 (AUDIO_FORMAT_CODE_FIRST + format_index);
773
774 /* those are unsupported, skip programming */
775 if (audio_format_code == AUDIO_FORMAT_CODE_1BITAUDIO ||
776 audio_format_code == AUDIO_FORMAT_CODE_DST)
777 continue;
778
779 value = 0;
780
781 /* check if supported */
782 if (is_audio_format_supported(
783 audio_info, audio_format_code, &index)) {
784 const struct audio_mode *audio_mode =
785 &audio_info->modes[index];
786 union audio_sample_rates sample_rates =
787 audio_mode->sample_rates;
788 uint8_t byte2 = audio_mode->max_bit_rate;
789 uint8_t channel_count = audio_mode->channel_count;
790
791 /* adjust specific properties */
792 switch (audio_format_code) {
793 case AUDIO_FORMAT_CODE_LINEARPCM: {
794
795 check_audio_bandwidth(
796 crtc_info,
797 dp_link_info,
798 channel_count,
799 signal,
800 &sample_rates);
801
802 byte2 = audio_mode->sample_size;
803
804 set_reg_field_value(value,
805 sample_rates.all,
806 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
807 SUPPORTED_FREQUENCIES_STEREO);
808 }
809 break;
810 case AUDIO_FORMAT_CODE_AC3:
811 is_ac3_supported = true;
812 break;
813 case AUDIO_FORMAT_CODE_DOLBYDIGITALPLUS:
814 case AUDIO_FORMAT_CODE_DTS_HD:
815 case AUDIO_FORMAT_CODE_MAT_MLP:
816 case AUDIO_FORMAT_CODE_DST:
817 case AUDIO_FORMAT_CODE_WMAPRO:
818 byte2 = audio_mode->vendor_specific;
819 break;
820 default:
821 break;
822 }
823
824 /* fill audio format data */
825 set_reg_field_value(value,
826 channel_count - 1,
827 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
828 MAX_CHANNELS);
829
830 set_reg_field_value(value,
831 sample_rates.all,
832 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
833 SUPPORTED_FREQUENCIES);
834
835 set_reg_field_value(value,
836 byte2,
837 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
838 DESCRIPTOR_BYTE_2);
839 } /* if */
840
841 AZ_REG_WRITE(
842 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0 + format_index,
843 value);
844 } /* for */
845
846 if (is_ac3_supported)
847 /* todo: this reg global. why program global register? */
848 REG_WRITE(AZALIA_F0_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS,
849 0x05);
850
851 /* check for 192khz/8-Ch support for HBR requirements */
852 sample_rate.all = 0;
853 sample_rate.rate.RATE_192 = 1;
854
855 check_audio_bandwidth(
856 crtc_info,
857 dp_link_info,
858 8,
859 signal,
860 &sample_rate);
861
862 set_high_bit_rate_capable(audio, sample_rate.rate.RATE_192);
863
864 /* Audio and Video Lipsync */
865 set_video_latency(audio, audio_info->video_latency);
866 set_audio_latency(audio, audio_info->audio_latency);
867
868 value = 0;
869 set_reg_field_value(value, audio_info->manufacture_id,
870 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0,
871 MANUFACTURER_ID);
872
873 set_reg_field_value(value, audio_info->product_id,
874 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0,
875 PRODUCT_ID);
876
877 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0,
878 value);
879
880 value = 0;
881
882 /*get display name string length */
883 while (audio_info->display_name[strlen++] != '\0') {
884 if (strlen >=
885 MAX_HW_AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS)
886 break;
887 }
888 set_reg_field_value(value, strlen,
889 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1,
890 SINK_DESCRIPTION_LEN);
891
892 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1,
893 value);
894 DC_LOG_HW_AUDIO("\n\tAUDIO:az_configure: index: %u data, 0x%x, displayName %s: \n",
895 audio->inst, value, audio_info->display_name);
896
897 /*
898 *write the port ID:
899 *PORT_ID0 = display index
900 *PORT_ID1 = 16bit BDF
901 *(format MSB->LSB: 8bit Bus, 5bit Device, 3bit Function)
902 */
903
904 value = 0;
905
906 set_reg_field_value(value, audio_info->port_id[0],
907 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2,
908 PORT_ID0);
909
910 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2, value);
911
912 value = 0;
913 set_reg_field_value(value, audio_info->port_id[1],
914 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3,
915 PORT_ID1);
916
917 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3, value);
918
919 /*write the 18 char monitor string */
920
921 value = 0;
922 set_reg_field_value(value, audio_info->display_name[0],
923 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
924 DESCRIPTION0);
925
926 set_reg_field_value(value, audio_info->display_name[1],
927 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
928 DESCRIPTION1);
929
930 set_reg_field_value(value, audio_info->display_name[2],
931 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
932 DESCRIPTION2);
933
934 set_reg_field_value(value, audio_info->display_name[3],
935 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
936 DESCRIPTION3);
937
938 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4, value);
939
940 value = 0;
941 set_reg_field_value(value, audio_info->display_name[4],
942 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
943 DESCRIPTION4);
944
945 set_reg_field_value(value, audio_info->display_name[5],
946 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
947 DESCRIPTION5);
948
949 set_reg_field_value(value, audio_info->display_name[6],
950 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
951 DESCRIPTION6);
952
953 set_reg_field_value(value, audio_info->display_name[7],
954 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
955 DESCRIPTION7);
956
957 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5, value);
958
959 value = 0;
960 set_reg_field_value(value, audio_info->display_name[8],
961 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
962 DESCRIPTION8);
963
964 set_reg_field_value(value, audio_info->display_name[9],
965 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
966 DESCRIPTION9);
967
968 set_reg_field_value(value, audio_info->display_name[10],
969 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
970 DESCRIPTION10);
971
972 set_reg_field_value(value, audio_info->display_name[11],
973 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
974 DESCRIPTION11);
975
976 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6, value);
977
978 value = 0;
979 set_reg_field_value(value, audio_info->display_name[12],
980 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
981 DESCRIPTION12);
982
983 set_reg_field_value(value, audio_info->display_name[13],
984 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
985 DESCRIPTION13);
986
987 set_reg_field_value(value, audio_info->display_name[14],
988 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
989 DESCRIPTION14);
990
991 set_reg_field_value(value, audio_info->display_name[15],
992 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
993 DESCRIPTION15);
994
995 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7, value);
996
997 value = 0;
998 set_reg_field_value(value, audio_info->display_name[16],
999 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8,
1000 DESCRIPTION16);
1001
1002 set_reg_field_value(value, audio_info->display_name[17],
1003 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8,
1004 DESCRIPTION17);
1005
1006 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8, value);
1007 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
1008 set_reg_field_value(value, 0,
1009 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
1010 CLOCK_GATING_DISABLE);
1011 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
1012}
1013
1014/*
1015* todo: wall clk related functionality probably belong to clock_src.
1016*/
1017
1018/* search pixel clock value for Azalia HDMI Audio */
1019static void get_azalia_clock_info_hdmi(
1020 uint32_t crtc_pixel_clock_100hz,
1021 uint32_t actual_pixel_clock_100Hz,
1022 struct azalia_clock_info *azalia_clock_info)
1023{
1024 /* audio_dto_phase= 24 * 10,000;
1025 * 24MHz in [100Hz] units */
1026 azalia_clock_info->audio_dto_phase =
1027 24 * 10000;
1028
1029 /* audio_dto_module = PCLKFrequency * 10,000;
1030 * [khz] -> [100Hz] */
1031 azalia_clock_info->audio_dto_module =
1032 actual_pixel_clock_100Hz;
1033}
1034
1035static void get_azalia_clock_info_dp(
1036 uint32_t requested_pixel_clock_100Hz,
1037 const struct audio_pll_info *pll_info,
1038 struct azalia_clock_info *azalia_clock_info)
1039{
1040 /* Reported dpDtoSourceClockInkhz value for
1041 * DCE8 already adjusted for SS, do not need any
1042 * adjustment here anymore
1043 */
1044
1045 /*audio_dto_phase = 24 * 10,000;
1046 * 24MHz in [100Hz] units */
1047 azalia_clock_info->audio_dto_phase = 24 * 10000;
1048
1049 /*audio_dto_module = dpDtoSourceClockInkhz * 10,000;
1050 * [khz] ->[100Hz] */
1051 azalia_clock_info->audio_dto_module =
1052 pll_info->audio_dto_source_clock_in_khz * 10;
1053}
1054
1055void dce_aud_wall_dto_setup(
1056 struct audio *audio,
1057 enum signal_type signal,
1058 const struct audio_crtc_info *crtc_info,
1059 const struct audio_pll_info *pll_info)
1060{
1061 struct dce_audio *aud = DCE_AUD(audio);
1062
1063 struct azalia_clock_info clock_info = { 0 };
1064
1065 if (dc_is_hdmi_tmds_signal(signal)) {
1066 uint32_t src_sel;
1067
1068 /*DTO0 Programming goal:
1069 -generate 24MHz, 128*Fs from 24MHz
1070 -use DTO0 when an active HDMI port is connected
1071 (optionally a DP is connected) */
1072
1073 /* calculate DTO settings */
1074 get_azalia_clock_info_hdmi(
1075 crtc_info->requested_pixel_clock_100Hz,
1076 crtc_info->calculated_pixel_clock_100Hz,
1077 &clock_info);
1078
1079 DC_LOG_HW_AUDIO("\n%s:Input::requested_pixel_clock_100Hz = %d"\
1080 "calculated_pixel_clock_100Hz =%d\n"\
1081 "audio_dto_module = %d audio_dto_phase =%d \n\n", __func__,\
1082 crtc_info->requested_pixel_clock_100Hz,\
1083 crtc_info->calculated_pixel_clock_100Hz,\
1084 clock_info.audio_dto_module,\
1085 clock_info.audio_dto_phase);
1086
1087 /* On TN/SI, Program DTO source select and DTO select before
1088 programming DTO modulo and DTO phase. These bits must be
1089 programmed first, otherwise there will be no HDMI audio at boot
1090 up. This is a HW sequence change (different from old ASICs).
1091 Caution when changing this programming sequence.
1092
1093 HDMI enabled, using DTO0
1094 program master CRTC for DTO0 */
1095 src_sel = pll_info->dto_source - DTO_SOURCE_ID0;
1096 REG_UPDATE_2(DCCG_AUDIO_DTO_SOURCE,
1097 DCCG_AUDIO_DTO0_SOURCE_SEL, src_sel,
1098 DCCG_AUDIO_DTO_SEL, 0);
1099
1100 /* module */
1101 REG_UPDATE(DCCG_AUDIO_DTO0_MODULE,
1102 DCCG_AUDIO_DTO0_MODULE, clock_info.audio_dto_module);
1103
1104 /* phase */
1105 REG_UPDATE(DCCG_AUDIO_DTO0_PHASE,
1106 DCCG_AUDIO_DTO0_PHASE, clock_info.audio_dto_phase);
1107 } else {
1108 /*DTO1 Programming goal:
1109 -generate 24MHz, 512*Fs, 128*Fs from 24MHz
1110 -default is to used DTO1, and switch to DTO0 when an audio
1111 master HDMI port is connected
1112 -use as default for DP
1113
1114 calculate DTO settings */
1115 get_azalia_clock_info_dp(
1116 crtc_info->requested_pixel_clock_100Hz,
1117 pll_info,
1118 &clock_info);
1119
1120 /* Program DTO select before programming DTO modulo and DTO
1121 phase. default to use DTO1 */
1122
1123 REG_UPDATE(DCCG_AUDIO_DTO_SOURCE,
1124 DCCG_AUDIO_DTO_SEL, 1);
1125
1126 /* DCCG_AUDIO_DTO2_USE_512FBR_DTO, 1)
1127 * Select 512fs for DP TODO: web register definition
1128 * does not match register header file
1129 * DCE11 version it's commented out while DCE8 it's set to 1
1130 */
1131
1132 /* module */
1133 REG_UPDATE(DCCG_AUDIO_DTO1_MODULE,
1134 DCCG_AUDIO_DTO1_MODULE, clock_info.audio_dto_module);
1135
1136 /* phase */
1137 REG_UPDATE(DCCG_AUDIO_DTO1_PHASE,
1138 DCCG_AUDIO_DTO1_PHASE, clock_info.audio_dto_phase);
1139
1140 REG_UPDATE(DCCG_AUDIO_DTO_SOURCE,
1141 DCCG_AUDIO_DTO2_USE_512FBR_DTO, 1);
1142
1143 }
1144}
1145
1146#if defined(CONFIG_DRM_AMD_DC_SI)
1147static void dce60_aud_wall_dto_setup(
1148 struct audio *audio,
1149 enum signal_type signal,
1150 const struct audio_crtc_info *crtc_info,
1151 const struct audio_pll_info *pll_info)
1152{
1153 struct dce_audio *aud = DCE_AUD(audio);
1154
1155 struct azalia_clock_info clock_info = { 0 };
1156
1157 if (dc_is_hdmi_signal(signal)) {
1158 uint32_t src_sel;
1159
1160 /*DTO0 Programming goal:
1161 -generate 24MHz, 128*Fs from 24MHz
1162 -use DTO0 when an active HDMI port is connected
1163 (optionally a DP is connected) */
1164
1165 /* calculate DTO settings */
1166 get_azalia_clock_info_hdmi(
1167 crtc_info->requested_pixel_clock_100Hz,
1168 crtc_info->calculated_pixel_clock_100Hz,
1169 &clock_info);
1170
1171 DC_LOG_HW_AUDIO("\n%s:Input::requested_pixel_clock_100Hz = %d"\
1172 "calculated_pixel_clock_100Hz =%d\n"\
1173 "audio_dto_module = %d audio_dto_phase =%d \n\n", __func__,\
1174 crtc_info->requested_pixel_clock_100Hz,\
1175 crtc_info->calculated_pixel_clock_100Hz,\
1176 clock_info.audio_dto_module,\
1177 clock_info.audio_dto_phase);
1178
1179 /* On TN/SI, Program DTO source select and DTO select before
1180 programming DTO modulo and DTO phase. These bits must be
1181 programmed first, otherwise there will be no HDMI audio at boot
1182 up. This is a HW sequence change (different from old ASICs).
1183 Caution when changing this programming sequence.
1184
1185 HDMI enabled, using DTO0
1186 program master CRTC for DTO0 */
1187 src_sel = pll_info->dto_source - DTO_SOURCE_ID0;
1188 REG_UPDATE_2(DCCG_AUDIO_DTO_SOURCE,
1189 DCCG_AUDIO_DTO0_SOURCE_SEL, src_sel,
1190 DCCG_AUDIO_DTO_SEL, 0);
1191
1192 /* module */
1193 REG_UPDATE(DCCG_AUDIO_DTO0_MODULE,
1194 DCCG_AUDIO_DTO0_MODULE, clock_info.audio_dto_module);
1195
1196 /* phase */
1197 REG_UPDATE(DCCG_AUDIO_DTO0_PHASE,
1198 DCCG_AUDIO_DTO0_PHASE, clock_info.audio_dto_phase);
1199 } else {
1200 /*DTO1 Programming goal:
1201 -generate 24MHz, 128*Fs from 24MHz (DCE6 does not support 512*Fs)
1202 -default is to used DTO1, and switch to DTO0 when an audio
1203 master HDMI port is connected
1204 -use as default for DP
1205
1206 calculate DTO settings */
1207 get_azalia_clock_info_dp(
1208 crtc_info->requested_pixel_clock_100Hz,
1209 pll_info,
1210 &clock_info);
1211
1212 /* Program DTO select before programming DTO modulo and DTO
1213 phase. default to use DTO1 */
1214
1215 REG_UPDATE(DCCG_AUDIO_DTO_SOURCE,
1216 DCCG_AUDIO_DTO_SEL, 1);
1217
1218 /* DCCG_AUDIO_DTO2_USE_512FBR_DTO, 1)
1219 * Cannot select 512fs for DP
1220 *
1221 * DCE6 has no DCCG_AUDIO_DTO2_USE_512FBR_DTO mask
1222 */
1223
1224 /* module */
1225 REG_UPDATE(DCCG_AUDIO_DTO1_MODULE,
1226 DCCG_AUDIO_DTO1_MODULE, clock_info.audio_dto_module);
1227
1228 /* phase */
1229 REG_UPDATE(DCCG_AUDIO_DTO1_PHASE,
1230 DCCG_AUDIO_DTO1_PHASE, clock_info.audio_dto_phase);
1231
1232 /* DCE6 has no DCCG_AUDIO_DTO2_USE_512FBR_DTO mask in DCCG_AUDIO_DTO_SOURCE reg */
1233
1234 }
1235}
1236#endif
1237
1238static bool dce_aud_endpoint_valid(struct audio *audio)
1239{
1240 uint32_t value;
1241 uint32_t port_connectivity;
1242
1243 value = AZ_REG_READ(
1244 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT);
1245
1246 port_connectivity = get_reg_field_value(value,
1247 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT,
1248 PORT_CONNECTIVITY);
1249
1250 return !(port_connectivity == 1);
1251}
1252
1253/* initialize HW state */
1254void dce_aud_hw_init(
1255 struct audio *audio)
1256{
1257 uint32_t value;
1258 struct dce_audio *aud = DCE_AUD(audio);
1259
1260 /* we only need to program the following registers once, so we only do
1261 it for the inst 0*/
1262 if (audio->inst != 0)
1263 return;
1264
1265 /* Suport R5 - 32khz
1266 * Suport R6 - 44.1khz
1267 * Suport R7 - 48khz
1268 */
1269 /*disable clock gating before write to endpoint register*/
1270 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
1271 set_reg_field_value(value, 1,
1272 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
1273 CLOCK_GATING_DISABLE);
1274 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
1275 REG_UPDATE(AZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES,
1276 AUDIO_RATE_CAPABILITIES, 0x70);
1277
1278 /*Keep alive bit to verify HW block in BU. */
1279 REG_UPDATE_2(AZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES,
1280 CLKSTOP, 1,
1281 EPSS, 1);
1282 set_reg_field_value(value, 0,
1283 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
1284 CLOCK_GATING_DISABLE);
1285 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
1286}
1287
1288static const struct audio_funcs funcs = {
1289 .endpoint_valid = dce_aud_endpoint_valid,
1290 .hw_init = dce_aud_hw_init,
1291 .wall_dto_setup = dce_aud_wall_dto_setup,
1292 .az_enable = dce_aud_az_enable,
1293 .az_disable = dce_aud_az_disable,
1294 .az_configure = dce_aud_az_configure,
1295 .destroy = dce_aud_destroy,
1296};
1297
1298#if defined(CONFIG_DRM_AMD_DC_SI)
1299static const struct audio_funcs dce60_funcs = {
1300 .endpoint_valid = dce_aud_endpoint_valid,
1301 .hw_init = dce_aud_hw_init,
1302 .wall_dto_setup = dce60_aud_wall_dto_setup,
1303 .az_enable = dce_aud_az_enable,
1304 .az_disable = dce_aud_az_disable,
1305 .az_configure = dce_aud_az_configure,
1306 .destroy = dce_aud_destroy,
1307};
1308#endif
1309
1310void dce_aud_destroy(struct audio **audio)
1311{
1312 struct dce_audio *aud = DCE_AUD(*audio);
1313
1314 kfree(aud);
1315 *audio = NULL;
1316}
1317
1318struct audio *dce_audio_create(
1319 struct dc_context *ctx,
1320 unsigned int inst,
1321 const struct dce_audio_registers *reg,
1322 const struct dce_audio_shift *shifts,
1323 const struct dce_audio_mask *masks
1324 )
1325{
1326 struct dce_audio *audio = kzalloc(sizeof(*audio), GFP_KERNEL);
1327
1328 if (audio == NULL) {
1329 ASSERT_CRITICAL(audio);
1330 return NULL;
1331 }
1332
1333 audio->base.ctx = ctx;
1334 audio->base.inst = inst;
1335 audio->base.funcs = &funcs;
1336
1337 audio->regs = reg;
1338 audio->shifts = shifts;
1339 audio->masks = masks;
1340 return &audio->base;
1341}
1342
1343#if defined(CONFIG_DRM_AMD_DC_SI)
1344struct audio *dce60_audio_create(
1345 struct dc_context *ctx,
1346 unsigned int inst,
1347 const struct dce_audio_registers *reg,
1348 const struct dce_audio_shift *shifts,
1349 const struct dce_audio_mask *masks
1350 )
1351{
1352 struct dce_audio *audio = kzalloc(sizeof(*audio), GFP_KERNEL);
1353
1354 if (audio == NULL) {
1355 ASSERT_CRITICAL(audio);
1356 return NULL;
1357 }
1358
1359 audio->base.ctx = ctx;
1360 audio->base.inst = inst;
1361 audio->base.funcs = &dce60_funcs;
1362
1363 audio->regs = reg;
1364 audio->shifts = shifts;
1365 audio->masks = masks;
1366 return &audio->base;
1367}
1368#endif
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 "reg_helper.h"
27#include "dce_audio.h"
28#include "dce/dce_11_0_d.h"
29#include "dce/dce_11_0_sh_mask.h"
30
31#define DCE_AUD(audio)\
32 container_of(audio, struct dce_audio, base)
33
34#define CTX \
35 aud->base.ctx
36#define DC_LOGGER \
37 aud->base.ctx->logger
38#define REG(reg)\
39 (aud->regs->reg)
40
41#undef FN
42#define FN(reg_name, field_name) \
43 aud->shifts->field_name, aud->masks->field_name
44
45#define IX_REG(reg)\
46 ix ## reg
47
48#define AZ_REG_READ(reg_name) \
49 read_indirect_azalia_reg(audio, IX_REG(reg_name))
50
51#define AZ_REG_WRITE(reg_name, value) \
52 write_indirect_azalia_reg(audio, IX_REG(reg_name), value)
53
54static void write_indirect_azalia_reg(struct audio *audio,
55 uint32_t reg_index,
56 uint32_t reg_data)
57{
58 struct dce_audio *aud = DCE_AUD(audio);
59
60 /* AZALIA_F0_CODEC_ENDPOINT_INDEX endpoint index */
61 REG_SET(AZALIA_F0_CODEC_ENDPOINT_INDEX, 0,
62 AZALIA_ENDPOINT_REG_INDEX, reg_index);
63
64 /* AZALIA_F0_CODEC_ENDPOINT_DATA endpoint data */
65 REG_SET(AZALIA_F0_CODEC_ENDPOINT_DATA, 0,
66 AZALIA_ENDPOINT_REG_DATA, reg_data);
67
68 DC_LOG_HW_AUDIO("AUDIO:write_indirect_azalia_reg: index: %u data: %u\n",
69 reg_index, 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 DC_LOG_HW_AUDIO("AUDIO:read_indirect_azalia_reg: index: %u data: %u\n",
86 reg_index, value);
87
88 return value;
89}
90
91static bool is_audio_format_supported(
92 const struct audio_info *audio_info,
93 enum audio_format_code audio_format_code,
94 uint32_t *format_index)
95{
96 uint32_t index;
97 uint32_t max_channe_index = 0;
98 bool found = false;
99
100 if (audio_info == NULL)
101 return found;
102
103 /* pass through whole array */
104 for (index = 0; index < audio_info->mode_count; index++) {
105 if (audio_info->modes[index].format_code == audio_format_code) {
106 if (found) {
107 /* format has multiply entries, choose one with
108 * highst number of channels */
109 if (audio_info->modes[index].channel_count >
110 audio_info->modes[max_channe_index].channel_count) {
111 max_channe_index = index;
112 }
113 } else {
114 /* format found, save it's index */
115 found = true;
116 max_channe_index = index;
117 }
118 }
119 }
120
121 /* return index */
122 if (found && format_index != NULL)
123 *format_index = max_channe_index;
124
125 return found;
126}
127
128/*For HDMI, calculate if specified sample rates can fit into a given timing */
129static void check_audio_bandwidth_hdmi(
130 const struct audio_crtc_info *crtc_info,
131 uint32_t channel_count,
132 union audio_sample_rates *sample_rates)
133{
134 uint32_t samples;
135 uint32_t h_blank;
136 bool limit_freq_to_48_khz = false;
137 bool limit_freq_to_88_2_khz = false;
138 bool limit_freq_to_96_khz = false;
139 bool limit_freq_to_174_4_khz = false;
140
141 /* For two channels supported return whatever sink support,unmodified*/
142 if (channel_count > 2) {
143
144 /* Based on HDMI spec 1.3 Table 7.5 */
145 if ((crtc_info->requested_pixel_clock <= 27000) &&
146 (crtc_info->v_active <= 576) &&
147 !(crtc_info->interlaced) &&
148 !(crtc_info->pixel_repetition == 2 ||
149 crtc_info->pixel_repetition == 4)) {
150 limit_freq_to_48_khz = true;
151
152 } else if ((crtc_info->requested_pixel_clock <= 27000) &&
153 (crtc_info->v_active <= 576) &&
154 (crtc_info->interlaced) &&
155 (crtc_info->pixel_repetition == 2)) {
156 limit_freq_to_88_2_khz = true;
157
158 } else if ((crtc_info->requested_pixel_clock <= 54000) &&
159 (crtc_info->v_active <= 576) &&
160 !(crtc_info->interlaced)) {
161 limit_freq_to_174_4_khz = true;
162 }
163 }
164
165 /* Also do some calculation for the available Audio Bandwidth for the
166 * 8 ch (i.e. for the Layout 1 => ch > 2)
167 */
168 h_blank = crtc_info->h_total - crtc_info->h_active;
169
170 if (crtc_info->pixel_repetition)
171 h_blank *= crtc_info->pixel_repetition;
172
173 /*based on HDMI spec 1.3 Table 7.5 */
174 h_blank -= 58;
175 /*for Control Period */
176 h_blank -= 16;
177
178 samples = h_blank * 10;
179 /* Number of Audio Packets (multiplied by 10) per Line (for 8 ch number
180 * of Audio samples per line multiplied by 10 - Layout 1)
181 */
182 samples /= 32;
183 samples *= crtc_info->v_active;
184 /*Number of samples multiplied by 10, per second */
185 samples *= crtc_info->refresh_rate;
186 /*Number of Audio samples per second */
187 samples /= 10;
188
189 /* @todo do it after deep color is implemented
190 * 8xx - deep color bandwidth scaling
191 * Extra bandwidth is avaliable in deep color b/c link runs faster than
192 * pixel rate. This has the effect of allowing more tmds characters to
193 * be transmitted during blank
194 */
195
196 switch (crtc_info->color_depth) {
197 case COLOR_DEPTH_888:
198 samples *= 4;
199 break;
200 case COLOR_DEPTH_101010:
201 samples *= 5;
202 break;
203 case COLOR_DEPTH_121212:
204 samples *= 6;
205 break;
206 default:
207 samples *= 4;
208 break;
209 }
210
211 samples /= 4;
212
213 /*check limitation*/
214 if (samples < 88200)
215 limit_freq_to_48_khz = true;
216 else if (samples < 96000)
217 limit_freq_to_88_2_khz = true;
218 else if (samples < 176400)
219 limit_freq_to_96_khz = true;
220 else if (samples < 192000)
221 limit_freq_to_174_4_khz = true;
222
223 if (sample_rates != NULL) {
224 /* limit frequencies */
225 if (limit_freq_to_174_4_khz)
226 sample_rates->rate.RATE_192 = 0;
227
228 if (limit_freq_to_96_khz) {
229 sample_rates->rate.RATE_192 = 0;
230 sample_rates->rate.RATE_176_4 = 0;
231 }
232 if (limit_freq_to_88_2_khz) {
233 sample_rates->rate.RATE_192 = 0;
234 sample_rates->rate.RATE_176_4 = 0;
235 sample_rates->rate.RATE_96 = 0;
236 }
237 if (limit_freq_to_48_khz) {
238 sample_rates->rate.RATE_192 = 0;
239 sample_rates->rate.RATE_176_4 = 0;
240 sample_rates->rate.RATE_96 = 0;
241 sample_rates->rate.RATE_88_2 = 0;
242 }
243 }
244}
245
246/*For DP SST, calculate if specified sample rates can fit into a given timing */
247static void check_audio_bandwidth_dpsst(
248 const struct audio_crtc_info *crtc_info,
249 uint32_t channel_count,
250 union audio_sample_rates *sample_rates)
251{
252 /* do nothing */
253}
254
255/*For DP MST, calculate if specified sample rates can fit into a given timing */
256static void check_audio_bandwidth_dpmst(
257 const struct audio_crtc_info *crtc_info,
258 uint32_t channel_count,
259 union audio_sample_rates *sample_rates)
260{
261 /* do nothing */
262}
263
264static void check_audio_bandwidth(
265 const struct audio_crtc_info *crtc_info,
266 uint32_t channel_count,
267 enum signal_type signal,
268 union audio_sample_rates *sample_rates)
269{
270 switch (signal) {
271 case SIGNAL_TYPE_HDMI_TYPE_A:
272 check_audio_bandwidth_hdmi(
273 crtc_info, channel_count, sample_rates);
274 break;
275 case SIGNAL_TYPE_EDP:
276 case SIGNAL_TYPE_DISPLAY_PORT:
277 check_audio_bandwidth_dpsst(
278 crtc_info, channel_count, sample_rates);
279 break;
280 case SIGNAL_TYPE_DISPLAY_PORT_MST:
281 check_audio_bandwidth_dpmst(
282 crtc_info, channel_count, sample_rates);
283 break;
284 default:
285 break;
286 }
287}
288
289/* expose/not expose HBR capability to Audio driver */
290static void set_high_bit_rate_capable(
291 struct audio *audio,
292 bool capable)
293{
294 uint32_t value = 0;
295
296 /* set high bit rate audio capable*/
297 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR);
298
299 set_reg_field_value(value, capable,
300 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR,
301 HBR_CAPABLE);
302
303 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR, value);
304}
305
306/* set video latency in in ms/2+1 */
307static void set_video_latency(
308 struct audio *audio,
309 int latency_in_ms)
310{
311 uint32_t value = 0;
312
313 if ((latency_in_ms < 0) || (latency_in_ms > 255))
314 return;
315
316 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC);
317
318 set_reg_field_value(value, latency_in_ms,
319 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
320 VIDEO_LIPSYNC);
321
322 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
323 value);
324}
325
326/* set audio latency in in ms/2+1 */
327static void set_audio_latency(
328 struct audio *audio,
329 int latency_in_ms)
330{
331 uint32_t value = 0;
332
333 if (latency_in_ms < 0)
334 latency_in_ms = 0;
335
336 if (latency_in_ms > 255)
337 latency_in_ms = 255;
338
339 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC);
340
341 set_reg_field_value(value, latency_in_ms,
342 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
343 AUDIO_LIPSYNC);
344
345 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
346 value);
347}
348
349void dce_aud_az_enable(struct audio *audio)
350{
351 struct dce_audio *aud = DCE_AUD(audio);
352 uint32_t value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
353
354 set_reg_field_value(value, 1,
355 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
356 CLOCK_GATING_DISABLE);
357 set_reg_field_value(value, 1,
358 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
359 AUDIO_ENABLED);
360
361 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
362 set_reg_field_value(value, 0,
363 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
364 CLOCK_GATING_DISABLE);
365 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
366
367 DC_LOG_HW_AUDIO("\n\t========= AUDIO:dce_aud_az_enable: index: %u data: 0x%x\n",
368 audio->inst, value);
369}
370
371void dce_aud_az_disable(struct audio *audio)
372{
373 uint32_t value;
374 struct dce_audio *aud = DCE_AUD(audio);
375
376 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
377 set_reg_field_value(value, 1,
378 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
379 CLOCK_GATING_DISABLE);
380 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
381
382 set_reg_field_value(value, 0,
383 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
384 AUDIO_ENABLED);
385 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
386
387 set_reg_field_value(value, 0,
388 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
389 CLOCK_GATING_DISABLE);
390 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
391 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
392 DC_LOG_HW_AUDIO("\n\t========= AUDIO:dce_aud_az_disable: index: %u data: 0x%x\n",
393 audio->inst, value);
394}
395
396void dce_aud_az_configure(
397 struct audio *audio,
398 enum signal_type signal,
399 const struct audio_crtc_info *crtc_info,
400 const struct audio_info *audio_info)
401{
402 struct dce_audio *aud = DCE_AUD(audio);
403
404 uint32_t speakers = audio_info->flags.info.ALLSPEAKERS;
405 uint32_t value;
406 uint32_t field = 0;
407 enum audio_format_code audio_format_code;
408 uint32_t format_index;
409 uint32_t index;
410 bool is_ac3_supported = false;
411 union audio_sample_rates sample_rate;
412 uint32_t strlen = 0;
413 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
414 set_reg_field_value(value, 1,
415 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
416 CLOCK_GATING_DISABLE);
417 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
418
419 /* Speaker Allocation */
420 /*
421 uint32_t value;
422 uint32_t field = 0;*/
423 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER);
424
425 set_reg_field_value(value,
426 speakers,
427 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
428 SPEAKER_ALLOCATION);
429
430 /* LFE_PLAYBACK_LEVEL = LFEPBL
431 * LFEPBL = 0 : Unknown or refer to other information
432 * LFEPBL = 1 : 0dB playback
433 * LFEPBL = 2 : +10dB playback
434 * LFE_BL = 3 : Reserved
435 */
436 set_reg_field_value(value,
437 0,
438 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
439 LFE_PLAYBACK_LEVEL);
440 /* todo: according to reg spec LFE_PLAYBACK_LEVEL is read only.
441 * why are we writing to it? DCE8 does not write this */
442
443
444 set_reg_field_value(value,
445 0,
446 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
447 HDMI_CONNECTION);
448
449 set_reg_field_value(value,
450 0,
451 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
452 DP_CONNECTION);
453
454 field = get_reg_field_value(value,
455 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
456 EXTRA_CONNECTION_INFO);
457
458 field &= ~0x1;
459
460 set_reg_field_value(value,
461 field,
462 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
463 EXTRA_CONNECTION_INFO);
464
465 /* set audio for output signal */
466 switch (signal) {
467 case SIGNAL_TYPE_HDMI_TYPE_A:
468 set_reg_field_value(value,
469 1,
470 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
471 HDMI_CONNECTION);
472
473 break;
474
475 case SIGNAL_TYPE_EDP:
476 case SIGNAL_TYPE_DISPLAY_PORT:
477 case SIGNAL_TYPE_DISPLAY_PORT_MST:
478 set_reg_field_value(value,
479 1,
480 AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
481 DP_CONNECTION);
482 break;
483 default:
484 BREAK_TO_DEBUGGER();
485 break;
486 }
487
488 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, value);
489
490 /* Audio Descriptors */
491 /* pass through all formats */
492 for (format_index = 0; format_index < AUDIO_FORMAT_CODE_COUNT;
493 format_index++) {
494 audio_format_code =
495 (AUDIO_FORMAT_CODE_FIRST + format_index);
496
497 /* those are unsupported, skip programming */
498 if (audio_format_code == AUDIO_FORMAT_CODE_1BITAUDIO ||
499 audio_format_code == AUDIO_FORMAT_CODE_DST)
500 continue;
501
502 value = 0;
503
504 /* check if supported */
505 if (is_audio_format_supported(
506 audio_info, audio_format_code, &index)) {
507 const struct audio_mode *audio_mode =
508 &audio_info->modes[index];
509 union audio_sample_rates sample_rates =
510 audio_mode->sample_rates;
511 uint8_t byte2 = audio_mode->max_bit_rate;
512
513 /* adjust specific properties */
514 switch (audio_format_code) {
515 case AUDIO_FORMAT_CODE_LINEARPCM: {
516 check_audio_bandwidth(
517 crtc_info,
518 audio_mode->channel_count,
519 signal,
520 &sample_rates);
521
522 byte2 = audio_mode->sample_size;
523
524 set_reg_field_value(value,
525 sample_rates.all,
526 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
527 SUPPORTED_FREQUENCIES_STEREO);
528 }
529 break;
530 case AUDIO_FORMAT_CODE_AC3:
531 is_ac3_supported = true;
532 break;
533 case AUDIO_FORMAT_CODE_DOLBYDIGITALPLUS:
534 case AUDIO_FORMAT_CODE_DTS_HD:
535 case AUDIO_FORMAT_CODE_MAT_MLP:
536 case AUDIO_FORMAT_CODE_DST:
537 case AUDIO_FORMAT_CODE_WMAPRO:
538 byte2 = audio_mode->vendor_specific;
539 break;
540 default:
541 break;
542 }
543
544 /* fill audio format data */
545 set_reg_field_value(value,
546 audio_mode->channel_count - 1,
547 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
548 MAX_CHANNELS);
549
550 set_reg_field_value(value,
551 sample_rates.all,
552 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
553 SUPPORTED_FREQUENCIES);
554
555 set_reg_field_value(value,
556 byte2,
557 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
558 DESCRIPTOR_BYTE_2);
559 } /* if */
560
561 AZ_REG_WRITE(
562 AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0 + format_index,
563 value);
564 } /* for */
565
566 if (is_ac3_supported)
567 /* todo: this reg global. why program global register? */
568 REG_WRITE(AZALIA_F0_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS,
569 0x05);
570
571 /* check for 192khz/8-Ch support for HBR requirements */
572 sample_rate.all = 0;
573 sample_rate.rate.RATE_192 = 1;
574
575 check_audio_bandwidth(
576 crtc_info,
577 8,
578 signal,
579 &sample_rate);
580
581 set_high_bit_rate_capable(audio, sample_rate.rate.RATE_192);
582
583 /* Audio and Video Lipsync */
584 set_video_latency(audio, audio_info->video_latency);
585 set_audio_latency(audio, audio_info->audio_latency);
586
587 value = 0;
588 set_reg_field_value(value, audio_info->manufacture_id,
589 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0,
590 MANUFACTURER_ID);
591
592 set_reg_field_value(value, audio_info->product_id,
593 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0,
594 PRODUCT_ID);
595
596 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0,
597 value);
598
599 value = 0;
600
601 /*get display name string length */
602 while (audio_info->display_name[strlen++] != '\0') {
603 if (strlen >=
604 MAX_HW_AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS)
605 break;
606 }
607 set_reg_field_value(value, strlen,
608 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1,
609 SINK_DESCRIPTION_LEN);
610
611 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1,
612 value);
613
614 /*
615 *write the port ID:
616 *PORT_ID0 = display index
617 *PORT_ID1 = 16bit BDF
618 *(format MSB->LSB: 8bit Bus, 5bit Device, 3bit Function)
619 */
620
621 value = 0;
622
623 set_reg_field_value(value, audio_info->port_id[0],
624 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2,
625 PORT_ID0);
626
627 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2, value);
628
629 value = 0;
630 set_reg_field_value(value, audio_info->port_id[1],
631 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3,
632 PORT_ID1);
633
634 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3, value);
635
636 /*write the 18 char monitor string */
637
638 value = 0;
639 set_reg_field_value(value, audio_info->display_name[0],
640 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
641 DESCRIPTION0);
642
643 set_reg_field_value(value, audio_info->display_name[1],
644 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
645 DESCRIPTION1);
646
647 set_reg_field_value(value, audio_info->display_name[2],
648 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
649 DESCRIPTION2);
650
651 set_reg_field_value(value, audio_info->display_name[3],
652 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
653 DESCRIPTION3);
654
655 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4, value);
656
657 value = 0;
658 set_reg_field_value(value, audio_info->display_name[4],
659 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
660 DESCRIPTION4);
661
662 set_reg_field_value(value, audio_info->display_name[5],
663 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
664 DESCRIPTION5);
665
666 set_reg_field_value(value, audio_info->display_name[6],
667 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
668 DESCRIPTION6);
669
670 set_reg_field_value(value, audio_info->display_name[7],
671 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
672 DESCRIPTION7);
673
674 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5, value);
675
676 value = 0;
677 set_reg_field_value(value, audio_info->display_name[8],
678 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
679 DESCRIPTION8);
680
681 set_reg_field_value(value, audio_info->display_name[9],
682 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
683 DESCRIPTION9);
684
685 set_reg_field_value(value, audio_info->display_name[10],
686 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
687 DESCRIPTION10);
688
689 set_reg_field_value(value, audio_info->display_name[11],
690 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
691 DESCRIPTION11);
692
693 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6, value);
694
695 value = 0;
696 set_reg_field_value(value, audio_info->display_name[12],
697 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
698 DESCRIPTION12);
699
700 set_reg_field_value(value, audio_info->display_name[13],
701 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
702 DESCRIPTION13);
703
704 set_reg_field_value(value, audio_info->display_name[14],
705 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
706 DESCRIPTION14);
707
708 set_reg_field_value(value, audio_info->display_name[15],
709 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
710 DESCRIPTION15);
711
712 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7, value);
713
714 value = 0;
715 set_reg_field_value(value, audio_info->display_name[16],
716 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8,
717 DESCRIPTION16);
718
719 set_reg_field_value(value, audio_info->display_name[17],
720 AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8,
721 DESCRIPTION17);
722
723 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8, value);
724 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
725 set_reg_field_value(value, 0,
726 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
727 CLOCK_GATING_DISABLE);
728 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
729}
730
731/*
732* todo: wall clk related functionality probably belong to clock_src.
733*/
734
735/* search pixel clock value for Azalia HDMI Audio */
736static void get_azalia_clock_info_hdmi(
737 uint32_t crtc_pixel_clock_in_khz,
738 uint32_t actual_pixel_clock_in_khz,
739 struct azalia_clock_info *azalia_clock_info)
740{
741 /* audio_dto_phase= 24 * 10,000;
742 * 24MHz in [100Hz] units */
743 azalia_clock_info->audio_dto_phase =
744 24 * 10000;
745
746 /* audio_dto_module = PCLKFrequency * 10,000;
747 * [khz] -> [100Hz] */
748 azalia_clock_info->audio_dto_module =
749 actual_pixel_clock_in_khz * 10;
750}
751
752static void get_azalia_clock_info_dp(
753 uint32_t requested_pixel_clock_in_khz,
754 const struct audio_pll_info *pll_info,
755 struct azalia_clock_info *azalia_clock_info)
756{
757 /* Reported dpDtoSourceClockInkhz value for
758 * DCE8 already adjusted for SS, do not need any
759 * adjustment here anymore
760 */
761
762 /*audio_dto_phase = 24 * 10,000;
763 * 24MHz in [100Hz] units */
764 azalia_clock_info->audio_dto_phase = 24 * 10000;
765
766 /*audio_dto_module = dpDtoSourceClockInkhz * 10,000;
767 * [khz] ->[100Hz] */
768 azalia_clock_info->audio_dto_module =
769 pll_info->dp_dto_source_clock_in_khz * 10;
770}
771
772void dce_aud_wall_dto_setup(
773 struct audio *audio,
774 enum signal_type signal,
775 const struct audio_crtc_info *crtc_info,
776 const struct audio_pll_info *pll_info)
777{
778 struct dce_audio *aud = DCE_AUD(audio);
779
780 struct azalia_clock_info clock_info = { 0 };
781
782 if (dc_is_hdmi_signal(signal)) {
783 uint32_t src_sel;
784
785 /*DTO0 Programming goal:
786 -generate 24MHz, 128*Fs from 24MHz
787 -use DTO0 when an active HDMI port is connected
788 (optionally a DP is connected) */
789
790 /* calculate DTO settings */
791 get_azalia_clock_info_hdmi(
792 crtc_info->requested_pixel_clock,
793 crtc_info->calculated_pixel_clock,
794 &clock_info);
795
796 DC_LOG_HW_AUDIO("\n%s:Input::requested_pixel_clock = %d"\
797 "calculated_pixel_clock =%d\n"\
798 "audio_dto_module = %d audio_dto_phase =%d \n\n", __func__,\
799 crtc_info->requested_pixel_clock,\
800 crtc_info->calculated_pixel_clock,\
801 clock_info.audio_dto_module,\
802 clock_info.audio_dto_phase);
803
804 /* On TN/SI, Program DTO source select and DTO select before
805 programming DTO modulo and DTO phase. These bits must be
806 programmed first, otherwise there will be no HDMI audio at boot
807 up. This is a HW sequence change (different from old ASICs).
808 Caution when changing this programming sequence.
809
810 HDMI enabled, using DTO0
811 program master CRTC for DTO0 */
812 src_sel = pll_info->dto_source - DTO_SOURCE_ID0;
813 REG_UPDATE_2(DCCG_AUDIO_DTO_SOURCE,
814 DCCG_AUDIO_DTO0_SOURCE_SEL, src_sel,
815 DCCG_AUDIO_DTO_SEL, 0);
816
817 /* module */
818 REG_UPDATE(DCCG_AUDIO_DTO0_MODULE,
819 DCCG_AUDIO_DTO0_MODULE, clock_info.audio_dto_module);
820
821 /* phase */
822 REG_UPDATE(DCCG_AUDIO_DTO0_PHASE,
823 DCCG_AUDIO_DTO0_PHASE, clock_info.audio_dto_phase);
824 } else {
825 /*DTO1 Programming goal:
826 -generate 24MHz, 512*Fs, 128*Fs from 24MHz
827 -default is to used DTO1, and switch to DTO0 when an audio
828 master HDMI port is connected
829 -use as default for DP
830
831 calculate DTO settings */
832 get_azalia_clock_info_dp(
833 crtc_info->requested_pixel_clock,
834 pll_info,
835 &clock_info);
836
837 /* Program DTO select before programming DTO modulo and DTO
838 phase. default to use DTO1 */
839
840 REG_UPDATE(DCCG_AUDIO_DTO_SOURCE,
841 DCCG_AUDIO_DTO_SEL, 1);
842
843 REG_UPDATE(DCCG_AUDIO_DTO_SOURCE,
844 DCCG_AUDIO_DTO_SEL, 1);
845 /* DCCG_AUDIO_DTO2_USE_512FBR_DTO, 1)
846 * Select 512fs for DP TODO: web register definition
847 * does not match register header file
848 * DCE11 version it's commented out while DCE8 it's set to 1
849 */
850
851 /* module */
852 REG_UPDATE(DCCG_AUDIO_DTO1_MODULE,
853 DCCG_AUDIO_DTO1_MODULE, clock_info.audio_dto_module);
854
855 /* phase */
856 REG_UPDATE(DCCG_AUDIO_DTO1_PHASE,
857 DCCG_AUDIO_DTO1_PHASE, clock_info.audio_dto_phase);
858
859 REG_UPDATE(DCCG_AUDIO_DTO_SOURCE,
860 DCCG_AUDIO_DTO2_USE_512FBR_DTO, 1);
861
862 }
863}
864
865static bool dce_aud_endpoint_valid(struct audio *audio)
866{
867 uint32_t value;
868 uint32_t port_connectivity;
869
870 value = AZ_REG_READ(
871 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT);
872
873 port_connectivity = get_reg_field_value(value,
874 AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT,
875 PORT_CONNECTIVITY);
876
877 return !(port_connectivity == 1);
878}
879
880/* initialize HW state */
881void dce_aud_hw_init(
882 struct audio *audio)
883{
884 uint32_t value;
885 struct dce_audio *aud = DCE_AUD(audio);
886
887 /* we only need to program the following registers once, so we only do
888 it for the inst 0*/
889 if (audio->inst != 0)
890 return;
891
892 /* Suport R5 - 32khz
893 * Suport R6 - 44.1khz
894 * Suport R7 - 48khz
895 */
896 /*disable clock gating before write to endpoint register*/
897 value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
898 set_reg_field_value(value, 1,
899 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
900 CLOCK_GATING_DISABLE);
901 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
902 REG_UPDATE(AZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES,
903 AUDIO_RATE_CAPABILITIES, 0x70);
904
905 /*Keep alive bit to verify HW block in BU. */
906 REG_UPDATE_2(AZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES,
907 CLKSTOP, 1,
908 EPSS, 1);
909 set_reg_field_value(value, 0,
910 AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
911 CLOCK_GATING_DISABLE);
912 AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
913}
914
915static const struct audio_funcs funcs = {
916 .endpoint_valid = dce_aud_endpoint_valid,
917 .hw_init = dce_aud_hw_init,
918 .wall_dto_setup = dce_aud_wall_dto_setup,
919 .az_enable = dce_aud_az_enable,
920 .az_disable = dce_aud_az_disable,
921 .az_configure = dce_aud_az_configure,
922 .destroy = dce_aud_destroy,
923};
924
925void dce_aud_destroy(struct audio **audio)
926{
927 struct dce_audio *aud = DCE_AUD(*audio);
928
929 kfree(aud);
930 *audio = NULL;
931}
932
933struct audio *dce_audio_create(
934 struct dc_context *ctx,
935 unsigned int inst,
936 const struct dce_audio_registers *reg,
937 const struct dce_audio_shift *shifts,
938 const struct dce_aduio_mask *masks
939 )
940{
941 struct dce_audio *audio = kzalloc(sizeof(*audio), GFP_KERNEL);
942
943 if (audio == NULL) {
944 ASSERT_CRITICAL(audio);
945 return NULL;
946 }
947
948 audio->base.ctx = ctx;
949 audio->base.inst = inst;
950 audio->base.funcs = &funcs;
951
952 audio->regs = reg;
953 audio->shifts = shifts;
954 audio->masks = masks;
955
956 return &audio->base;
957}
958