intel_audio.c 35.3 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
/*
 * 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.
 */

I
Imre Deak 已提交
24
#include <linux/component.h>
25 26 27
#include <linux/kernel.h>

#include <drm/drm_edid.h>
I
Imre Deak 已提交
28
#include <drm/i915_component.h>
29 30

#include "i915_drv.h"
31
#include "intel_atomic.h"
32
#include "intel_audio.h"
33
#include "intel_display_types.h"
34
#include "intel_lpe_audio.h"
35

36 37 38 39 40 41 42 43 44 45 46
/**
 * 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
47 48
 * transcoder and port, and after completed link training. Therefore the audio
 * enable/disable sequences are part of the modeset sequence.
49 50 51 52 53 54 55
 *
 * 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.)
56
 *
57 58
 * 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
59
 * defined in graphics driver and called in audio driver. The
60
 * struct &i915_audio_component_audio_ops @audio_ops is called from i915 driver.
61 62
 */

63
/* DP N/M table */
64
#define LC_810M	810000
65 66 67 68 69 70 71 72 73 74 75
#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;
};

76 77 78 79 80 81 82
struct hdmi_aud_ncts {
	int sample_rate;
	int clock;
	int n;
	int cts;
};

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
/* 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 },
112 113 114 115 116 117 118 119 120
	{ 32000, LC_810M, 1024, 50625 },
	{ 44100, LC_810M, 784, 28125 },
	{ 48000, LC_810M, 512, 16875 },
	{ 64000, LC_810M, 2048, 50625 },
	{ 88200, LC_810M, 1568, 28125 },
	{ 96000, LC_810M, 1024, 16875 },
	{ 128000, LC_810M, 4096, 50625 },
	{ 176400, LC_810M, 3136, 28125 },
	{ 192000, LC_810M, 2048, 16875 },
121 122 123
};

static const struct dp_aud_n_m *
124
audio_config_dp_get_n_m(const struct intel_crtc_state *crtc_state, int rate)
125 126 127 128 129
{
	int i;

	for (i = 0; i < ARRAY_SIZE(dp_aud_n_m); i++) {
		if (rate == dp_aud_n_m[i].sample_rate &&
130
		    crtc_state->port_clock == dp_aud_n_m[i].clock)
131 132 133 134 135 136
			return &dp_aud_n_m[i];
	}

	return NULL;
}

137
static const struct {
138 139 140
	int clock;
	u32 config;
} hdmi_audio_clock[] = {
141
	{ 25175, AUD_CONFIG_PIXEL_CLOCK_HDMI_25175 },
142 143
	{ 25200, AUD_CONFIG_PIXEL_CLOCK_HDMI_25200 }, /* default per bspec */
	{ 27000, AUD_CONFIG_PIXEL_CLOCK_HDMI_27000 },
144
	{ 27027, AUD_CONFIG_PIXEL_CLOCK_HDMI_27027 },
145
	{ 54000, AUD_CONFIG_PIXEL_CLOCK_HDMI_54000 },
146 147
	{ 54054, AUD_CONFIG_PIXEL_CLOCK_HDMI_54054 },
	{ 74176, AUD_CONFIG_PIXEL_CLOCK_HDMI_74176 },
148
	{ 74250, AUD_CONFIG_PIXEL_CLOCK_HDMI_74250 },
149
	{ 148352, AUD_CONFIG_PIXEL_CLOCK_HDMI_148352 },
150 151 152
	{ 148500, AUD_CONFIG_PIXEL_CLOCK_HDMI_148500 },
};

153 154
/* HDMI N/CTS table */
#define TMDS_297M 297000
155
#define TMDS_296M 296703
156 157 158
#define TMDS_594M 594000
#define TMDS_593M 593407

159
static const struct hdmi_aud_ncts hdmi_aud_ncts_24bpp[] = {
160 161
	{ 32000, TMDS_296M, 5824, 421875 },
	{ 32000, TMDS_297M, 3072, 222750 },
162 163 164 165 166 167
	{ 32000, TMDS_593M, 5824, 843750 },
	{ 32000, TMDS_594M, 3072, 445500 },
	{ 44100, TMDS_296M, 4459, 234375 },
	{ 44100, TMDS_297M, 4704, 247500 },
	{ 44100, TMDS_593M, 8918, 937500 },
	{ 44100, TMDS_594M, 9408, 990000 },
168 169
	{ 88200, TMDS_296M, 8918, 234375 },
	{ 88200, TMDS_297M, 9408, 247500 },
170 171
	{ 88200, TMDS_593M, 17836, 937500 },
	{ 88200, TMDS_594M, 18816, 990000 },
172 173
	{ 176400, TMDS_296M, 17836, 234375 },
	{ 176400, TMDS_297M, 18816, 247500 },
174 175 176 177
	{ 176400, TMDS_593M, 35672, 937500 },
	{ 176400, TMDS_594M, 37632, 990000 },
	{ 48000, TMDS_296M, 5824, 281250 },
	{ 48000, TMDS_297M, 5120, 247500 },
178 179
	{ 48000, TMDS_593M, 5824, 562500 },
	{ 48000, TMDS_594M, 6144, 594000 },
180 181
	{ 96000, TMDS_296M, 11648, 281250 },
	{ 96000, TMDS_297M, 10240, 247500 },
182 183
	{ 96000, TMDS_593M, 11648, 562500 },
	{ 96000, TMDS_594M, 12288, 594000 },
184 185
	{ 192000, TMDS_296M, 23296, 281250 },
	{ 192000, TMDS_297M, 20480, 247500 },
186 187
	{ 192000, TMDS_593M, 23296, 562500 },
	{ 192000, TMDS_594M, 24576, 594000 },
188 189
};

