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

Imre Deak's avatar
Imre Deak committed
24
#include <linux/component.h>
25 26 27
#include <linux/kernel.h>

#include <drm/drm_edid.h>
Imre Deak's avatar
Imre Deak committed
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_audio_regs.h"
34
#include "intel_cdclk.h"
35
#include "intel_crtc.h"
36
#include "intel_de.h"
37
#include "intel_display_types.h"
38
#include "intel_lpe_audio.h"
39

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

67 68 69 70 71 72 73 74 75
struct intel_audio_funcs {
	void (*audio_codec_enable)(struct intel_encoder *encoder,
				   const struct intel_crtc_state *crtc_state,
				   const struct drm_connector_state *conn_state);
	void (*audio_codec_disable)(struct intel_encoder *encoder,
				    const struct intel_crtc_state *old_crtc_state,
				    const struct drm_connector_state *old_conn_state);
};

76
/* DP N/M table */
77
#define LC_810M	810000
78 79 80 81 82 83 84 85 86 87 88
#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;
};

89 90 91 92 93 94 95
struct hdmi_aud_ncts {
	int sample_rate;
	int clock;
	int n;
	int cts;
};

96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
/* 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 },
125 126 127 128 129 130 131 132 133
	{ 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 },
134 135 136
};

static const struct dp_aud_n_m *
137
audio_config_dp_get_n_m(const struct intel_crtc_state *crtc_state, int rate)
138 139 140 141 142
{
	int i;

	for (i = 0; i < ARRAY_SIZE(dp_aud_n_m); i++) {
		if (rate == dp_aud_n_m[i].sample_rate &&
143
		    crtc_state->port_clock == dp_aud_n_m[i].clock)
144 145 146 147 148 149
			return &dp_aud_n_m[i];
	}

	return NULL;
}

150
static const struct {
151 152 153
	int clock;
	u32 config;
} hdmi_audio_clock[] = {
154
	{ 25175, AUD_CONFIG_PIXEL_CLOCK_HDMI_25175 },
155 156
	{ 25200, AUD_CONFIG_PIXEL_CLOCK_HDMI_25200 }, /* default per bspec */
	{ 27000, AUD_CONFIG_PIXEL_CLOCK_HDMI_27000 },
157
	{ 27027, AUD_CONFIG_PIXEL_CLOCK_HDMI_27027 },
158
	{ 54000, AUD_CONFIG_PIXEL_CLOCK_HDMI_54000 },
159 160
	{ 54054, AUD_CONFIG_PIXEL_CLOCK_HDMI_54054 },
	{ 74176, AUD_CONFIG_PIXEL_CLOCK_HDMI_74176 },
161
	{ 74250, AUD_CONFIG_PIXEL_CLOCK_HDMI_74250 },
162
	{ 148352, AUD_CONFIG_PIXEL_CLOCK_HDMI_148352 },
163
	{ 148500, AUD_CONFIG_PIXEL_CLOCK_HDMI_148500 },
164 165 166 167
	{ 296703, AUD_CONFIG_PIXEL_CLOCK_HDMI_296703 },
	{ 297000, AUD_CONFIG_PIXEL_CLOCK_HDMI_297000 },
	{ 593407, AUD_CONFIG_PIXEL_CLOCK_HDMI_593407 },
	{ 594000, AUD_CONFIG_PIXEL_CLOCK_HDMI_594000 },
168 169
};

170 171
/* HDMI N/CTS table */
#define TMDS_297M 297000
172
#define TMDS_296M 296703
173 174 175
#define TMDS_594M 594000
#define TMDS_593M 593407

176
static const struct hdmi_aud_ncts hdmi_aud_ncts_24bpp[] = {
177 178
	{ 32000, TMDS_296M, 5824, 421875 },
	{ 32000, TMDS_297M, 3072, 222750 },
179 180 181 182 183 184
	{ 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 },
185 186
	{ 88200, TMDS_296M, 8918, 234375 },
	{ 88200, TMDS_297M, 9408, 247500 },
187 188
	{ 88200, TMDS_593M, 17836, 937500 },
	{ 88200, TMDS_594M, 18816, 990000 },
189 190
	{ 176400, TMDS_296M, 17836, 234375 },
	{ 176400, TMDS_297M, 18816, 247500 },
191 192 193 194
	{ 176400, TMDS_593M, 35672, 937500 },
	{ 176400, TMDS_594M, 37632, 990000 },
	{ 48000, TMDS_296M, 5824, 281250 },
	{ 48000, TMDS_297M, 5120, 247500 },
195 196
	{ 48000, TMDS_593M, 5824, 562500 },
	{ 48000, TMDS_594M, 6144, 594000 },
197 198
	{ 96000, TMDS_296M, 11648, 281250 },
	{ 96000, TMDS_297M, 10240, 247500 },
199 200
	{ 96000, TMDS_593M, 11648, 562500 },
	{ 96000, TMDS_594M, 12288, 594000 },
201 202
	{ 192000, TMDS_296M, 23296, 281250 },
	{ 192000, TMDS_297M, 20480, 247500 },
203 204
	{ 192000, TMDS_593M, 23296, 562500 },
	{ 192000, TMDS_594M, 24576, 594000 },
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 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
/* 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 },
};

250
/* get AUD_CONFIG_PIXEL_CLOCK_HDMI_* value for mode */
251
static u32 audio_config_hdmi_pixel_clock(const struct intel_crtc_state *crtc_state)
252
{
253
	struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
254
	const struct drm_display_mode *adjusted_mode =
255
		&crtc_state->hw.adjusted_mode;
256 257 258
	int i;

	for (i = 0; i < ARRAY_SIZE(hdmi_audio_clock); i++) {
259
		if (adjusted_mode->crtc_clock == hdmi_audio_clock[i].clock)
260 261 262
			break;
	}

263
	if (DISPLAY_VER(dev_priv) < 12 && adjusted_mode->crtc_clock > 148500)
264 265
		i = ARRAY_SIZE(hdmi_audio_clock);

266
	if (i == ARRAY_SIZE(hdmi_audio_clock)) {
267 268 269
		drm_dbg_kms(&dev_priv->drm,
			    "HDMI audio pixel clock setting for %d not found, falling back to defaults\n",
			    adjusted_mode->crtc_clock);
270 271 272
		i = 1;
	}

273 274 275 276
	drm_dbg_kms(&dev_priv->drm,
		    "Configuring HDMI audio for pixel clock %d (0x%08x)\n",
		    hdmi_audio_clock[i].clock,
		    hdmi_audio_clock[i].config);
277 278 279 280

	return hdmi_audio_clock[i].config;
}

281
static int audio_config_hdmi_get_n(const struct intel_crtc_state *crtc_state,
282
				   int rate)
283
{
284 285 286 287 288 289 290 291 292 293 294 295 296
	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);
	}
