intel_audio.c 25.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * Copyright © 2014 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#include <linux/kernel.h>
I
Imre Deak 已提交
25 26 27
#include <linux/component.h>
#include <drm/i915_component.h>
#include "intel_drv.h"
28 29 30 31 32

#include <drm/drmP.h>
#include <drm/drm_edid.h>
#include "i915_drv.h"

33 34 35 36 37 38 39 40 41 42 43
/**
 * DOC: High Definition Audio over HDMI and Display Port
 *
 * The graphics and audio drivers together support High Definition Audio over
 * HDMI and Display Port. The audio programming sequences are divided into audio
 * codec and controller enable and disable sequences. The graphics driver
 * handles the audio codec sequences, while the audio driver handles the audio
 * controller sequences.
 *
 * The disable sequences must be performed before disabling the transcoder or
 * port. The enable sequences may only be performed after enabling the
44 45
 * transcoder and port, and after completed link training. Therefore the audio
 * enable/disable sequences are part of the modeset sequence.
46 47 48 49 50 51 52
 *
 * The codec and controller sequences could be done either parallel or serial,
 * but generally the ELDV/PD change in the codec sequence indicates to the audio
 * driver that the controller sequence should start. Indeed, most of the
 * co-operation between the graphics and audio drivers is handled via audio
 * related registers. (The notable exception is the power management, not
 * covered here.)
53 54 55 56 57
 *
 * The struct i915_audio_component is used to interact between the graphics
 * and audio drivers. The struct i915_audio_component_ops *ops in it is
 * defined in graphics driver and called in audio driver. The
 * struct i915_audio_component_audio_ops *audio_ops is called from i915 driver.
58 59
 */

60
static const struct {
61 62 63
	int clock;
	u32 config;
} hdmi_audio_clock[] = {
64
	{ 25175, AUD_CONFIG_PIXEL_CLOCK_HDMI_25175 },
65 66
	{ 25200, AUD_CONFIG_PIXEL_CLOCK_HDMI_25200 }, /* default per bspec */
	{ 27000, AUD_CONFIG_PIXEL_CLOCK_HDMI_27000 },
67
	{ 27027, AUD_CONFIG_PIXEL_CLOCK_HDMI_27027 },
68
	{ 54000, AUD_CONFIG_PIXEL_CLOCK_HDMI_54000 },
69 70
	{ 54054, AUD_CONFIG_PIXEL_CLOCK_HDMI_54054 },
	{ 74176, AUD_CONFIG_PIXEL_CLOCK_HDMI_74176 },
71
	{ 74250, AUD_CONFIG_PIXEL_CLOCK_HDMI_74250 },
72
	{ 148352, AUD_CONFIG_PIXEL_CLOCK_HDMI_148352 },
73 74 75
	{ 148500, AUD_CONFIG_PIXEL_CLOCK_HDMI_148500 },
};

76 77
/* HDMI N/CTS table */
#define TMDS_297M 297000
78
#define TMDS_296M 296703
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
static const struct {
	int sample_rate;
	int clock;
	int n;
	int cts;
} aud_ncts[] = {
	{ 44100, TMDS_296M, 4459, 234375 },
	{ 44100, TMDS_297M, 4704, 247500 },
	{ 48000, TMDS_296M, 5824, 281250 },
	{ 48000, TMDS_297M, 5120, 247500 },
	{ 32000, TMDS_296M, 5824, 421875 },
	{ 32000, TMDS_297M, 3072, 222750 },
	{ 88200, TMDS_296M, 8918, 234375 },
	{ 88200, TMDS_297M, 9408, 247500 },
	{ 96000, TMDS_296M, 11648, 281250 },
	{ 96000, TMDS_297M, 10240, 247500 },
	{ 176400, TMDS_296M, 17836, 234375 },
	{ 176400, TMDS_297M, 18816, 247500 },
	{ 192000, TMDS_296M, 23296, 281250 },
	{ 192000, TMDS_297M, 20480, 247500 },
};

