Linux Audio

Check our new training course

Loading...
v6.13.7
  1/*
  2 * Copyright 2008 Advanced Micro Devices, Inc.
  3 * Copyright 2008 Red Hat Inc.
  4 * Copyright 2009 Christian König.
  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: Christian König
 25 */
 26#include <linux/hdmi.h>
 27#include <linux/gcd.h>
 28
 29#include <drm/radeon_drm.h>
 30#include "radeon.h"
 31#include "radeon_asic.h"
 32#include "radeon_audio.h"
 33#include "r600.h"
 34#include "r600d.h"
 35#include "atom.h"
 36
 37/*
 38 * HDMI color format
 39 */
 40enum r600_hdmi_color_format {
 41	RGB = 0,
 42	YCC_422 = 1,
 43	YCC_444 = 2
 44};
 45
 46/*
 47 * IEC60958 status bits
 48 */
 49enum r600_hdmi_iec_status_bits {
 50	AUDIO_STATUS_DIG_ENABLE   = 0x01,
 51	AUDIO_STATUS_V            = 0x02,
 52	AUDIO_STATUS_VCFG         = 0x04,
 53	AUDIO_STATUS_EMPHASIS     = 0x08,
 54	AUDIO_STATUS_COPYRIGHT    = 0x10,
 55	AUDIO_STATUS_NONAUDIO     = 0x20,
 56	AUDIO_STATUS_PROFESSIONAL = 0x40,
 57	AUDIO_STATUS_LEVEL        = 0x80
 58};
 59
 60static struct r600_audio_pin r600_audio_status(struct radeon_device *rdev)
 61{
 62	struct r600_audio_pin status = {};
 63	uint32_t value;
 64
 65	value = RREG32(R600_AUDIO_RATE_BPS_CHANNEL);
 
 
 
 
 
 
 
 
 66
 67	/* number of channels */
 68	status.channels = (value & 0x7) + 1;
 69
 70	/* bits per sample */
 71	switch ((value & 0xF0) >> 4) {
 72	case 0x0:
 73		status.bits_per_sample = 8;
 74		break;
 75	case 0x1:
 76		status.bits_per_sample = 16;
 77		break;
 78	case 0x2:
 79		status.bits_per_sample = 20;
 80		break;
 81	case 0x3:
 82		status.bits_per_sample = 24;
 83		break;
 84	case 0x4:
 85		status.bits_per_sample = 32;
 86		break;
 87	default:
 88		dev_err(rdev->dev, "Unknown bits per sample 0x%x, using 16\n",
 89			(int)value);
 90		status.bits_per_sample = 16;
 91	}
 92
 93	/* current sampling rate in HZ */
 94	if (value & 0x4000)
 95		status.rate = 44100;
 96	else
 97		status.rate = 48000;
 98	status.rate *= ((value >> 11) & 0x7) + 1;
 99	status.rate /= ((value >> 8) & 0x7) + 1;
100
101	value = RREG32(R600_AUDIO_STATUS_BITS);
 
102
103	/* iec 60958 status bits */
104	status.status_bits = value & 0xff;
105
106	/* iec 60958 category code */
107	status.category_code = (value >> 8) & 0xff;
 
 
 
108
109	return status;
110}
111
112/*
113 * update all hdmi interfaces with current audio parameters
114 */
115void r600_audio_update_hdmi(struct work_struct *work)
116{
117	struct radeon_device *rdev = container_of(work, struct radeon_device,
118						  audio_work);
119	struct drm_device *dev = rdev_to_drm(rdev);
120	struct r600_audio_pin audio_status = r600_audio_status(rdev);
121	struct drm_encoder *encoder;
122	bool changed = false;
123
124	if (rdev->audio.pin[0].channels != audio_status.channels ||
125	    rdev->audio.pin[0].rate != audio_status.rate ||
126	    rdev->audio.pin[0].bits_per_sample != audio_status.bits_per_sample ||
127	    rdev->audio.pin[0].status_bits != audio_status.status_bits ||
128	    rdev->audio.pin[0].category_code != audio_status.category_code) {
129		rdev->audio.pin[0] = audio_status;
130		changed = true;
131	}
132
133	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
134		if (!radeon_encoder_is_digital(encoder))
135			continue;
136		if (changed || r600_hdmi_buffer_status_changed(encoder))
137			r600_hdmi_update_audio_settings(encoder);
138	}
139}
140
141/* enable the audio stream */
142void r600_audio_enable(struct radeon_device *rdev,
143		       struct r600_audio_pin *pin,
144		       u8 enable_mask)
145{
146	u32 tmp = RREG32(AZ_HOT_PLUG_CONTROL);
147
148	if (!pin)
149		return;
150
151	if (enable_mask) {
152		tmp |= AUDIO_ENABLED;
153		if (enable_mask & 1)
154			tmp |= PIN0_AUDIO_ENABLED;
155		if (enable_mask & 2)
156			tmp |= PIN1_AUDIO_ENABLED;
157		if (enable_mask & 4)
158			tmp |= PIN2_AUDIO_ENABLED;
159		if (enable_mask & 8)
160			tmp |= PIN3_AUDIO_ENABLED;
161	} else {
162		tmp &= ~(AUDIO_ENABLED |
163			 PIN0_AUDIO_ENABLED |
164			 PIN1_AUDIO_ENABLED |
165			 PIN2_AUDIO_ENABLED |
166			 PIN3_AUDIO_ENABLED);
167	}
168
169	WREG32(AZ_HOT_PLUG_CONTROL, tmp);
170}
 
 
171
172struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev)
173{
174	/* only one pin on 6xx-NI */
175	return &rdev->audio.pin[0];
176}
177
178void r600_hdmi_update_acr(struct drm_encoder *encoder, long offset,
179	const struct radeon_hdmi_acr *acr)
 
 
180{
181	struct drm_device *dev = encoder->dev;
182	struct radeon_device *rdev = dev->dev_private;
 
 
 
 
183
184	/* DCE 3.0 uses register that's normally for CRC_CONTROL */
185	uint32_t acr_ctl = ASIC_IS_DCE3(rdev) ? DCE3_HDMI0_ACR_PACKET_CONTROL :
186				       HDMI0_ACR_PACKET_CONTROL;
187	WREG32_P(acr_ctl + offset,
188		HDMI0_ACR_SOURCE |		/* select SW CTS value */
189		HDMI0_ACR_AUTO_SEND,	/* allow hw to sent ACR packets when required */
190		~(HDMI0_ACR_SOURCE |
191		HDMI0_ACR_AUTO_SEND));
192
193	WREG32_P(HDMI0_ACR_32_0 + offset,
194		HDMI0_ACR_CTS_32(acr->cts_32khz),
195		~HDMI0_ACR_CTS_32_MASK);
196	WREG32_P(HDMI0_ACR_32_1 + offset,
197		HDMI0_ACR_N_32(acr->n_32khz),
198		~HDMI0_ACR_N_32_MASK);
199
200	WREG32_P(HDMI0_ACR_44_0 + offset,
201		HDMI0_ACR_CTS_44(acr->cts_44_1khz),
202		~HDMI0_ACR_CTS_44_MASK);
203	WREG32_P(HDMI0_ACR_44_1 + offset,
204		HDMI0_ACR_N_44(acr->n_44_1khz),
205		~HDMI0_ACR_N_44_MASK);
206
207	WREG32_P(HDMI0_ACR_48_0 + offset,
208		HDMI0_ACR_CTS_48(acr->cts_48khz),
209		~HDMI0_ACR_CTS_48_MASK);
210	WREG32_P(HDMI0_ACR_48_1 + offset,
211		HDMI0_ACR_N_48(acr->n_48khz),
212		~HDMI0_ACR_N_48_MASK);
213}
214
215/*
216 * build a HDMI Video Info Frame
217 */
218void r600_set_avi_packet(struct radeon_device *rdev, u32 offset,
219			 unsigned char *buffer, size_t size)
220{
 
 
 
 
 
221	uint8_t *frame = buffer + 3;
 
222
223	WREG32(HDMI0_AVI_INFO0 + offset,
224		frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24));
225	WREG32(HDMI0_AVI_INFO1 + offset,
226		frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x7] << 24));
227	WREG32(HDMI0_AVI_INFO2 + offset,
228		frame[0x8] | (frame[0x9] << 8) | (frame[0xA] << 16) | (frame[0xB] << 24));
229	WREG32(HDMI0_AVI_INFO3 + offset,
230		frame[0xC] | (frame[0xD] << 8) | (buffer[1] << 24));
231
232	WREG32_OR(HDMI0_INFOFRAME_CONTROL1 + offset,
233		  HDMI0_AVI_INFO_LINE(2));	/* anything other than 0 */
234
235	WREG32_OR(HDMI0_INFOFRAME_CONTROL0 + offset,
236		  HDMI0_AVI_INFO_SEND |	/* enable AVI info frames */
237		  HDMI0_AVI_INFO_CONT);	/* send AVI info frames every frame/field */
238
239}
240
241/*
242 * build a Audio Info Frame
243 */
244static void r600_hdmi_update_audio_infoframe(struct drm_encoder *encoder,
245					     const void *buffer, size_t size)
246{
247	struct drm_device *dev = encoder->dev;
248	struct radeon_device *rdev = dev->dev_private;
249	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
250	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
251	uint32_t offset = dig->afmt->offset;
252	const u8 *frame = buffer + 3;
253
254	WREG32(HDMI0_AUDIO_INFO0 + offset,
255		frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24));
256	WREG32(HDMI0_AUDIO_INFO1 + offset,
257		frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x8] << 24));
258}
259
260/*
261 * test if audio buffer is filled enough to start playing
262 */
263static bool r600_hdmi_is_audio_buffer_filled(struct drm_encoder *encoder)
264{
265	struct drm_device *dev = encoder->dev;
266	struct radeon_device *rdev = dev->dev_private;
267	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
268	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
269	uint32_t offset = dig->afmt->offset;
270
271	return (RREG32(HDMI0_STATUS + offset) & 0x10) != 0;
272}
273
274/*
275 * have buffer status changed since last call?
276 */
277int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder)
278{
279	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
280	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
281	int status, result;
282
283	if (!dig->afmt || !dig->afmt->enabled)
284		return 0;
285
286	status = r600_hdmi_is_audio_buffer_filled(encoder);
287	result = dig->afmt->last_buffer_filled_status != status;
288	dig->afmt->last_buffer_filled_status = status;
289
290	return result;
291}
292
293/*
294 * write the audio workaround status to the hardware
295 */
296void r600_hdmi_audio_workaround(struct drm_encoder *encoder)
297{
298	struct drm_device *dev = encoder->dev;
299	struct radeon_device *rdev = dev->dev_private;
300	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
301	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
302	uint32_t offset = dig->afmt->offset;
303	bool hdmi_audio_workaround = false; /* FIXME */
304	u32 value;
305
306	if (!hdmi_audio_workaround ||
307	    r600_hdmi_is_audio_buffer_filled(encoder))
308		value = 0; /* disable workaround */
309	else
310		value = HDMI0_AUDIO_TEST_EN; /* enable workaround */
311	WREG32_P(HDMI0_AUDIO_PACKET_CONTROL + offset,
312		 value, ~HDMI0_AUDIO_TEST_EN);
313}
314
315void r600_hdmi_audio_set_dto(struct radeon_device *rdev,
316			     struct radeon_crtc *crtc, unsigned int clock)
317{
318	struct radeon_encoder *radeon_encoder;
319	struct radeon_encoder_atom_dig *dig;
 
 
 
 
 
 
 
 
320
321	if (!crtc)
322		return;
323
324	radeon_encoder = to_radeon_encoder(crtc->encoder);
325	dig = radeon_encoder->enc_priv;
326
327	if (!dig)
328		return;
 
 
 
 
 
 
 
 
329
330	if (dig->dig_encoder == 0) {
331		WREG32(DCCG_AUDIO_DTO0_PHASE, 24000 * 100);
332		WREG32(DCCG_AUDIO_DTO0_MODULE, clock * 100);
333		WREG32(DCCG_AUDIO_DTO_SELECT, 0); /* select DTO0 */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
334	} else {
335		WREG32(DCCG_AUDIO_DTO1_PHASE, 24000 * 100);
336		WREG32(DCCG_AUDIO_DTO1_MODULE, clock * 100);
337		WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */
 
 
 
 
 
 
 
 
 
338	}
339}
340
341void r600_set_vbi_packet(struct drm_encoder *encoder, u32 offset)
342{
343	struct drm_device *dev = encoder->dev;
344	struct radeon_device *rdev = dev->dev_private;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
345
346	WREG32_OR(HDMI0_VBI_PACKET_CONTROL + offset,
347		HDMI0_NULL_SEND |	/* send null packets when required */
348		HDMI0_GC_SEND |		/* send general control packets */
349		HDMI0_GC_CONT);		/* send general control packets every frame */
350}
351
352void r600_set_audio_packet(struct drm_encoder *encoder, u32 offset)
353{
354	struct drm_device *dev = encoder->dev;
355	struct radeon_device *rdev = dev->dev_private;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
356
357	WREG32_P(HDMI0_AUDIO_PACKET_CONTROL + offset,
358		HDMI0_AUDIO_SAMPLE_SEND |			/* send audio packets */
359		HDMI0_AUDIO_DELAY_EN(1) |			/* default audio delay */
360		HDMI0_AUDIO_PACKETS_PER_LINE(3) |	/* should be suffient for all audio modes and small enough for all hblanks */
361		HDMI0_60958_CS_UPDATE,				/* allow 60958 channel status fields to be updated */
362		~(HDMI0_AUDIO_SAMPLE_SEND |
363		HDMI0_AUDIO_DELAY_EN_MASK |
364		HDMI0_AUDIO_PACKETS_PER_LINE_MASK |
365		HDMI0_60958_CS_UPDATE));
366
367	WREG32_OR(HDMI0_INFOFRAME_CONTROL0 + offset,
368		HDMI0_AUDIO_INFO_SEND |		/* enable audio info frames (frames won't be set until audio is enabled) */
369		HDMI0_AUDIO_INFO_UPDATE);	/* required for audio info values to be updated */
370
371	WREG32_P(HDMI0_INFOFRAME_CONTROL1 + offset,
372		HDMI0_AUDIO_INFO_LINE(2),	/* anything other than 0 */
373		~HDMI0_AUDIO_INFO_LINE_MASK);
374
375	WREG32_AND(HDMI0_GENERIC_PACKET_CONTROL + offset,
376		~(HDMI0_GENERIC0_SEND |
377		HDMI0_GENERIC0_CONT |
378		HDMI0_GENERIC0_UPDATE |
379		HDMI0_GENERIC1_SEND |
380		HDMI0_GENERIC1_CONT |
381		HDMI0_GENERIC0_LINE_MASK |
382		HDMI0_GENERIC1_LINE_MASK));
383
384	WREG32_P(HDMI0_60958_0 + offset,
385		HDMI0_60958_CS_CHANNEL_NUMBER_L(1),
386		~(HDMI0_60958_CS_CHANNEL_NUMBER_L_MASK |
387		HDMI0_60958_CS_CLOCK_ACCURACY_MASK));
388
389	WREG32_P(HDMI0_60958_1 + offset,
390		HDMI0_60958_CS_CHANNEL_NUMBER_R(2),
391		~HDMI0_60958_CS_CHANNEL_NUMBER_R_MASK);
 
 
 
 
 
 
 
392}
393
394void r600_set_mute(struct drm_encoder *encoder, u32 offset, bool mute)
 
 
 