190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
/* Appendix C - N & CTS values for deep color from HDMI 2.0 spec*/
/* HDMI N/CTS table for 10 bit deep color(30 bpp)*/
#define TMDS_371M 371250
#define TMDS_370M 370878

static const struct hdmi_aud_ncts hdmi_aud_ncts_30bpp[] = {
	{ 32000, TMDS_370M, 5824, 527344 },
	{ 32000, TMDS_371M, 6144, 556875 },
	{ 44100, TMDS_370M, 8918, 585938 },
	{ 44100, TMDS_371M, 4704, 309375 },
	{ 88200, TMDS_370M, 17836, 585938 },
	{ 88200, TMDS_371M, 9408, 309375 },
	{ 176400, TMDS_370M, 35672, 585938 },
	{ 176400, TMDS_371M, 18816, 309375 },
	{ 48000, TMDS_370M, 11648, 703125 },
	{ 48000, TMDS_371M, 5120, 309375 },
	{ 96000, TMDS_370M, 23296, 703125 },
	{ 96000, TMDS_371M, 10240, 309375 },
	{ 192000, TMDS_370M, 46592, 703125 },
	{ 192000, TMDS_371M, 20480, 309375 },
};

/* HDMI N/CTS table for 12 bit deep color(36 bpp)*/
#define TMDS_445_5M 445500
#define TMDS_445M 445054

static const struct hdmi_aud_ncts hdmi_aud_ncts_36bpp[] = {
	{ 32000, TMDS_445M, 5824, 632813 },
	{ 32000, TMDS_445_5M, 4096, 445500 },
	{ 44100, TMDS_445M, 8918, 703125 },
	{ 44100, TMDS_445_5M, 4704, 371250 },
	{ 88200, TMDS_445M, 17836, 703125 },
	{ 88200, TMDS_445_5M, 9408, 371250 },
	{ 176400, TMDS_445M, 35672, 703125 },
	{ 176400, TMDS_445_5M, 18816, 371250 },
	{ 48000, TMDS_445M, 5824, 421875 },
	{ 48000, TMDS_445_5M, 5120, 371250 },
	{ 96000, TMDS_445M, 11648, 421875 },
	{ 96000, TMDS_445_5M, 10240, 371250 },
	{ 192000, TMDS_445M, 23296, 421875 },
	{ 192000, TMDS_445_5M, 20480, 371250 },
};

233
/* get AUD_CONFIG_PIXEL_CLOCK_HDMI_* value for mode */
234
static u32 audio_config_hdmi_pixel_clock(const struct intel_crtc_state *crtc_state)
235
{
236
	const struct drm_display_mode *adjusted_mode =
237
		&crtc_state->hw.adjusted_mode;
238 239 240
	int i;

	for (i = 0; i < ARRAY_SIZE(hdmi_audio_clock); i++) {
241
		if (adjusted_mode->crtc_clock == hdmi_audio_clock[i].clock)
242 243 244 245
			break;
	}

	if (i == ARRAY_SIZE(hdmi_audio_clock)) {
246
		DRM_DEBUG_KMS("HDMI audio pixel clock setting for %d not found, falling back to defaults\n",
247
			      adjusted_mode->crtc_clock);
248 249 250 251 252 253 254 255 256 257
		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;
}

258
static int audio_config_hdmi_get_n(const struct intel_crtc_state *crtc_state,
259
				   int rate)
260
{
261 262 263 264 265 266 267 268 269 270 271 272 273
	const struct hdmi_aud_ncts *hdmi_ncts_table;
	int i, size;

	if (crtc_state->pipe_bpp == 36) {
		hdmi_ncts_table = hdmi_aud_ncts_36bpp;
		size = ARRAY_SIZE(hdmi_aud_ncts_36bpp);
	} else if (crtc_state->pipe_bpp == 30) {
		hdmi_ncts_table = hdmi_aud_ncts_30bpp;
		size = ARRAY_SIZE(hdmi_aud_ncts_30bpp);
	} else {
		hdmi_ncts_table = hdmi_aud_ncts_24bpp;
		size = ARRAY_SIZE(hdmi_aud_ncts_24bpp);
	}
274

275 276 277 278
	for (i = 0; i < size; i++) {
		if (rate == hdmi_ncts_table[i].sample_rate &&
		    crtc_state->port_clock == hdmi_ncts_table[i].clock) {
			return hdmi_ncts_table[i].n;
279 280 281 282 283
		}
	}
	return 0;
}

284
static bool intel_eld_uptodate(struct drm_connector *connector,
285 286
			       i915_reg_t reg_eldv, u32 bits_eldv,
			       i915_reg_t reg_elda, u32 bits_elda,
287
			       i915_reg_t reg_edid)
288
{
289
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
290
	const u8 *eld = connector->eld;
291
	u32 tmp;
292
	int i;
293

294 295
	tmp = I915_READ(reg_eldv);
	tmp &= bits_eldv;
296

297
	if (!tmp)
298 299
		return false;

300 301 302
	tmp = I915_READ(reg_elda);
	tmp &= ~bits_elda;
	I915_WRITE(reg_elda, tmp);
303

304
	for (i = 0; i < drm_eld_size(eld) / 4; i++)
305
		if (I915_READ(reg_edid) != *((const u32 *)eld + i))
306 307 308 309 310
			return false;

	return true;
}

311 312 313
static void g4x_audio_codec_disable(struct intel_encoder *encoder,
				    const struct intel_crtc_state *old_crtc_state,
				    const struct drm_connector_state *old_conn_state)
314
{
315
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
316
	u32 eldv, tmp;
317

318
	drm_dbg_kms(&dev_priv->drm, "Disable audio codec\n");
319 320 321 322 323 324 325 326 327 328 329 330 331

	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);
}

