intel_audio.c 27.7 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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
/* DP N/M table */
#define LC_540M	540000
#define LC_270M	270000
#define LC_162M	162000

struct dp_aud_n_m {
	int sample_rate;
	int clock;
	u16 m;
	u16 n;
};

/* Values according to DP 1.4 Table 2-104 */
static const struct dp_aud_n_m dp_aud_n_m[] = {
	{ 32000, LC_162M, 1024, 10125 },
	{ 44100, LC_162M, 784, 5625 },
	{ 48000, LC_162M, 512, 3375 },
	{ 64000, LC_162M, 2048, 10125 },
	{ 88200, LC_162M, 1568, 5625 },
	{ 96000, LC_162M, 1024, 3375 },
	{ 128000, LC_162M, 4096, 10125 },
	{ 176400, LC_162M, 3136, 5625 },
	{ 192000, LC_162M, 2048, 3375 },
	{ 32000, LC_270M, 1024, 16875 },
	{ 44100, LC_270M, 784, 9375 },
	{ 48000, LC_270M, 512, 5625 },
	{ 64000, LC_270M, 2048, 16875 },
	{ 88200, LC_270M, 1568, 9375 },
	{ 96000, LC_270M, 1024, 5625 },
	{ 128000, LC_270M, 4096, 16875 },
	{ 176400, LC_270M, 3136, 9375 },
	{ 192000, LC_270M, 2048, 5625 },
	{ 32000, LC_540M, 1024, 33750 },
	{ 44100, LC_540M, 784, 18750 },
	{ 48000, LC_540M, 512, 11250 },
	{ 64000, LC_540M, 2048, 33750 },
	{ 88200, LC_540M, 1568, 18750 },
	{ 96000, LC_540M, 1024, 11250 },
	{ 128000, LC_540M, 4096, 33750 },
	{ 176400, LC_540M, 3136, 18750 },
	{ 192000, LC_540M, 2048, 11250 },
};

static const struct dp_aud_n_m *
audio_config_dp_get_n_m(struct intel_crtc *intel_crtc, int rate)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(dp_aud_n_m); i++) {
		if (rate == dp_aud_n_m[i].sample_rate &&
		    intel_crtc->config->port_clock == dp_aud_n_m[i].clock)
			return &dp_aud_n_m[i];
	}

	return NULL;
}

117
static const struct {
118 119 120
	int clock;
	u32 config;
} hdmi_audio_clock[] = {
121
	{ 25175, AUD_CONFIG_PIXEL_CLOCK_HDMI_25175 },
122 123
	{ 25200, AUD_CONFIG_PIXEL_CLOCK_HDMI_25200 }, /* default per bspec */
	{ 27000, AUD_CONFIG_PIXEL_CLOCK_HDMI_27000 },
124
	{ 27027, AUD_CONFIG_PIXEL_CLOCK_HDMI_27027 },
125
	{ 54000, AUD_CONFIG_PIXEL_CLOCK_HDMI_54000 },
126 127
	{ 54054, AUD_CONFIG_PIXEL_CLOCK_HDMI_54054 },
	{ 74176, AUD_CONFIG_PIXEL_CLOCK_HDMI_74176 },
128
	{ 74250, AUD_CONFIG_PIXEL_CLOCK_HDMI_74250 },
129
	{ 148352, AUD_CONFIG_PIXEL_CLOCK_HDMI_148352 },
130 131 132
	{ 148500, AUD_CONFIG_PIXEL_CLOCK_HDMI_148500 },
};

133 134
/* HDMI N/CTS table */
#define TMDS_297M 297000
135
#define TMDS_296M 296703
136 137 138 139 140
static const struct {
	int sample_rate;
	int clock;
	int n;
	int cts;
141
} hdmi_aud_ncts[] = {
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
	{ 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 },
};

