intel_audio.c 25.2 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
 * 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
56
 * defined in graphics driver and called in audio driver. The
57
 * 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
static const struct {
	int sample_rate;
	int clock;
	int n;
	int cts;
84
} hdmi_aud_ncts[] = {
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
	{ 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
static int audio_config_hdmi_get_n(const struct drm_display_mode *adjusted_mode,
				   int rate)
126 127 128
{
	int i;

129 130 131 132
	for (i = 0; i < ARRAY_SIZE(hdmi_aud_ncts); i++) {
		if (rate == hdmi_aud_ncts[i].sample_rate &&
		    adjusted_mode->crtc_clock == hdmi_aud_ncts[i].clock) {
			return hdmi_aud_ncts[i].n;
133 134 135 136 137
		}
	}
	return 0;
}

138
static bool intel_eld_uptodate(struct drm_connector *connector,
139 140 141
			       i915_reg_t reg_eldv, uint32_t bits_eldv,
			       i915_reg_t reg_elda, uint32_t bits_elda,
			       i915_reg_t reg_edid)
142
{
143
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
144
	uint8_t *eld = connector->eld;
145 146
	uint32_t tmp;
	int i;
147

148 149
	tmp = I915_READ(reg_eldv);
	tmp &= bits_eldv;
150

151
	if (!tmp)
152 153
		return false;

154 155 156
	tmp = I915_READ(reg_elda);
	tmp &= ~bits_elda;
	I915_WRITE(reg_elda, tmp);
157

158
	for (i = 0; i < drm_eld_size(eld) / 4; i++)
159 160 161 162 163 164
		if (I915_READ(reg_edid) != *((uint32_t *)eld + i))
			return false;

	return true;
}

165 166
static void g4x_audio_codec_disable(struct intel_encoder *encoder)
{
167
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
	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);
}

184 185
static void g4x_audio_codec_enable(struct drm_connector *connector,
				   struct intel_encoder *encoder,
186
				   const struct drm_display_mode *adjusted_mode)
187
{
188
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
189 190
	uint8_t *eld = connector->eld;
	uint32_t eldv;
191 192
	uint32_t tmp;
	int len, i;
193

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

196 197
	tmp = I915_READ(G4X_AUD_VID_DID);
	if (tmp == INTEL_AUDIO_DEVBLC || tmp == INTEL_AUDIO_DEVCL)
198 199 200 201 202 203
		eldv = G4X_ELDV_DEVCL_DEVBLC;
	else
		eldv = G4X_ELDV_DEVCTG;

	if (intel_eld_uptodate(connector,
			       G4X_AUD_CNTL_ST, eldv,
204
			       G4X_AUD_CNTL_ST, G4X_ELD_ADDR_MASK,
205 206 207
			       G4X_HDMIW_HDMIEDID))
		return;

208
	tmp = I915_READ(G4X_AUD_CNTL_ST);
209
	tmp &= ~(eldv | G4X_ELD_ADDR_MASK);
210 211
	len = (tmp >> 9) & 0x1f;		/* ELD buffer size */
	I915_WRITE(G4X_AUD_CNTL_ST, tmp);
212

213
	len = min(drm_eld_size(eld) / 4, len);
214 215 216 217
	DRM_DEBUG_DRIVER("ELD size %d\n", len);
	for (i = 0; i < len; i++)
		I915_WRITE(G4X_HDMIW_HDMIEDID, *((uint32_t *)eld + i));

218 219 220
	tmp = I915_READ(G4X_AUD_CNTL_ST);
	tmp |= eldv;
	I915_WRITE(G4X_AUD_CNTL_ST, tmp);
221 222
}

223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
static void
hsw_dp_audio_config_update(struct intel_crtc *intel_crtc, enum port port,
			   const struct drm_display_mode *adjusted_mode)
{
	struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
	enum pipe pipe = intel_crtc->pipe;
	u32 tmp;

	tmp = I915_READ(HSW_AUD_CFG(pipe));
	tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
	tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
	tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
	tmp |= AUD_CONFIG_N_VALUE_INDEX;

	I915_WRITE(HSW_AUD_CFG(pipe), tmp);
}

static void
hsw_hdmi_audio_config_update(struct intel_crtc *intel_crtc, enum port port,
			     const struct drm_display_mode *adjusted_mode)
243 244 245
{
	struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
	struct i915_audio_component *acomp = dev_priv->audio_component;
246
	int rate = acomp ? acomp->aud_sample_rate[port] : 0;
247
	enum pipe pipe = intel_crtc->pipe;
248
	int n;
249 250 251 252 253 254
	u32 tmp;

	tmp = I915_READ(HSW_AUD_CFG(pipe));
	tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
	tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
	tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
255 256
	tmp |= audio_config_hdmi_pixel_clock(adjusted_mode);

257 258
	if (adjusted_mode->crtc_clock == TMDS_296M ||
	    adjusted_mode->crtc_clock == TMDS_297M) {
259
		n = audio_config_hdmi_get_n(adjusted_mode, rate);
260 261 262 263 264
		if (n != 0) {
			tmp &= ~AUD_CONFIG_N_MASK;
			tmp |= AUD_CONFIG_N(n);
			tmp |= AUD_CONFIG_N_PROG_ENABLE;
		} else {
265
			DRM_DEBUG_KMS("no suitable N value is found\n");
266
		}
267 268 269 270 271
	}

	I915_WRITE(HSW_AUD_CFG(pipe), tmp);
}

272 273 274 275 276 277 278 279 280 281
static void
hsw_audio_config_update(struct intel_crtc *intel_crtc, enum port port,
			const struct drm_display_mode *adjusted_mode)
{
	if (intel_crtc_has_dp_encoder(intel_crtc->config))
		hsw_dp_audio_config_update(intel_crtc, port, adjusted_mode);
	else
		hsw_hdmi_audio_config_update(intel_crtc, port, adjusted_mode);
}

282 283
static void hsw_audio_codec_disable(struct intel_encoder *encoder)
{
284
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
285 286
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
	enum pipe pipe = intel_crtc->pipe;
287 288
	uint32_t tmp;

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

291 292
	mutex_lock(&dev_priv->av_mutex);

293 294 295 296 297 298
	/* 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;
299
	if (intel_crtc_has_dp_encoder(intel_crtc->config))
300 301 302 303
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	I915_WRITE(HSW_AUD_CFG(pipe), tmp);

	/* Invalidate ELD */
304
	tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
305
	tmp &= ~AUDIO_ELD_VALID(pipe);
306
	tmp &= ~AUDIO_OUTPUT_ENABLE(pipe);
307
	I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
308 309

	mutex_unlock(&dev_priv->av_mutex);
310 311 312
}

static void hsw_audio_codec_enable(struct drm_connector *connector,
313
				   struct intel_encoder *intel_encoder,
314
				   const struct drm_display_mode *adjusted_mode)
315
{
316
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
317
	struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
318
	enum pipe pipe = intel_crtc->pipe;
319
	enum port port = intel_encoder->port;
320
	const uint8_t *eld = connector->eld;
321 322
	uint32_t tmp;
	int len, i;
323

324
	DRM_DEBUG_KMS("Enable audio codec on pipe %c, %u bytes ELD\n",
325
		      pipe_name(pipe), drm_eld_size(eld));
326

327 328
	mutex_lock(&dev_priv->av_mutex);

329 330
	/* Enable audio presence detect, invalidate ELD */
	tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
331 332
	tmp |= AUDIO_OUTPUT_ENABLE(pipe);
	tmp &= ~AUDIO_ELD_VALID(pipe);
333
	I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
334

335 336 337 338 339 340
	/*
	 * 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.
	 */
341

342 343
	/* Reset ELD write address */
	tmp = I915_READ(HSW_AUD_DIP_ELD_CTRL(pipe));
344
	tmp &= ~IBX_ELD_ADDRESS_MASK;
345
	I915_WRITE(HSW_AUD_DIP_ELD_CTRL(pipe), tmp);
346

347
	/* Up to 84 bytes of hw ELD buffer */
348 349
	len = min(drm_eld_size(eld), 84);
	for (i = 0; i < len / 4; i++)
350
		I915_WRITE(HSW_AUD_EDID_DATA(pipe), *((uint32_t *)eld + i));
351

352
	/* ELD valid */
353
	tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
354
	tmp |= AUDIO_ELD_VALID(pipe);
355
	I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
356 357

	/* Enable timestamps */
358
	hsw_audio_config_update(intel_crtc, port, adjusted_mode);
359 360

	mutex_unlock(&dev_priv->av_mutex);
361 362
}

363
static void ilk_audio_codec_disable(struct intel_encoder *intel_encoder)
364
{
365 366
	struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
	struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
367
	enum pipe pipe = intel_crtc->pipe;
368
	enum port port = intel_encoder->port;
369
	uint32_t tmp, eldv;
370
	i915_reg_t aud_config, aud_cntrl_st2;
371 372 373 374

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

375 376 377
	if (WARN_ON(port == PORT_A))
		return;

378
	if (HAS_PCH_IBX(dev_priv)) {
379 380
		aud_config = IBX_AUD_CFG(pipe);
		aud_cntrl_st2 = IBX_AUD_CNTL_ST2;
381
	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
382 383 384 385 386 387 388 389 390 391 392 393 394
		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;
395
	if (intel_crtc_has_dp_encoder(intel_crtc->config))
396 397 398
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	I915_WRITE(aud_config, tmp);

399
	eldv = IBX_ELD_VALID(port);
400 401 402 403 404 405 406

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

407
static void ilk_audio_codec_enable(struct drm_connector *connector,
408
				   struct intel_encoder *intel_encoder,
409
				   const struct drm_display_mode *adjusted_mode)
410
{
411
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
412
	struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
413
	enum pipe pipe = intel_crtc->pipe;
414
	enum port port = intel_encoder->port;
415
	uint8_t *eld = connector->eld;
416
	uint32_t tmp, eldv;
417
	int len, i;
418
	i915_reg_t hdmiw_hdmiedid, aud_config, aud_cntl_st, aud_cntrl_st2;
419 420

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

423 424 425
	if (WARN_ON(port == PORT_A))
		return;

426 427 428 429 430 431
	/*
	 * 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.
	 */
432 433 434 435 436 437

	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;
438 439
	} else if (IS_VALLEYVIEW(connector->dev) ||
		   IS_CHERRYVIEW(connector->dev)) {
440 441 442 443 444 445 446 447 448 449 450
		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;
	}

451
	eldv = IBX_ELD_VALID(port);
452

453
	/* Invalidate ELD */
454 455 456
	tmp = I915_READ(aud_cntrl_st2);
	tmp &= ~eldv;
	I915_WRITE(aud_cntrl_st2, tmp);
457

458
	/* Reset ELD write address */
459
	tmp = I915_READ(aud_cntl_st);
460
	tmp &= ~IBX_ELD_ADDRESS_MASK;
461
	I915_WRITE(aud_cntl_st, tmp);
462

463
	/* Up to 84 bytes of hw ELD buffer */
464 465
	len = min(drm_eld_size(eld), 84);
	for (i = 0; i < len / 4; i++)
466 467
		I915_WRITE(hdmiw_hdmiedid, *((uint32_t *)eld + i));

468
	/* ELD valid */
469 470 471
	tmp = I915_READ(aud_cntrl_st2);
	tmp |= eldv;
	I915_WRITE(aud_cntrl_st2, tmp);
472 473 474 475 476 477

	/* 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;
478
	if (intel_crtc_has_dp_encoder(intel_crtc->config))
479 480
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	else
481
		tmp |= audio_config_hdmi_pixel_clock(adjusted_mode);
482
	I915_WRITE(aud_config, tmp);
483 484
}

485 486 487 488 489 490 491 492
/**
 * 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)
493
{
494 495
	struct drm_encoder *encoder = &intel_encoder->base;
	struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
496
	const struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode;
497
	struct drm_connector *connector;
498
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
499
	struct i915_audio_component *acomp = dev_priv->audio_component;
500
	enum port port = intel_encoder->port;
501
	enum pipe pipe = crtc->pipe;
502

503
	connector = drm_select_eld(encoder);
504 505 506 507 508 509 510 511 512
	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);

513 514
	/* ELD Conn_Type */
	connector->eld[5] &= ~(3 << 2);
515
	if (intel_crtc_has_dp_encoder(crtc->config))
516 517
		connector->eld[5] |= (1 << 2);

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

520
	if (dev_priv->display.audio_codec_enable)
521 522
		dev_priv->display.audio_codec_enable(connector, intel_encoder,
						     adjusted_mode);
523

524
	mutex_lock(&dev_priv->av_mutex);
525
	intel_encoder->audio_connector = connector;
526

527
	/* referred in audio callbacks */
528
	dev_priv->av_enc_map[pipe] = intel_encoder;
529 530
	mutex_unlock(&dev_priv->av_mutex);

531 532 533 534
	/* audio drivers expect pipe = -1 to indicate Non-MST cases */
	if (intel_encoder->type != INTEL_OUTPUT_DP_MST)
		pipe = -1;

535
	if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
536 537
		acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
						 (int) port, (int) pipe);
538 539 540 541
}

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

	if (dev_priv->display.audio_codec_disable)
557 558
		dev_priv->display.audio_codec_disable(intel_encoder);

559
	mutex_lock(&dev_priv->av_mutex);
560
	intel_encoder->audio_connector = NULL;
561
	dev_priv->av_enc_map[pipe] = NULL;
562 563
	mutex_unlock(&dev_priv->av_mutex);

564 565 566 567
	/* audio drivers expect pipe = -1 to indicate Non-MST cases */
	if (intel_encoder->type != INTEL_OUTPUT_DP_MST)
		pipe = -1;

568
	if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
569 570
		acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
						 (int) port, (int) pipe);