101
/* get AUD_CONFIG_PIXEL_CLOCK_HDMI_* value for mode */
102
static u32 audio_config_hdmi_pixel_clock(const struct drm_display_mode *adjusted_mode)
103 104 105 106
{
	int i;

	for (i = 0; i < ARRAY_SIZE(hdmi_audio_clock); i++) {
107
		if (adjusted_mode->crtc_clock == hdmi_audio_clock[i].clock)
108 109 110 111
			break;
	}

	if (i == ARRAY_SIZE(hdmi_audio_clock)) {
112
		DRM_DEBUG_KMS("HDMI audio pixel clock setting for %d not found, falling back to defaults\n",
113
			      adjusted_mode->crtc_clock);
114 115 116 117 118 119 120 121 122 123
		i = 1;
	}

	DRM_DEBUG_KMS("Configuring HDMI audio for pixel clock %d (0x%08x)\n",
		      hdmi_audio_clock[i].clock,
		      hdmi_audio_clock[i].config);

	return hdmi_audio_clock[i].config;
}

124 125 126 127 128 129 130 131 132 133 134 135 136
static int audio_config_get_n(const struct drm_display_mode *mode, int rate)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(aud_ncts); i++) {
		if ((rate == aud_ncts[i].sample_rate) &&
			(mode->clock == aud_ncts[i].clock)) {
			return aud_ncts[i].n;
		}
	}
	return 0;
}

137 138 139 140 141 142 143 144 145 146 147 148 149 150
static uint32_t audio_config_setup_n_reg(int n, uint32_t val)
{
	int n_low, n_up;
	uint32_t tmp = val;

	n_low = n & 0xfff;
	n_up = (n >> 12) & 0xff;
	tmp &= ~(AUD_CONFIG_UPPER_N_MASK | AUD_CONFIG_LOWER_N_MASK);
	tmp |= ((n_up << AUD_CONFIG_UPPER_N_SHIFT) |
			(n_low << AUD_CONFIG_LOWER_N_SHIFT) |
			AUD_CONFIG_N_PROG_ENABLE);
	return tmp;
}

151 152
/* check whether N/CTS/M need be set manually */
static bool audio_rate_need_prog(struct intel_crtc *crtc,
153
				 const struct drm_display_mode *mode)
154 155 156
{
	if (((mode->clock == TMDS_297M) ||
		 (mode->clock == TMDS_296M)) &&
157
		intel_crtc_has_type(crtc->config, INTEL_OUTPUT_HDMI))
158 159 160 161 162
		return true;
	else
		return false;
}

163
static bool intel_eld_uptodate(struct drm_connector *connector,
164 165 166
			       i915_reg_t reg_eldv, uint32_t bits_eldv,
			       i915_reg_t reg_elda, uint32_t bits_elda,
			       i915_reg_t reg_edid)
167
{
168
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
169
	uint8_t *eld = connector->eld;
170 171
	uint32_t tmp;
	int i;
172

173 174
	tmp = I915_READ(reg_eldv);
	tmp &= bits_eldv;
175

176
	if (!tmp)
177 178
		return false;

179 180 181
	tmp = I915_READ(reg_elda);
	tmp &= ~bits_elda;
	I915_WRITE(reg_elda, tmp);
182

183
	for (i = 0; i < drm_eld_size(eld) / 4; i++)
184 185 186 187 188 189
		if (I915_READ(reg_edid) != *((uint32_t *)eld + i))
			return false;

	return true;
}

190 191
static void g4x_audio_codec_disable(struct intel_encoder *encoder)
{
192
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
	uint32_t eldv, tmp;

	DRM_DEBUG_KMS("Disable audio codec\n");

	tmp = I915_READ(G4X_AUD_VID_DID);
	if (tmp == INTEL_AUDIO_DEVBLC || tmp == INTEL_AUDIO_DEVCL)
		eldv = G4X_ELDV_DEVCL_DEVBLC;
	else
		eldv = G4X_ELDV_DEVCTG;

	/* Invalidate ELD */
	tmp = I915_READ(G4X_AUD_CNTL_ST);
	tmp &= ~eldv;
	I915_WRITE(G4X_AUD_CNTL_ST, tmp);
}

209 210
static void g4x_audio_codec_enable(struct drm_connector *connector,
				   struct intel_encoder *encoder,
211
				   const struct drm_display_mode *adjusted_mode)