395{
396	struct drm_device *dev = encoder->dev;
397	struct radeon_device *rdev = dev->dev_private;
 
 
 
 
 
 
398
399	if (mute)
400		WREG32_OR(HDMI0_GC + offset, HDMI0_GC_AVMUTE);
401	else
402		WREG32_AND(HDMI0_GC + offset, ~HDMI0_GC_AVMUTE);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
403}
404
405/**
406 * r600_hdmi_update_audio_settings - Update audio infoframe
407 *
408 * @encoder: drm encoder
409 *
410 * Gets info about current audio stream and updates audio infoframe.
411 */
412void r600_hdmi_update_audio_settings(struct drm_encoder *encoder)
413{
414	struct drm_device *dev = encoder->dev;
415	struct radeon_device *rdev = dev->dev_private;
416	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
417	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
418	struct r600_audio_pin audio = r600_audio_status(rdev);
419	uint8_t buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AUDIO_INFOFRAME_SIZE];
420	struct hdmi_audio_infoframe frame;
421	uint32_t offset;
422	uint32_t value;
423	ssize_t err;
424
425	if (!dig->afmt || !dig->afmt->enabled)
426		return;
427	offset = dig->afmt->offset;
428
429	DRM_DEBUG("%s with %d channels, %d Hz sampling rate, %d bits per sample,\n",
430		 r600_hdmi_is_audio_buffer_filled(encoder) ? "playing" : "stopped",
431		  audio.channels, audio.rate, audio.bits_per_sample);
432	DRM_DEBUG("0x%02X IEC60958 status bits and 0x%02X category code\n",
433		  (int)audio.status_bits, (int)audio.category_code);
434
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
435	err = hdmi_audio_infoframe_init(&frame);
436	if (err < 0) {
437		DRM_ERROR("failed to setup audio infoframe\n");
438		return;
439	}
440
441	frame.channels = audio.channels;
442
443	err = hdmi_audio_infoframe_pack(&frame, buffer, sizeof(buffer));
444	if (err < 0) {
445		DRM_ERROR("failed to pack audio infoframe\n");
446		return;
447	}
448
449	value = RREG32(HDMI0_AUDIO_PACKET_CONTROL + offset);
450	if (value & HDMI0_AUDIO_TEST_EN)
451		WREG32(HDMI0_AUDIO_PACKET_CONTROL + offset,
452		       value & ~HDMI0_AUDIO_TEST_EN);
453
454	WREG32_OR(HDMI0_CONTROL + offset,
455		  HDMI0_ERROR_ACK);
456
457	WREG32_AND(HDMI0_INFOFRAME_CONTROL0 + offset,
458		   ~HDMI0_AUDIO_INFO_SOURCE);
459
460	r600_hdmi_update_audio_infoframe(encoder, buffer, sizeof(buffer));
461
462	WREG32_OR(HDMI0_INFOFRAME_CONTROL0 + offset,
463		  HDMI0_AUDIO_INFO_CONT |
464		  HDMI0_AUDIO_INFO_UPDATE);
465}
466
467/*
468 * enable the HDMI engine
469 */
470void r600_hdmi_enable(struct drm_encoder *encoder, bool enable)
471{
472	struct drm_device *dev = encoder->dev;
473	struct radeon_device *rdev = dev->dev_private;
474	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
475	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
476	u32 hdmi = HDMI0_ERROR_ACK;
477
478	if (!dig || !dig->afmt)
 
 
 
 
 
 
479		return;
480
481	/* Older chipsets require setting HDMI and routing manually */
482	if (!ASIC_IS_DCE3(rdev)) {
483		if (enable)
484			hdmi |= HDMI0_ENABLE;
485		switch (radeon_encoder->encoder_id) {
486		case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
487			if (enable) {
488				WREG32_OR(AVIVO_TMDSA_CNTL, AVIVO_TMDSA_CNTL_HDMI_EN);
489				hdmi |= HDMI0_STREAM(HDMI0_STREAM_TMDSA);
490			} else {
491				WREG32_AND(AVIVO_TMDSA_CNTL, ~AVIVO_TMDSA_CNTL_HDMI_EN);
492			}
493			break;
494		case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
495			if (enable) {
496				WREG32_OR(AVIVO_LVTMA_CNTL, AVIVO_LVTMA_CNTL_HDMI_EN);
497				hdmi |= HDMI0_STREAM(HDMI0_STREAM_LVTMA);
498			} else {
499				WREG32_AND(AVIVO_LVTMA_CNTL, ~AVIVO_LVTMA_CNTL_HDMI_EN);
500			}
501			break;
502		case ENCODER_OBJECT_ID_INTERNAL_DDI:
503			if (enable) {
504				WREG32_OR(DDIA_CNTL, DDIA_HDMI_EN);
505				hdmi |= HDMI0_STREAM(HDMI0_STREAM_DDIA);
506			} else {
507				WREG32_AND(DDIA_CNTL, ~DDIA_HDMI_EN);
508			}
509			break;
510		case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
511			if (enable)
512				hdmi |= HDMI0_STREAM(HDMI0_STREAM_DVOA);
513			break;
514		default:
515			dev_err(rdev->dev, "Invalid encoder for HDMI: 0x%X\n",
516				radeon_encoder->encoder_id);
517			break;
518		}
519		WREG32(HDMI0_CONTROL + dig->afmt->offset, hdmi);
520	}
521
522	if (rdev->irq.installed) {
523		/* if irq is available use it */
524		/* XXX: shouldn't need this on any asics.  Double check DCE2/3 */
525		if (enable)
526			radeon_irq_kms_enable_afmt(rdev, dig->afmt->id);
527		else
528			radeon_irq_kms_disable_afmt(rdev, dig->afmt->id);
529	}
530
531	dig->afmt->enabled = enable;
532
533	DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n",
534		  enable ? "En" : "Dis", dig->afmt->offset, radeon_encoder->encoder_id);
535}
536
v3.15
  1/*
  2 * Copyright 2008 Advanced Micro Devices, Inc.
  3 * Copyright 2008 Red Hat Inc.
  4 * Copyright 2009 Christian König.
  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: Christian König
 25 */
 26#include <linux/hdmi.h>
 27#include <linux/gcd.h>
 28#include <drm/drmP.h>
 29#include <drm/radeon_drm.h>
 30#include "radeon.h"
 31#include "radeon_asic.h"
 
 
 32#include "r600d.h"
 33#include "atom.h"
 34
 35/*
 36 * HDMI color format
 37 */
 38enum r600_hdmi_color_format {
 39	RGB = 0,
 40	YCC_422 = 1,
 41	YCC_444 = 2
 42};
 43
 44/*
 45 * IEC60958 status bits
 46 */
 47enum r600_hdmi_iec_status_bits {
 48	AUDIO_STATUS_DIG_ENABLE   = 0x01,
 49	AUDIO_STATUS_V            = 0x02,
 50	AUDIO_STATUS_VCFG         = 0x04,
 51	AUDIO_STATUS_EMPHASIS     = 0x08,
 52	AUDIO_STATUS_COPYRIGHT    = 0x10,
 53	AUDIO_STATUS_NONAUDIO     = 0x20,
 54	AUDIO_STATUS_PROFESSIONAL = 0x40,
 55	AUDIO_STATUS_LEVEL        = 0x80
 56};
 57
 58static const struct radeon_hdmi_acr r600_hdmi_predefined_acr[] = {
 59    /*	     32kHz	  44.1kHz	48kHz    */
 60    /* Clock      N     CTS      N     CTS      N     CTS */
 61    {  25175,  4096,  25175, 28224, 125875,  6144,  25175 }, /*  25,20/1.001 MHz */
 62    {  25200,  4096,  25200,  6272,  28000,  6144,  25200 }, /*  25.20       MHz */
 63    {  27000,  4096,  27000,  6272,  30000,  6144,  27000 }, /*  27.00       MHz */
 64    {  27027,  4096,  27027,  6272,  30030,  6144,  27027 }, /*  27.00*1.001 MHz */
 65    {  54000,  4096,  54000,  6272,  60000,  6144,  54000 }, /*  54.00       MHz */
 66    {  54054,  4096,  54054,  6272,  60060,  6144,  54054 }, /*  54.00*1.001 MHz */
 67    {  74176,  4096,  74176,  5733,  75335,  6144,  74176 }, /*  74.25/1.001 MHz */
 68    {  74250,  4096,  74250,  6272,  82500,  6144,  74250 }, /*  74.25       MHz */
 69    { 148352,  4096, 148352,  5733, 150670,  6144, 148352 }, /* 148.50/1.001 MHz */
 70    { 148500,  4096, 148500,  6272, 165000,  6144, 148500 }, /* 148.50       MHz */
 71};
 72
 
 
 73
 74/*
 75 * calculate CTS and N values if they are not found in the table
 76 */
 77static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int *N, int freq)
 78{
 79	int n, cts;
 80	unsigned long div, mul;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 81
 82	/* Safe, but overly large values */
 83	n = 128 * freq;
 84	cts = clock * 1000;
 
 
 
 
 85
 86	/* Smallest valid fraction */
 87	div = gcd(n, cts);
 88
 89	n /= div;
 90	cts /= div;
 91
 92	/*
 93	 * The optimal N is 128*freq/1000. Calculate the closest larger
 94	 * value that doesn't truncate any bits.
 95	 */
 96	mul = ((128*freq/1000) + (n-1))/n;
 97
 98	n *= mul;
 99	cts *= mul;
100
101	/* Check that we are in spec (not always possible) */
102	if (n < (128*freq/1500))
103		printk(KERN_WARNING "Calculated ACR N value is too small. You may experience audio problems.\n");
104	if (n > (128*freq/300))
105		printk(KERN_WARNING "Calculated ACR N value is too large. You may experience audio problems.\n");
 
 
 
 
 
 
106
107	*N = n;
108	*CTS = cts;
 
 
 
 
 
 
109
110	DRM_DEBUG("Calculated ACR timing N=%d CTS=%d for frequency %d\n",
111		  *N, *CTS, freq);
 
 
 
 
112}
113
114struct radeon_hdmi_acr r600_hdmi_acr(uint32_t clock)
 
 
 