332 333 334
static void g4x_audio_codec_enable(struct intel_encoder *encoder,
				   const struct intel_crtc_state *crtc_state,
				   const struct drm_connector_state *conn_state)
335
{
336 337
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
	struct drm_connector *connector = conn_state->connector;
338
	const u8 *eld = connector->eld;
339 340
	u32 eldv;
	u32 tmp;
341
	int len, i;
342

343 344
	drm_dbg_kms(&dev_priv->drm, "Enable audio codec, %u bytes ELD\n",
		    drm_eld_size(eld));
345

346 347
	tmp = I915_READ(G4X_AUD_VID_DID);
	if (tmp == INTEL_AUDIO_DEVBLC || tmp == INTEL_AUDIO_DEVCL)
348 349 350 351 352 353
		eldv = G4X_ELDV_DEVCL_DEVBLC;
	else
		eldv = G4X_ELDV_DEVCTG;

	if (intel_eld_uptodate(connector,
			       G4X_AUD_CNTL_ST, eldv,
354
			       G4X_AUD_CNTL_ST, G4X_ELD_ADDR_MASK,
355 356 357
			       G4X_HDMIW_HDMIEDID))
		return;

358
	tmp = I915_READ(G4X_AUD_CNTL_ST);
359
	tmp &= ~(eldv | G4X_ELD_ADDR_MASK);
360 361
	len = (tmp >> 9) & 0x1f;		/* ELD buffer size */
	I915_WRITE(G4X_AUD_CNTL_ST, tmp);
362

363
	len = min(drm_eld_size(eld) / 4, len);
364
	drm_dbg(&dev_priv->drm, "ELD size %d\n", len);
365
	for (i = 0; i < len; i++)
366
		I915_WRITE(G4X_HDMIW_HDMIEDID, *((const u32 *)eld + i));
367

368 369 370
	tmp = I915_READ(G4X_AUD_CNTL_ST);
	tmp |= eldv;
	I915_WRITE(G4X_AUD_CNTL_ST, tmp);
371 372
}

373
static void
374 375
hsw_dp_audio_config_update(struct intel_encoder *encoder,
			   const struct intel_crtc_state *crtc_state)
376
{
377
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
378
	struct i915_audio_component *acomp = dev_priv->audio_component;
379
	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
380 381 382
	enum port port = encoder->port;
	const struct dp_aud_n_m *nm;
	int rate;
383 384
	u32 tmp;

385 386
	rate = acomp ? acomp->aud_sample_rate[port] : 0;
	nm = audio_config_dp_get_n_m(crtc_state, rate);
387
	if (nm)
388 389
		drm_dbg_kms(&dev_priv->drm, "using Maud %u, Naud %u\n", nm->m,
			    nm->n);
390
	else
391
		drm_dbg_kms(&dev_priv->drm, "using automatic Maud, Naud\n");
392

393
	tmp = I915_READ(HSW_AUD_CFG(cpu_transcoder));
394 395 396 397 398
	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;

399 400 401 402 403 404
	if (nm) {
		tmp &= ~AUD_CONFIG_N_MASK;
		tmp |= AUD_CONFIG_N(nm->n);
		tmp |= AUD_CONFIG_N_PROG_ENABLE;
	}

405
	I915_WRITE(HSW_AUD_CFG(cpu_transcoder), tmp);
406

407
	tmp = I915_READ(HSW_AUD_M_CTS_ENABLE(cpu_transcoder));
408 409 410 411 412 413 414 415 416 417
	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;
	}

418
	I915_WRITE(HSW_AUD_M_CTS_ENABLE(cpu_transcoder), tmp);
419 420 421
}

static void
422 423
hsw_hdmi_audio_config_update(struct intel_encoder *encoder,
			     const struct intel_crtc_state *crtc_state)