212
{
213
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
214 215
	uint8_t *eld = connector->eld;
	uint32_t eldv;
216 217
	uint32_t tmp;
	int len, i;
218

219 220
	DRM_DEBUG_KMS("Enable audio codec, %u bytes ELD\n", eld[2]);

221 222
	tmp = I915_READ(G4X_AUD_VID_DID);
	if (tmp == INTEL_AUDIO_DEVBLC || tmp == INTEL_AUDIO_DEVCL)
223 224 225 226 227 228
		eldv = G4X_ELDV_DEVCL_DEVBLC;
	else
		eldv = G4X_ELDV_DEVCTG;

	if (intel_eld_uptodate(connector,
			       G4X_AUD_CNTL_ST, eldv,
229
			       G4X_AUD_CNTL_ST, G4X_ELD_ADDR_MASK,
230 231 232
			       G4X_HDMIW_HDMIEDID))
		return;

233
	tmp = I915_READ(G4X_AUD_CNTL_ST);
234
	tmp &= ~(eldv | G4X_ELD_ADDR_MASK);
235 236
	len = (tmp >> 9) & 0x1f;		/* ELD buffer size */
	I915_WRITE(G4X_AUD_CNTL_ST, tmp);
237

238
	len = min(drm_eld_size(eld) / 4, len);
239 240 241 242
	DRM_DEBUG_DRIVER("ELD size %d\n", len);
	for (i = 0; i < len; i++)
		I915_WRITE(G4X_HDMIW_HDMIEDID, *((uint32_t *)eld + i));

243 244 245
	tmp = I915_READ(G4X_AUD_CNTL_ST);
	tmp |= eldv;
	I915_WRITE(G4X_AUD_CNTL_ST, tmp);
246 247
}

248 249
static void hsw_audio_codec_disable(struct intel_encoder *encoder)
{
250
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
251 252
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
	enum pipe pipe = intel_crtc->pipe;
253 254
	uint32_t tmp;

255 256
	DRM_DEBUG_KMS("Disable audio codec on pipe %c\n", pipe_name(pipe));

257 258
	mutex_lock(&dev_priv->av_mutex);

259 260 261 262 263 264
	/* Disable timestamps */
	tmp = I915_READ(HSW_AUD_CFG(pipe));
	tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
	tmp |= AUD_CONFIG_N_PROG_ENABLE;
	tmp &= ~AUD_CONFIG_UPPER_N_MASK;
	tmp &= ~AUD_CONFIG_LOWER_N_MASK;
265
	if (intel_crtc_has_dp_encoder(intel_crtc->config))
266 267 268 269
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	I915_WRITE(HSW_AUD_CFG(pipe), tmp);

	/* Invalidate ELD */
270
	tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
271
	tmp &= ~AUDIO_ELD_VALID(pipe);
272
	tmp &= ~AUDIO_OUTPUT_ENABLE(pipe);
273
	I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
274 275

	mutex_unlock(&dev_priv->av_mutex);
276 277 278
}

static void hsw_audio_codec_enable(struct drm_connector *connector,
279
				   struct intel_encoder *intel_encoder,
280
				   const struct drm_display_mode *adjusted_mode)
281
{
282
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
283
	struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
284
	enum pipe pipe = intel_crtc->pipe;
285
	enum port port = intel_encoder->port;
286
	struct i915_audio_component *acomp = dev_priv->audio_component;
287
	const uint8_t *eld = connector->eld;
288 289
	uint32_t tmp;
	int len, i;
290
	int n, rate;
291

292
	DRM_DEBUG_KMS("Enable audio codec on pipe %c, %u bytes ELD\n",
293
		      pipe_name(pipe), drm_eld_size(eld));
294

295 296
	mutex_lock(&dev_priv->av_mutex);

297 298
	/* Enable audio presence detect, invalidate ELD */
	tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
299 300
	tmp |= AUDIO_OUTPUT_ENABLE(pipe);
	tmp &= ~AUDIO_ELD_VALID(pipe);
301
	I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
302

303 304 305 306 307 308
	/*
	 * FIXME: We're supposed to wait for vblank here, but we have vblanks
	 * disabled during the mode set. The proper fix would be to push the
	 * rest of the setup into a vblank work item, queued here, but the
	 * infrastructure is not there yet.
	 */
309

310 311
	/* Reset ELD write address */
	tmp = I915_READ(HSW_AUD_DIP_ELD_CTRL(pipe));
312
	tmp &= ~IBX_ELD_ADDRESS_MASK;
313
	I915_WRITE(HSW_AUD_DIP_ELD_CTRL(pipe), tmp);
314

315
	/* Up to 84 bytes of hw ELD buffer */
316 317
	len = min(drm_eld_size(eld), 84);
	for (i = 0; i < len / 4; i++)
318
		I915_WRITE(HSW_AUD_EDID_DATA(pipe), *((uint32_t *)eld + i));
319

320
	/* ELD valid */
321
	tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
322
	tmp |= AUDIO_ELD_VALID(pipe);
323
	I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
324 325 326 327 328

	/* Enable timestamps */
	tmp = I915_READ(HSW_AUD_CFG(pipe));
	tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
	tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
329
	if (intel_crtc_has_dp_encoder(intel_crtc->config))
330 331
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	else
332
		tmp |= audio_config_hdmi_pixel_clock(adjusted_mode);
333 334

	tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
335
	if (audio_rate_need_prog(intel_crtc, adjusted_mode)) {
336 337 338 339 340 341 342 343
		if (!acomp)
			rate = 0;
		else if (port >= PORT_A && port <= PORT_E)
			rate = acomp->aud_sample_rate[port];
		else {
			DRM_ERROR("invalid port: %d\n", port);
			rate = 0;
		}
344
		n = audio_config_get_n(adjusted_mode, rate);
345 346 347 348 349 350
		if (n != 0)
			tmp = audio_config_setup_n_reg(n, tmp);
		else
			DRM_DEBUG_KMS("no suitable N value is found\n");
	}

351
	I915_WRITE(HSW_AUD_CFG(pipe), tmp);
352 353

	mutex_unlock(&dev_priv->av_mutex);
354 355
}