115{
116	struct radeon_hdmi_acr res;
117	u8 i;
 
 
118
119	/* Precalculated values for common clocks */
120	for (i = 0; i < ARRAY_SIZE(r600_hdmi_predefined_acr); i++) {
121		if (r600_hdmi_predefined_acr[i].clock == clock)
122			return r600_hdmi_predefined_acr[i];
 
 
 
 
 
 
 
 
 
 
 
 
123	}
124
125	/* And odd clocks get manually calculated */
126	r600_hdmi_calc_cts(clock, &res.cts_32khz, &res.n_32khz, 32000);
127	r600_hdmi_calc_cts(clock, &res.cts_44_1khz, &res.n_44_1khz, 44100);
128	r600_hdmi_calc_cts(clock, &res.cts_48khz, &res.n_48khz, 48000);
129
130	return res;
 
 
 
131}
132
133/*
134 * update the N and CTS parameters for a given pixel clock rate
135 */
136static void r600_hdmi_update_ACR(struct drm_encoder *encoder, uint32_t clock)
137{
138	struct drm_device *dev = encoder->dev;
139	struct radeon_device *rdev = dev->dev_private;
140	struct radeon_hdmi_acr acr = r600_hdmi_acr(clock);
141	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
142	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
143	uint32_t offset = dig->afmt->offset;
144
145	WREG32(HDMI0_ACR_32_0 + offset, HDMI0_ACR_CTS_32(acr.cts_32khz));
146	WREG32(HDMI0_ACR_32_1 + offset, acr.n_32khz);
147
148	WREG32(HDMI0_ACR_44_0 + offset, HDMI0_ACR_CTS_44(acr.cts_44_1khz));
149	WREG32(HDMI0_ACR_44_1 + offset, acr.n_44_1khz);
150
151	WREG32(HDMI0_ACR_48_0 + offset, HDMI0_ACR_CTS_48(acr.cts_48khz));
152	WREG32(HDMI0_ACR_48_1 + offset, acr.n_48khz);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153}
154
155/*
156 * build a HDMI Video Info Frame
157 */
158static void r600_hdmi_update_avi_infoframe(struct drm_encoder *encoder,
159					   void *buffer, size_t size)
160{
161	struct drm_device *dev = encoder->dev;
162	struct radeon_device *rdev = dev->dev_private;
163	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
164	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
165	uint32_t offset = dig->afmt->offset;
166	uint8_t *frame = buffer + 3;
167	uint8_t *header = buffer;
168
169	WREG32(HDMI0_AVI_INFO0 + offset,
170		frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24));
171	WREG32(HDMI0_AVI_INFO1 + offset,
172		frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x7] << 24));
173	WREG32(HDMI0_AVI_INFO2 + offset,
174		frame[0x8] | (frame[0x9] << 8) | (frame[0xA] << 16) | (frame[0xB] << 24));
175	WREG32(HDMI0_AVI_INFO3 + offset,
176		frame[0xC] | (frame[0xD] << 8) | (header[1] << 24));
 
 
 
 
 
 
 
 
177}
178
179/*
180 * build a Audio Info Frame
181 */
182static void r600_hdmi_update_audio_infoframe(struct drm_encoder *encoder,
183					     const void *buffer, size_t size)
184{
185	struct drm_device *dev = encoder->dev;
186	struct radeon_device *rdev = dev->dev_private;
187	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
188	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
189	uint32_t offset = dig->afmt->offset;
190	const u8 *frame = buffer + 3;
191
192	WREG32(HDMI0_AUDIO_INFO0 + offset,
193		frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24));
194	WREG32(HDMI0_AUDIO_INFO1 + offset,
195		frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x8] << 24));
196}
197
198/*
199 * test if audio buffer is filled enough to start playing
200 */
201static bool r600_hdmi_is_audio_buffer_filled(struct drm_encoder *encoder)
202{
203	struct drm_device *dev = encoder->dev;
204	struct radeon_device *rdev = dev->dev_private;
205	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
206	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
207	uint32_t offset = dig->afmt->offset;
208
209	return (RREG32(HDMI0_STATUS + offset) & 0x10) != 0;
210}
211
212/*
213 * have buffer status changed since last call?
214 */
215int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder)
216{
217	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
218	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
219	int status, result;
220
221	if (!dig->afmt || !dig->afmt->enabled)
222		return 0;
223
224	status = r600_hdmi_is_audio_buffer_filled(encoder);
225	result = dig->afmt->last_buffer_filled_status != status;
226	dig->afmt->last_buffer_filled_status = status;
227
228	return result;
229}
230
231/*
232 * write the audio workaround status to the hardware
233 */
234static void r600_hdmi_audio_workaround(struct drm_encoder *encoder)
235{
236	struct drm_device *dev = encoder->dev;
237	struct radeon_device *rdev = dev->dev_private;
238	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
239	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
240	uint32_t offset = dig->afmt->offset;
241	bool hdmi_audio_workaround = false; /* FIXME */
242	u32 value;
243
244	if (!hdmi_audio_workaround ||
245	    r600_hdmi_is_audio_buffer_filled(encoder))
246		value = 0; /* disable workaround */
247	else
248		value = HDMI0_AUDIO_TEST_EN; /* enable workaround */
249	WREG32_P(HDMI0_AUDIO_PACKET_CONTROL + offset,
250		 value, ~HDMI0_AUDIO_TEST_EN);
251}
252
253static void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock)
 