571 572 573
}

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

594
static void i915_audio_component_get_power(struct device *kdev)
I
Imre Deak 已提交
595
{
596
	intel_display_power_get(kdev_to_i915(kdev), POWER_DOMAIN_AUDIO);
I
Imre Deak 已提交
597 598
}

599
static void i915_audio_component_put_power(struct device *kdev)
I
Imre Deak 已提交
600
{
601
	intel_display_power_put(kdev_to_i915(kdev), POWER_DOMAIN_AUDIO);
I
Imre Deak 已提交
602 603
}

604
static void i915_audio_component_codec_wake_override(struct device *kdev,
605 606
						     bool enable)
{
607
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
608 609
	u32 tmp;

610
	if (!IS_SKYLAKE(dev_priv) && !IS_KABYLAKE(dev_priv))
611 612
		return;

613
	i915_audio_component_get_power(kdev);
614

615 616 617 618 619 620 621 622 623 624 625 626 627 628 629
	/*
	 * 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);
	}
630

631
	i915_audio_component_put_power(kdev);
632 633
}

I
Imre Deak 已提交
634
/* Get CDCLK in kHz  */
635
static int i915_audio_component_get_cdclk_freq(struct device *kdev)
I
Imre Deak 已提交
636
{
637
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
I
Imre Deak 已提交
638 639 640 641

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

642
	return dev_priv->cdclk_freq;
I
Imre Deak 已提交
643 644
}

645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672
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)
673
{
674
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
675 676
	struct intel_encoder *intel_encoder;
	struct intel_crtc *crtc;
677
	struct drm_display_mode *adjusted_mode;
678
	struct i915_audio_component *acomp = dev_priv->audio_component;
679
	int err = 0;
680

681
	if (!HAS_DDI(dev_priv))
682 683
		return 0;

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

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

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

700
	adjusted_mode = &crtc->config->base.adjusted_mode;
701

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

705
	hsw_audio_config_update(crtc, port, adjusted_mode);
706

707
 unlock:
708
	mutex_unlock(&dev_priv->av_mutex);
709
	i915_audio_component_put_power(kdev);
710
	return err;
711 712
}