356
static void ilk_audio_codec_disable(struct intel_encoder *intel_encoder)
357
{
358 359
	struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
	struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
360
	enum pipe pipe = intel_crtc->pipe;
361
	enum port port = intel_encoder->port;
362
	uint32_t tmp, eldv;
363
	i915_reg_t aud_config, aud_cntrl_st2;
364 365 366 367

	DRM_DEBUG_KMS("Disable audio codec on port %c, pipe %c\n",
		      port_name(port), pipe_name(pipe));

368 369 370
	if (WARN_ON(port == PORT_A))
		return;

371
	if (HAS_PCH_IBX(dev_priv)) {
372 373
		aud_config = IBX_AUD_CFG(pipe);
		aud_cntrl_st2 = IBX_AUD_CNTL_ST2;
374
	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
375 376 377 378 379 380 381 382 383 384 385 386 387
		aud_config = VLV_AUD_CFG(pipe);
		aud_cntrl_st2 = VLV_AUD_CNTL_ST2;
	} else {
		aud_config = CPT_AUD_CFG(pipe);
		aud_cntrl_st2 = CPT_AUD_CNTRL_ST2;
	}

	/* Disable timestamps */
	tmp = I915_READ(aud_config);
	tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
	tmp |= AUD_CONFIG_N_PROG_ENABLE;
	tmp &= ~AUD_CONFIG_UPPER_N_MASK;
	tmp &= ~AUD_CONFIG_LOWER_N_MASK;
388
	if (intel_crtc_has_dp_encoder(intel_crtc->config))
389 390 391
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	I915_WRITE(aud_config, tmp);

392
	eldv = IBX_ELD_VALID(port);
393 394 395 396 397 398 399

	/* Invalidate ELD */
	tmp = I915_READ(aud_cntrl_st2);
	tmp &= ~eldv;
	I915_WRITE(aud_cntrl_st2, tmp);
}

400
static void ilk_audio_codec_enable(struct drm_connector *connector,
401
				   struct intel_encoder *intel_encoder,
402
				   const struct drm_display_mode *adjusted_mode)