158
/* get AUD_CONFIG_PIXEL_CLOCK_HDMI_* value for mode */
159
static u32 audio_config_hdmi_pixel_clock(const struct drm_display_mode *adjusted_mode)
160 161 162 163
{
	int i;

	for (i = 0; i < ARRAY_SIZE(hdmi_audio_clock); i++) {
164
		if (adjusted_mode->crtc_clock == hdmi_audio_clock[i].clock)
165 166 167 168
			break;
	}

	if (i == ARRAY_SIZE(hdmi_audio_clock)) {
169
		DRM_DEBUG_KMS("HDMI audio pixel clock setting for %d not found, falling back to defaults\n",
170
			      adjusted_mode->crtc_clock);
171 172 173 174 175 176 177 178 179 180
		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;
}

181 182
static int audio_config_hdmi_get_n(const struct drm_display_mode *adjusted_mode,
				   int rate)
183 184 185
{
	int i;

186 187 188 189
	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;
190 191 192 193 194
		}
	}
	return 0;
}

195
static bool intel_eld_uptodate(struct drm_connector *connector,
196 197 198
			       i915_reg_t reg_eldv, uint32_t bits_eldv,
			       i915_reg_t reg_elda, uint32_t bits_elda,
			       i915_reg_t reg_edid)
199
{
200
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
201
	uint8_t *eld = connector->eld;
202 203
	uint32_t tmp;
	int i;
204

205 206
	tmp = I915_READ(reg_eldv);
	tmp &= bits_eldv;
207

208
	if (!tmp)
209 210
		return false;

211 212 213
	tmp = I915_READ(reg_elda);
	tmp &= ~bits_elda;
	I915_WRITE(reg_elda, tmp);
214

215
	for (i = 0; i < drm_eld_size(eld) / 4; i++)
216 217 218 219 220 221
		if (I915_READ(reg_edid) != *((uint32_t *)eld + i))
			return false;

	return true;
}

222 223
static void g4x_audio_codec_disable(struct intel_encoder *encoder)
{
224
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
	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);
}

241 242
static void g4x_audio_codec_enable(struct drm_connector *connector,
				   struct intel_encoder *encoder,
243
				   const struct drm_display_mode *adjusted_mode)
244
{
245
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
246 247
	uint8_t *eld = connector->eld;
	uint32_t eldv;
248 249
	uint32_t tmp;
	int len, i;
250

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

253 254
	tmp = I915_READ(G4X_AUD_VID_DID);
	if (tmp == INTEL_AUDIO_DEVBLC || tmp == INTEL_AUDIO_DEVCL)
255 256 257 258 259 260
		eldv = G4X_ELDV_DEVCL_DEVBLC;
	else
		eldv = G4X_ELDV_DEVCTG;

	if (intel_eld_uptodate(connector,
			       G4X_AUD_CNTL_ST, eldv,
261
			       G4X_AUD_CNTL_ST, G4X_ELD_ADDR_MASK,
262 263 264
			       G4X_HDMIW_HDMIEDID))
		return;

265
	tmp = I915_READ(G4X_AUD_CNTL_ST);
266
	tmp &= ~(eldv | G4X_ELD_ADDR_MASK);
267 268
	len = (tmp >> 9) & 0x1f;		/* ELD buffer size */
	I915_WRITE(G4X_AUD_CNTL_ST, tmp);
269

270
	len = min(drm_eld_size(eld) / 4, len);
271 272 273 274
	DRM_DEBUG_DRIVER("ELD size %d\n", len);
	for (i = 0; i < len; i++)
		I915_WRITE(G4X_HDMIW_HDMIEDID, *((uint32_t *)eld + i));

275 276 277
	tmp = I915_READ(G4X_AUD_CNTL_ST);
	tmp |= eldv;
	I915_WRITE(G4X_AUD_CNTL_ST, tmp);
278 279
}