424
{
425
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
426
	struct i915_audio_component *acomp = dev_priv->audio_component;
427
	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
428 429
	enum port port = encoder->port;
	int n, rate;
430 431
	u32 tmp;

432 433
	rate = acomp ? acomp->aud_sample_rate[port] : 0;

434
	tmp = I915_READ(HSW_AUD_CFG(cpu_transcoder));
435 436 437
	tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
	tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
	tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
438
	tmp |= audio_config_hdmi_pixel_clock(crtc_state);
439

440
	n = audio_config_hdmi_get_n(crtc_state, rate);
441
	if (n != 0) {
442
		drm_dbg_kms(&dev_priv->drm, "using N %d\n", n);
443 444 445 446 447

		tmp &= ~AUD_CONFIG_N_MASK;
		tmp |= AUD_CONFIG_N(n);
		tmp |= AUD_CONFIG_N_PROG_ENABLE;
	} else {
448
		drm_dbg_kms(&dev_priv->drm, "using automatic N\n");
449 450
	}

451
	I915_WRITE(HSW_AUD_CFG(cpu_transcoder), tmp);
452

453 454 455 456
	/*
	 * Let's disable "Enable CTS or M Prog bit"
	 * and let HW calculate the value
	 */
457
	tmp = I915_READ(HSW_AUD_M_CTS_ENABLE(cpu_transcoder));
458
	tmp &= ~AUD_M_CTS_M_PROG_ENABLE;
459
	tmp &= ~AUD_M_CTS_M_VALUE_INDEX;
460
	I915_WRITE(HSW_AUD_M_CTS_ENABLE(cpu_transcoder), tmp);
461 462
}

463
static void
464 465
hsw_audio_config_update(struct intel_encoder *encoder,
			const struct intel_crtc_state *crtc_state)
466
{
467 468
	if (intel_crtc_has_dp_encoder(crtc_state))
		hsw_dp_audio_config_update(encoder, crtc_state);
469
	else
470
		hsw_hdmi_audio_config_update(encoder, crtc_state);
471 472
}

473 474 475
static void hsw_audio_codec_disable(struct intel_encoder *encoder,
				    const struct intel_crtc_state *old_crtc_state,
				    const struct drm_connector_state *old_conn_state)
476
{
477
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
478
	enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder;
479
	u32 tmp;
480

481 482
	drm_dbg_kms(&dev_priv->drm, "Disable audio codec on transcoder %s\n",
		    transcoder_name(cpu_transcoder));
483

484 485
	mutex_lock(&dev_priv->av_mutex);

486
	/* Disable timestamps */
487
	tmp = I915_READ(HSW_AUD_CFG(cpu_transcoder));
488 489 490 491
	tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
	tmp |= AUD_CONFIG_N_PROG_ENABLE;
	tmp &= ~AUD_CONFIG_UPPER_N_MASK;
	tmp &= ~AUD_CONFIG_LOWER_N_MASK;
492
	if (intel_crtc_has_dp_encoder(old_crtc_state))
493
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
494
	I915_WRITE(HSW_AUD_CFG(cpu_transcoder), tmp);
495 496

	/* Invalidate ELD */
497
	tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
498 499
	tmp &= ~AUDIO_ELD_VALID(cpu_transcoder);
	tmp &= ~AUDIO_OUTPUT_ENABLE(cpu_transcoder);
500
	I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
501 502

	mutex_unlock(&dev_priv->av_mutex);
503 504
}

505 506 507
static void hsw_audio_codec_enable(struct intel_encoder *encoder,
				   const struct intel_crtc_state *crtc_state,
				   const struct drm_connector_state *conn_state)
508
{
509 510
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
	struct drm_connector *connector = conn_state->connector;
511
	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
512 513
	const u8 *eld = connector->eld;
	u32 tmp;
514
	int len, i;
515

516 517 518
	drm_dbg_kms(&dev_priv->drm,
		    "Enable audio codec on transcoder %s, %u bytes ELD\n",
		     transcoder_name(cpu_transcoder), drm_eld_size(eld));
519

520 521
	mutex_lock(&dev_priv->av_mutex);

522 523
	/* Enable audio presence detect, invalidate ELD */
	tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
524 525
	tmp |= AUDIO_OUTPUT_ENABLE(cpu_transcoder);
	tmp &= ~AUDIO_ELD_VALID(cpu_transcoder);
526
	I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
527

528 529 530 531 532 533
	/*
	 * 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.
	 */
534

535
	/* Reset ELD write address */
536
	tmp = I915_READ(HSW_AUD_DIP_ELD_CTRL(cpu_transcoder));
537
	tmp &= ~IBX_ELD_ADDRESS_MASK;
538
	I915_WRITE(HSW_AUD_DIP_ELD_CTRL(cpu_transcoder), tmp);
539

540
	/* Up to 84 bytes of hw ELD buffer */
541 542
	len = min(drm_eld_size(eld), 84);
	for (i = 0; i < len / 4; i++)
543
		I915_WRITE(HSW_AUD_EDID_DATA(cpu_transcoder), *((const u32 *)eld + i));
544

545
	/* ELD valid */
546
	tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
547
	tmp |= AUDIO_ELD_VALID(cpu_transcoder);
548
	I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
549 550

	/* Enable timestamps */
551
	hsw_audio_config_update(encoder, crtc_state);
552 553

	mutex_unlock(&dev_priv->av_mutex);
554 555
}

556 557 558
static void ilk_audio_codec_disable(struct intel_encoder *encoder,
				    const struct intel_crtc_state *old_crtc_state,
				    const struct drm_connector_state *old_conn_state)