403
{
404
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
405
	struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
406
	enum pipe pipe = intel_crtc->pipe;
407
	enum port port = intel_encoder->port;
408
	uint8_t *eld = connector->eld;
409
	uint32_t tmp, eldv;
410
	int len, i;
411
	i915_reg_t hdmiw_hdmiedid, aud_config, aud_cntl_st, aud_cntrl_st2;
412 413

	DRM_DEBUG_KMS("Enable audio codec on port %c, pipe %c, %u bytes ELD\n",
414
		      port_name(port), pipe_name(pipe), drm_eld_size(eld));
415

416 417 418
	if (WARN_ON(port == PORT_A))
		return;

419 420 421 422 423 424
	/*
	 * FIXME: We're supposed to wait for vblank here, but we have vblanks
	 * disabled during the mode set. The proper fix would be to push the
	 * rest of the setup into a vblank work item, queued here, but the
	 * infrastructure is not there yet.
	 */
425 426 427 428 429 430

	if (HAS_PCH_IBX(connector->dev)) {
		hdmiw_hdmiedid = IBX_HDMIW_HDMIEDID(pipe);
		aud_config = IBX_AUD_CFG(pipe);
		aud_cntl_st = IBX_AUD_CNTL_ST(pipe);
		aud_cntrl_st2 = IBX_AUD_CNTL_ST2;
431 432
	} else if (IS_VALLEYVIEW(connector->dev) ||
		   IS_CHERRYVIEW(connector->dev)) {
433 434 435 436 437 438 439 440 441 442 443
		hdmiw_hdmiedid = VLV_HDMIW_HDMIEDID(pipe);
		aud_config = VLV_AUD_CFG(pipe);
		aud_cntl_st = VLV_AUD_CNTL_ST(pipe);
		aud_cntrl_st2 = VLV_AUD_CNTL_ST2;
	} else {
		hdmiw_hdmiedid = CPT_HDMIW_HDMIEDID(pipe);
		aud_config = CPT_AUD_CFG(pipe);
		aud_cntl_st = CPT_AUD_CNTL_ST(pipe);
		aud_cntrl_st2 = CPT_AUD_CNTRL_ST2;
	}

444
	eldv = IBX_ELD_VALID(port);
445

446
	/* Invalidate ELD */
447 448 449
	tmp = I915_READ(aud_cntrl_st2);
	tmp &= ~eldv;
	I915_WRITE(aud_cntrl_st2, tmp);
450

451
	/* Reset ELD write address */
452
	tmp = I915_READ(aud_cntl_st);
453
	tmp &= ~IBX_ELD_ADDRESS_MASK;
454
	I915_WRITE(aud_cntl_st, tmp);
455

456
	/* Up to 84 bytes of hw ELD buffer */
457 458
	len = min(drm_eld_size(eld), 84);
	for (i = 0; i < len / 4; i++)
459 460
		I915_WRITE(hdmiw_hdmiedid, *((uint32_t *)eld + i));

461
	/* ELD valid */
462 463 464
	tmp = I915_READ(aud_cntrl_st2);
	tmp |= eldv;
	I915_WRITE(aud_cntrl_st2, tmp);
465 466 467 468 469 470

	/* Enable timestamps */
	tmp = I915_READ(aud_config);
	tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
	tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
	tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
471
	if (intel_crtc_has_dp_encoder(intel_crtc->config))
472 473
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	else
474
		tmp |= audio_config_hdmi_pixel_clock(adjusted_mode);
475
	I915_WRITE(aud_config, tmp);
476 477
}

478 479 480 481 482 483 484 485
/**
 * intel_audio_codec_enable - Enable the audio codec for HD audio
 * @intel_encoder: encoder on which to enable audio
 *
 * The enable sequences may only be performed after enabling the transcoder and
 * port, and after completed link training.
 */
void intel_audio_codec_enable(struct intel_encoder *intel_encoder)
486
{
487 488
	struct drm_encoder *encoder = &intel_encoder->base;
	struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
489
	const struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode;
490
	struct drm_connector *connector;
491
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
492
	struct i915_audio_component *acomp = dev_priv->audio_component;
493
	enum port port = intel_encoder->port;
494
	enum pipe pipe = crtc->pipe;
495

496
	connector = drm_select_eld(encoder);
497 498 499 500 501 502 503 504 505
	if (!connector)
		return;

	DRM_DEBUG_DRIVER("ELD on [CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
			 connector->base.id,
			 connector->name,
			 connector->encoder->base.id,
			 connector->encoder->name);

506 507
	/* ELD Conn_Type */
	connector->eld[5] &= ~(3 << 2);
508
	if (intel_crtc_has_dp_encoder(crtc->config))
509 510
		connector->eld[5] |= (1 << 2);

511
	connector->eld[6] = drm_av_sync_delay(connector, adjusted_mode) / 2;
512

513
	if (dev_priv->display.audio_codec_enable)
514 515
		dev_priv->display.audio_codec_enable(connector, intel_encoder,
						     adjusted_mode);
516

517
	mutex_lock(&dev_priv->av_mutex);
518
	intel_encoder->audio_connector = connector;
519

520
	/* referred in audio callbacks */
521
	dev_priv->av_enc_map[pipe] = intel_encoder;
522 523
	mutex_unlock(&dev_priv->av_mutex);

524 525 526 527
	/* audio drivers expect pipe = -1 to indicate Non-MST cases */
	if (intel_encoder->type != INTEL_OUTPUT_DP_MST)
		pipe = -1;

528
	if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
529 530
		acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
						 (int) port, (int) pipe);