254{
255	struct drm_device *dev = encoder->dev;
256	struct radeon_device *rdev = dev->dev_private;
257	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
258	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
259	u32 base_rate = 24000;
260	u32 max_ratio = clock / base_rate;
261	u32 dto_phase;
262	u32 dto_modulo = clock;
263	u32 wallclock_ratio;
264	u32 dto_cntl;
265
266	if (!dig || !dig->afmt)
267		return;
268
269	if (max_ratio >= 8) {
270		dto_phase = 192 * 1000;
271		wallclock_ratio = 3;
272	} else if (max_ratio >= 4) {
273		dto_phase = 96 * 1000;
274		wallclock_ratio = 2;
275	} else if (max_ratio >= 2) {
276		dto_phase = 48 * 1000;
277		wallclock_ratio = 1;
278	} else {
279		dto_phase = 24 * 1000;
280		wallclock_ratio = 0;
281	}
282
283	/* there are two DTOs selected by DCCG_AUDIO_DTO_SELECT.
284	 * doesn't matter which one you use.  Just use the first one.
285	 */
286	/* XXX two dtos; generally use dto0 for hdmi */
287	/* Express [24MHz / target pixel clock] as an exact rational
288	 * number (coefficient of two integer numbers.  DCCG_AUDIO_DTOx_PHASE
289	 * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator
290	 */
291	if (ASIC_IS_DCE32(rdev)) {
292		if (dig->dig_encoder == 0) {
293			dto_cntl = RREG32(DCCG_AUDIO_DTO0_CNTL) & ~DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK;
294			dto_cntl |= DCCG_AUDIO_DTO_WALLCLOCK_RATIO(wallclock_ratio);
295			WREG32(DCCG_AUDIO_DTO0_CNTL, dto_cntl);
296			WREG32(DCCG_AUDIO_DTO0_PHASE, dto_phase);
297			WREG32(DCCG_AUDIO_DTO0_MODULE, dto_modulo);
298			WREG32(DCCG_AUDIO_DTO_SELECT, 0); /* select DTO0 */
299		} else {
300			dto_cntl = RREG32(DCCG_AUDIO_DTO1_CNTL) & ~DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK;
301			dto_cntl |= DCCG_AUDIO_DTO_WALLCLOCK_RATIO(wallclock_ratio);
302			WREG32(DCCG_AUDIO_DTO1_CNTL, dto_cntl);
303			WREG32(DCCG_AUDIO_DTO1_PHASE, dto_phase);
304			WREG32(DCCG_AUDIO_DTO1_MODULE, dto_modulo);
305			WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */
306		}
307	} else {
308		/* according to the reg specs, this should DCE3.2 only, but in
309		 * practice it seems to cover DCE2.0/3.0/3.1 as well.
310		 */
311		if (dig->dig_encoder == 0) {
312			WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100);
313			WREG32(DCCG_AUDIO_DTO0_MODULE, clock * 100);
314			WREG32(DCCG_AUDIO_DTO_SELECT, 0); /* select DTO0 */
315		} else {
316			WREG32(DCCG_AUDIO_DTO1_PHASE, base_rate * 100);
317			WREG32(DCCG_AUDIO_DTO1_MODULE, clock * 100);
318			WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */
319		}
320	}
321}
322
323static void dce3_2_afmt_write_speaker_allocation(struct drm_encoder *encoder)
324{
325	struct radeon_device *rdev = encoder->dev->dev_private;
326	struct drm_connector *connector;
327	struct radeon_connector *radeon_connector = NULL;
328	u32 tmp;
329	u8 *sadb;
330	int sad_count;
331
332	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
333		if (connector->encoder == encoder) {
334			radeon_connector = to_radeon_connector(connector);
335			break;
336		}
337	}
338
339	if (!radeon_connector) {
340		DRM_ERROR("Couldn't find encoder's connector\n");
341		return;
342	}
343
344	sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb);
345	if (sad_count < 0) {
346		DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
347		return;
348	}
349
350	/* program the speaker allocation */
351	tmp = RREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER);
352	tmp &= ~(DP_CONNECTION | SPEAKER_ALLOCATION_MASK);
353	/* set HDMI mode */
354	tmp |= HDMI_CONNECTION;
355	if (sad_count)
356		tmp |= SPEAKER_ALLOCATION(sadb[0]);
357	else
358		tmp |= SPEAKER_ALLOCATION(5); /* stereo */
359	WREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER, tmp);
360
361	kfree(sadb);
 
 
 