559
{
560
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
561
	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
562 563
	enum pipe pipe = crtc->pipe;
	enum port port = encoder->port;
564
	u32 tmp, eldv;
565
	i915_reg_t aud_config, aud_cntrl_st2;
566

567 568 569 570
	drm_dbg_kms(&dev_priv->drm,
		    "Disable audio codec on [ENCODER:%d:%s], pipe %c\n",
		     encoder->base.base.id, encoder->base.name,
		     pipe_name(pipe));
571

572 573 574
	if (WARN_ON(port == PORT_A))
		return;

575
	if (HAS_PCH_IBX(dev_priv)) {
576 577
		aud_config = IBX_AUD_CFG(pipe);
		aud_cntrl_st2 = IBX_AUD_CNTL_ST2;
578
	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
579 580 581 582 583 584 585 586 587 588 589 590 591
		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;
592
	if (intel_crtc_has_dp_encoder(old_crtc_state))
593 594 595
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	I915_WRITE(aud_config, tmp);

596
	eldv = IBX_ELD_VALID(port);
597 598 599 600 601 602 603

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

604 605 606
static void ilk_audio_codec_enable(struct intel_encoder *encoder,
				   const struct intel_crtc_state *crtc_state,
				   const struct drm_connector_state *conn_state)
607
{
608
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
609
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
610 611 612
	struct drm_connector *connector = conn_state->connector;
	enum pipe pipe = crtc->pipe;
	enum port port = encoder->port;
613
	const u8 *eld = connector->eld;
614
	u32 tmp, eldv;
615
	int len, i;
616
	i915_reg_t hdmiw_hdmiedid, aud_config, aud_cntl_st, aud_cntrl_st2;
617

618 619 620 621
	drm_dbg_kms(&dev_priv->drm,
		    "Enable audio codec on [ENCODER:%d:%s], pipe %c, %u bytes ELD\n",
		    encoder->base.base.id, encoder->base.name,
		    pipe_name(pipe), drm_eld_size(eld));
622

623 624 625
	if (WARN_ON(port == PORT_A))
		return;

626 627 628 629 630 631
	/*
	 * 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.
	 */
632

633
	if (HAS_PCH_IBX(dev_priv)) {
634 635 636 637
		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;
638 639
	} else if (IS_VALLEYVIEW(dev_priv) ||
		   IS_CHERRYVIEW(dev_priv)) {
640 641 642 643 644 645 646 647 648 649 650
		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;
	}

651
	eldv = IBX_ELD_VALID(port);
652

653
	/* Invalidate ELD */
654 655 656
	tmp = I915_READ(aud_cntrl_st2);
	tmp &= ~eldv;
	I915_WRITE(aud_cntrl_st2, tmp);
657

658
	/* Reset ELD write address */
659
	tmp = I915_READ(aud_cntl_st);
660
	tmp &= ~IBX_ELD_ADDRESS_MASK;
661
	I915_WRITE(aud_cntl_st, tmp);
662

663
	/* Up to 84 bytes of hw ELD buffer */
664 665
	len = min(drm_eld_size(eld), 84);
	for (i = 0; i < len / 4; i++)
666
		I915_WRITE(hdmiw_hdmiedid, *((const u32 *)eld + i));
667

668
	/* ELD valid */
669 670 671
	tmp = I915_READ(aud_cntrl_st2);
	tmp |= eldv;
	I915_WRITE(aud_cntrl_st2, tmp);
672 673 674 675 676 677

	/* 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;
678
	if (intel_crtc_has_dp_encoder(crtc_state))
679 680
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	else
681
		tmp |= audio_config_hdmi_pixel_clock(crtc_state);
682
	I915_WRITE(aud_config, tmp);
683 684
}

685 686
/**
 * intel_audio_codec_enable - Enable the audio codec for HD audio
687
 * @encoder: encoder on which to enable audio
688 689
 * @crtc_state: pointer to the current crtc state.
 * @conn_state: pointer to the current connector state.
690 691 692 693
 *
 * The enable sequences may only be performed after enabling the transcoder and
 * port, and after completed link training.
 */
694
void intel_audio_codec_enable(struct intel_encoder *encoder,
695 696
			      const struct intel_crtc_state *crtc_state,
			      const struct drm_connector_state *conn_state)
697
{
698
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
699
	struct i915_audio_component *acomp = dev_priv->audio_component;
700
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
701 702
	struct drm_connector *connector = conn_state->connector;
	const struct drm_display_mode *adjusted_mode =
703
		&crtc_state->hw.adjusted_mode;
704 705
	enum port port = encoder->port;
	enum pipe pipe = crtc->pipe;
706

707
	/* FIXME precompute the ELD in .compute_config() */
708
	if (!connector->eld[0])
709 710 711
		drm_dbg_kms(&dev_priv->drm,
			    "Bogus ELD on [CONNECTOR:%d:%s]\n",
			    connector->base.id, connector->name);
712

713 714 715 716 717
	drm_dbg(&dev_priv->drm, "ELD on [CONNECTOR:%d:%s], [ENCODER:%d:%s]\n",
		connector->base.id,
		connector->name,
		encoder->base.base.id,
		encoder->base.name);
718

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

721
	if (dev_priv->display.audio_codec_enable)
722 723 724
		dev_priv->display.audio_codec_enable(encoder,
						     crtc_state,
						     conn_state);
725

726
	mutex_lock(&dev_priv->av_mutex);
727
	encoder->audio_connector = connector;
728

729
	/* referred in audio callbacks */
730
	dev_priv->av_enc_map[pipe] = encoder;
731 732
	mutex_unlock(&dev_priv->av_mutex);

733 734
	if (acomp && acomp->base.audio_ops &&
	    acomp->base.audio_ops->pin_eld_notify) {
735
		/* audio drivers expect pipe = -1 to indicate Non-MST cases */
736
		if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST))
737
			pipe = -1;
738
		acomp->base.audio_ops->pin_eld_notify(acomp->base.audio_ops->audio_ptr,
739
						 (int) port, (int) pipe);
740 741
	}

742
	intel_lpe_audio_notify(dev_priv, pipe, port, connector->eld,
743
			       crtc_state->port_clock,
744
			       intel_crtc_has_dp_encoder(crtc_state));
745 746 747 748
}

/**
 * intel_audio_codec_disable - Disable the audio codec for HD audio
749
 * @encoder: encoder on which to disable audio
750 751
 * @old_crtc_state: pointer to the old crtc state.
 * @old_conn_state: pointer to the old connector state.
752 753 754 755
 *
 * The disable sequences must be performed before disabling the transcoder or
 * port.
 */
756 757 758
void intel_audio_codec_disable(struct intel_encoder *encoder,
			       const struct intel_crtc_state *old_crtc_state,
			       const struct drm_connector_state *old_conn_state)
759
{
760
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
761
	struct i915_audio_component *acomp = dev_priv->audio_component;
762
	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
763
	enum port port = encoder->port;
764
	enum pipe pipe = crtc->pipe;
765 766

	if (dev_priv->display.audio_codec_disable)
767 768 769
		dev_priv->display.audio_codec_disable(encoder,
						      old_crtc_state,
						      old_conn_state);
770

771
	mutex_lock(&dev_priv->av_mutex);
772
	encoder->audio_connector = NULL;
773
	dev_priv->av_enc_map[pipe] = NULL;
774 775
	mutex_unlock(&dev_priv->av_mutex);

776 777
	if (acomp && acomp->base.audio_ops &&
	    acomp->base.audio_ops->pin_eld_notify) {
778
		/* audio drivers expect pipe = -1 to indicate Non-MST cases */
779
		if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST))
780
			pipe = -1;
781
		acomp->base.audio_ops->pin_eld_notify(acomp->base.audio_ops->audio_ptr,
782
						 (int) port, (int) pipe);
783
	}