531 532 533 534
}

/**
 * intel_audio_codec_disable - Disable the audio codec for HD audio
535
 * @intel_encoder: encoder on which to disable audio
536 537 538 539
 *
 * The disable sequences must be performed before disabling the transcoder or
 * port.
 */
540
void intel_audio_codec_disable(struct intel_encoder *intel_encoder)
541
{
542
	struct drm_encoder *encoder = &intel_encoder->base;
543
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
544
	struct i915_audio_component *acomp = dev_priv->audio_component;
545
	enum port port = intel_encoder->port;
546 547
	struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
	enum pipe pipe = crtc->pipe;
548 549

	if (dev_priv->display.audio_codec_disable)
550 551
		dev_priv->display.audio_codec_disable(intel_encoder);

552
	mutex_lock(&dev_priv->av_mutex);
553
	intel_encoder->audio_connector = NULL;
554
	dev_priv->av_enc_map[pipe] = NULL;
555 556
	mutex_unlock(&dev_priv->av_mutex);

557 558 559 560
	/* audio drivers expect pipe = -1 to indicate Non-MST cases */
	if (intel_encoder->type != INTEL_OUTPUT_DP_MST)
		pipe = -1;

561
	if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
562 563
		acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
						 (int) port, (int) pipe);
564 565 566
}

/**
567 568
 * intel_init_audio_hooks - Set up chip specific audio hooks
 * @dev_priv: device private
569
 */
570
void intel_init_audio_hooks(struct drm_i915_private *dev_priv)
571
{
572
	if (IS_G4X(dev_priv)) {
573
		dev_priv->display.audio_codec_enable = g4x_audio_codec_enable;
574
		dev_priv->display.audio_codec_disable = g4x_audio_codec_disable;
575
	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
576
		dev_priv->display.audio_codec_enable = ilk_audio_codec_enable;
577
		dev_priv->display.audio_codec_disable = ilk_audio_codec_disable;
578
	} else if (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8) {
579 580
		dev_priv->display.audio_codec_enable = hsw_audio_codec_enable;
		dev_priv->display.audio_codec_disable = hsw_audio_codec_disable;
581
	} else if (HAS_PCH_SPLIT(dev_priv)) {
582
		dev_priv->display.audio_codec_enable = ilk_audio_codec_enable;
583
		dev_priv->display.audio_codec_disable = ilk_audio_codec_disable;
584
	}
585
}
I
Imre Deak 已提交
586

587
static void i915_audio_component_get_power(struct device *kdev)
I
Imre Deak 已提交
588
{
589
	intel_display_power_get(kdev_to_i915(kdev), POWER_DOMAIN_AUDIO);
I
Imre Deak 已提交
590 591
}

592
static void i915_audio_component_put_power(struct device *kdev)
I
Imre Deak 已提交
593
{
594
	intel_display_power_put(kdev_to_i915(kdev), POWER_DOMAIN_AUDIO);
I
Imre Deak 已提交
595 596
}

597
static void i915_audio_component_codec_wake_override(struct device *kdev,
598 599
						     bool enable)
{
600
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
601 602
	u32 tmp;

603
	if (!IS_SKYLAKE(dev_priv) && !IS_KABYLAKE(dev_priv))
604 605
		return;

606
	i915_audio_component_get_power(kdev);
607

608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
	/*
	 * Enable/disable generating the codec wake signal, overriding the
	 * internal logic to generate the codec wake to controller.
	 */
	tmp = I915_READ(HSW_AUD_CHICKENBIT);
	tmp &= ~SKL_AUD_CODEC_WAKE_SIGNAL;
	I915_WRITE(HSW_AUD_CHICKENBIT, tmp);
	usleep_range(1000, 1500);

	if (enable) {
		tmp = I915_READ(HSW_AUD_CHICKENBIT);
		tmp |= SKL_AUD_CODEC_WAKE_SIGNAL;
		I915_WRITE(HSW_AUD_CHICKENBIT, tmp);
		usleep_range(1000, 1500);
	}
623

624
	i915_audio_component_put_power(kdev);
625 626
}