297

298 299 300 301
	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;
302 303 304 305 306
		}
	}
	return 0;
}

307
static bool intel_eld_uptodate(struct drm_connector *connector,
308 309
			       i915_reg_t reg_eldv, u32 bits_eldv,
			       i915_reg_t reg_elda, u32 bits_elda,
310
			       i915_reg_t reg_edid)
311
{
312
	struct drm_i915_private *dev_priv = to_i915(connector->dev);
313
	const u8 *eld = connector->eld;
314
	u32 tmp;
315
	int i;
316

317
	tmp = intel_de_read(dev_priv, reg_eldv);
318
	tmp &= bits_eldv;
319

320
	if (!tmp)
321 322
		return false;

323
	tmp = intel_de_read(dev_priv, reg_elda);
324
	tmp &= ~bits_elda;
325
	intel_de_write(dev_priv, reg_elda, tmp);
326

327
	for (i = 0; i < drm_eld_size(eld) / 4; i++)
328
		if (intel_de_read(dev_priv, reg_edid) != *((const u32 *)eld + i))
329 330 331 332 333
			return false;

	return true;
}

334 335 336
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)
337
{
338
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
339
	u32 eldv, tmp;
340

341
	tmp = intel_de_read(dev_priv, G4X_AUD_VID_DID);
342 343 344 345 346 347
	if (tmp == INTEL_AUDIO_DEVBLC || tmp == INTEL_AUDIO_DEVCL)
		eldv = G4X_ELDV_DEVCL_DEVBLC;
	else
		eldv = G4X_ELDV_DEVCTG;

	/* Invalidate ELD */
348
	tmp = intel_de_read(dev_priv, G4X_AUD_CNTL_ST);
349
	tmp &= ~eldv;
350
	intel_de_write(dev_priv, G4X_AUD_CNTL_ST, tmp);
351 352
}

353 354 355
static void g4x_audio_codec_enable(struct intel_encoder *encoder,
				   const struct intel_crtc_state *crtc_state,
				   const struct drm_connector_state *conn_state)
356
{
357 358
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
	struct drm_connector *connector = conn_state->connector;
359
	const u8 *eld = connector->eld;
360 361
	u32 eldv;
	u32 tmp;
362
	int len, i;
363

364
	tmp = intel_de_read(dev_priv, G4X_AUD_VID_DID);
365
	if (tmp == INTEL_AUDIO_DEVBLC || tmp == INTEL_AUDIO_DEVCL)
366 367 368 369 370 371
		eldv = G4X_ELDV_DEVCL_DEVBLC;
	else
		eldv = G4X_ELDV_DEVCTG;

	if (intel_eld_uptodate(connector,
			       G4X_AUD_CNTL_ST, eldv,
372
			       G4X_AUD_CNTL_ST, G4X_ELD_ADDR_MASK,
373 374 375
			       G4X_HDMIW_HDMIEDID))
		return;

376
	tmp = intel_de_read(dev_priv, G4X_AUD_CNTL_ST);
377
	tmp &= ~(eldv | G4X_ELD_ADDR_MASK);
378
	len = (tmp >> 9) & 0x1f;		/* ELD buffer size */
379
	intel_de_write(dev_priv, G4X_AUD_CNTL_ST, tmp);
380

381
	len = min(drm_eld_size(eld) / 4, len);
382
	for (i = 0; i < len; i++)
383 384
		intel_de_write(dev_priv, G4X_HDMIW_HDMIEDID,
			       *((const u32 *)eld + i));
385

386
	tmp = intel_de_read(dev_priv, G4X_AUD_CNTL_ST);
387
	tmp |= eldv;
388
	intel_de_write(dev_priv, G4X_AUD_CNTL_ST, tmp);
389 390
}

391
static void
392 393
hsw_dp_audio_config_update(struct intel_encoder *encoder,
			   const struct intel_crtc_state *crtc_state)
394
{
395
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
396
	struct i915_audio_component *acomp = dev_priv->audio.component;
397
	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
398 399 400
	enum port port = encoder->port;
	const struct dp_aud_n_m *nm;
	int rate;
401 402
	u32 tmp;

403 404
	rate = acomp ? acomp->aud_sample_rate[port] : 0;
	nm = audio_config_dp_get_n_m(crtc_state, rate);
405
	if (nm)
406 407
		drm_dbg_kms(&dev_priv->drm, "using Maud %u, Naud %u\n", nm->m,
			    nm->n);
408
	else
409
		drm_dbg_kms(&dev_priv->drm, "using automatic Maud, Naud\n");
410

411
	tmp = intel_de_read(dev_priv, HSW_AUD_CFG(cpu_transcoder));
412 413 414 415 416
	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;

417 418 419 420 421 422
	if (nm) {
		tmp &= ~AUD_CONFIG_N_MASK;
		tmp |= AUD_CONFIG_N(nm->n);
		tmp |= AUD_CONFIG_N_PROG_ENABLE;
	}

423
	intel_de_write(dev_priv, HSW_AUD_CFG(cpu_transcoder), tmp);
424

425
	tmp = intel_de_read(dev_priv, HSW_AUD_M_CTS_ENABLE(cpu_transcoder));
426 427 428 429 430 431 432 433 434 435
	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;
	}

436
	intel_de_write(dev_priv, HSW_AUD_M_CTS_ENABLE(cpu_transcoder), tmp);
437 438 439
}

static void
440 441
hsw_hdmi_audio_config_update(struct intel_encoder *encoder,
			     const struct intel_crtc_state *crtc_state)