784

785
	intel_lpe_audio_notify(dev_priv, pipe, port, NULL, 0, false);
786 787 788
}

/**
789 790
 * intel_init_audio_hooks - Set up chip specific audio hooks
 * @dev_priv: device private
791
 */
792
void intel_init_audio_hooks(struct drm_i915_private *dev_priv)
793
{
794
	if (IS_G4X(dev_priv)) {
795
		dev_priv->display.audio_codec_enable = g4x_audio_codec_enable;
796
		dev_priv->display.audio_codec_disable = g4x_audio_codec_disable;
797
	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
798
		dev_priv->display.audio_codec_enable = ilk_audio_codec_enable;
799
		dev_priv->display.audio_codec_disable = ilk_audio_codec_disable;
800
	} else if (IS_HASWELL(dev_priv) || INTEL_GEN(dev_priv) >= 8) {
801 802
		dev_priv->display.audio_codec_enable = hsw_audio_codec_enable;
		dev_priv->display.audio_codec_disable = hsw_audio_codec_disable;
803
	} else if (HAS_PCH_SPLIT(dev_priv)) {
804
		dev_priv->display.audio_codec_enable = ilk_audio_codec_enable;
805
		dev_priv->display.audio_codec_disable = ilk_audio_codec_disable;
806
	}
807
}
I
Imre Deak 已提交
808

809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827
static void glk_force_audio_cdclk(struct drm_i915_private *dev_priv,
				  bool enable)
{
	struct drm_modeset_acquire_ctx ctx;
	struct drm_atomic_state *state;
	int ret;

	drm_modeset_acquire_init(&ctx, 0);
	state = drm_atomic_state_alloc(&dev_priv->drm);
	if (WARN_ON(!state))
		return;

	state->acquire_ctx = &ctx;

retry:
	to_intel_atomic_state(state)->cdclk.force_min_cdclk_changed = true;
	to_intel_atomic_state(state)->cdclk.force_min_cdclk =
		enable ? 2 * 96000 : 0;

828 829
	/* Protects dev_priv->cdclk.force_min_cdclk */
	ret = intel_atomic_lock_global_state(to_intel_atomic_state(state));
830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846
	if (!ret)
		ret = drm_atomic_commit(state);

	if (ret == -EDEADLK) {
		drm_atomic_state_clear(state);
		drm_modeset_backoff(&ctx);
		goto retry;
	}

	WARN_ON(ret);

	drm_atomic_state_put(state);

	drm_modeset_drop_locks(&ctx);
	drm_modeset_acquire_fini(&ctx);
}

847
static unsigned long i915_audio_component_get_power(struct device *kdev)
I
Imre Deak 已提交
848
{
849 850 851
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
	intel_wakeref_t ret;

852 853 854
	/* Catch potential impedance mismatches before they occur! */
	BUILD_BUG_ON(sizeof(intel_wakeref_t) > sizeof(unsigned long));

855 856
	ret = intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);