I
Imre Deak 已提交
627
/* Get CDCLK in kHz  */
628
static int i915_audio_component_get_cdclk_freq(struct device *kdev)
I
Imre Deak 已提交
629
{
630
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
I
Imre Deak 已提交
631 632 633 634

	if (WARN_ON_ONCE(!HAS_DDI(dev_priv)))
		return -ENODEV;

635
	return dev_priv->cdclk_freq;
I
Imre Deak 已提交
636 637
}

638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665
static struct intel_encoder *get_saved_enc(struct drm_i915_private *dev_priv,
					       int port, int pipe)
{

	if (WARN_ON(pipe >= I915_MAX_PIPES))
		return NULL;

	/* MST */
	if (pipe >= 0)
		return dev_priv->av_enc_map[pipe];

	/* Non-MST */
	for_each_pipe(dev_priv, pipe) {
		struct intel_encoder *encoder;

		encoder = dev_priv->av_enc_map[pipe];
		if (encoder == NULL)
			continue;

		if (port == encoder->port)
			return encoder;
	}

	return NULL;
}

static int i915_audio_component_sync_audio_rate(struct device *kdev, int port,
						int pipe, int rate)
666
{
667
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
668 669 670
	struct intel_encoder *intel_encoder;
	struct intel_crtc *crtc;
	struct drm_display_mode *mode;
671
	struct i915_audio_component *acomp = dev_priv->audio_component;
672
	u32 tmp;
673
	int n;
674
	int err = 0;
675

676
	/* HSW, BDW, SKL, KBL need this fix */
677
	if (!IS_SKYLAKE(dev_priv) &&
678 679 680
	    !IS_KABYLAKE(dev_priv) &&
	    !IS_BROADWELL(dev_priv) &&
	    !IS_HASWELL(dev_priv))
681 682
		return 0;

683
	i915_audio_component_get_power(kdev);
684
	mutex_lock(&dev_priv->av_mutex);
685

686
	/* 1. get the pipe */
687
	intel_encoder = get_saved_enc(dev_priv, port, pipe);
688 689
	if (!intel_encoder || !intel_encoder->base.crtc ||
	    intel_encoder->type != INTEL_OUTPUT_HDMI) {
690
		DRM_DEBUG_KMS("Not valid for port %c\n", port_name(port));
691 692
		err = -ENODEV;
		goto unlock;
693
	}
694 695

	/* pipe passed from the audio driver will be -1 for Non-MST case */
696 697 698
	crtc = to_intel_crtc(intel_encoder->base.crtc);
	pipe = crtc->pipe;

699 700
	mode = &crtc->config->base.adjusted_mode;

701 702 703
	/* port must be valid now, otherwise the pipe will be invalid */
	acomp->aud_sample_rate[port] = rate;

704 705 706 707 708
	/* 2. check whether to set the N/CTS/M manually or not */
	if (!audio_rate_need_prog(crtc, mode)) {
		tmp = I915_READ(HSW_AUD_CFG(pipe));
		tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
		I915_WRITE(HSW_AUD_CFG(pipe), tmp);
709
		goto unlock;
710 711 712 713 714 715 716 717 718
	}

	n = audio_config_get_n(mode, rate);
	if (n == 0) {
		DRM_DEBUG_KMS("Using automatic mode for N value on port %c\n",
					  port_name(port));
		tmp = I915_READ(HSW_AUD_CFG(pipe));
		tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
		I915_WRITE(HSW_AUD_CFG(pipe), tmp);
719
		goto unlock;
720 721
	}

722
	/* 3. set the N/CTS/M */
723
	tmp = I915_READ(HSW_AUD_CFG(pipe));
724
	tmp = audio_config_setup_n_reg(n, tmp);
725 726
	I915_WRITE(HSW_AUD_CFG(pipe), tmp);

727
 unlock:
728
	mutex_unlock(&dev_priv->av_mutex);
729
	i915_audio_component_put_power(kdev);
730
	return err;
731 732
}

733
static int i915_audio_component_get_eld(struct device *kdev, int port,
734
					int pipe, bool *enabled,
735 736
					unsigned char *buf, int max_bytes)
{
737
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
738 739 740 741 742
	struct intel_encoder *intel_encoder;
	const u8 *eld;
	int ret = -EINVAL;

	mutex_lock(&dev_priv->av_mutex);
743 744 745 746 747 748 749 750 751 752 753 754 755 756

	intel_encoder = get_saved_enc(dev_priv, port, pipe);
	if (!intel_encoder) {
		DRM_DEBUG_KMS("Not valid for port %c\n", port_name(port));
		mutex_unlock(&dev_priv->av_mutex);
		return ret;
	}

	ret = 0;
	*enabled = intel_encoder->audio_connector != NULL;
	if (*enabled) {
		eld = intel_encoder->audio_connector->eld;
		ret = drm_eld_size(eld);
		memcpy(buf, eld, min(max_bytes, ret));
757 758 759 760
	}

	mutex_unlock(&dev_priv->av_mutex);
	return ret;
761 762
}