442
{
443
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
444
	struct i915_audio_component *acomp = dev_priv->audio.component;
445
	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
446 447
	enum port port = encoder->port;
	int n, rate;
448 449
	u32 tmp;

450 451
	rate = acomp ? acomp->aud_sample_rate[port] : 0;

452
	tmp = intel_de_read(dev_priv, HSW_AUD_CFG(cpu_transcoder));
453 454 455
	tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
	tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
	tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
456
	tmp |= audio_config_hdmi_pixel_clock(crtc_state);
457

458
	n = audio_config_hdmi_get_n(crtc_state, rate);
459
	if (n != 0) {
460
		drm_dbg_kms(&dev_priv->drm, "using N %d\n", n);
461 462 463 464 465

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

469
	intel_de_write(dev_priv, HSW_AUD_CFG(cpu_transcoder), tmp);
470

471 472 473 474
	/*
	 * Let's disable "Enable CTS or M Prog bit"
	 * and let HW calculate the value
	 */
475
	tmp = intel_de_read(dev_priv, HSW_AUD_M_CTS_ENABLE(cpu_transcoder));
476
	tmp &= ~AUD_M_CTS_M_PROG_ENABLE;
477
	tmp &= ~AUD_M_CTS_M_VALUE_INDEX;
478
	intel_de_write(dev_priv, HSW_AUD_M_CTS_ENABLE(cpu_transcoder), tmp);
479 480
}

481
static void
482 483
hsw_audio_config_update(struct intel_encoder *encoder,
			const struct intel_crtc_state *crtc_state)
484
{
485 486
	if (intel_crtc_has_dp_encoder(crtc_state))
		hsw_dp_audio_config_update(encoder, crtc_state);
487
	else
488
		hsw_hdmi_audio_config_update(encoder, crtc_state);
489 490
}

491 492 493
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)
494
{
495
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
496
	enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder;
497
	u32 tmp;
498

499
	mutex_lock(&dev_priv->audio.mutex);
500

501
	/* Disable timestamps */
502
	tmp = intel_de_read(dev_priv, HSW_AUD_CFG(cpu_transcoder));
503 504 505 506
	tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
	tmp |= AUD_CONFIG_N_PROG_ENABLE;
	tmp &= ~AUD_CONFIG_UPPER_N_MASK;
	tmp &= ~AUD_CONFIG_LOWER_N_MASK;
507
	if (intel_crtc_has_dp_encoder(old_crtc_state))
508
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
509
	intel_de_write(dev_priv, HSW_AUD_CFG(cpu_transcoder), tmp);
510 511

	/* Invalidate ELD */
512
	tmp = intel_de_read(dev_priv, HSW_AUD_PIN_ELD_CP_VLD);
513 514
	tmp &= ~AUDIO_ELD_VALID(cpu_transcoder);
	tmp &= ~AUDIO_OUTPUT_ENABLE(cpu_transcoder);
515
	intel_de_write(dev_priv, HSW_AUD_PIN_ELD_CP_VLD, tmp);
516

517
	mutex_unlock(&dev_priv->audio.mutex);
518 519
}

520 521
static unsigned int calc_hblank_early_prog(struct intel_encoder *encoder,
					   const struct intel_crtc_state *crtc_state)
522 523 524 525
{
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
	unsigned int link_clks_available, link_clks_required;
	unsigned int tu_data, tu_line, link_clks_active;
526 527
	unsigned int h_active, h_total, hblank_delta, pixel_clk;
	unsigned int fec_coeff, cdclk, vdsc_bpp;
528
	unsigned int link_clk, lanes;
529
	unsigned int hblank_rise;
530 531 532 533 534 535 536 537

	h_active = crtc_state->hw.adjusted_mode.crtc_hdisplay;
	h_total = crtc_state->hw.adjusted_mode.crtc_htotal;
	pixel_clk = crtc_state->hw.adjusted_mode.crtc_clock;
	vdsc_bpp = crtc_state->dsc.compressed_bpp;
	cdclk = i915->cdclk.hw.cdclk;
	/* fec= 0.972261, using rounding multiplier of 1000000 */
	fec_coeff = 972261;
538 539
	link_clk = crtc_state->port_clock;
	lanes = crtc_state->lane_count;
540 541 542

	drm_dbg_kms(&i915->drm, "h_active = %u link_clk = %u :"
		    "lanes = %u vdsc_bpp = %u cdclk = %u\n",
543
		    h_active, link_clk, lanes, vdsc_bpp, cdclk);
544

545
	if (WARN_ON(!link_clk || !pixel_clk || !lanes || !vdsc_bpp || !cdclk))
546 547
		return 0;

548 549
	link_clks_available = (h_total - h_active) * link_clk / pixel_clk - 28;
	link_clks_required = DIV_ROUND_UP(192000 * h_total, 1000 * pixel_clk) * (48 / lanes + 2);
550 551 552 553

	if (link_clks_available > link_clks_required)
		hblank_delta = 32;
	else
554 555
		hblank_delta = DIV64_U64_ROUND_UP(mul_u32_u32(5 * (link_clk + cdclk), pixel_clk),
						  mul_u32_u32(link_clk, cdclk));
556

557 558 559 560 561
	tu_data = div64_u64(mul_u32_u32(pixel_clk * vdsc_bpp * 8, 1000000),
			    mul_u32_u32(link_clk * lanes, fec_coeff));
	tu_line = div64_u64(h_active * mul_u32_u32(link_clk, fec_coeff),
			    mul_u32_u32(64 * pixel_clk, 1000000));
	link_clks_active  = (tu_line - 1) * 64 + tu_data;
562

563
	hblank_rise = (link_clks_active + 6 * DIV_ROUND_UP(link_clks_active, 250) + 4) * pixel_clk / link_clk;
564

565
	return h_active - hblank_rise + hblank_delta;
566 567
}

568
static unsigned int calc_samples_room(const struct intel_crtc_state *crtc_state)
569 570
{
	unsigned int h_active, h_total, pixel_clk;
571
	unsigned int link_clk, lanes;
572 573 574 575

	h_active = crtc_state->hw.adjusted_mode.hdisplay;
	h_total = crtc_state->hw.adjusted_mode.htotal;
	pixel_clk = crtc_state->hw.adjusted_mode.clock;
576 577
	link_clk = crtc_state->port_clock;
	lanes = crtc_state->lane_count;
578

579 580
	return ((h_total - h_active) * link_clk - 12 * pixel_clk) /
		(pixel_clk * (48 / lanes + 2));
581 582 583 584 585 586 587 588
}