362}
363
364static void dce3_2_afmt_write_sad_regs(struct drm_encoder *encoder)
365{
366	struct radeon_device *rdev = encoder->dev->dev_private;
367	struct drm_connector *connector;
368	struct radeon_connector *radeon_connector = NULL;
369	struct cea_sad *sads;
370	int i, sad_count;
371
372	static const u16 eld_reg_to_type[][2] = {
373		{ AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR0, HDMI_AUDIO_CODING_TYPE_PCM },
374		{ AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR1, HDMI_AUDIO_CODING_TYPE_AC3 },
375		{ AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR2, HDMI_AUDIO_CODING_TYPE_MPEG1 },
376		{ AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR3, HDMI_AUDIO_CODING_TYPE_MP3 },
377		{ AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR4, HDMI_AUDIO_CODING_TYPE_MPEG2 },
378		{ AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR5, HDMI_AUDIO_CODING_TYPE_AAC_LC },
379		{ AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR6, HDMI_AUDIO_CODING_TYPE_DTS },
380		{ AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR7, HDMI_AUDIO_CODING_TYPE_ATRAC },
381		{ AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR9, HDMI_AUDIO_CODING_TYPE_EAC3 },
382		{ AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR10, HDMI_AUDIO_CODING_TYPE_DTS_HD },
383		{ AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR11, HDMI_AUDIO_CODING_TYPE_MLP },
384		{ AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO },
385	};
386
387	list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
388		if (connector->encoder == encoder) {
389			radeon_connector = to_radeon_connector(connector);
390			break;
391		}
392	}
393
394	if (!radeon_connector) {
395		DRM_ERROR("Couldn't find encoder's connector\n");
396		return;
397	}
398
399	sad_count = drm_edid_to_sad(radeon_connector->edid, &sads);
400	if (sad_count < 0) {
401		DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
402		return;
403	}
404	BUG_ON(!sads);
405
406	for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) {
407		u32 value = 0;
408		u8 stereo_freqs = 0;
409		int max_channels = -1;
410		int j;
411
412		for (j = 0; j < sad_count; j++) {
413			struct cea_sad *sad = &sads[j];
414
415			if (sad->format == eld_reg_to_type[i][1]) {
416				if (sad->channels > max_channels) {
417					value = MAX_CHANNELS(sad->channels) |
418						DESCRIPTOR_BYTE_2(sad->byte2) |
419						SUPPORTED_FREQUENCIES(sad->freq);
420					max_channels = sad->channels;
421				}
422
423				if (sad->format == HDMI_AUDIO_CODING_TYPE_PCM)
424					stereo_freqs |= sad->freq;
425				else
426					break;
427			}
428		}
429
430		value |= SUPPORTED_FREQUENCIES_STEREO(stereo_freqs);
431
432		WREG32(eld_reg_to_type[i][0], value);
433	}
434
435	kfree(sads);
436}
437
438/*
439 * update the info frames with the data from the current display mode
440 */
441void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode)
442{
443	struct drm_device *dev = encoder->dev;
444	struct radeon_device *rdev = dev->dev_private;
445	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
446	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
447	u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
448	struct hdmi_avi_infoframe frame;
449	uint32_t offset;
450	ssize_t err;
451
452	if (!dig || !dig->afmt)
453		return;
454
455	/* Silent, r600_hdmi_enable will raise WARN for us */
456	if (!dig->afmt->enabled)
457		return;
458	offset = dig->afmt->offset;
459
460	/* disable audio prior to setting up hw */
461	dig->afmt->pin = r600_audio_get_pin(rdev);
462	r600_audio_enable(rdev, dig->afmt->pin, false);
463
464	r600_audio_set_dto(encoder, mode->clock);
465
466	WREG32(HDMI0_VBI_PACKET_CONTROL + offset,
467	       HDMI0_NULL_SEND); /* send null packets when required */
468
469	WREG32(HDMI0_AUDIO_CRC_CONTROL + offset, 0x1000);
470
471	if (ASIC_IS_DCE32(rdev)) {
472		WREG32(HDMI0_AUDIO_PACKET_CONTROL + offset,
473		       HDMI0_AUDIO_DELAY_EN(1) | /* default audio delay */
474		       HDMI0_AUDIO_PACKETS_PER_LINE(3)); /* should be suffient for all audio modes and small enough for all hblanks */
475		WREG32(AFMT_AUDIO_PACKET_CONTROL + offset,
476		       AFMT_AUDIO_SAMPLE_SEND | /* send audio packets */
477		       AFMT_60958_CS_UPDATE); /* allow 60958 channel status fields to be updated */
478	} else {
479		WREG32(HDMI0_AUDIO_PACKET_CONTROL + offset,
480		       HDMI0_AUDIO_SAMPLE_SEND | /* send audio packets */
481		       HDMI0_AUDIO_DELAY_EN(1) | /* default audio delay */
482		       HDMI0_AUDIO_PACKETS_PER_LINE(3) | /* should be suffient for all audio modes and small enough for all hblanks */
483		       HDMI0_60958_CS_UPDATE); /* allow 60958 channel status fields to be updated */
484	}
485
486	if (ASIC_IS_DCE32(rdev)) {
487		dce3_2_afmt_write_speaker_allocation(encoder);
488		dce3_2_afmt_write_sad_regs(encoder);
489	}
490
491	WREG32(HDMI0_ACR_PACKET_CONTROL + offset,
492	       HDMI0_ACR_SOURCE | /* select SW CTS value - XXX verify that hw CTS works on all families */
493	       HDMI0_ACR_AUTO_SEND); /* allow hw to sent ACR packets when required */
494
495	WREG32(HDMI0_VBI_PACKET_CONTROL + offset,
496	       HDMI0_NULL_SEND | /* send null packets when required */
497	       HDMI0_GC_SEND | /* send general control packets */
498	       HDMI0_GC_CONT); /* send general control packets every frame */
499
500	/* TODO: HDMI0_AUDIO_INFO_UPDATE */
501	WREG32(HDMI0_INFOFRAME_CONTROL0 + offset,
502	       HDMI0_AVI_INFO_SEND | /* enable AVI info frames */
503	       HDMI0_AVI_INFO_CONT | /* send AVI info frames every frame/field */
504	       HDMI0_AUDIO_INFO_SEND | /* enable audio info frames (frames won't be set until audio is enabled) */
505	       HDMI0_AUDIO_INFO_CONT); /* send audio info frames every frame/field */
506
507	WREG32(HDMI0_INFOFRAME_CONTROL1 + offset,
508	       HDMI0_AVI_INFO_LINE(2) | /* anything other than 0 */
509	       HDMI0_AUDIO_INFO_LINE(2)); /* anything other than 0 */
510
511	WREG32(HDMI0_GC + offset, 0); /* unset HDMI0_GC_AVMUTE */
512
513	err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode);
514	if (err < 0) {
515		DRM_ERROR("failed to setup AVI infoframe: %zd\n", err);
516		return;
517	}
518
519	err = hdmi_avi_infoframe_pack(&frame, buffer, sizeof(buffer));
520	if (err < 0) {
521		DRM_ERROR("failed to pack AVI infoframe: %zd\n", err);
522		return;
523	}
524
525	r600_hdmi_update_avi_infoframe(encoder, buffer, sizeof(buffer));
526	r600_hdmi_update_ACR(encoder, mode->clock);
527
528	/* it's unknown what these bits do excatly, but it's indeed quite useful for debugging */
529	WREG32(HDMI0_RAMP_CONTROL0 + offset, 0x00FFFFFF);
530	WREG32(HDMI0_RAMP_CONTROL1 + offset, 0x007FFFFF);
531	WREG32(HDMI0_RAMP_CONTROL2 + offset, 0x00000001);
532	WREG32(HDMI0_RAMP_CONTROL3 + offset, 0x00000001);
533
534	r600_hdmi_audio_workaround(encoder);
535
536	/* enable audio after to setting up hw */
537	r600_audio_enable(rdev, dig->afmt->pin, true);
538}
539
540/*
541 * update settings with current parameters from audio engine
 
 
 
 
542 */
543void r600_hdmi_update_audio_settings(struct drm_encoder *encoder)
544{
545	struct drm_device *dev = encoder->dev;
546	struct radeon_device *rdev = dev->dev_private;
547	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
548	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
549	struct r600_audio_pin audio = r600_audio_status(rdev);
550	uint8_t buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AUDIO_INFOFRAME_SIZE];
551	struct hdmi_audio_infoframe frame;
552	uint32_t offset;
553	uint32_t iec;
554	ssize_t err;
555
556	if (!dig->afmt || !dig->afmt->enabled)
557		return;
558	offset = dig->afmt->offset;
559
560	DRM_DEBUG("%s with %d channels, %d Hz sampling rate, %d bits per sample,\n",
561		 r600_hdmi_is_audio_buffer_filled(encoder) ? "playing" : "stopped",
562		  audio.channels, audio.rate, audio.bits_per_sample);
563	DRM_DEBUG("0x%02X IEC60958 status bits and 0x%02X category code\n",
564		  (int)audio.status_bits, (int)audio.category_code);
565
566	iec = 0;
567	if (audio.status_bits & AUDIO_STATUS_PROFESSIONAL)
568		iec |= 1 << 0;
569	if (audio.status_bits & AUDIO_STATUS_NONAUDIO)
570		iec |= 1 << 1;
571	if (audio.status_bits & AUDIO_STATUS_COPYRIGHT)
572		iec |= 1 << 2;
573	if (audio.status_bits & AUDIO_STATUS_EMPHASIS)
574		iec |= 1 << 3;
575
576	iec |= HDMI0_60958_CS_CATEGORY_CODE(audio.category_code);
577
578	switch (audio.rate) {
579	case 32000:
580		iec |= HDMI0_60958_CS_SAMPLING_FREQUENCY(0x3);
581		break;
582	case 44100:
583		iec |= HDMI0_60958_CS_SAMPLING_FREQUENCY(0x0);
584		break;
585	case 48000:
586		iec |= HDMI0_60958_CS_SAMPLING_FREQUENCY(0x2);
587		break;
588	case 88200:
589		iec |= HDMI0_60958_CS_SAMPLING_FREQUENCY(0x8);
590		break;
591	case 96000:
592		iec |= HDMI0_60958_CS_SAMPLING_FREQUENCY(0xa);
593		break;
594	case 176400:
595		iec |= HDMI0_60958_CS_SAMPLING_FREQUENCY(0xc);
596		break;
597	case 192000:
598		iec |= HDMI0_60958_CS_SAMPLING_FREQUENCY(0xe);
599		break;
600	}
601
602	WREG32(HDMI0_60958_0 + offset, iec);
603
604	iec = 0;
605	switch (audio.bits_per_sample) {
606	case 16:
607		iec |= HDMI0_60958_CS_WORD_LENGTH(0x2);
608		break;
609	case 20:
610		iec |= HDMI0_60958_CS_WORD_LENGTH(0x3);
611		break;
612	case 24:
613		iec |= HDMI0_60958_CS_WORD_LENGTH(0xb);
614		break;
615	}
616	if (audio.status_bits & AUDIO_STATUS_V)
617		iec |= 0x5 << 16;
618	WREG32_P(HDMI0_60958_1 + offset, iec, ~0x5000f);
619
620	err = hdmi_audio_infoframe_init(&frame);
621	if (err < 0) {
622		DRM_ERROR("failed to setup audio infoframe\n");
623		return;
624	}
625
626	frame.channels = audio.channels;
627
628	err = hdmi_audio_infoframe_pack(&frame, buffer, sizeof(buffer));
629	if (err < 0) {
630		DRM_ERROR("failed to pack audio infoframe\n");
631		return;
632	}
633
 
 
 
 
 
 
 
 
 
 
 