I
Imre Deak 已提交
763 764 765 766
static const struct i915_audio_component_ops i915_audio_component_ops = {
	.owner		= THIS_MODULE,
	.get_power	= i915_audio_component_get_power,
	.put_power	= i915_audio_component_put_power,
767
	.codec_wake_override = i915_audio_component_codec_wake_override,
I
Imre Deak 已提交
768
	.get_cdclk_freq	= i915_audio_component_get_cdclk_freq,
769
	.sync_audio_rate = i915_audio_component_sync_audio_rate,
770
	.get_eld	= i915_audio_component_get_eld,
I
Imre Deak 已提交
771 772
};

773 774
static int i915_audio_component_bind(struct device *i915_kdev,
				     struct device *hda_kdev, void *data)
I
Imre Deak 已提交
775 776
{
	struct i915_audio_component *acomp = data;
777
	struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
778
	int i;
I
Imre Deak 已提交
779 780 781 782

	if (WARN_ON(acomp->ops || acomp->dev))
		return -EEXIST;

783
	drm_modeset_lock_all(&dev_priv->drm);
I
Imre Deak 已提交
784
	acomp->ops = &i915_audio_component_ops;
785
	acomp->dev = i915_kdev;
786 787 788
	BUILD_BUG_ON(MAX_PORTS != I915_MAX_PORTS);
	for (i = 0; i < ARRAY_SIZE(acomp->aud_sample_rate); i++)
		acomp->aud_sample_rate[i] = 0;
789
	dev_priv->audio_component = acomp;
790
	drm_modeset_unlock_all(&dev_priv->drm);
I
Imre Deak 已提交
791 792 793 794

	return 0;
}

795 796
static void i915_audio_component_unbind(struct device *i915_kdev,
					struct device *hda_kdev, void *data)
I
Imre Deak 已提交
797 798
{
	struct i915_audio_component *acomp = data;
799
	struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
I
Imre Deak 已提交
800

801
	drm_modeset_lock_all(&dev_priv->drm);
I
Imre Deak 已提交
802 803
	acomp->ops = NULL;
	acomp->dev = NULL;
804
	dev_priv->audio_component = NULL;
805
	drm_modeset_unlock_all(&dev_priv->drm);
I
Imre Deak 已提交
806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832
}

static const struct component_ops i915_audio_component_bind_ops = {
	.bind	= i915_audio_component_bind,
	.unbind	= i915_audio_component_unbind,
};

/**
 * i915_audio_component_init - initialize and register the audio component
 * @dev_priv: i915 device instance
 *
 * This will register with the component framework a child component which
 * will bind dynamically to the snd_hda_intel driver's corresponding master
 * component when the latter is registered. During binding the child
 * initializes an instance of struct i915_audio_component which it receives
 * from the master. The master can then start to use the interface defined by
 * this struct. Each side can break the binding at any point by deregistering
 * its own component after which each side's component unbind callback is
 * called.
 *
 * We ignore any error during registration and continue with reduced
 * functionality (i.e. without HDMI audio).
 */
void i915_audio_component_init(struct drm_i915_private *dev_priv)
{
	int ret;

833
	ret = component_add(dev_priv->drm.dev, &i915_audio_component_bind_ops);
I
Imre Deak 已提交
834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854
	if (ret < 0) {
		DRM_ERROR("failed to add audio component (%d)\n", ret);
		/* continue with reduced functionality */
		return;
	}

	dev_priv->audio_component_registered = true;
}

/**
 * i915_audio_component_cleanup - deregister the audio component
 * @dev_priv: i915 device instance
 *
 * Deregisters the audio component, breaking any existing binding to the
 * corresponding snd_hda_intel driver's master component.
 */
void i915_audio_component_cleanup(struct drm_i915_private *dev_priv)
{
	if (!dev_priv->audio_component_registered)
		return;

855
	component_del(dev_priv->drm.dev, &i915_audio_component_bind_ops);
I
Imre Deak 已提交
856 857
	dev_priv->audio_component_registered = false;
}