static void enable_audio_dsc_wa(struct intel_encoder *encoder,
				const struct intel_crtc_state *crtc_state)
{
	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
	enum pipe pipe = crtc->pipe;
589
	unsigned int hblank_early_prog, samples_room;
590 591
	unsigned int val;

592
	if (DISPLAY_VER(i915) < 11)
593 594 595 596
		return;

	val = intel_de_read(i915, AUD_CONFIG_BE);

597
	if (DISPLAY_VER(i915) == 11)
598
		val |= HBLANK_EARLY_ENABLE_ICL(pipe);
599
	else if (DISPLAY_VER(i915) >= 12)
600 601 602
		val |= HBLANK_EARLY_ENABLE_TGL(pipe);

	if (crtc_state->dsc.compression_enable &&
603 604
	    crtc_state->hw.adjusted_mode.hdisplay >= 3840 &&
	    crtc_state->hw.adjusted_mode.vdisplay >= 2160) {
605
		/* Get hblank early enable value required */
606
		val &= ~HBLANK_START_COUNT_MASK(pipe);
607
		hblank_early_prog = calc_hblank_early_prog(encoder, crtc_state);
608
		if (hblank_early_prog < 32)
609
			val |= HBLANK_START_COUNT(pipe, HBLANK_START_COUNT_32);
610
		else if (hblank_early_prog < 64)
611
			val |= HBLANK_START_COUNT(pipe, HBLANK_START_COUNT_64);
612
		else if (hblank_early_prog < 96)
613
			val |= HBLANK_START_COUNT(pipe, HBLANK_START_COUNT_96);
614
		else
615 616 617
			val |= HBLANK_START_COUNT(pipe, HBLANK_START_COUNT_128);

		/* Get samples room value required */
618
		val &= ~NUMBER_SAMPLES_PER_LINE_MASK(pipe);
619
		samples_room = calc_samples_room(crtc_state);
620
		if (samples_room < 3)
621
			val |= NUMBER_SAMPLES_PER_LINE(pipe, samples_room);
622
		else /* Program 0 i.e "All Samples available in buffer" */
623 624 625 626 627 628 629 630
			val |= NUMBER_SAMPLES_PER_LINE(pipe, 0x0);
	}

	intel_de_write(i915, AUD_CONFIG_BE, val);
}

#undef ROUNDING_FACTOR

631 632 633
static void hsw_audio_codec_enable(struct intel_encoder *encoder,
				   const struct intel_crtc_state *crtc_state,
				   const struct drm_connector_state *conn_state)
634
{
635 636
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
	struct drm_connector *connector = conn_state->connector;
637
	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
638 639
	const u8 *eld = connector->eld;
	u32 tmp;
640
	int len, i;
641

642
	mutex_lock(&dev_priv->audio.mutex);
643

644 645 646 647
	/* Enable Audio WA for 4k DSC usecases */
	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP))
		enable_audio_dsc_wa(encoder, crtc_state);

648
	/* Enable audio presence detect, invalidate ELD */
649
	tmp = intel_de_read(dev_priv, HSW_AUD_PIN_ELD_CP_VLD);
650 651
	tmp |= AUDIO_OUTPUT_ENABLE(cpu_transcoder);
	tmp &= ~AUDIO_ELD_VALID(cpu_transcoder);
652
	intel_de_write(dev_priv, HSW_AUD_PIN_ELD_CP_VLD, tmp);
653

654 655 656 657 658 659
	/*
	 * 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.
	 */
660

661
	/* Reset ELD write address */
662
	tmp = intel_de_read(dev_priv, HSW_AUD_DIP_ELD_CTRL(cpu_transcoder));
663
	tmp &= ~IBX_ELD_ADDRESS_MASK;
664
	intel_de_write(dev_priv, HSW_AUD_DIP_ELD_CTRL(cpu_transcoder), tmp);
665

666
	/* Up to 84 bytes of hw ELD buffer */
667 668
	len = min(drm_eld_size(eld), 84);
	for (i = 0; i < len / 4; i++)
669 670
		intel_de_write(dev_priv, HSW_AUD_EDID_DATA(cpu_transcoder),
			       *((const u32 *)eld + i));
671

672
	/* ELD valid */
673
	tmp = intel_de_read(dev_priv, HSW_AUD_PIN_ELD_CP_VLD);
674
	tmp |= AUDIO_ELD_VALID(cpu_transcoder);
675
	intel_de_write(dev_priv, HSW_AUD_PIN_ELD_CP_VLD, tmp);
676 677

	/* Enable timestamps */
678
	hsw_audio_config_update(encoder, crtc_state);
679

680
	mutex_unlock(&dev_priv->audio.mutex);
681 682
}