280 281 282 283 284
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);
285 286 287
	struct i915_audio_component *acomp = dev_priv->audio_component;
	int rate = acomp ? acomp->aud_sample_rate[port] : 0;
	const struct dp_aud_n_m *nm = audio_config_dp_get_n_m(intel_crtc, rate);
288 289 290
	enum pipe pipe = intel_crtc->pipe;
	u32 tmp;

291 292 293 294 295
	if (nm)
		DRM_DEBUG_KMS("using Maud %u, Naud %u\n", nm->m, nm->n);
	else
		DRM_DEBUG_KMS("using automatic Maud, Naud\n");

296 297 298 299 300 301
	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;

302 303 304 305 306 307
	if (nm) {
		tmp &= ~AUD_CONFIG_N_MASK;
		tmp |= AUD_CONFIG_N(nm->n);
		tmp |= AUD_CONFIG_N_PROG_ENABLE;
	}

308
	I915_WRITE(HSW_AUD_CFG(pipe), tmp);
309 310 311 312 313 314 315 316 317 318 319 320 321

	tmp = I915_READ(HSW_AUD_M_CTS_ENABLE(pipe));
	tmp &= ~AUD_CONFIG_M_MASK;
	tmp &= ~AUD_M_CTS_M_VALUE_INDEX;
	tmp &= ~AUD_M_CTS_M_PROG_ENABLE;

	if (nm) {
		tmp |= nm->m;
		tmp |= AUD_M_CTS_M_VALUE_INDEX;
		tmp |= AUD_M_CTS_M_PROG_ENABLE;
	}

	I915_WRITE(HSW_AUD_M_CTS_ENABLE(pipe), tmp);
322 323 324 325 326
}

static void
hsw_hdmi_audio_config_update(struct intel_crtc *intel_crtc, enum port port,
			     const struct drm_display_mode *adjusted_mode)
327 328 329
{
	struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
	struct i915_audio_component *acomp = dev_priv->audio_component;
330
	int rate = acomp ? acomp->aud_sample_rate[port] : 0;
331
	enum pipe pipe = intel_crtc->pipe;
332
	int n;
333 334 335 336 337 338
	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;
339 340
	tmp |= audio_config_hdmi_pixel_clock(adjusted_mode);

341 342 343 344 345 346 347 348 349
	n = audio_config_hdmi_get_n(adjusted_mode, rate);
	if (n != 0) {
		DRM_DEBUG_KMS("using N %d\n", n);

		tmp &= ~AUD_CONFIG_N_MASK;
		tmp |= AUD_CONFIG_N(n);
		tmp |= AUD_CONFIG_N_PROG_ENABLE;
	} else {
		DRM_DEBUG_KMS("using automatic N\n");
350 351 352
	}

	I915_WRITE(HSW_AUD_CFG(pipe), tmp);
353

354 355 356 357
	/*
	 * Let's disable "Enable CTS or M Prog bit"
	 * and let HW calculate the value
	 */
358
	tmp = I915_READ(HSW_AUD_M_CTS_ENABLE(pipe));
359
	tmp &= ~AUD_M_CTS_M_PROG_ENABLE;
360 361
	tmp &= ~AUD_M_CTS_M_VALUE_INDEX;
	I915_WRITE(HSW_AUD_M_CTS_ENABLE(pipe), tmp);
362 363
}

364 365 366 367 368 369 370 371 372 373
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);
}

374 375
static void hsw_audio_codec_disable(struct intel_encoder *encoder)
{
376
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
377 378
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
	enum pipe pipe = intel_crtc->pipe;
379 380
	uint32_t tmp;

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

383 384
	mutex_lock(&dev_priv->av_mutex);

385 386 387 388 389 390
	/* 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;
391
	if (intel_crtc_has_dp_encoder(intel_crtc->config))
392 393 394 395
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	I915_WRITE(HSW_AUD_CFG(pipe), tmp);

	/* Invalidate ELD */
396
	tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
397
	tmp &= ~AUDIO_ELD_VALID(pipe);
398
	tmp &= ~AUDIO_OUTPUT_ENABLE(pipe);
399
	I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
400 401

	mutex_unlock(&dev_priv->av_mutex);
402 403 404
}