713
static int i915_audio_component_get_eld(struct device *kdev, int port,
714
					int pipe, bool *enabled,
715 716
					unsigned char *buf, int max_bytes)
{
717
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
718 719 720 721 722
	struct intel_encoder *intel_encoder;
	const u8 *eld;
	int ret = -EINVAL;

	mutex_lock(&dev_priv->av_mutex);
723 724 725 726 727 728 729 730 731 732 733 734 735 736

	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));
737 738 739 740
	}

	mutex_unlock(&dev_priv->av_mutex);
	return ret;
741 742
}

I
Imre Deak 已提交
743 744 745 746
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,
747
	.codec_wake_override = i915_audio_component_codec_wake_override,
I
Imre Deak 已提交
748
	.get_cdclk_freq	= i915_audio_component_get_cdclk_freq,
749
	.sync_audio_rate = i915_audio_component_sync_audio_rate,
750
	.get_eld	= i915_audio_component_get_eld,
I
Imre Deak 已提交
751 752
};

753 754
static int i915_audio_component_bind(struct device *i915_kdev,
				     struct device *hda_kdev, void *data)
I
Imre Deak 已提交
755 756
{
	struct i915_audio_component *acomp = data;
757
	struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
758
	int i;
I
Imre Deak 已提交
759 760 761 762

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

763
	drm_modeset_lock_all(&dev_priv->drm);
I
Imre Deak 已提交
764
	acomp->ops = &i915_audio_component_ops;
765
	acomp->dev = i915_kdev;
766 767 768
	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;
769
	dev_priv->audio_component = acomp;
770
	drm_modeset_unlock_all(&dev_priv->drm);
I
Imre Deak 已提交
771 772 773 774

	return 0;
}

775 776
static void i915_audio_component_unbind(struct device *i915_kdev,
					struct device *hda_kdev, void *data)
I
Imre Deak 已提交
777 778
{
	struct i915_audio_component *acomp = data;
779
	struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
I
Imre Deak 已提交
780

781
	drm_modeset_lock_all(&dev_priv->drm);
I
Imre Deak 已提交
782 783
	acomp->ops = NULL;
	acomp->dev = NULL;
784
	dev_priv->audio_component = NULL;
785
	drm_modeset_unlock_all(&dev_priv->drm);
I
Imre Deak 已提交
786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812
}

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;

813
	ret = component_add(dev_priv->drm.dev, &i915_audio_component_bind_ops);
I
Imre Deak 已提交
814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834
	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;

835
	component_del(dev_priv->drm.dev, &i915_audio_component_bind_ops);
I
Imre Deak 已提交
836 837
	dev_priv->audio_component_registered = false;
}