683 684 685
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)
686
{
687
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
688
	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
689 690
	enum pipe pipe = crtc->pipe;
	enum port port = encoder->port;
691
	u32 tmp, eldv;
692
	i915_reg_t aud_config, aud_cntrl_st2;
693

694
	if (drm_WARN_ON(&dev_priv->drm, port == PORT_A))
695 696
		return;

697
	if (HAS_PCH_IBX(dev_priv)) {
698 699
		aud_config = IBX_AUD_CFG(pipe);
		aud_cntrl_st2 = IBX_AUD_CNTL_ST2;
700
	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
701 702 703 704 705 706 707 708
		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 */
709
	tmp = intel_de_read(dev_priv, aud_config);
710 711 712 713
	tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
	tmp |= AUD_CONFIG_N_PROG_ENABLE;
	tmp &= ~AUD_CONFIG_UPPER_N_MASK;
	tmp &= ~AUD_CONFIG_LOWER_N_MASK;
714
	if (intel_crtc_has_dp_encoder(old_crtc_state))
715
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
716
	intel_de_write(dev_priv, aud_config, tmp);
717

718
	eldv = IBX_ELD_VALID(port);
719 720

	/* Invalidate ELD */
721
	tmp = intel_de_read(dev_priv, aud_cntrl_st2);
722
	tmp &= ~eldv;
723
	intel_de_write(dev_priv, aud_cntrl_st2, tmp);
724 725
}

726 727 728
static void ilk_audio_codec_enable(struct intel_encoder *encoder,
				   const struct intel_crtc_state *crtc_state,
				   const struct drm_connector_state *conn_state)
729
{
730
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
731
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
732 733 734
	struct drm_connector *connector = conn_state->connector;
	enum pipe pipe = crtc->pipe;
	enum port port = encoder->port;
735
	const u8 *eld = connector->eld;
736
	u32 tmp, eldv;
737
	int len, i;
738
	i915_reg_t hdmiw_hdmiedid, aud_config, aud_cntl_st, aud_cntrl_st2;
739

740
	if (drm_WARN_ON(&dev_priv->drm, port == PORT_A))
741 742
		return;

743 744 745 746 747 748
	/*
	 * 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.
	 */
749

750
	if (HAS_PCH_IBX(dev_priv)) {
751 752 753 754
		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;
755 756
	} else if (IS_VALLEYVIEW(dev_priv) ||
		   IS_CHERRYVIEW(dev_priv)) {
757 758 759 760 761 762 763 764 765 766 767
		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;
	}

768
	eldv = IBX_ELD_VALID(port);
769

770
	/* Invalidate ELD */
771
	tmp = intel_de_read(dev_priv, aud_cntrl_st2);
772
	tmp &= ~eldv;
773
	intel_de_write(dev_priv, aud_cntrl_st2, tmp);
774

775
	/* Reset ELD write address */
776
	tmp = intel_de_read(dev_priv, aud_cntl_st);
777
	tmp &= ~IBX_ELD_ADDRESS_MASK;
778
	intel_de_write(dev_priv, aud_cntl_st, tmp);
779

780
	/* Up to 84 bytes of hw ELD buffer */
781 782
	len = min(drm_eld_size(eld), 84);
	for (i = 0; i < len / 4; i++)
783 784
		intel_de_write(dev_priv, hdmiw_hdmiedid,
			       *((const u32 *)eld + i));
785

786
	/* ELD valid */
787
	tmp = intel_de_read(dev_priv, aud_cntrl_st2);
788
	tmp |= eldv;
789
	intel_de_write(dev_priv, aud_cntrl_st2, tmp);
790 791

	/* Enable timestamps */
792
	tmp = intel_de_read(dev_priv, aud_config);
793 794 795
	tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
	tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
	tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
796
	if (intel_crtc_has_dp_encoder(crtc_state))
797 798
		tmp |= AUD_CONFIG_N_VALUE_INDEX;
	else
799
		tmp |= audio_config_hdmi_pixel_clock(crtc_state);
800
	intel_de_write(dev_priv, aud_config, tmp);
801 802
}

803 804
/**
 * intel_audio_codec_enable - Enable the audio codec for HD audio
805
 * @encoder: encoder on which to enable audio
806 807
 * @crtc_state: pointer to the current crtc state.
 * @conn_state: pointer to the current connector state.
808 809 810 811
 *
 * The enable sequences may only be performed after enabling the transcoder and
 * port, and after completed link training.
 */
812
void intel_audio_codec_enable(struct intel_encoder *encoder,
813 814
			      const struct intel_crtc_state *crtc_state,
			      const struct drm_connector_state *conn_state)
815
{
816
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
817
	struct i915_audio_component *acomp = dev_priv->audio.component;
818
	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
819 820
	struct drm_connector *connector = conn_state->connector;
	const struct drm_display_mode *adjusted_mode =
821
		&crtc_state->hw.adjusted_mode;
822 823
	enum port port = encoder->port;
	enum pipe pipe = crtc->pipe;
824

825 826 827
	if (!crtc_state->has_audio)
		return;

828 829 830
	drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s][ENCODER:%d:%s] Enable audio codec on pipe %c, %u bytes ELD\n",
		    connector->base.id, connector->name,
		    encoder->base.base.id, encoder->base.name,
831
		    pipe_name(pipe), drm_eld_size(connector->eld));
832

833
	/* FIXME precompute the ELD in .compute_config() */
834
	if (!connector->eld[0])
835 836 837
		drm_dbg_kms(&dev_priv->drm,
			    "Bogus ELD on [CONNECTOR:%d:%s]\n",
			    connector->base.id, connector->name);
838

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

841 842
	if (dev_priv->audio.funcs)
		dev_priv->audio.funcs->audio_codec_enable(encoder,
843 844
							  crtc_state,
							  conn_state);
845

846
	mutex_lock(&dev_priv->audio.mutex);
847
	encoder->audio_connector = connector;
848

849
	/* referred in audio callbacks */
850 851
	dev_priv->audio.encoder_map[pipe] = encoder;
	mutex_unlock(&dev_priv->audio.mutex);
852

853 854
	if (acomp && acomp->base.audio_ops &&
	    acomp->base.audio_ops->pin_eld_notify) {
855
		/* audio drivers expect pipe = -1 to indicate Non-MST cases */
856
		if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST))
857
			pipe = -1;
858
		acomp->base.audio_ops->pin_eld_notify(acomp->base.audio_ops->audio_ptr,
859
						 (int) port, (int) pipe);
860 861
	}

862
	intel_lpe_audio_notify(dev_priv, pipe, port, connector->eld,
863
			       crtc_state->port_clock,
864
			       intel_crtc_has_dp_encoder(crtc_state));
865 866 867 868
}

/**
 * intel_audio_codec_disable - Disable the audio codec for HD audio
869
 * @encoder: encoder on which to disable audio
870 871
 * @old_crtc_state: pointer to the old crtc state.
 * @old_conn_state: pointer to the old connector state.
872 873 874 875
 *
 * The disable sequences must be performed before disabling the transcoder or
 * port.
 */
876 877 878
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)
879
{
880
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
881
	struct i915_audio_component *acomp = dev_priv->audio.component;
882
	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
883
	struct drm_connector *connector = old_conn_state->connector;
884
	enum port port = encoder->port;
885
	enum pipe pipe = crtc->pipe;
886

887 888 889
	if (!old_crtc_state->has_audio)
		return;

890 891
	drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s][ENCODER:%d:%s] Disable audio codec on pipe %c\n",
		    connector->base.id, connector->name,
892
		    encoder->base.base.id, encoder->base.name, pipe_name(pipe));
893

894 895
	if (dev_priv->audio.funcs)
		dev_priv->audio.funcs->audio_codec_disable(encoder,
896 897
							   old_crtc_state,
							   old_conn_state);
898

899
	mutex_lock(&dev_priv->audio.mutex);
900
	encoder->audio_connector = NULL;
901 902
	dev_priv->audio.encoder_map[pipe] = NULL;
	mutex_unlock(&dev_priv->audio.mutex);
903

904 905
	if (acomp && acomp->base.audio_ops &&
	    acomp->base.audio_ops->pin_eld_notify) {
906
		/* audio drivers expect pipe = -1 to indicate Non-MST cases */
907
		if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST))
908
			pipe = -1;
909
		acomp->base.audio_ops->pin_eld_notify(acomp->base.audio_ops->audio_ptr,
910
						 (int) port, (int) pipe);
