1 /*	$NetBSD: radeon_audio.c,v 1.3 2021/12/18 23:45:43 riastradh Exp $	*/
2 
3 /*
4  * Copyright 2014 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: Slava Grigorev <slava.grigorev@amd.com>
25  */
26 
27 #include <sys/cdefs.h>
28 __KERNEL_RCSID(0, "$NetBSD: radeon_audio.c,v 1.3 2021/12/18 23:45:43 riastradh Exp $");
29 
30 #include <linux/gcd.h>
31 
32 #include <drm/drm_crtc.h>
33 #include "radeon.h"
34 #include "atom.h"
35 #include "radeon_audio.h"
36 
37 void r600_audio_enable(struct radeon_device *rdev, struct r600_audio_pin *pin,
38 		u8 enable_mask);
39 void dce4_audio_enable(struct radeon_device *rdev, struct r600_audio_pin *pin,
40 		u8 enable_mask);
41 void dce6_audio_enable(struct radeon_device *rdev, struct r600_audio_pin *pin,
42 		u8 enable_mask);
43 u32 dce6_endpoint_rreg(struct radeon_device *rdev, u32 offset, u32 reg);
44 void dce6_endpoint_wreg(struct radeon_device *rdev,
45 		u32 offset, u32 reg, u32 v);
46 void dce3_2_afmt_write_sad_regs(struct drm_encoder *encoder,
47 		struct cea_sad *sads, int sad_count);
48 void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder,
49 		struct cea_sad *sads, int sad_count);
50 void dce6_afmt_write_sad_regs(struct drm_encoder *encoder,
51 		struct cea_sad *sads, int sad_count);
52 void dce3_2_afmt_hdmi_write_speaker_allocation(struct drm_encoder *encoder,
53 		u8 *sadb, int sad_count);
54 void dce3_2_afmt_dp_write_speaker_allocation(struct drm_encoder *encoder,
55 		u8 *sadb, int sad_count);
56 void dce4_afmt_hdmi_write_speaker_allocation(struct drm_encoder *encoder,
57 		u8 *sadb, int sad_count);
58 void dce4_afmt_dp_write_speaker_allocation(struct drm_encoder *encoder,
59 		u8 *sadb, int sad_count);
60 void dce6_afmt_hdmi_write_speaker_allocation(struct drm_encoder *encoder,
61 		u8 *sadb, int sad_count);
62 void dce6_afmt_dp_write_speaker_allocation(struct drm_encoder *encoder,
63 		u8 *sadb, int sad_count);
64 void dce4_afmt_write_latency_fields(struct drm_encoder *encoder,
65 		struct drm_connector *connector, struct drm_display_mode *mode);
66 void dce6_afmt_write_latency_fields(struct drm_encoder *encoder,
67 		struct drm_connector *connector, struct drm_display_mode *mode);
68 struct r600_audio_pin* r600_audio_get_pin(struct radeon_device *rdev);
69 struct r600_audio_pin* dce6_audio_get_pin(struct radeon_device *rdev);
70 void dce6_afmt_select_pin(struct drm_encoder *encoder);
71 void r600_hdmi_audio_set_dto(struct radeon_device *rdev,
72 	struct radeon_crtc *crtc, unsigned int clock);
73 void dce3_2_audio_set_dto(struct radeon_device *rdev,
74 	struct radeon_crtc *crtc, unsigned int clock);
75 void dce4_hdmi_audio_set_dto(struct radeon_device *rdev,
76 	struct radeon_crtc *crtc, unsigned int clock);
77 void dce4_dp_audio_set_dto(struct radeon_device *rdev,
78 	struct radeon_crtc *crtc, unsigned int clock);
79 void dce6_hdmi_audio_set_dto(struct radeon_device *rdev,
80 	struct radeon_crtc *crtc, unsigned int clock);
81 void dce6_dp_audio_set_dto(struct radeon_device *rdev,
82 	struct radeon_crtc *crtc, unsigned int clock);
83 void r600_set_avi_packet(struct radeon_device *rdev, u32 offset,
84 	unsigned char *buffer, size_t size);
85 void evergreen_set_avi_packet(struct radeon_device *rdev, u32 offset,
86 	unsigned char *buffer, size_t size);
87 void r600_hdmi_update_acr(struct drm_encoder *encoder, long offset,
88 	const struct radeon_hdmi_acr *acr);
89 void dce3_2_hdmi_update_acr(struct drm_encoder *encoder, long offset,
90 	const struct radeon_hdmi_acr *acr);
91 void evergreen_hdmi_update_acr(struct drm_encoder *encoder, long offset,
92 	const struct radeon_hdmi_acr *acr);
93 void r600_set_vbi_packet(struct drm_encoder *encoder, u32 offset);
94 void dce4_set_vbi_packet(struct drm_encoder *encoder, u32 offset);
95 void dce4_hdmi_set_color_depth(struct drm_encoder *encoder,
96 	u32 offset, int bpc);
97 void r600_set_audio_packet(struct drm_encoder *encoder, u32 offset);
98 void dce3_2_set_audio_packet(struct drm_encoder *encoder, u32 offset);
99 void dce4_set_audio_packet(struct drm_encoder *encoder, u32 offset);
100 void r600_set_mute(struct drm_encoder *encoder, u32 offset, bool mute);
101 void dce3_2_set_mute(struct drm_encoder *encoder, u32 offset, bool mute);
102 void dce4_set_mute(struct drm_encoder *encoder, u32 offset, bool mute);
103 static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder,
104 	struct drm_display_mode *mode);
105 static void radeon_audio_dp_mode_set(struct drm_encoder *encoder,
106 	struct drm_display_mode *mode);
107 void r600_hdmi_enable(struct drm_encoder *encoder, bool enable);
108 void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable);
109 void evergreen_dp_enable(struct drm_encoder *encoder, bool enable);
110 
111 static const u32 pin_offsets[7] =
112 {
113 	(0x5e00 - 0x5e00),
114 	(0x5e18 - 0x5e00),
115 	(0x5e30 - 0x5e00),
116 	(0x5e48 - 0x5e00),
117 	(0x5e60 - 0x5e00),
118 	(0x5e78 - 0x5e00),
119 	(0x5e90 - 0x5e00),
120 };
121 
radeon_audio_rreg(struct radeon_device * rdev,u32 offset,u32 reg)122 static u32 radeon_audio_rreg(struct radeon_device *rdev, u32 offset, u32 reg)
123 {
124 	return RREG32(reg);
125 }
126 
radeon_audio_wreg(struct radeon_device * rdev,u32 offset,u32 reg,u32 v)127 static void radeon_audio_wreg(struct radeon_device *rdev, u32 offset,
128 		u32 reg, u32 v)
129 {
130 	WREG32(reg, v);
131 }
132 
133 static struct radeon_audio_basic_funcs r600_funcs = {
134 	.endpoint_rreg = radeon_audio_rreg,
135 	.endpoint_wreg = radeon_audio_wreg,
136 	.enable = r600_audio_enable,
137 };
138 
139 static struct radeon_audio_basic_funcs dce32_funcs = {
140 	.endpoint_rreg = radeon_audio_rreg,
141 	.endpoint_wreg = radeon_audio_wreg,
142 	.enable = r600_audio_enable,
143 };
144 
145 static struct radeon_audio_basic_funcs dce4_funcs = {
146 	.endpoint_rreg = radeon_audio_rreg,
147 	.endpoint_wreg = radeon_audio_wreg,
148 	.enable = dce4_audio_enable,
149 };
150 
151 static struct radeon_audio_basic_funcs dce6_funcs = {
152 	.endpoint_rreg = dce6_endpoint_rreg,
153 	.endpoint_wreg = dce6_endpoint_wreg,
154 	.enable = dce6_audio_enable,
155 };
156 
157 static struct radeon_audio_funcs r600_hdmi_funcs = {
158 	.get_pin = r600_audio_get_pin,
159 	.set_dto = r600_hdmi_audio_set_dto,
160 	.update_acr = r600_hdmi_update_acr,
161 	.set_vbi_packet = r600_set_vbi_packet,
162 	.set_avi_packet = r600_set_avi_packet,
163 	.set_audio_packet = r600_set_audio_packet,
164 	.set_mute = r600_set_mute,
165 	.mode_set = radeon_audio_hdmi_mode_set,
166 	.dpms = r600_hdmi_enable,
167 };
168 
169 static struct radeon_audio_funcs dce32_hdmi_funcs = {
170 	.get_pin = r600_audio_get_pin,
171 	.write_sad_regs = dce3_2_afmt_write_sad_regs,
172 	.write_speaker_allocation = dce3_2_afmt_hdmi_write_speaker_allocation,
173 	.set_dto = dce3_2_audio_set_dto,
174 	.update_acr = dce3_2_hdmi_update_acr,
175 	.set_vbi_packet = r600_set_vbi_packet,
176 	.set_avi_packet = r600_set_avi_packet,
177 	.set_audio_packet = dce3_2_set_audio_packet,
178 	.set_mute = dce3_2_set_mute,
179 	.mode_set = radeon_audio_hdmi_mode_set,
180 	.dpms = r600_hdmi_enable,
181 };
182 
183 static struct radeon_audio_funcs dce32_dp_funcs = {
184 	.get_pin = r600_audio_get_pin,
185 	.write_sad_regs = dce3_2_afmt_write_sad_regs,
186 	.write_speaker_allocation = dce3_2_afmt_dp_write_speaker_allocation,
187 	.set_dto = dce3_2_audio_set_dto,
188 	.set_avi_packet = r600_set_avi_packet,
189 	.set_audio_packet = dce3_2_set_audio_packet,
190 };
191 
192 static struct radeon_audio_funcs dce4_hdmi_funcs = {
193 	.get_pin = r600_audio_get_pin,
194 	.write_sad_regs = evergreen_hdmi_write_sad_regs,
195 	.write_speaker_allocation = dce4_afmt_hdmi_write_speaker_allocation,
196 	.write_latency_fields = dce4_afmt_write_latency_fields,
197 	.set_dto = dce4_hdmi_audio_set_dto,
198 	.update_acr = evergreen_hdmi_update_acr,
199 	.set_vbi_packet = dce4_set_vbi_packet,
200 	.set_color_depth = dce4_hdmi_set_color_depth,
201 	.set_avi_packet = evergreen_set_avi_packet,
202 	.set_audio_packet = dce4_set_audio_packet,
203 	.set_mute = dce4_set_mute,
204 	.mode_set = radeon_audio_hdmi_mode_set,
205 	.dpms = evergreen_hdmi_enable,
206 };
207 
208 static struct radeon_audio_funcs dce4_dp_funcs = {
209 	.get_pin = r600_audio_get_pin,
210 	.write_sad_regs = evergreen_hdmi_write_sad_regs,
211 	.write_speaker_allocation = dce4_afmt_dp_write_speaker_allocation,
212 	.write_latency_fields = dce4_afmt_write_latency_fields,
213 	.set_dto = dce4_dp_audio_set_dto,
214 	.set_avi_packet = evergreen_set_avi_packet,
215 	.set_audio_packet = dce4_set_audio_packet,
216 	.mode_set = radeon_audio_dp_mode_set,
217 	.dpms = evergreen_dp_enable,
218 };
219 
220 static struct radeon_audio_funcs dce6_hdmi_funcs = {
221 	.select_pin = dce6_afmt_select_pin,
222 	.get_pin = dce6_audio_get_pin,
223 	.write_sad_regs = dce6_afmt_write_sad_regs,
224 	.write_speaker_allocation = dce6_afmt_hdmi_write_speaker_allocation,
225 	.write_latency_fields = dce6_afmt_write_latency_fields,
226 	.set_dto = dce6_hdmi_audio_set_dto,
227 	.update_acr = evergreen_hdmi_update_acr,
228 	.set_vbi_packet = dce4_set_vbi_packet,
229 	.set_color_depth = dce4_hdmi_set_color_depth,
230 	.set_avi_packet = evergreen_set_avi_packet,
231 	.set_audio_packet = dce4_set_audio_packet,
232 	.set_mute = dce4_set_mute,
233 	.mode_set = radeon_audio_hdmi_mode_set,
234 	.dpms = evergreen_hdmi_enable,
235 };
236 
237 static struct radeon_audio_funcs dce6_dp_funcs = {
238 	.select_pin = dce6_afmt_select_pin,
239 	.get_pin = dce6_audio_get_pin,
240 	.write_sad_regs = dce6_afmt_write_sad_regs,
241 	.write_speaker_allocation = dce6_afmt_dp_write_speaker_allocation,
242 	.write_latency_fields = dce6_afmt_write_latency_fields,
243 	.set_dto = dce6_dp_audio_set_dto,
244 	.set_avi_packet = evergreen_set_avi_packet,
245 	.set_audio_packet = dce4_set_audio_packet,
246 	.mode_set = radeon_audio_dp_mode_set,
247 	.dpms = evergreen_dp_enable,
248 };
249 
radeon_audio_enable(struct radeon_device * rdev,struct r600_audio_pin * pin,u8 enable_mask)250 static void radeon_audio_enable(struct radeon_device *rdev,
251 				struct r600_audio_pin *pin, u8 enable_mask)
252 {
253 	struct drm_encoder *encoder;
254 	struct radeon_encoder *radeon_encoder;
255 	struct radeon_encoder_atom_dig *dig;
256 	int pin_count = 0;
257 
258 	if (!pin)
259 		return;
260 
261 	if (rdev->mode_info.mode_config_initialized) {
262 		list_for_each_entry(encoder, &rdev->ddev->mode_config.encoder_list, head) {
263 			if (radeon_encoder_is_digital(encoder)) {
264 				radeon_encoder = to_radeon_encoder(encoder);
265 				dig = radeon_encoder->enc_priv;
266 				if (dig->pin == pin)
267 					pin_count++;
268 			}
269 		}
270 
271 		if ((pin_count > 1) && (enable_mask == 0))
272 			return;
273 	}
274 
275 	if (rdev->audio.funcs->enable)
276 		rdev->audio.funcs->enable(rdev, pin, enable_mask);
277 }
278 
radeon_audio_interface_init(struct radeon_device * rdev)279 static void radeon_audio_interface_init(struct radeon_device *rdev)
280 {
281 	if (ASIC_IS_DCE6(rdev)) {
282 		rdev->audio.funcs = &dce6_funcs;
283 		rdev->audio.hdmi_funcs = &dce6_hdmi_funcs;
284 		rdev->audio.dp_funcs = &dce6_dp_funcs;
285 	} else if (ASIC_IS_DCE4(rdev)) {
286 		rdev->audio.funcs = &dce4_funcs;
287 		rdev->audio.hdmi_funcs = &dce4_hdmi_funcs;
288 		rdev->audio.dp_funcs = &dce4_dp_funcs;
289 	} else if (ASIC_IS_DCE32(rdev)) {
290 		rdev->audio.funcs = &dce32_funcs;
291 		rdev->audio.hdmi_funcs = &dce32_hdmi_funcs;
292 		rdev->audio.dp_funcs = &dce32_dp_funcs;
293 	} else {
294 		rdev->audio.funcs = &r600_funcs;
295 		rdev->audio.hdmi_funcs = &r600_hdmi_funcs;
296 		rdev->audio.dp_funcs = NULL;
297 	}
298 }
299 
radeon_audio_chipset_supported(struct radeon_device * rdev)300 static int radeon_audio_chipset_supported(struct radeon_device *rdev)
301 {
302 	return ASIC_IS_DCE2(rdev) && !ASIC_IS_NODCE(rdev);
303 }
304 
radeon_audio_init(struct radeon_device * rdev)305 int radeon_audio_init(struct radeon_device *rdev)
306 {
307 	int i;
308 
309 	if (!radeon_audio || !radeon_audio_chipset_supported(rdev))
310 		return 0;
311 
312 	rdev->audio.enabled = true;
313 
314 	if (ASIC_IS_DCE83(rdev))		/* KB: 2 streams, 3 endpoints */
315 		rdev->audio.num_pins = 3;
316 	else if (ASIC_IS_DCE81(rdev))	/* KV: 4 streams, 7 endpoints */
317 		rdev->audio.num_pins = 7;
318 	else if (ASIC_IS_DCE8(rdev))	/* BN/HW: 6 streams, 7 endpoints */
319 		rdev->audio.num_pins = 7;
320 	else if (ASIC_IS_DCE64(rdev))	/* OL: 2 streams, 2 endpoints */
321 		rdev->audio.num_pins = 2;
322 	else if (ASIC_IS_DCE61(rdev))	/* TN: 4 streams, 6 endpoints */
323 		rdev->audio.num_pins = 6;
324 	else if (ASIC_IS_DCE6(rdev))	/* SI: 6 streams, 6 endpoints */
325 		rdev->audio.num_pins = 6;
326 	else
327 		rdev->audio.num_pins = 1;
328 
329 	for (i = 0; i < rdev->audio.num_pins; i++) {
330 		rdev->audio.pin[i].channels = -1;
331 		rdev->audio.pin[i].rate = -1;
332 		rdev->audio.pin[i].bits_per_sample = -1;
333 		rdev->audio.pin[i].status_bits = 0;
334 		rdev->audio.pin[i].category_code = 0;
335 		rdev->audio.pin[i].connected = false;
336 		rdev->audio.pin[i].offset = pin_offsets[i];
337 		rdev->audio.pin[i].id = i;
338 	}
339 
340 	radeon_audio_interface_init(rdev);
341 
342 	/* disable audio.  it will be set up later */
343 	for (i = 0; i < rdev->audio.num_pins; i++)
344 		radeon_audio_enable(rdev, &rdev->audio.pin[i], 0);
345 
346 	return 0;
347 }
348 
radeon_audio_endpoint_rreg(struct radeon_device * rdev,u32 offset,u32 reg)349 u32 radeon_audio_endpoint_rreg(struct radeon_device *rdev, u32 offset, u32 reg)
350 {
351 	if (rdev->audio.funcs->endpoint_rreg)
352 		return rdev->audio.funcs->endpoint_rreg(rdev, offset, reg);
353 
354 	return 0;
355 }
356 
radeon_audio_endpoint_wreg(struct radeon_device * rdev,u32 offset,u32 reg,u32 v)357 void radeon_audio_endpoint_wreg(struct radeon_device *rdev, u32 offset,
358 	u32 reg, u32 v)
359 {
360 	if (rdev->audio.funcs->endpoint_wreg)
361 		rdev->audio.funcs->endpoint_wreg(rdev, offset, reg, v);
362 }
363 
radeon_audio_write_sad_regs(struct drm_encoder * encoder)364 static void radeon_audio_write_sad_regs(struct drm_encoder *encoder)
365 {
366 	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
367 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
368 	struct cea_sad *sads;
369 	int sad_count;
370 
371 	if (!connector)
372 		return;
373 
374 	sad_count = drm_edid_to_sad(radeon_connector_edid(connector), &sads);
375 	if (sad_count < 0)
376 		DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
377 	if (sad_count <= 0)
378 		return;
379 	BUG_ON(!sads);
380 
381 	if (radeon_encoder->audio && radeon_encoder->audio->write_sad_regs)
382 		radeon_encoder->audio->write_sad_regs(encoder, sads, sad_count);
383 
384 	kfree(sads);
385 }
386 
radeon_audio_write_speaker_allocation(struct drm_encoder * encoder)387 static void radeon_audio_write_speaker_allocation(struct drm_encoder *encoder)
388 {
389 	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
390 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
391 	u8 *sadb = NULL;
392 	int sad_count;
393 
394 	if (!connector)
395 		return;
396 
397 	sad_count = drm_edid_to_speaker_allocation(radeon_connector_edid(connector),
398 						   &sadb);
399 	if (sad_count < 0) {
400 		DRM_DEBUG("Couldn't read Speaker Allocation Data Block: %d\n",
401 			  sad_count);
402 		sad_count = 0;
403 	}
404 
405 	if (radeon_encoder->audio && radeon_encoder->audio->write_speaker_allocation)
406 		radeon_encoder->audio->write_speaker_allocation(encoder, sadb, sad_count);
407 
408 	kfree(sadb);
409 }
410 
radeon_audio_write_latency_fields(struct drm_encoder * encoder,struct drm_display_mode * mode)411 static void radeon_audio_write_latency_fields(struct drm_encoder *encoder,
412 					      struct drm_display_mode *mode)
413 {
414 	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
415 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
416 
417 	if (!connector)
418 		return;
419 
420 	if (radeon_encoder->audio && radeon_encoder->audio->write_latency_fields)
421 		radeon_encoder->audio->write_latency_fields(encoder, connector, mode);
422 }
423 
radeon_audio_get_pin(struct drm_encoder * encoder)424 struct r600_audio_pin* radeon_audio_get_pin(struct drm_encoder *encoder)
425 {
426 	struct radeon_device *rdev = encoder->dev->dev_private;
427 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
428 
429 	if (radeon_encoder->audio && radeon_encoder->audio->get_pin)
430 		return radeon_encoder->audio->get_pin(rdev);
431 
432 	return NULL;
433 }
434 
radeon_audio_select_pin(struct drm_encoder * encoder)435 static void radeon_audio_select_pin(struct drm_encoder *encoder)
436 {
437 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
438 
439 	if (radeon_encoder->audio && radeon_encoder->audio->select_pin)
440 		radeon_encoder->audio->select_pin(encoder);
441 }
442 
radeon_audio_detect(struct drm_connector * connector,struct drm_encoder * encoder,enum drm_connector_status status)443 void radeon_audio_detect(struct drm_connector *connector,
444 			 struct drm_encoder *encoder,
445 			 enum drm_connector_status status)
446 {
447 	struct drm_device *dev = connector->dev;
448 	struct radeon_device *rdev = dev->dev_private;
449 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
450 	struct radeon_encoder_atom_dig *dig;
451 
452 	if (!radeon_audio_chipset_supported(rdev))
453 		return;
454 
455 	if (!radeon_encoder_is_digital(encoder))
456 		return;
457 
458 	dig = radeon_encoder->enc_priv;
459 
460 	if (status == connector_status_connected) {
461 		if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
462 			struct radeon_connector *radeon_connector = to_radeon_connector(connector);
463 
464 			if (radeon_dp_getsinktype(radeon_connector) ==
465 			    CONNECTOR_OBJECT_ID_DISPLAYPORT)
466 				radeon_encoder->audio = rdev->audio.dp_funcs;
467 			else
468 				radeon_encoder->audio = rdev->audio.hdmi_funcs;
469 		} else {
470 			radeon_encoder->audio = rdev->audio.hdmi_funcs;
471 		}
472 
473 		if (drm_detect_monitor_audio(radeon_connector_edid(connector))) {
474 			if (!dig->pin)
475 				dig->pin = radeon_audio_get_pin(encoder);
476 			radeon_audio_enable(rdev, dig->pin, 0xf);
477 		} else {
478 			radeon_audio_enable(rdev, dig->pin, 0);
479 			dig->pin = NULL;
480 		}
481 	} else {
482 		radeon_audio_enable(rdev, dig->pin, 0);
483 		dig->pin = NULL;
484 	}
485 }
486 
radeon_audio_fini(struct radeon_device * rdev)487 void radeon_audio_fini(struct radeon_device *rdev)
488 {
489 	int i;
490 
491 	if (!rdev->audio.enabled)
492 		return;
493 
494 	for (i = 0; i < rdev->audio.num_pins; i++)
495 		radeon_audio_enable(rdev, &rdev->audio.pin[i], 0);
496 
497 	rdev->audio.enabled = false;
498 }
499 
radeon_audio_set_dto(struct drm_encoder * encoder,unsigned int clock)500 static void radeon_audio_set_dto(struct drm_encoder *encoder, unsigned int clock)
501 {
502 	struct radeon_device *rdev = encoder->dev->dev_private;
503 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
504 	struct radeon_crtc *crtc = to_radeon_crtc(encoder->crtc);
505 
506 	if (radeon_encoder->audio && radeon_encoder->audio->set_dto)
507 		radeon_encoder->audio->set_dto(rdev, crtc, clock);
508 }
509 
radeon_audio_set_avi_packet(struct drm_encoder * encoder,struct drm_display_mode * mode)510 static int radeon_audio_set_avi_packet(struct drm_encoder *encoder,
511 				       struct drm_display_mode *mode)
512 {
513 	struct radeon_device *rdev = encoder->dev->dev_private;
514 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
515 	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
516 	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
517 	u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
518 	struct hdmi_avi_infoframe frame;
519 	int err;
520 
521 	if (!connector)
522 		return -EINVAL;
523 
524 	err = drm_hdmi_avi_infoframe_from_display_mode(&frame, connector, mode);
525 	if (err < 0) {
526 		DRM_ERROR("failed to setup AVI infoframe: %d\n", err);
527 		return err;
528 	}
529 
530 	if (radeon_encoder->output_csc != RADEON_OUTPUT_CSC_BYPASS) {
531 		drm_hdmi_avi_infoframe_quant_range(&frame, connector, mode,
532 						   radeon_encoder->output_csc == RADEON_OUTPUT_CSC_TVRGB ?
533 						   HDMI_QUANTIZATION_RANGE_LIMITED :
534 						   HDMI_QUANTIZATION_RANGE_FULL);
535 	}
536 
537 	err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer));
538 	if (err < 0) {
539 		DRM_ERROR("failed to pack AVI infoframe: %d\n", err);
540 		return err;
541 	}
542 
543 	if (dig && dig->afmt && radeon_encoder->audio &&
544 	    radeon_encoder->audio->set_avi_packet)
545 		radeon_encoder->audio->set_avi_packet(rdev, dig->afmt->offset,
546 			buffer, sizeof(buffer));
547 
548 	return 0;
549 }
550 
551 /*
552  * calculate CTS and N values if they are not found in the table
553  */
radeon_audio_calc_cts(unsigned int clock,int * CTS,int * N,int freq)554 static void radeon_audio_calc_cts(unsigned int clock, int *CTS, int *N, int freq)
555 {
556 	int n, cts;
557 	unsigned long div, mul;
558 
559 	/* Safe, but overly large values */
560 	n = 128 * freq;
561 	cts = clock * 1000;
562 
563 	/* Smallest valid fraction */
564 	div = gcd(n, cts);
565 
566 	n /= div;
567 	cts /= div;
568 
569 	/*
570 	 * The optimal N is 128*freq/1000. Calculate the closest larger
571 	 * value that doesn't truncate any bits.
572 	 */
573 	mul = ((128*freq/1000) + (n-1))/n;
574 
575 	n *= mul;
576 	cts *= mul;
577 
578 	/* Check that we are in spec (not always possible) */
579 	if (n < (128*freq/1500))
580 		pr_warn("Calculated ACR N value is too small. You may experience audio problems.\n");
581 	if (n > (128*freq/300))
582 		pr_warn("Calculated ACR N value is too large. You may experience audio problems.\n");
583 
584 	*N = n;
585 	*CTS = cts;
586 
587 	DRM_DEBUG("Calculated ACR timing N=%d CTS=%d for frequency %d\n",
588 		*N, *CTS, freq);
589 }
590 
radeon_audio_acr(unsigned int clock)591 static const struct radeon_hdmi_acr* radeon_audio_acr(unsigned int clock)
592 {
593 	static struct radeon_hdmi_acr res;
594 	u8 i;
595 
596 	static const struct radeon_hdmi_acr hdmi_predefined_acr[] = {
597 		/*       32kHz    44.1kHz   48kHz    */
598 		/* Clock      N     CTS      N     CTS      N     CTS */
599 		{  25175,  4096,  25175, 28224, 125875,  6144,  25175 }, /*  25,20/1.001 MHz */
600 		{  25200,  4096,  25200,  6272,  28000,  6144,  25200 }, /*  25.20       MHz */
601 		{  27000,  4096,  27000,  6272,  30000,  6144,  27000 }, /*  27.00       MHz */
602 		{  27027,  4096,  27027,  6272,  30030,  6144,  27027 }, /*  27.00*1.001 MHz */
603 		{  54000,  4096,  54000,  6272,  60000,  6144,  54000 }, /*  54.00       MHz */
604 		{  54054,  4096,  54054,  6272,  60060,  6144,  54054 }, /*  54.00*1.001 MHz */
605 		{  74176,  4096,  74176,  5733,  75335,  6144,  74176 }, /*  74.25/1.001 MHz */
606 		{  74250,  4096,  74250,  6272,  82500,  6144,  74250 }, /*  74.25       MHz */
607 		{ 148352,  4096, 148352,  5733, 150670,  6144, 148352 }, /* 148.50/1.001 MHz */
608 		{ 148500,  4096, 148500,  6272, 165000,  6144, 148500 }, /* 148.50       MHz */
609 	};
610 
611 	/* Precalculated values for common clocks */
612 	for (i = 0; i < ARRAY_SIZE(hdmi_predefined_acr); i++)
613 		if (hdmi_predefined_acr[i].clock == clock)
614 			return &hdmi_predefined_acr[i];
615 
616 	/* And odd clocks get manually calculated */
617 	radeon_audio_calc_cts(clock, &res.cts_32khz, &res.n_32khz, 32000);
618 	radeon_audio_calc_cts(clock, &res.cts_44_1khz, &res.n_44_1khz, 44100);
619 	radeon_audio_calc_cts(clock, &res.cts_48khz, &res.n_48khz, 48000);
620 
621 	return &res;
622 }
623 
624 /*
625  * update the N and CTS parameters for a given pixel clock rate
626  */
radeon_audio_update_acr(struct drm_encoder * encoder,unsigned int clock)627 static void radeon_audio_update_acr(struct drm_encoder *encoder, unsigned int clock)
628 {
629 	const struct radeon_hdmi_acr *acr = radeon_audio_acr(clock);
630 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
631 	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
632 
633 	if (!dig || !dig->afmt)
634 		return;
635 
636 	if (radeon_encoder->audio && radeon_encoder->audio->update_acr)
637 		radeon_encoder->audio->update_acr(encoder, dig->afmt->offset, acr);
638 }
639 
radeon_audio_set_vbi_packet(struct drm_encoder * encoder)640 static void radeon_audio_set_vbi_packet(struct drm_encoder *encoder)
641 {
642 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
643 	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
644 
645 	if (!dig || !dig->afmt)
646 		return;
647 
648 	if (radeon_encoder->audio && radeon_encoder->audio->set_vbi_packet)
649 		radeon_encoder->audio->set_vbi_packet(encoder, dig->afmt->offset);
650 }
651 
radeon_hdmi_set_color_depth(struct drm_encoder * encoder)652 static void radeon_hdmi_set_color_depth(struct drm_encoder *encoder)
653 {
654 	int bpc = 8;
655 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
656 	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
657 
658 	if (!dig || !dig->afmt)
659 		return;
660 
661 	if (encoder->crtc) {
662 		struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
663 		bpc = radeon_crtc->bpc;
664 	}
665 
666 	if (radeon_encoder->audio && radeon_encoder->audio->set_color_depth)
667 		radeon_encoder->audio->set_color_depth(encoder, dig->afmt->offset, bpc);
668 }
669 
radeon_audio_set_audio_packet(struct drm_encoder * encoder)670 static void radeon_audio_set_audio_packet(struct drm_encoder *encoder)
671 {
672 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
673 	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
674 
675 	if (!dig || !dig->afmt)
676 		return;
677 
678 	if (radeon_encoder->audio && radeon_encoder->audio->set_audio_packet)
679 		radeon_encoder->audio->set_audio_packet(encoder, dig->afmt->offset);
680 }
681 
radeon_audio_set_mute(struct drm_encoder * encoder,bool mute)682 static void radeon_audio_set_mute(struct drm_encoder *encoder, bool mute)
683 {
684 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
685 	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
686 
687 	if (!dig || !dig->afmt)
688 		return;
689 
690 	if (radeon_encoder->audio && radeon_encoder->audio->set_mute)
691 		radeon_encoder->audio->set_mute(encoder, dig->afmt->offset, mute);
692 }
693 
694 /*
695  * update the info frames with the data from the current display mode
696  */
radeon_audio_hdmi_mode_set(struct drm_encoder * encoder,struct drm_display_mode * mode)697 static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder,
698 				       struct drm_display_mode *mode)
699 {
700 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
701 	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
702 	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
703 
704 	if (!dig || !dig->afmt)
705 		return;
706 
707 	if (!connector)
708 		return;
709 
710 	if (drm_detect_monitor_audio(radeon_connector_edid(connector))) {
711 		radeon_audio_set_mute(encoder, true);
712 
713 		radeon_audio_write_speaker_allocation(encoder);
714 		radeon_audio_write_sad_regs(encoder);
715 		radeon_audio_write_latency_fields(encoder, mode);
716 		radeon_audio_set_dto(encoder, mode->clock);
717 		radeon_audio_set_vbi_packet(encoder);
718 		radeon_hdmi_set_color_depth(encoder);
719 		radeon_audio_update_acr(encoder, mode->clock);
720 		radeon_audio_set_audio_packet(encoder);
721 		radeon_audio_select_pin(encoder);
722 
723 		if (radeon_audio_set_avi_packet(encoder, mode) < 0)
724 			return;
725 
726 		radeon_audio_set_mute(encoder, false);
727 	} else {
728 		radeon_hdmi_set_color_depth(encoder);
729 
730 		if (radeon_audio_set_avi_packet(encoder, mode) < 0)
731 			return;
732 	}
733 }
734 
radeon_audio_dp_mode_set(struct drm_encoder * encoder,struct drm_display_mode * mode)735 static void radeon_audio_dp_mode_set(struct drm_encoder *encoder,
736 				     struct drm_display_mode *mode)
737 {
738 	struct drm_device *dev = encoder->dev;
739 	struct radeon_device *rdev = dev->dev_private;
740 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
741 	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
742 	struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
743 
744 	if (!dig || !dig->afmt)
745 		return;
746 
747 	if (!connector)
748 		return;
749 
750 	if (drm_detect_monitor_audio(radeon_connector_edid(connector))) {
751 		radeon_audio_write_speaker_allocation(encoder);
752 		radeon_audio_write_sad_regs(encoder);
753 		radeon_audio_write_latency_fields(encoder, mode);
754 		radeon_audio_set_dto(encoder, rdev->clock.vco_freq * 10);
755 		radeon_audio_set_audio_packet(encoder);
756 		radeon_audio_select_pin(encoder);
757 
758 		if (radeon_audio_set_avi_packet(encoder, mode) < 0)
759 			return;
760 	}
761 }
762 
radeon_audio_mode_set(struct drm_encoder * encoder,struct drm_display_mode * mode)763 void radeon_audio_mode_set(struct drm_encoder *encoder,
764 			   struct drm_display_mode *mode)
765 {
766 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
767 
768 	if (radeon_encoder->audio && radeon_encoder->audio->mode_set)
769 		radeon_encoder->audio->mode_set(encoder, mode);
770 }
771 
radeon_audio_dpms(struct drm_encoder * encoder,int mode)772 void radeon_audio_dpms(struct drm_encoder *encoder, int mode)
773 {
774 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
775 
776 	if (radeon_encoder->audio && radeon_encoder->audio->dpms)
777 		radeon_encoder->audio->dpms(encoder, mode == DRM_MODE_DPMS_ON);
778 }
779 
radeon_audio_decode_dfs_div(unsigned int div)780 unsigned int radeon_audio_decode_dfs_div(unsigned int div)
781 {
782 	if (div >= 8 && div < 64)
783 		return (div - 8) * 25 + 200;
784 	else if (div >= 64 && div < 96)
785 		return (div - 64) * 50 + 1600;
786 	else if (div >= 96 && div < 128)
787 		return (div - 96) * 100 + 3200;
788 	else
789 		return 0;
790 }
791