static void hsw_audio_codec_enable(struct drm_connector *connector,
405
				   struct intel_encoder *intel_encoder,
406
				   const struct drm_display_mode *adjusted_mode)
407
{
408
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
409
	struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
410
	enum pipe pipe = intel_crtc->pipe;
411
	enum port port = intel_encoder->port;
412
	const uint8_t *eld = connector->eld;
413 414
	uint32_t tmp;
	int len, i;
415

416
	DRM_DEBUG_KMS("Enable audio codec on pipe %c, %u bytes ELD\n",
417
		      pipe_name(pipe), drm_eld_size(eld));
418

419 420
	mutex_lock(&dev_priv->av_mutex);

421 422
	/* Enable audio presence detect, invalidate ELD */
	tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
423 424
	tmp |= AUDIO_OUTPUT_ENABLE(pipe);
	tmp &= ~AUDIO_ELD_VALID(pipe);
425
	I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
426

427 428 429 430 431 432
	/*
	 * 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.
	 */
433

434 435
	/* Reset ELD write address */
	tmp = I915_READ(HSW_AUD_DIP_ELD_CTRL(pipe));
436
	tmp &= ~IBX_ELD_ADDRESS_MASK;
437
	I915_WRITE(HSW_AUD_DIP_ELD_CTRL(pipe), tmp);
438

439
	/* Up to 84 bytes of hw ELD buffer */
440 441
	len = min(drm_eld_size(eld), 84);
	for (i = 0; i < len / 4; i++)
442
		I915_WRITE(HSW_AUD_EDID_DATA(pipe), *((uint32_t *)eld + i));
443

444
	/* ELD valid */
445
	tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
446
	tmp |= AUDIO_ELD_VALID(pipe);
447
	I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
448 449

	/* Enable timestamps */
450
	hsw_audio_config_update(intel_crtc, port, adjusted_mode);
451 452

	mutex_unlock(&dev_priv->av_mutex);
453 454
}