911
	}
912

913
	intel_lpe_audio_notify(dev_priv, pipe, port, NULL, 0, false);
914 915
}

916 917 918 919 920 921 922 923 924 925 926 927 928 929 930
static const struct intel_audio_funcs g4x_audio_funcs = {
	.audio_codec_enable = g4x_audio_codec_enable,
	.audio_codec_disable = g4x_audio_codec_disable,
};

static const struct intel_audio_funcs ilk_audio_funcs = {
	.audio_codec_enable = ilk_audio_codec_enable,
	.audio_codec_disable = ilk_audio_codec_disable,
};

static const struct intel_audio_funcs hsw_audio_funcs = {
	.audio_codec_enable = hsw_audio_codec_enable,
	.audio_codec_disable = hsw_audio_codec_disable,
};

931
/**
932
 * intel_audio_hooks_init - Set up chip specific audio hooks
933
 * @dev_priv: device private
934
 */
935
void intel_audio_hooks_init(struct drm_i915_private *dev_priv)
936
{
937
	if (IS_G4X(dev_priv)) {
938
		dev_priv->audio.funcs = &g4x_audio_funcs;
939
	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
940
		dev_priv->audio.funcs = &ilk_audio_funcs;
941
	} else if (IS_HASWELL(dev_priv) || DISPLAY_VER(dev_priv) >= 8) {
942
		dev_priv->audio.funcs = &hsw_audio_funcs;
943
	} else if (HAS_PCH_SPLIT(dev_priv)) {
944
		dev_priv->audio.funcs = &ilk_audio_funcs;
945
	}
946
}
Imre Deak's avatar
Imre Deak committed
947

948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981
struct aud_ts_cdclk_m_n {
	u8 m;
	u16 n;
};

void intel_audio_cdclk_change_pre(struct drm_i915_private *i915)
{
	if (DISPLAY_VER(i915) >= 13)
		intel_de_rmw(i915, AUD_TS_CDCLK_M, AUD_TS_CDCLK_M_EN, 0);
}

static void get_aud_ts_cdclk_m_n(int refclk, int cdclk, struct aud_ts_cdclk_m_n *aud_ts)
{
	if (refclk == 24000)
		aud_ts->m = 12;
	else
		aud_ts->m = 15;

	aud_ts->n = cdclk * aud_ts->m / 24000;
}

void intel_audio_cdclk_change_post(struct drm_i915_private *i915)
{
	struct aud_ts_cdclk_m_n aud_ts;

	if (DISPLAY_VER(i915) >= 13) {
		get_aud_ts_cdclk_m_n(i915->cdclk.hw.ref, i915->cdclk.hw.cdclk, &aud_ts);

		intel_de_write(i915, AUD_TS_CDCLK_N, aud_ts.n);
		intel_de_write(i915, AUD_TS_CDCLK_M, aud_ts.m | AUD_TS_CDCLK_M_EN);
		drm_dbg_kms(&i915->drm, "aud_ts_cdclk set to M=%u, N=%u\n", aud_ts.m, aud_ts.n);
	}
}

982
static int glk_force_audio_cdclk_commit(struct intel_atomic_state *state,
983
					struct intel_crtc *crtc,
984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002
					bool enable)
{
	struct intel_cdclk_state *cdclk_state;
	int ret;

	/* need to hold at least one crtc lock for the global state */
	ret = drm_modeset_lock(&crtc->base.mutex, state->base.acquire_ctx);
	if (ret)
		return ret;

	cdclk_state = intel_atomic_get_cdclk_state(state);
	if (IS_ERR(cdclk_state))
		return PTR_ERR(cdclk_state);

	cdclk_state->force_min_cdclk = enable ? 2 * 96000 : 0;

	return drm_atomic_commit(&state->base);
}

1003 1004 1005 1006 1007
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;
1008
	struct intel_crtc *crtc;
1009 1010
	int ret;

1011
	crtc = intel_first_crtc(dev_priv);
1012 1013 1014
	if (!crtc)
		return;

1015 1016
	drm_modeset_acquire_init(&ctx, 0);
	state = drm_atomic_state_alloc(&dev_priv->drm);
1017
	if (drm_WARN_ON(&dev_priv->drm, !state))
1018 1019 1020 1021 1022
		return;

	state->acquire_ctx = &ctx;

retry:
1023 1024
	ret = glk_force_audio_cdclk_commit(to_intel_atomic_state(state), crtc,
					   enable);
1025 1026 1027 1028 1029 1030
	if (ret == -EDEADLK) {
		drm_atomic_state_clear(state);
		drm_modeset_backoff(&ctx);
		goto retry;
	}

1031
	drm_WARN_ON(&dev_priv->drm, ret);
1032 1033 1034 1035 1036 1037 1038

	drm_atomic_state_put(state);

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

1039
static unsigned long i915_audio_component_get_power(struct device *kdev)
Imre Deak's avatar
Imre Deak committed
1040
{
1041 1042 1043
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
	intel_wakeref_t ret;

1044 1045 1046
	/* Catch potential impedance mismatches before they occur! */
	BUILD_BUG_ON(sizeof(intel_wakeref_t) > sizeof(unsigned long));

1047
	ret = intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO_PLAYBACK);
1048

1049
	if (dev_priv->audio.power_refcount++ == 0) {
1050
		if (DISPLAY_VER(dev_priv) >= 9) {
1051
			intel_de_write(dev_priv, AUD_FREQ_CNTRL,
1052
				       dev_priv->audio.freq_cntrl);
1053 1054
			drm_dbg_kms(&dev_priv->drm,
				    "restored AUD_FREQ_CNTRL to 0x%x\n",
1055
				    dev_priv->audio.freq_cntrl);
1056 1057 1058
		}

		/* Force CDCLK to 2*BCLK as long as we need audio powered. */
1059
		if (IS_GEMINILAKE(dev_priv))
1060
			glk_force_audio_cdclk(dev_priv, true);
1061

1062
		if (DISPLAY_VER(dev_priv) >= 10)
1063 1064
			intel_de_write(dev_priv, AUD_PIN_BUF_CTL,
				       (intel_de_read(dev_priv, AUD_PIN_BUF_CTL) | AUD_PIN_BUF_ENABLE));
1065
	}
1066 1067

	return ret;
Imre Deak's avatar
Imre Deak committed
1068 1069
}