857 858 859
	if (dev_priv->audio_power_refcount++ == 0) {
		if (IS_TIGERLAKE(dev_priv) || IS_ICELAKE(dev_priv)) {
			I915_WRITE(AUD_FREQ_CNTRL, dev_priv->audio_freq_cntrl);
860 861 862
			drm_dbg_kms(&dev_priv->drm,
				    "restored AUD_FREQ_CNTRL to 0x%x\n",
				    dev_priv->audio_freq_cntrl);
863 864 865
		}

		/* Force CDCLK to 2*BCLK as long as we need audio powered. */
866
		if (IS_GEMINILAKE(dev_priv))
867
			glk_force_audio_cdclk(dev_priv, true);
868 869 870 871 872

		if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
			I915_WRITE(AUD_PIN_BUF_CTL,
				   (I915_READ(AUD_PIN_BUF_CTL) |
				    AUD_PIN_BUF_ENABLE));
873
	}
874 875

	return ret;
I
Imre Deak 已提交
876 877
}

878 879
static void i915_audio_component_put_power(struct device *kdev,
					   unsigned long cookie)
I
Imre Deak 已提交
880
{
881 882 883 884
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);

	/* Stop forcing CDCLK to 2*BCLK if no need for audio to be powered. */
	if (--dev_priv->audio_power_refcount == 0)
885
		if (IS_GEMINILAKE(dev_priv))
886 887 888
			glk_force_audio_cdclk(dev_priv, false);

	intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO, cookie);
I
Imre Deak 已提交
889 890
}

891
static void i915_audio_component_codec_wake_override(struct device *kdev,
892 893
						     bool enable)
{
894
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
895
	unsigned long cookie;
896 897
	u32 tmp;

898
	if (!IS_GEN(dev_priv, 9))
899 900
		return;

901
	cookie = i915_audio_component_get_power(kdev);
902

903 904 905 906 907 908 909 910 911 912 913 914 915 916 917
	/*
	 * 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);
	}
918

919
	i915_audio_component_put_power(kdev, cookie);
920 921
}

I
Imre Deak 已提交
922
/* Get CDCLK in kHz  */
923
static int i915_audio_component_get_cdclk_freq(struct device *kdev)
I
Imre Deak 已提交
924
{
925
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
I
Imre Deak 已提交
926 927 928 929

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

930
	return dev_priv->cdclk.hw.cdclk;
I
Imre Deak 已提交
931 932
}

933 934 935 936 937 938 939 940 941 942
/*
 * get the intel_encoder according to the parameter port and pipe
 * intel_encoder is saved by the index of pipe
 * MST & (pipe >= 0): return the av_enc_map[pipe],
 *   when port is matched
 * MST & (pipe < 0): this is invalid
 * Non-MST & (pipe >= 0): only pipe = 0 (the first device entry)
 *   will get the right intel_encoder with port matched
 * Non-MST & (pipe < 0): get the right intel_encoder with port matched
 */
943 944 945
static struct intel_encoder *get_saved_enc(struct drm_i915_private *dev_priv,
					       int port, int pipe)
{
946
	struct intel_encoder *encoder;
947 948

	/* MST */
949
	if (pipe >= 0) {
950 951 952
		if (WARN_ON(pipe >= ARRAY_SIZE(dev_priv->av_enc_map)))
			return NULL;

953 954 955 956 957 958 959 960 961 962
		encoder = dev_priv->av_enc_map[pipe];
		/*
		 * when bootup, audio driver may not know it is
		 * MST or not. So it will poll all the port & pipe
		 * combinations
		 */
		if (encoder != NULL && encoder->port == port &&
		    encoder->type == INTEL_OUTPUT_DP_MST)
			return encoder;
	}
963 964

	/* Non-MST */
965 966
	if (pipe > 0)
		return NULL;
967

968
	for_each_pipe(dev_priv, pipe) {
969 970 971 972
		encoder = dev_priv->av_enc_map[pipe];
		if (encoder == NULL)
			continue;

973 974 975
		if (encoder->type == INTEL_OUTPUT_DP_MST)
			continue;

976 977 978 979 980 981 982 983 984
		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)
985
{
986
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
987
	struct i915_audio_component *acomp = dev_priv->audio_component;
988 989
	struct intel_encoder *encoder;
	struct intel_crtc *crtc;
990
	unsigned long cookie;
991
	int err = 0;
992

993
	if (!HAS_DDI(dev_priv))
994 995
		return 0;

996
	cookie = i915_audio_component_get_power(kdev);
997
	mutex_lock(&dev_priv->av_mutex);
998

999
	/* 1. get the pipe */
1000 1001
	encoder = get_saved_enc(dev_priv, port, pipe);
	if (!encoder || !encoder->base.crtc) {
1002 1003
		drm_dbg_kms(&dev_priv->drm, "Not valid for port %c\n",
			    port_name(port));
1004 1005
		err = -ENODEV;
		goto unlock;
1006
	}
1007

1008
	crtc = to_intel_crtc(encoder->base.crtc);
1009

1010 1011 1012
	/* port must be valid now, otherwise the pipe will be invalid */
	acomp->aud_sample_rate[port] = rate;

1013
	hsw_audio_config_update(encoder, crtc->config);
1014

1015
 unlock:
1016
	mutex_unlock(&dev_priv->av_mutex);
1017
	i915_audio_component_put_power(kdev, cookie);
1018
	return err;
1019 1020
}

1021
static int i915_audio_component_get_eld(struct device *kdev, int port,
1022
					int pipe, bool *enabled,
1023 1024
					unsigned char *buf, int max_bytes)
{
1025
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
1026 1027 1028 1029 1030
	struct intel_encoder *intel_encoder;
	const u8 *eld;
	int ret = -EINVAL;

	mutex_lock(&dev_priv->av_mutex);
1031 1032 1033

	intel_encoder = get_saved_enc(dev_priv, port, pipe);
	if (!intel_encoder) {
1034 1035
		drm_dbg_kms(&dev_priv->drm, "Not valid for port %c\n",
			    port_name(port));
1036 1037 1038 1039 1040 1041 1042 1043 1044 1045
		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));
1046 1047 1048 1049
	}

	mutex_unlock(&dev_priv->av_mutex);
	return ret;
1050 1051
}