634	r600_hdmi_update_audio_infoframe(encoder, buffer, sizeof(buffer));
635	r600_hdmi_audio_workaround(encoder);
 
 
 
636}
637
638/*
639 * enable the HDMI engine
640 */
641void r600_hdmi_enable(struct drm_encoder *encoder, bool enable)
642{
643	struct drm_device *dev = encoder->dev;
644	struct radeon_device *rdev = dev->dev_private;
645	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
646	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
647	u32 hdmi = HDMI0_ERROR_ACK;
648
649	if (!dig || !dig->afmt)
650		return;
651
652	/* Silent, r600_hdmi_enable will raise WARN for us */
653	if (enable && dig->afmt->enabled)
654		return;
655	if (!enable && !dig->afmt->enabled)
656		return;
657
658	/* Older chipsets require setting HDMI and routing manually */
659	if (!ASIC_IS_DCE3(rdev)) {
660		if (enable)
661			hdmi |= HDMI0_ENABLE;
662		switch (radeon_encoder->encoder_id) {
663		case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
664			if (enable) {
665				WREG32_OR(AVIVO_TMDSA_CNTL, AVIVO_TMDSA_CNTL_HDMI_EN);
666				hdmi |= HDMI0_STREAM(HDMI0_STREAM_TMDSA);
667			} else {
668				WREG32_AND(AVIVO_TMDSA_CNTL, ~AVIVO_TMDSA_CNTL_HDMI_EN);
669			}
670			break;
671		case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
672			if (enable) {
673				WREG32_OR(AVIVO_LVTMA_CNTL, AVIVO_LVTMA_CNTL_HDMI_EN);
674				hdmi |= HDMI0_STREAM(HDMI0_STREAM_LVTMA);
675			} else {
676				WREG32_AND(AVIVO_LVTMA_CNTL, ~AVIVO_LVTMA_CNTL_HDMI_EN);
677			}
678			break;
679		case ENCODER_OBJECT_ID_INTERNAL_DDI:
680			if (enable) {
681				WREG32_OR(DDIA_CNTL, DDIA_HDMI_EN);
682				hdmi |= HDMI0_STREAM(HDMI0_STREAM_DDIA);
683			} else {
684				WREG32_AND(DDIA_CNTL, ~DDIA_HDMI_EN);
685			}
686			break;
687		case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1:
688			if (enable)
689				hdmi |= HDMI0_STREAM(HDMI0_STREAM_DVOA);
690			break;
691		default:
692			dev_err(rdev->dev, "Invalid encoder for HDMI: 0x%X\n",
693				radeon_encoder->encoder_id);
694			break;
695		}
696		WREG32(HDMI0_CONTROL + dig->afmt->offset, hdmi);
697	}
698
699	if (rdev->irq.installed) {
700		/* if irq is available use it */
701		/* XXX: shouldn't need this on any asics.  Double check DCE2/3 */
702		if (enable)
703			radeon_irq_kms_enable_afmt(rdev, dig->afmt->id);
704		else
705			radeon_irq_kms_disable_afmt(rdev, dig->afmt->id);
706	}
707
708	dig->afmt->enabled = enable;
709
710	DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n",
711		  enable ? "En" : "Dis", dig->afmt->offset, radeon_encoder->encoder_id);
712}
713