1070 1071
static void i915_audio_component_put_power(struct device *kdev,
					   unsigned long cookie)
Imre Deak's avatar
Imre Deak committed
1072
{
1073 1074 1075
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);

	/* Stop forcing CDCLK to 2*BCLK if no need for audio to be powered. */
1076
	if (--dev_priv->audio.power_refcount == 0)
1077
		if (IS_GEMINILAKE(dev_priv))
1078 1079
			glk_force_audio_cdclk(dev_priv, false);

1080
	intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO_PLAYBACK, cookie);
Imre Deak's avatar
Imre Deak committed
1081 1082
}

1083
static void i915_audio_component_codec_wake_override(struct device *kdev,
1084 1085
						     bool enable)
{
1086
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
1087
	unsigned long cookie;
1088 1089
	u32 tmp;

1090
	if (DISPLAY_VER(dev_priv) < 9)
1091 1092
		return;

1093
	cookie = i915_audio_component_get_power(kdev);
1094

1095 1096 1097 1098
	/*
	 * Enable/disable generating the codec wake signal, overriding the
	 * internal logic to generate the codec wake to controller.
	 */
1099
	tmp = intel_de_read(dev_priv, HSW_AUD_CHICKENBIT);
1100
	tmp &= ~SKL_AUD_CODEC_WAKE_SIGNAL;
1101
	intel_de_write(dev_priv, HSW_AUD_CHICKENBIT, tmp);
1102 1103 1104
	usleep_range(1000, 1500);

	if (enable) {
1105
		tmp = intel_de_read(dev_priv, HSW_AUD_CHICKENBIT);
1106
		tmp |= SKL_AUD_CODEC_WAKE_SIGNAL;
1107
		intel_de_write(dev_priv, HSW_AUD_CHICKENBIT, tmp);
1108 1109
		usleep_range(1000, 1500);
	}
1110

1111
	i915_audio_component_put_power(kdev, cookie);
1112 1113
}

Imre Deak's avatar
Imre Deak committed
1114
/* Get CDCLK in kHz  */
1115
static int i915_audio_component_get_cdclk_freq(struct device *kdev)
Imre Deak's avatar
Imre Deak committed
1116
{
1117
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
Imre Deak's avatar
Imre Deak committed
1118

1119
	if (drm_WARN_ON_ONCE(&dev_priv->drm, !HAS_DDI(dev_priv)))
Imre Deak's avatar
Imre Deak committed
1120 1121
		return -ENODEV;

1122
	return dev_priv->cdclk.hw.cdclk;
Imre Deak's avatar
Imre Deak committed
1123 1124
}

1125 1126 1127
/*
 * get the intel_encoder according to the parameter port and pipe
 * intel_encoder is saved by the index of pipe
1128
 * MST & (pipe >= 0): return the audio.encoder_map[pipe],
1129 1130 1131 1132 1133 1134
 *   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
 */
1135 1136 1137
static struct intel_encoder *get_saved_enc(struct drm_i915_private *dev_priv,
					       int port, int pipe)
{
1138
	struct intel_encoder *encoder;
1139 1140

	/* MST */
1141
	if (pipe >= 0) {
1142
		if (drm_WARN_ON(&dev_priv->drm,
1143
				pipe >= ARRAY_SIZE(dev_priv->audio.encoder_map)))
1144 1145
			return NULL;

1146
		encoder = dev_priv->audio.encoder_map[pipe];
1147 1148 1149 1150 1151 1152 1153 1154 1155
		/*
		 * 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;
	}
1156 1157

	/* Non-MST */
1158 1159
	if (pipe > 0)
		return NULL;
1160

1161
	for_each_pipe(dev_priv, pipe) {
1162
		encoder = dev_priv->audio.encoder_map[pipe];
1163 1164 1165
		if (encoder == NULL)
			continue;

1166 1167 1168
		if (encoder->type == INTEL_OUTPUT_DP_MST)
			continue;

1169 1170 1171 1172 1173 1174 1175 1176 1177
		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)
1178
{
1179
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
1180
	struct i915_audio_component *acomp = dev_priv->audio.component;
1181 1182
	struct intel_encoder *encoder;
	struct intel_crtc *crtc;
1183
	unsigned long cookie;
1184
	int err = 0;
1185

1186
	if (!HAS_DDI(dev_priv))
1187 1188
		return 0;

1189
	cookie = i915_audio_component_get_power(kdev);
1190
	mutex_lock(&dev_priv->audio.mutex);
1191

1192
	/* 1. get the pipe */
1193 1194
	encoder = get_saved_enc(dev_priv, port, pipe);
	if (!encoder || !encoder->base.crtc) {
1195 1196
		drm_dbg_kms(&dev_priv->drm, "Not valid for port %c\n",
			    port_name(port));
1197 1198
		err = -ENODEV;
		goto unlock;
1199
	}
1200

1201
	crtc = to_intel_crtc(encoder->base.crtc);
1202

1203 1204 1205
	/* port must be valid now, otherwise the pipe will be invalid */
	acomp->aud_sample_rate[port] = rate;

1206
	hsw_audio_config_update(encoder, crtc->config);
1207

1208
 unlock:
1209
	mutex_unlock(&dev_priv->audio.mutex);
1210
	i915_audio_component_put_power(kdev, cookie);
1211
	return err;
1212 1213
}

1214
static int i915_audio_component_get_eld(struct device *kdev, int port,
1215
					int pipe, bool *enabled,
1216 1217
					unsigned char *buf, int max_bytes)
{
1218
	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
1219 1220 1221 1222
	struct intel_encoder *intel_encoder;
	const u8 *eld;
	int ret = -EINVAL;

1223
	mutex_lock(&dev_priv->audio.mutex);
1224 1225 1226

	intel_encoder = get_saved_enc(dev_priv, port, pipe);
	if (!intel_encoder) {
1227 1228
		drm_dbg_kms(&dev_priv->drm, "Not valid for port %c\n",
			    port_name(port));
1229
		mutex_unlock(&dev_priv->audio.mutex);
1230 1231 1232 1233 1234 1235 1236 1237 1238
		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));
1239 1240
	}

1241
	mutex_unlock(&dev_priv->audio.mutex);
1242
	return ret;
1243 1244
}