455
static void ilk_audio_codec_disable(struct intel_encoder *intel_encoder)
456
{
457 458
	struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
	struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
459
	enum pipe pipe = intel_crtc->pipe;
460
	enum port port = intel_encoder->port;
461
	uint32_t tmp, eldv;
462
	i915_reg_t aud_config, aud_cntrl_st2;
463 464 465 466

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

467 468 469
	if (WARN_ON(port == PORT_A))
		return;

470
	if (HAS_PCH_IBX(dev_priv)) {
471 472
		aud_config = IBX_AUD_CFG(pipe);
		aud_cntrl_st2 = IBX_AUD_CNTL_ST2;
473
	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
474 475 476 477 478 479 480 481 482 483 484 485 486
		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;
487
	if (intel_crtc_has_dp_encoder(intel_crtc->config))
488 489 490
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	I915_WRITE(aud_config, tmp);

491
	eldv = IBX_ELD_VALID(port);
492 493 494 495 496 497 498

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

499
static void ilk_audio_codec_enable(struct drm_connector *connector,
500
				   struct intel_encoder *intel_encoder,
501
				   const struct drm_display_mode *adjusted_mode)
502
{
503
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
504
	struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
505
	enum pipe pipe = intel_crtc->pipe;
506
	enum port port = intel_encoder->port;
507
	uint8_t *eld = connector->eld;
508
	uint32_t tmp, eldv;
509
	int len, i;
510
	i915_reg_t hdmiw_hdmiedid, aud_config, aud_cntl_st, aud_cntrl_st2;
511 512

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

515 516 517
	if (WARN_ON(port == PORT_A))
		return;

518 519 520 521 522 523
	/*
	 * 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.
	 */
524

525
	if (HAS_PCH_IBX(dev_priv)) {
526 527 528 529
		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;
530 531
	} else if (IS_VALLEYVIEW(dev_priv) ||
		   IS_CHERRYVIEW(dev_priv)) {
532 533 534 535 536 537 538 539 540 541 542
		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;
	}

543
	eldv = IBX_ELD_VALID(port);
544

545
	/* Invalidate ELD */
546 547 548
	tmp = I915_READ(aud_cntrl_st2);
	tmp &= ~eldv;
	I915_WRITE(aud_cntrl_st2, tmp);
549

550
	/* Reset ELD write address */
551
	tmp = I915_READ(aud_cntl_st);
552
	tmp &= ~IBX_ELD_ADDRESS_MASK;
553
	I915_WRITE(aud_cntl_st, tmp);
554

555
	/* Up to 84 bytes of hw ELD buffer */
556 557
	len = min(drm_eld_size(eld), 84);
	for (i = 0; i < len / 4; i++)
558 559
		I915_WRITE(hdmiw_hdmiedid, *((uint32_t *)eld + i));

560
	/* ELD valid */
561 562 563
	tmp = I915_READ(aud_cntrl_st2);
	tmp |= eldv;
	I915_WRITE(aud_cntrl_st2, tmp);
564 565 566 567 568 569

	/* 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;
570
	if (intel_crtc_has_dp_encoder(intel_crtc->config))
571 572
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	else
573
		tmp |= audio_config_hdmi_pixel_clock(adjusted_mode);
574
	I915_WRITE(aud_config, tmp);
575 576
}

577 578 579
/**
 * intel_audio_codec_enable - Enable the audio codec for HD audio
 * @intel_encoder: encoder on which to enable audio
580 581
 * @crtc_state: pointer to the current crtc state.
 * @conn_state: pointer to the current connector state.
582 583 584 585
 *
 * The enable sequences may only be performed after enabling the transcoder and
 * port, and after completed link training.
 */
586 587 588
void intel_audio_codec_enable(struct intel_encoder *intel_encoder,
			      const struct intel_crtc_state *crtc_state,
			      const struct drm_connector_state *conn_state)
589
{
590
	struct drm_encoder *encoder = &intel_encoder->base;
591
	const struct drm_display_mode *adjusted_mode = &crtc_state->base.adjusted_mode;
592
	struct drm_connector *connector;
593
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
594
	struct i915_audio_component *acomp = dev_priv->audio_component;
595
	enum port port = intel_encoder->port;
596
	enum pipe pipe = to_intel_crtc(crtc_state->base.crtc)->pipe;
597

598 599
	connector = conn_state->connector;
	if (!connector || !connector->eld[0])
600 601 602 603 604 605 606 607
		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);

608 609
	/* ELD Conn_Type */
	connector->eld[5] &= ~(3 << 2);
610
	if (intel_crtc_has_dp_encoder(crtc_state))
611 612
		connector->eld[5] |= (1 << 2);

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

615
	if (dev_priv->display.audio_codec_enable)
616 617
		dev_priv->display.audio_codec_enable(connector, intel_encoder,
						     adjusted_mode);
618

619
	mutex_lock(&dev_priv->av_mutex);
620
	intel_encoder->audio_connector = connector;
621

622
	/* referred in audio callbacks */
623
	dev_priv->av_enc_map[pipe] = intel_encoder;
624 625
	mutex_unlock(&dev_priv->av_mutex);

626 627 628 629
	/* audio drivers expect pipe = -1 to indicate Non-MST cases */
	if (intel_encoder->type != INTEL_OUTPUT_DP_MST)
		pipe = -1;

630
	if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
631 632
		acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
						 (int) port, (int) pipe);
633 634 635 636
}

/**
 * intel_audio_codec_disable - Disable the audio codec for HD audio
637
 * @intel_encoder: encoder on which to disable audio
638 639 640 641
 *
 * The disable sequences must be performed before disabling the transcoder or
 * port.
 */
642
void intel_audio_codec_disable(struct intel_encoder *intel_encoder)
643
{
644
	struct drm_encoder *encoder = &intel_encoder->base;
645
	struct drm_i915_private *dev_priv = to_i915(encoder->dev);
646
	struct i915_audio_component *acomp = dev_priv->audio_component;
647
	enum port port = intel_encoder->port;
648 649
	struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
	enum pipe pipe = crtc->pipe;
650 651

	if (dev_priv->display.audio_codec_disable)
652 653
		dev_priv->display.audio_codec_disable(intel_encoder);

654
	mutex_lock(&dev_priv->av_mutex);
655
	intel_encoder->audio_connector = NULL;
656
	dev_priv->av_enc_map[pipe] = NULL;
657 658
	mutex_unlock(&dev_priv->av_mutex);

659 660 661 662
	/* audio drivers expect pipe = -1 to indicate Non-MST cases */
	if (intel_encoder->type != INTEL_OUTPUT_DP_MST)
		pipe = -1;

663
	if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
664 665
		acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
						 (int) port, (int) pipe);
666 667 668
}