1052
static const struct drm_audio_component_ops i915_audio_component_ops = {
I
Imre Deak 已提交
1053 1054 1055
	.owner		= THIS_MODULE,
	.get_power	= i915_audio_component_get_power,
	.put_power	= i915_audio_component_put_power,
1056
	.codec_wake_override = i915_audio_component_codec_wake_override,
I
Imre Deak 已提交
1057
	.get_cdclk_freq	= i915_audio_component_get_cdclk_freq,
1058
	.sync_audio_rate = i915_audio_component_sync_audio_rate,
1059
	.get_eld	= i915_audio_component_get_eld,
I
Imre Deak 已提交
1060 1061
};

1062 1063
static int i915_audio_component_bind(struct device *i915_kdev,
				     struct device *hda_kdev, void *data)
I
Imre Deak 已提交
1064 1065
{
	struct i915_audio_component *acomp = data;
1066
	struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
1067
	int i;
I
Imre Deak 已提交
1068

1069
	if (WARN_ON(acomp->base.ops || acomp->base.dev))
I
Imre Deak 已提交
1070 1071
		return -EEXIST;

1072 1073 1074
	if (WARN_ON(!device_link_add(hda_kdev, i915_kdev, DL_FLAG_STATELESS)))
		return -ENOMEM;

1075
	drm_modeset_lock_all(&dev_priv->drm);
1076 1077
	acomp->base.ops = &i915_audio_component_ops;
	acomp->base.dev = i915_kdev;
1078 1079 1080
	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;
1081
	dev_priv->audio_component = acomp;
1082
	drm_modeset_unlock_all(&dev_priv->drm);
I
Imre Deak 已提交
1083 1084 1085 1086

	return 0;
}

1087 1088
static void i915_audio_component_unbind(struct device *i915_kdev,
					struct device *hda_kdev, void *data)
I
Imre Deak 已提交
1089 1090
{
	struct i915_audio_component *acomp = data;
1091
	struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
I
Imre Deak 已提交
1092

1093
	drm_modeset_lock_all(&dev_priv->drm);
1094 1095
	acomp->base.ops = NULL;
	acomp->base.dev = NULL;
1096
	dev_priv->audio_component = NULL;
1097
	drm_modeset_unlock_all(&dev_priv->drm);
1098 1099

	device_link_remove(hda_kdev, i915_kdev);
I
Imre Deak 已提交
1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122
}

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).
 */
1123
static void i915_audio_component_init(struct drm_i915_private *dev_priv)
I
Imre Deak 已提交
1124 1125 1126
{
	int ret;

1127 1128 1129
	ret = component_add_typed(dev_priv->drm.dev,
				  &i915_audio_component_bind_ops,
				  I915_COMPONENT_AUDIO);
I
Imre Deak 已提交
1130
	if (ret < 0) {
1131 1132
		drm_err(&dev_priv->drm,
			"failed to add audio component (%d)\n", ret);
I
Imre Deak 已提交
1133 1134 1135 1136
		/* continue with reduced functionality */
		return;
	}

1137 1138
	if (IS_TIGERLAKE(dev_priv) || IS_ICELAKE(dev_priv)) {
		dev_priv->audio_freq_cntrl = I915_READ(AUD_FREQ_CNTRL);
1139 1140 1141
		drm_dbg_kms(&dev_priv->drm,
			    "init value of AUD_FREQ_CNTRL of 0x%x\n",
			    dev_priv->audio_freq_cntrl);
1142 1143
	}

I
Imre Deak 已提交
1144 1145 1146 1147 1148 1149 1150 1151 1152 1153
	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.
 */
1154
static void i915_audio_component_cleanup(struct drm_i915_private *dev_priv)
I
Imre Deak 已提交
1155 1156 1157 1158
{
	if (!dev_priv->audio_component_registered)
		return;

1159
	component_del(dev_priv->drm.dev, &i915_audio_component_bind_ops);
I
Imre Deak 已提交
1160 1161
	dev_priv->audio_component_registered = false;
}
1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186

/**
 * intel_audio_init() - Initialize the audio driver either using
 * component framework or using lpe audio bridge
 * @dev_priv: the i915 drm device private data
 *
 */
void intel_audio_init(struct drm_i915_private *dev_priv)
{
	if (intel_lpe_audio_init(dev_priv) < 0)
		i915_audio_component_init(dev_priv);
}

/**
 * intel_audio_deinit() - deinitialize the audio driver
 * @dev_priv: the i915 drm device private data
 *
 */
void intel_audio_deinit(struct drm_i915_private *dev_priv)
{
	if ((dev_priv)->lpe_audio.platdev != NULL)
		intel_lpe_audio_teardown(dev_priv);
	else
		i915_audio_component_cleanup(dev_priv);
}