1245
static const struct drm_audio_component_ops i915_audio_component_ops = {
Imre Deak's avatar
Imre Deak committed
1246 1247 1248
	.owner		= THIS_MODULE,
	.get_power	= i915_audio_component_get_power,
	.put_power	= i915_audio_component_put_power,
1249
	.codec_wake_override = i915_audio_component_codec_wake_override,
Imre Deak's avatar
Imre Deak committed
1250
	.get_cdclk_freq	= i915_audio_component_get_cdclk_freq,
1251
	.sync_audio_rate = i915_audio_component_sync_audio_rate,
1252
	.get_eld	= i915_audio_component_get_eld,
Imre Deak's avatar
Imre Deak committed
1253 1254
};

1255 1256
static int i915_audio_component_bind(struct device *i915_kdev,
				     struct device *hda_kdev, void *data)
Imre Deak's avatar
Imre Deak committed
1257 1258
{
	struct i915_audio_component *acomp = data;
1259
	struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
1260
	int i;
Imre Deak's avatar
Imre Deak committed
1261

1262
	if (drm_WARN_ON(&dev_priv->drm, acomp->base.ops || acomp->base.dev))
Imre Deak's avatar
Imre Deak committed
1263 1264
		return -EEXIST;

1265 1266 1267
	if (drm_WARN_ON(&dev_priv->drm,
			!device_link_add(hda_kdev, i915_kdev,
					 DL_FLAG_STATELESS)))
1268 1269
		return -ENOMEM;

1270
	drm_modeset_lock_all(&dev_priv->drm);
1271 1272
	acomp->base.ops = &i915_audio_component_ops;
	acomp->base.dev = i915_kdev;
1273 1274 1275
	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;
1276
	dev_priv->audio.component = acomp;
1277
	drm_modeset_unlock_all(&dev_priv->drm);
Imre Deak's avatar
Imre Deak committed
1278 1279 1280 1281

	return 0;
}

1282 1283
static void i915_audio_component_unbind(struct device *i915_kdev,
					struct device *hda_kdev, void *data)
Imre Deak's avatar
Imre Deak committed
1284 1285
{
	struct i915_audio_component *acomp = data;
1286
	struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
Imre Deak's avatar
Imre Deak committed
1287

1288
	drm_modeset_lock_all(&dev_priv->drm);
1289 1290
	acomp->base.ops = NULL;
	acomp->base.dev = NULL;
1291
	dev_priv->audio.component = NULL;
1292
	drm_modeset_unlock_all(&dev_priv->drm);
1293 1294

	device_link_remove(hda_kdev, i915_kdev);
1295

1296
	if (dev_priv->audio.power_refcount)
1297
		drm_err(&dev_priv->drm, "audio power refcount %d after unbind\n",
1298
			dev_priv->audio.power_refcount);
Imre Deak's avatar
Imre Deak committed
1299 1300 1301 1302 1303 1304 1305
}

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

1306 1307 1308 1309 1310 1311 1312 1313 1314
#define AUD_FREQ_TMODE_SHIFT	14
#define AUD_FREQ_4T		0
#define AUD_FREQ_8T		(2 << AUD_FREQ_TMODE_SHIFT)
#define AUD_FREQ_PULLCLKS(x)	(((x) & 0x3) << 11)
#define AUD_FREQ_BCLK_96M	BIT(4)

#define AUD_FREQ_GEN12          (AUD_FREQ_8T | AUD_FREQ_PULLCLKS(0) | AUD_FREQ_BCLK_96M)
#define AUD_FREQ_TGL_BROKEN     (AUD_FREQ_8T | AUD_FREQ_PULLCLKS(2) | AUD_FREQ_BCLK_96M)

Imre Deak's avatar
Imre Deak committed
1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330
/**
 * 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).
 */
1331
static void i915_audio_component_init(struct drm_i915_private *dev_priv)
Imre Deak's avatar
Imre Deak committed
1332
{
1333
	u32 aud_freq, aud_freq_init;
Imre Deak's avatar
Imre Deak committed
1334 1335
	int ret;

1336 1337 1338
	ret = component_add_typed(dev_priv->drm.dev,
				  &i915_audio_component_bind_ops,
				  I915_COMPONENT_AUDIO);
Imre Deak's avatar
Imre Deak committed
1339
	if (ret < 0) {
1340 1341
		drm_err(&dev_priv->drm,
			"failed to add audio component (%d)\n", ret);
Imre Deak's avatar
Imre Deak committed
1342 1343 1344 1345
		/* continue with reduced functionality */
		return;
	}

1346
	if (DISPLAY_VER(dev_priv) >= 9) {
1347 1348
		aud_freq_init = intel_de_read(dev_priv, AUD_FREQ_CNTRL);

1349
		if (DISPLAY_VER(dev_priv) >= 12)
1350 1351 1352 1353
			aud_freq = AUD_FREQ_GEN12;
		else
			aud_freq = aud_freq_init;

1354 1355 1356
		/* use BIOS provided value for TGL and RKL unless it is a known bad value */
		if ((IS_TIGERLAKE(dev_priv) || IS_ROCKETLAKE(dev_priv)) &&
		    aud_freq_init != AUD_FREQ_TGL_BROKEN)
1357 1358 1359 1360 1361
			aud_freq = aud_freq_init;

		drm_dbg_kms(&dev_priv->drm, "use AUD_FREQ_CNTRL of 0x%x (init value 0x%x)\n",
			    aud_freq, aud_freq_init);

1362
		dev_priv->audio.freq_cntrl = aud_freq;
1363 1364
	}

1365 1366 1367
	/* init with current cdclk */
	intel_audio_cdclk_change_post(dev_priv);

1368
	dev_priv->audio.component_registered = true;
Imre Deak's avatar
Imre Deak committed
1369 1370 1371 1372 1373 1374 1375 1376 1377
}

/**
 * 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.
 */
1378
static void i915_audio_component_cleanup(struct drm_i915_private *dev_priv)
Imre Deak's avatar
Imre Deak committed
1379
{
1380
	if (!dev_priv->audio.component_registered)
Imre Deak's avatar
Imre Deak committed
1381 1382
		return;

1383
	component_del(dev_priv->drm.dev, &i915_audio_component_bind_ops);
1384
	dev_priv->audio.component_registered = false;
Imre Deak's avatar
Imre Deak committed
1385
}
1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405

/**
 * 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)
{
1406
	if ((dev_priv)->audio.lpe.platdev != NULL)
1407 1408 1409 1410
		intel_lpe_audio_teardown(dev_priv);
	else
		i915_audio_component_cleanup(dev_priv);
}