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