xref: /dragonfly/sys/dev/drm/amd/display/dc/dce/dce_audio.c (revision 7d3e9a5b)
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 
55 static 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 	DC_LOG_HW_AUDIO("AUDIO:write_indirect_azalia_reg: index: %u  data: %u\n",
70 		reg_index, reg_data);
71 }
72 
73 static uint32_t read_indirect_azalia_reg(struct audio *audio, uint32_t reg_index)
74 {
75 	struct dce_audio *aud = DCE_AUD(audio);
76 
77 	uint32_t value = 0;
78 
79 	/* AZALIA_F0_CODEC_ENDPOINT_INDEX  endpoint index  */
80 	REG_SET(AZALIA_F0_CODEC_ENDPOINT_INDEX, 0,
81 			AZALIA_ENDPOINT_REG_INDEX, reg_index);
82 
83 	/* AZALIA_F0_CODEC_ENDPOINT_DATA  endpoint data  */
84 	value = REG_READ(AZALIA_F0_CODEC_ENDPOINT_DATA);
85 
86 	DC_LOG_HW_AUDIO("AUDIO:read_indirect_azalia_reg: index: %u  data: %u\n",
87 		reg_index, value);
88 
89 	return value;
90 }
91 
92 static bool is_audio_format_supported(
93 	const struct audio_info *audio_info,
94 	enum audio_format_code audio_format_code,
95 	uint32_t *format_index)
96 {
97 	uint32_t index;
98 	uint32_t max_channe_index = 0;
99 	bool found = false;
100 
101 	if (audio_info == NULL)
102 		return found;
103 
104 	/* pass through whole array */
105 	for (index = 0; index < audio_info->mode_count; index++) {
106 		if (audio_info->modes[index].format_code == audio_format_code) {
107 			if (found) {
108 				/* format has multiply entries, choose one with
109 				 *  highst number of channels */
110 				if (audio_info->modes[index].channel_count >
111 		audio_info->modes[max_channe_index].channel_count) {
112 					max_channe_index = index;
113 				}
114 			} else {
115 				/* format found, save it's index */
116 				found = true;
117 				max_channe_index = index;
118 			}
119 		}
120 	}
121 
122 	/* return index */
123 	if (found && format_index != NULL)
124 		*format_index = max_channe_index;
125 
126 	return found;
127 }
128 
129 /*For HDMI, calculate if specified sample rates can fit into a given timing */
130 static void check_audio_bandwidth_hdmi(
131 	const struct audio_crtc_info *crtc_info,
132 	uint32_t channel_count,
133 	union audio_sample_rates *sample_rates)
134 {
135 	uint32_t samples;
136 	uint32_t  h_blank;
137 	bool limit_freq_to_48_khz = false;
138 	bool limit_freq_to_88_2_khz = false;
139 	bool limit_freq_to_96_khz = false;
140 	bool limit_freq_to_174_4_khz = false;
141 
142 	/* For two channels supported return whatever sink support,unmodified*/
143 	if (channel_count > 2) {
144 
145 		/* Based on HDMI spec 1.3 Table 7.5 */
146 		if ((crtc_info->requested_pixel_clock <= 27000) &&
147 		(crtc_info->v_active <= 576) &&
148 		!(crtc_info->interlaced) &&
149 		!(crtc_info->pixel_repetition == 2 ||
150 		crtc_info->pixel_repetition == 4)) {
151 			limit_freq_to_48_khz = true;
152 
153 		} else if ((crtc_info->requested_pixel_clock <= 27000) &&
154 				(crtc_info->v_active <= 576) &&
155 				(crtc_info->interlaced) &&
156 				(crtc_info->pixel_repetition == 2)) {
157 			limit_freq_to_88_2_khz = true;
158 
159 		} else if ((crtc_info->requested_pixel_clock <= 54000) &&
160 				(crtc_info->v_active <= 576) &&
161 				!(crtc_info->interlaced)) {
162 			limit_freq_to_174_4_khz = true;
163 		}
164 	}
165 
166 	/* Also do some calculation for the available Audio Bandwidth for the
167 	 * 8 ch (i.e. for the Layout 1 => ch > 2)
168 	 */
169 	h_blank = crtc_info->h_total - crtc_info->h_active;
170 
171 	if (crtc_info->pixel_repetition)
172 		h_blank *= crtc_info->pixel_repetition;
173 
174 	/*based on HDMI spec 1.3 Table 7.5 */
175 	h_blank -= 58;
176 	/*for Control Period */
177 	h_blank -= 16;
178 
179 	samples = h_blank * 10;
180 	/* Number of Audio Packets (multiplied by 10) per Line (for 8 ch number
181 	 * of Audio samples per line multiplied by 10 - Layout 1)
182 	 */
183 	samples /= 32;
184 	samples *= crtc_info->v_active;
185 	/*Number of samples multiplied by 10, per second */
186 	samples *= crtc_info->refresh_rate;
187 	/*Number of Audio samples per second */
188 	samples /= 10;
189 
190 	/* @todo do it after deep color is implemented
191 	 * 8xx - deep color bandwidth scaling
192 	 * Extra bandwidth is avaliable in deep color b/c link runs faster than
193 	 * pixel rate. This has the effect of allowing more tmds characters to
194 	 * be transmitted during blank
195 	 */
196 
197 	switch (crtc_info->color_depth) {
198 	case COLOR_DEPTH_888:
199 		samples *= 4;
200 		break;
201 	case COLOR_DEPTH_101010:
202 		samples *= 5;
203 		break;
204 	case COLOR_DEPTH_121212:
205 		samples *= 6;
206 		break;
207 	default:
208 		samples *= 4;
209 		break;
210 	}
211 
212 	samples /= 4;
213 
214 	/*check limitation*/
215 	if (samples < 88200)
216 		limit_freq_to_48_khz = true;
217 	else if (samples < 96000)
218 		limit_freq_to_88_2_khz = true;
219 	else if (samples < 176400)
220 		limit_freq_to_96_khz = true;
221 	else if (samples < 192000)
222 		limit_freq_to_174_4_khz = true;
223 
224 	if (sample_rates != NULL) {
225 		/* limit frequencies */
226 		if (limit_freq_to_174_4_khz)
227 			sample_rates->rate.RATE_192 = 0;
228 
229 		if (limit_freq_to_96_khz) {
230 			sample_rates->rate.RATE_192 = 0;
231 			sample_rates->rate.RATE_176_4 = 0;
232 		}
233 		if (limit_freq_to_88_2_khz) {
234 			sample_rates->rate.RATE_192 = 0;
235 			sample_rates->rate.RATE_176_4 = 0;
236 			sample_rates->rate.RATE_96 = 0;
237 		}
238 		if (limit_freq_to_48_khz) {
239 			sample_rates->rate.RATE_192 = 0;
240 			sample_rates->rate.RATE_176_4 = 0;
241 			sample_rates->rate.RATE_96 = 0;
242 			sample_rates->rate.RATE_88_2 = 0;
243 		}
244 	}
245 }
246 
247 /*For DP SST, calculate if specified sample rates can fit into a given timing */
248 static void check_audio_bandwidth_dpsst(
249 	const struct audio_crtc_info *crtc_info,
250 	uint32_t channel_count,
251 	union audio_sample_rates *sample_rates)
252 {
253 	/* do nothing */
254 }
255 
256 /*For DP MST, calculate if specified sample rates can fit into a given timing */
257 static void check_audio_bandwidth_dpmst(
258 	const struct audio_crtc_info *crtc_info,
259 	uint32_t channel_count,
260 	union audio_sample_rates *sample_rates)
261 {
262 	/* do nothing  */
263 }
264 
265 static void check_audio_bandwidth(
266 	const struct audio_crtc_info *crtc_info,
267 	uint32_t channel_count,
268 	enum signal_type signal,
269 	union audio_sample_rates *sample_rates)
270 {
271 	switch (signal) {
272 	case SIGNAL_TYPE_HDMI_TYPE_A:
273 		check_audio_bandwidth_hdmi(
274 			crtc_info, channel_count, sample_rates);
275 		break;
276 	case SIGNAL_TYPE_EDP:
277 	case SIGNAL_TYPE_DISPLAY_PORT:
278 		check_audio_bandwidth_dpsst(
279 			crtc_info, channel_count, sample_rates);
280 		break;
281 	case SIGNAL_TYPE_DISPLAY_PORT_MST:
282 		check_audio_bandwidth_dpmst(
283 			crtc_info, channel_count, sample_rates);
284 		break;
285 	default:
286 		break;
287 	}
288 }
289 
290 /* expose/not expose HBR capability to Audio driver */
291 static void set_high_bit_rate_capable(
292 	struct audio *audio,
293 	bool capable)
294 {
295 	uint32_t value = 0;
296 
297 	/* set high bit rate audio capable*/
298 	value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR);
299 
300 	set_reg_field_value(value, capable,
301 		AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR,
302 		HBR_CAPABLE);
303 
304 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR, value);
305 }
306 
307 /* set video latency in in ms/2+1 */
308 static void set_video_latency(
309 	struct audio *audio,
310 	int latency_in_ms)
311 {
312 	uint32_t value = 0;
313 
314 	if ((latency_in_ms < 0) || (latency_in_ms > 255))
315 		return;
316 
317 	value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC);
318 
319 	set_reg_field_value(value, latency_in_ms,
320 		AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
321 		VIDEO_LIPSYNC);
322 
323 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
324 		value);
325 }
326 
327 /* set audio latency in in ms/2+1 */
328 static void set_audio_latency(
329 	struct audio *audio,
330 	int latency_in_ms)
331 {
332 	uint32_t value = 0;
333 
334 	if (latency_in_ms < 0)
335 		latency_in_ms = 0;
336 
337 	if (latency_in_ms > 255)
338 		latency_in_ms = 255;
339 
340 	value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC);
341 
342 	set_reg_field_value(value, latency_in_ms,
343 		AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
344 		AUDIO_LIPSYNC);
345 
346 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC,
347 		value);
348 }
349 
350 void dce_aud_az_enable(struct audio *audio)
351 {
352 	uint32_t value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
353 	DC_LOGGER_INIT();
354 
355 	set_reg_field_value(value, 1,
356 			    AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
357 			    CLOCK_GATING_DISABLE);
358 	set_reg_field_value(value, 1,
359 			    AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
360 			    AUDIO_ENABLED);
361 
362 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
363 	set_reg_field_value(value, 0,
364 			AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
365 			CLOCK_GATING_DISABLE);
366 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
367 
368 	DC_LOG_HW_AUDIO("\n\t========= AUDIO:dce_aud_az_enable: index: %u  data: 0x%x\n",
369 			audio->inst, value);
370 }
371 
372 void dce_aud_az_disable(struct audio *audio)
373 {
374 	uint32_t value;
375 	DC_LOGGER_INIT();
376 
377 	value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
378 	set_reg_field_value(value, 1,
379 			AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
380 			CLOCK_GATING_DISABLE);
381 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
382 
383 	set_reg_field_value(value, 0,
384 		AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
385 		AUDIO_ENABLED);
386 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
387 
388 	set_reg_field_value(value, 0,
389 			AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
390 			CLOCK_GATING_DISABLE);
391 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
392 	value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
393 	DC_LOG_HW_AUDIO("\n\t========= AUDIO:dce_aud_az_disable: index: %u  data: 0x%x\n",
394 			audio->inst, value);
395 }
396 
397 void dce_aud_az_configure(
398 	struct audio *audio,
399 	enum signal_type signal,
400 	const struct audio_crtc_info *crtc_info,
401 	const struct audio_info *audio_info)
402 {
403 	struct dce_audio *aud = DCE_AUD(audio);
404 
405 	uint32_t speakers = audio_info->flags.info.ALLSPEAKERS;
406 	uint32_t value;
407 	uint32_t field = 0;
408 	enum audio_format_code audio_format_code;
409 	uint32_t format_index;
410 	uint32_t index;
411 	bool is_ac3_supported = false;
412 	union audio_sample_rates sample_rate;
413 	uint32_t strlen = 0;
414 	value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
415 	set_reg_field_value(value, 1,
416 			AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
417 			CLOCK_GATING_DISABLE);
418 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
419 
420 	/* Speaker Allocation */
421 	/*
422 	uint32_t value;
423 	uint32_t field = 0;*/
424 	value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER);
425 
426 	set_reg_field_value(value,
427 		speakers,
428 		AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
429 		SPEAKER_ALLOCATION);
430 
431 	/* LFE_PLAYBACK_LEVEL = LFEPBL
432 	 * LFEPBL = 0 : Unknown or refer to other information
433 	 * LFEPBL = 1 : 0dB playback
434 	 * LFEPBL = 2 : +10dB playback
435 	 * LFE_BL = 3 : Reserved
436 	 */
437 	set_reg_field_value(value,
438 		0,
439 		AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
440 		LFE_PLAYBACK_LEVEL);
441 	/* todo: according to reg spec LFE_PLAYBACK_LEVEL is read only.
442 	 *  why are we writing to it?  DCE8 does not write this */
443 
444 
445 	set_reg_field_value(value,
446 		0,
447 		AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
448 		HDMI_CONNECTION);
449 
450 	set_reg_field_value(value,
451 		0,
452 		AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
453 		DP_CONNECTION);
454 
455 	field = get_reg_field_value(value,
456 			AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
457 			EXTRA_CONNECTION_INFO);
458 
459 	field &= ~0x1;
460 
461 	set_reg_field_value(value,
462 		field,
463 		AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
464 		EXTRA_CONNECTION_INFO);
465 
466 	/* set audio for output signal */
467 	switch (signal) {
468 	case SIGNAL_TYPE_HDMI_TYPE_A:
469 		set_reg_field_value(value,
470 			1,
471 			AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
472 			HDMI_CONNECTION);
473 
474 		break;
475 
476 	case SIGNAL_TYPE_EDP:
477 	case SIGNAL_TYPE_DISPLAY_PORT:
478 	case SIGNAL_TYPE_DISPLAY_PORT_MST:
479 		set_reg_field_value(value,
480 			1,
481 			AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER,
482 			DP_CONNECTION);
483 		break;
484 	default:
485 		BREAK_TO_DEBUGGER();
486 		break;
487 	}
488 
489 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, value);
490 
491 	/*  Audio Descriptors   */
492 	/* pass through all formats */
493 	for (format_index = 0; format_index < AUDIO_FORMAT_CODE_COUNT;
494 			format_index++) {
495 		audio_format_code =
496 			(AUDIO_FORMAT_CODE_FIRST + format_index);
497 
498 		/* those are unsupported, skip programming */
499 		if (audio_format_code == AUDIO_FORMAT_CODE_1BITAUDIO ||
500 			audio_format_code == AUDIO_FORMAT_CODE_DST)
501 			continue;
502 
503 		value = 0;
504 
505 		/* check if supported */
506 		if (is_audio_format_supported(
507 				audio_info, audio_format_code, &index)) {
508 			const struct audio_mode *audio_mode =
509 					&audio_info->modes[index];
510 			union audio_sample_rates sample_rates =
511 					audio_mode->sample_rates;
512 			uint8_t byte2 = audio_mode->max_bit_rate;
513 
514 			/* adjust specific properties */
515 			switch (audio_format_code) {
516 			case AUDIO_FORMAT_CODE_LINEARPCM: {
517 				check_audio_bandwidth(
518 					crtc_info,
519 					audio_mode->channel_count,
520 					signal,
521 					&sample_rates);
522 
523 				byte2 = audio_mode->sample_size;
524 
525 				set_reg_field_value(value,
526 						sample_rates.all,
527 						AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
528 						SUPPORTED_FREQUENCIES_STEREO);
529 				}
530 				break;
531 			case AUDIO_FORMAT_CODE_AC3:
532 				is_ac3_supported = true;
533 				break;
534 			case AUDIO_FORMAT_CODE_DOLBYDIGITALPLUS:
535 			case AUDIO_FORMAT_CODE_DTS_HD:
536 			case AUDIO_FORMAT_CODE_MAT_MLP:
537 			case AUDIO_FORMAT_CODE_DST:
538 			case AUDIO_FORMAT_CODE_WMAPRO:
539 				byte2 = audio_mode->vendor_specific;
540 				break;
541 			default:
542 				break;
543 			}
544 
545 			/* fill audio format data */
546 			set_reg_field_value(value,
547 					audio_mode->channel_count - 1,
548 					AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
549 					MAX_CHANNELS);
550 
551 			set_reg_field_value(value,
552 					sample_rates.all,
553 					AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
554 					SUPPORTED_FREQUENCIES);
555 
556 			set_reg_field_value(value,
557 					byte2,
558 					AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0,
559 					DESCRIPTOR_BYTE_2);
560 		} /* if */
561 
562 		AZ_REG_WRITE(
563 				AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0 + format_index,
564 				value);
565 	} /* for */
566 
567 	if (is_ac3_supported)
568 		/* todo: this reg global.  why program global register? */
569 		REG_WRITE(AZALIA_F0_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS,
570 				0x05);
571 
572 	/* check for 192khz/8-Ch support for HBR requirements */
573 	sample_rate.all = 0;
574 	sample_rate.rate.RATE_192 = 1;
575 
576 	check_audio_bandwidth(
577 		crtc_info,
578 		8,
579 		signal,
580 		&sample_rate);
581 
582 	set_high_bit_rate_capable(audio, sample_rate.rate.RATE_192);
583 
584 	/* Audio and Video Lipsync */
585 	set_video_latency(audio, audio_info->video_latency);
586 	set_audio_latency(audio, audio_info->audio_latency);
587 
588 	value = 0;
589 	set_reg_field_value(value, audio_info->manufacture_id,
590 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0,
591 		MANUFACTURER_ID);
592 
593 	set_reg_field_value(value, audio_info->product_id,
594 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0,
595 		PRODUCT_ID);
596 
597 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0,
598 		value);
599 
600 	value = 0;
601 
602 	/*get display name string length */
603 	while (audio_info->display_name[strlen++] != '\0') {
604 		if (strlen >=
605 		MAX_HW_AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS)
606 			break;
607 		}
608 	set_reg_field_value(value, strlen,
609 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1,
610 		SINK_DESCRIPTION_LEN);
611 
612 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1,
613 		value);
614 	DC_LOG_HW_AUDIO("\n\tAUDIO:az_configure: index: %u data, 0x%x, displayName %s: \n",
615 		audio->inst, value, audio_info->display_name);
616 
617 	/*
618 	*write the port ID:
619 	*PORT_ID0 = display index
620 	*PORT_ID1 = 16bit BDF
621 	*(format MSB->LSB: 8bit Bus, 5bit Device, 3bit Function)
622 	*/
623 
624 	value = 0;
625 
626 	set_reg_field_value(value, audio_info->port_id[0],
627 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2,
628 		PORT_ID0);
629 
630 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2, value);
631 
632 	value = 0;
633 	set_reg_field_value(value, audio_info->port_id[1],
634 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3,
635 		PORT_ID1);
636 
637 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3, value);
638 
639 	/*write the 18 char monitor string */
640 
641 	value = 0;
642 	set_reg_field_value(value, audio_info->display_name[0],
643 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
644 		DESCRIPTION0);
645 
646 	set_reg_field_value(value, audio_info->display_name[1],
647 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
648 		DESCRIPTION1);
649 
650 	set_reg_field_value(value, audio_info->display_name[2],
651 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
652 		DESCRIPTION2);
653 
654 	set_reg_field_value(value, audio_info->display_name[3],
655 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4,
656 		DESCRIPTION3);
657 
658 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4, value);
659 
660 	value = 0;
661 	set_reg_field_value(value, audio_info->display_name[4],
662 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
663 		DESCRIPTION4);
664 
665 	set_reg_field_value(value, audio_info->display_name[5],
666 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
667 		DESCRIPTION5);
668 
669 	set_reg_field_value(value, audio_info->display_name[6],
670 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
671 		DESCRIPTION6);
672 
673 	set_reg_field_value(value, audio_info->display_name[7],
674 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5,
675 		DESCRIPTION7);
676 
677 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5, value);
678 
679 	value = 0;
680 	set_reg_field_value(value, audio_info->display_name[8],
681 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
682 		DESCRIPTION8);
683 
684 	set_reg_field_value(value, audio_info->display_name[9],
685 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
686 		DESCRIPTION9);
687 
688 	set_reg_field_value(value, audio_info->display_name[10],
689 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
690 		DESCRIPTION10);
691 
692 	set_reg_field_value(value, audio_info->display_name[11],
693 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6,
694 		DESCRIPTION11);
695 
696 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6, value);
697 
698 	value = 0;
699 	set_reg_field_value(value, audio_info->display_name[12],
700 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
701 		DESCRIPTION12);
702 
703 	set_reg_field_value(value, audio_info->display_name[13],
704 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
705 		DESCRIPTION13);
706 
707 	set_reg_field_value(value, audio_info->display_name[14],
708 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
709 		DESCRIPTION14);
710 
711 	set_reg_field_value(value, audio_info->display_name[15],
712 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7,
713 		DESCRIPTION15);
714 
715 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7, value);
716 
717 	value = 0;
718 	set_reg_field_value(value, audio_info->display_name[16],
719 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8,
720 		DESCRIPTION16);
721 
722 	set_reg_field_value(value, audio_info->display_name[17],
723 		AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8,
724 		DESCRIPTION17);
725 
726 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8, value);
727 	value = AZ_REG_READ(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL);
728 	set_reg_field_value(value, 0,
729 			AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL,
730 			CLOCK_GATING_DISABLE);
731 	AZ_REG_WRITE(AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, value);
732 }
733 
734 /*
735 * todo: wall clk related functionality probably belong to clock_src.
736 */
737 
738 /* search pixel clock value for Azalia HDMI Audio */
739 static void get_azalia_clock_info_hdmi(
740 	uint32_t crtc_pixel_clock_in_khz,
741 	uint32_t actual_pixel_clock_in_khz,
742 	struct azalia_clock_info *azalia_clock_info)
743 {
744 	/* audio_dto_phase= 24 * 10,000;
745 	 *   24MHz in [100Hz] units */
746 	azalia_clock_info->audio_dto_phase =
747 			24 * 10000;
748 
749 	/* audio_dto_module = PCLKFrequency * 10,000;
750 	 *  [khz] -> [100Hz] */
751 	azalia_clock_info->audio_dto_module =
752 			actual_pixel_clock_in_khz * 10;
753 }
754 
755 static void get_azalia_clock_info_dp(
756 	uint32_t requested_pixel_clock_in_khz,
757 	const struct audio_pll_info *pll_info,
758 	struct azalia_clock_info *azalia_clock_info)
759 {
760 	/* Reported dpDtoSourceClockInkhz value for
761 	 * DCE8 already adjusted for SS, do not need any
762 	 * adjustment here anymore
763 	 */
764 
765 	/*audio_dto_phase = 24 * 10,000;
766 	 * 24MHz in [100Hz] units */
767 	azalia_clock_info->audio_dto_phase = 24 * 10000;
768 
769 	/*audio_dto_module = dpDtoSourceClockInkhz * 10,000;
770 	 *  [khz] ->[100Hz] */
771 	azalia_clock_info->audio_dto_module =
772 		pll_info->dp_dto_source_clock_in_khz * 10;
773 }
774 
775 void dce_aud_wall_dto_setup(
776 	struct audio *audio,
777 	enum signal_type signal,
778 	const struct audio_crtc_info *crtc_info,
779 	const struct audio_pll_info *pll_info)
780 {
781 	struct dce_audio *aud = DCE_AUD(audio);
782 
783 	struct azalia_clock_info clock_info = { 0 };
784 
785 	if (dc_is_hdmi_signal(signal)) {
786 		uint32_t src_sel;
787 
788 		/*DTO0 Programming goal:
789 		-generate 24MHz, 128*Fs from 24MHz
790 		-use DTO0 when an active HDMI port is connected
791 		(optionally a DP is connected) */
792 
793 		/* calculate DTO settings */
794 		get_azalia_clock_info_hdmi(
795 			crtc_info->requested_pixel_clock,
796 			crtc_info->calculated_pixel_clock,
797 			&clock_info);
798 
799 		DC_LOG_HW_AUDIO("\n%s:Input::requested_pixel_clock = %d"\
800 				"calculated_pixel_clock =%d\n"\
801 				"audio_dto_module = %d audio_dto_phase =%d \n\n", __func__,\
802 				crtc_info->requested_pixel_clock,\
803 				crtc_info->calculated_pixel_clock,\
804 				clock_info.audio_dto_module,\
805 				clock_info.audio_dto_phase);
806 
807 		/* On TN/SI, Program DTO source select and DTO select before
808 		programming DTO modulo and DTO phase. These bits must be
809 		programmed first, otherwise there will be no HDMI audio at boot
810 		up. This is a HW sequence change (different from old ASICs).
811 		Caution when changing this programming sequence.
812 
813 		HDMI enabled, using DTO0
814 		program master CRTC for DTO0 */
815 		src_sel = pll_info->dto_source - DTO_SOURCE_ID0;
816 		REG_UPDATE_2(DCCG_AUDIO_DTO_SOURCE,
817 			DCCG_AUDIO_DTO0_SOURCE_SEL, src_sel,
818 			DCCG_AUDIO_DTO_SEL, 0);
819 
820 		/* module */
821 		REG_UPDATE(DCCG_AUDIO_DTO0_MODULE,
822 			DCCG_AUDIO_DTO0_MODULE, clock_info.audio_dto_module);
823 
824 		/* phase */
825 		REG_UPDATE(DCCG_AUDIO_DTO0_PHASE,
826 			DCCG_AUDIO_DTO0_PHASE, clock_info.audio_dto_phase);
827 	} else {
828 		/*DTO1 Programming goal:
829 		-generate 24MHz, 512*Fs, 128*Fs from 24MHz
830 		-default is to used DTO1, and switch to DTO0 when an audio
831 		master HDMI port is connected
832 		-use as default for DP
833 
834 		calculate DTO settings */
835 		get_azalia_clock_info_dp(
836 			crtc_info->requested_pixel_clock,
837 			pll_info,
838 			&clock_info);
839 
840 		/* Program DTO select before programming DTO modulo and DTO
841 		phase. default to use DTO1 */
842 
843 		REG_UPDATE(DCCG_AUDIO_DTO_SOURCE,
844 				DCCG_AUDIO_DTO_SEL, 1);
845 
846 		REG_UPDATE(DCCG_AUDIO_DTO_SOURCE,
847 			DCCG_AUDIO_DTO_SEL, 1);
848 			/* DCCG_AUDIO_DTO2_USE_512FBR_DTO, 1)
849 			 * Select 512fs for DP TODO: web register definition
850 			 * does not match register header file
851 			 * DCE11 version it's commented out while DCE8 it's set to 1
852 			*/
853 
854 		/* module */
855 		REG_UPDATE(DCCG_AUDIO_DTO1_MODULE,
856 				DCCG_AUDIO_DTO1_MODULE, clock_info.audio_dto_module);
857 
858 		/* phase */
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 /* initialize HW state */
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 	/* we only need to program the following registers once, so we only do
891 	it for the inst 0*/
892 	if (audio->inst != 0)
893 		return;
894 
895 	/* Suport R5 - 32khz
896 	 * Suport R6 - 44.1khz
897 	 * Suport R7 - 48khz
898 	 */
899 	/*disable clock gating before write to endpoint register*/
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 	/*Keep alive bit to verify HW block in BU. */
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_aduio_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 
960