/**
669 670
 * intel_init_audio_hooks - Set up chip specific audio hooks
 * @dev_priv: device private
671
 */
672
void intel_init_audio_hooks(struct drm_i915_private *dev_priv)
673
{
674
	if (IS_G4X(dev_priv)) {
675
		dev_priv->display.audio_codec_enable = g4x_audio_codec_enable;
676
		dev_priv->display.audio_codec_disable = g4x_audio_codec_disable;
677
	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
678
		dev_priv->display.audio_codec_enable = ilk_audio_codec_enable;
679
		dev_priv->display.audio_codec_disable = ilk_audio_codec_disable;
680
	} else if (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8) {
681 682
		dev_priv->display.audio_codec_enable = hsw_audio_codec_enable;
		dev_priv->display.audio_codec_disable = hsw_audio_codec_disable;
683
	} else if (HAS_PCH_SPLIT(dev_priv)) {
684
		dev_priv->display.audio_codec_enable = ilk_audio_codec_enable;
685
		dev_priv->display.audio_codec_disable = ilk_audio_codec_disable;
686
	}
687
}
I
Imre Deak 已提交
688

689
static void i915_audio_component_get_power(struct device *kdev)
I
Imre Deak 已提交
690
{
691
	intel_display_power_get(kdev_to_i915(kdev), POWER_DOMAIN_AUDIO);
I
Imre Deak 已提交
692 693
}

694
static void i915_audio_component_put_power(struct device *kdev)
I
Imre Deak 已提交
695
{
696
	intel_display_power_put(kdev_to_i915(kdev), POWER_DOMAIN_AUDIO);
I
Imre Deak 已提交
697 698
}

699
static void i915_audio_component_codec_wake_override(struct device *kdev,
700 701
						     bool enable)
{
702
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
703 704
	u32 tmp;

705
	if (!IS_SKYLAKE(dev_priv) && !IS_KABYLAKE(dev_priv))
706 707
		return;

708
	i915_audio_component_get_power(kdev);
709

710 711 712 713 714 715 716 717 718 719 720 721 722 723 724
	/*
	 * 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);
	}
725

726
	i915_audio_component_put_power(kdev);
727 728
}

I
Imre Deak 已提交
729
/* Get CDCLK in kHz  */
730
static int i915_audio_component_get_cdclk_freq(struct device *kdev)
I
Imre Deak 已提交
731
{
732
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
I
Imre Deak 已提交
733 734 735 736

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

737
	return dev_priv->cdclk_freq;
I
Imre Deak 已提交
738 739
}

740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767
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)
768
{
769
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
770 771
	struct intel_encoder *intel_encoder;
	struct intel_crtc *crtc;
772
	struct drm_display_mode *adjusted_mode;
773
	struct i915_audio_component *acomp = dev_priv->audio_component;
774
	int err = 0;
775

776
	if (!HAS_DDI(dev_priv))
777 778
		return 0;

779
	i915_audio_component_get_power(kdev);
780
	mutex_lock(&dev_priv->av_mutex);
781

782
	/* 1. get the pipe */
783
	intel_encoder = get_saved_enc(dev_priv, port, pipe);
784
	if (!intel_encoder || !intel_encoder->base.crtc ||
785 786
	    (intel_encoder->type != INTEL_OUTPUT_HDMI &&
	     intel_encoder->type != INTEL_OUTPUT_DP)) {
787
		DRM_DEBUG_KMS("Not valid for port %c\n", port_name(port));
788 789
		err = -ENODEV;
		goto unlock;
790
	}
791 792

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

796
	adjusted_mode = &crtc->config->base.adjusted_mode;
797

798 799 800
	/* port must be valid now, otherwise the pipe will be invalid */
	acomp->aud_sample_rate[port] = rate;

801
	hsw_audio_config_update(crtc, port, adjusted_mode);
802

803
 unlock:
804
	mutex_unlock(&dev_priv->av_mutex);
805
	i915_audio_component_put_power(kdev);
806
	return err;
807 808
}

809
static int i915_audio_component_get_eld(struct device *kdev, int port,
810
					int pipe, bool *enabled,
811 812
					unsigned char *buf, int max_bytes)
{
813
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
814 815 816 817 818
	struct intel_encoder *intel_encoder;
	const u8 *eld;
	int ret = -EINVAL;

	mutex_lock(&dev_priv->av_mutex);
819 820 821 822 823 824 825 826 827 828 829 830 831 832

	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));
833 834 835 836
	}

	mutex_unlock(&dev_priv->av_mutex);
	return ret;
837 838
}

I
Imre Deak 已提交
839 840 841 842
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,
843
	.codec_wake_override = i915_audio_component_codec_wake_override,
I
Imre Deak 已提交
844
	.get_cdclk_freq	= i915_audio_component_get_cdclk_freq,
845
	.sync_audio_rate = i915_audio_component_sync_audio_rate,
846
	.get_eld	= i915_audio_component_get_eld,
I
Imre Deak 已提交
847 848
};

849 850
static int i915_audio_component_bind(struct device *i915_kdev,
				     struct device *hda_kdev, void *data)
I
Imre Deak 已提交
851 852
{
	struct i915_audio_component *acomp = data;
853
	struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
854
	int i;
I
Imre Deak 已提交
855 856 857 858

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

859
	drm_modeset_lock_all(&dev_priv->drm);
I
Imre Deak 已提交
860
	acomp->ops = &i915_audio_component_ops;
861
	acomp->dev = i915_kdev;
862 863 864
	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;
865
	dev_priv->audio_component = acomp;
866
	drm_modeset_unlock_all(&dev_priv->drm);
I
Imre Deak 已提交
867 868 869 870

	return 0;
}

871 872
static void i915_audio_component_unbind(struct device *i915_kdev,
					struct device *hda_kdev, void *data)
I
Imre Deak 已提交
873 874
{
	struct i915_audio_component *acomp = data;
875
	struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
I
Imre Deak 已提交
876

877
	drm_modeset_lock_all(&dev_priv->drm);
I
Imre Deak 已提交
878 879
	acomp->ops = NULL;
	acomp->dev = NULL;
880
	dev_priv->audio_component = NULL;
881
	drm_modeset_unlock_all(&dev_priv->drm);
I
Imre Deak 已提交
882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908
}

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;

909
	ret = component_add(dev_priv->drm.dev, &i915_audio_component_bind_ops);
I
Imre Deak 已提交
910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930
	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;

931
	component_del(dev_priv->drm.dev, &i915_audio_component_bind_ops);
I
Imre Deak 已提交
932 933
	dev_priv->audio_component_registered = false;
}