0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include <linux/component.h>
0025 #include <linux/kernel.h>
0026
0027 #include <drm/drm_edid.h>
0028 #include <drm/i915_component.h>
0029
0030 #include "i915_drv.h"
0031 #include "intel_atomic.h"
0032 #include "intel_audio.h"
0033 #include "intel_audio_regs.h"
0034 #include "intel_cdclk.h"
0035 #include "intel_crtc.h"
0036 #include "intel_de.h"
0037 #include "intel_display_types.h"
0038 #include "intel_lpe_audio.h"
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067 struct intel_audio_funcs {
0068 void (*audio_codec_enable)(struct intel_encoder *encoder,
0069 const struct intel_crtc_state *crtc_state,
0070 const struct drm_connector_state *conn_state);
0071 void (*audio_codec_disable)(struct intel_encoder *encoder,
0072 const struct intel_crtc_state *old_crtc_state,
0073 const struct drm_connector_state *old_conn_state);
0074 };
0075
0076
0077 #define LC_810M 810000
0078 #define LC_540M 540000
0079 #define LC_270M 270000
0080 #define LC_162M 162000
0081
0082 struct dp_aud_n_m {
0083 int sample_rate;
0084 int clock;
0085 u16 m;
0086 u16 n;
0087 };
0088
0089 struct hdmi_aud_ncts {
0090 int sample_rate;
0091 int clock;
0092 int n;
0093 int cts;
0094 };
0095
0096
0097 static const struct dp_aud_n_m dp_aud_n_m[] = {
0098 { 32000, LC_162M, 1024, 10125 },
0099 { 44100, LC_162M, 784, 5625 },
0100 { 48000, LC_162M, 512, 3375 },
0101 { 64000, LC_162M, 2048, 10125 },
0102 { 88200, LC_162M, 1568, 5625 },
0103 { 96000, LC_162M, 1024, 3375 },
0104 { 128000, LC_162M, 4096, 10125 },
0105 { 176400, LC_162M, 3136, 5625 },
0106 { 192000, LC_162M, 2048, 3375 },
0107 { 32000, LC_270M, 1024, 16875 },
0108 { 44100, LC_270M, 784, 9375 },
0109 { 48000, LC_270M, 512, 5625 },
0110 { 64000, LC_270M, 2048, 16875 },
0111 { 88200, LC_270M, 1568, 9375 },
0112 { 96000, LC_270M, 1024, 5625 },
0113 { 128000, LC_270M, 4096, 16875 },
0114 { 176400, LC_270M, 3136, 9375 },
0115 { 192000, LC_270M, 2048, 5625 },
0116 { 32000, LC_540M, 1024, 33750 },
0117 { 44100, LC_540M, 784, 18750 },
0118 { 48000, LC_540M, 512, 11250 },
0119 { 64000, LC_540M, 2048, 33750 },
0120 { 88200, LC_540M, 1568, 18750 },
0121 { 96000, LC_540M, 1024, 11250 },
0122 { 128000, LC_540M, 4096, 33750 },
0123 { 176400, LC_540M, 3136, 18750 },
0124 { 192000, LC_540M, 2048, 11250 },
0125 { 32000, LC_810M, 1024, 50625 },
0126 { 44100, LC_810M, 784, 28125 },
0127 { 48000, LC_810M, 512, 16875 },
0128 { 64000, LC_810M, 2048, 50625 },
0129 { 88200, LC_810M, 1568, 28125 },
0130 { 96000, LC_810M, 1024, 16875 },
0131 { 128000, LC_810M, 4096, 50625 },
0132 { 176400, LC_810M, 3136, 28125 },
0133 { 192000, LC_810M, 2048, 16875 },
0134 };
0135
0136 static const struct dp_aud_n_m *
0137 audio_config_dp_get_n_m(const struct intel_crtc_state *crtc_state, int rate)
0138 {
0139 int i;
0140
0141 for (i = 0; i < ARRAY_SIZE(dp_aud_n_m); i++) {
0142 if (rate == dp_aud_n_m[i].sample_rate &&
0143 crtc_state->port_clock == dp_aud_n_m[i].clock)
0144 return &dp_aud_n_m[i];
0145 }
0146
0147 return NULL;
0148 }
0149
0150 static const struct {
0151 int clock;
0152 u32 config;
0153 } hdmi_audio_clock[] = {
0154 { 25175, AUD_CONFIG_PIXEL_CLOCK_HDMI_25175 },
0155 { 25200, AUD_CONFIG_PIXEL_CLOCK_HDMI_25200 },
0156 { 27000, AUD_CONFIG_PIXEL_CLOCK_HDMI_27000 },
0157 { 27027, AUD_CONFIG_PIXEL_CLOCK_HDMI_27027 },
0158 { 54000, AUD_CONFIG_PIXEL_CLOCK_HDMI_54000 },
0159 { 54054, AUD_CONFIG_PIXEL_CLOCK_HDMI_54054 },
0160 { 74176, AUD_CONFIG_PIXEL_CLOCK_HDMI_74176 },
0161 { 74250, AUD_CONFIG_PIXEL_CLOCK_HDMI_74250 },
0162 { 148352, AUD_CONFIG_PIXEL_CLOCK_HDMI_148352 },
0163 { 148500, AUD_CONFIG_PIXEL_CLOCK_HDMI_148500 },
0164 { 296703, AUD_CONFIG_PIXEL_CLOCK_HDMI_296703 },
0165 { 297000, AUD_CONFIG_PIXEL_CLOCK_HDMI_297000 },
0166 { 593407, AUD_CONFIG_PIXEL_CLOCK_HDMI_593407 },
0167 { 594000, AUD_CONFIG_PIXEL_CLOCK_HDMI_594000 },
0168 };
0169
0170
0171 #define TMDS_297M 297000
0172 #define TMDS_296M 296703
0173 #define TMDS_594M 594000
0174 #define TMDS_593M 593407
0175
0176 static const struct hdmi_aud_ncts hdmi_aud_ncts_24bpp[] = {
0177 { 32000, TMDS_296M, 5824, 421875 },
0178 { 32000, TMDS_297M, 3072, 222750 },
0179 { 32000, TMDS_593M, 5824, 843750 },
0180 { 32000, TMDS_594M, 3072, 445500 },
0181 { 44100, TMDS_296M, 4459, 234375 },
0182 { 44100, TMDS_297M, 4704, 247500 },
0183 { 44100, TMDS_593M, 8918, 937500 },
0184 { 44100, TMDS_594M, 9408, 990000 },
0185 { 88200, TMDS_296M, 8918, 234375 },
0186 { 88200, TMDS_297M, 9408, 247500 },
0187 { 88200, TMDS_593M, 17836, 937500 },
0188 { 88200, TMDS_594M, 18816, 990000 },
0189 { 176400, TMDS_296M, 17836, 234375 },
0190 { 176400, TMDS_297M, 18816, 247500 },
0191 { 176400, TMDS_593M, 35672, 937500 },
0192 { 176400, TMDS_594M, 37632, 990000 },
0193 { 48000, TMDS_296M, 5824, 281250 },
0194 { 48000, TMDS_297M, 5120, 247500 },
0195 { 48000, TMDS_593M, 5824, 562500 },
0196 { 48000, TMDS_594M, 6144, 594000 },
0197 { 96000, TMDS_296M, 11648, 281250 },
0198 { 96000, TMDS_297M, 10240, 247500 },
0199 { 96000, TMDS_593M, 11648, 562500 },
0200 { 96000, TMDS_594M, 12288, 594000 },
0201 { 192000, TMDS_296M, 23296, 281250 },
0202 { 192000, TMDS_297M, 20480, 247500 },
0203 { 192000, TMDS_593M, 23296, 562500 },
0204 { 192000, TMDS_594M, 24576, 594000 },
0205 };
0206
0207
0208
0209 #define TMDS_371M 371250
0210 #define TMDS_370M 370878
0211
0212 static const struct hdmi_aud_ncts hdmi_aud_ncts_30bpp[] = {
0213 { 32000, TMDS_370M, 5824, 527344 },
0214 { 32000, TMDS_371M, 6144, 556875 },
0215 { 44100, TMDS_370M, 8918, 585938 },
0216 { 44100, TMDS_371M, 4704, 309375 },
0217 { 88200, TMDS_370M, 17836, 585938 },
0218 { 88200, TMDS_371M, 9408, 309375 },
0219 { 176400, TMDS_370M, 35672, 585938 },
0220 { 176400, TMDS_371M, 18816, 309375 },
0221 { 48000, TMDS_370M, 11648, 703125 },
0222 { 48000, TMDS_371M, 5120, 309375 },
0223 { 96000, TMDS_370M, 23296, 703125 },
0224 { 96000, TMDS_371M, 10240, 309375 },
0225 { 192000, TMDS_370M, 46592, 703125 },
0226 { 192000, TMDS_371M, 20480, 309375 },
0227 };
0228
0229
0230 #define TMDS_445_5M 445500
0231 #define TMDS_445M 445054
0232
0233 static const struct hdmi_aud_ncts hdmi_aud_ncts_36bpp[] = {
0234 { 32000, TMDS_445M, 5824, 632813 },
0235 { 32000, TMDS_445_5M, 4096, 445500 },
0236 { 44100, TMDS_445M, 8918, 703125 },
0237 { 44100, TMDS_445_5M, 4704, 371250 },
0238 { 88200, TMDS_445M, 17836, 703125 },
0239 { 88200, TMDS_445_5M, 9408, 371250 },
0240 { 176400, TMDS_445M, 35672, 703125 },
0241 { 176400, TMDS_445_5M, 18816, 371250 },
0242 { 48000, TMDS_445M, 5824, 421875 },
0243 { 48000, TMDS_445_5M, 5120, 371250 },
0244 { 96000, TMDS_445M, 11648, 421875 },
0245 { 96000, TMDS_445_5M, 10240, 371250 },
0246 { 192000, TMDS_445M, 23296, 421875 },
0247 { 192000, TMDS_445_5M, 20480, 371250 },
0248 };
0249
0250
0251 static u32 audio_config_hdmi_pixel_clock(const struct intel_crtc_state *crtc_state)
0252 {
0253 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
0254 const struct drm_display_mode *adjusted_mode =
0255 &crtc_state->hw.adjusted_mode;
0256 int i;
0257
0258 for (i = 0; i < ARRAY_SIZE(hdmi_audio_clock); i++) {
0259 if (adjusted_mode->crtc_clock == hdmi_audio_clock[i].clock)
0260 break;
0261 }
0262
0263 if (DISPLAY_VER(dev_priv) < 12 && adjusted_mode->crtc_clock > 148500)
0264 i = ARRAY_SIZE(hdmi_audio_clock);
0265
0266 if (i == ARRAY_SIZE(hdmi_audio_clock)) {
0267 drm_dbg_kms(&dev_priv->drm,
0268 "HDMI audio pixel clock setting for %d not found, falling back to defaults\n",
0269 adjusted_mode->crtc_clock);
0270 i = 1;
0271 }
0272
0273 drm_dbg_kms(&dev_priv->drm,
0274 "Configuring HDMI audio for pixel clock %d (0x%08x)\n",
0275 hdmi_audio_clock[i].clock,
0276 hdmi_audio_clock[i].config);
0277
0278 return hdmi_audio_clock[i].config;
0279 }
0280
0281 static int audio_config_hdmi_get_n(const struct intel_crtc_state *crtc_state,
0282 int rate)
0283 {
0284 const struct hdmi_aud_ncts *hdmi_ncts_table;
0285 int i, size;
0286
0287 if (crtc_state->pipe_bpp == 36) {
0288 hdmi_ncts_table = hdmi_aud_ncts_36bpp;
0289 size = ARRAY_SIZE(hdmi_aud_ncts_36bpp);
0290 } else if (crtc_state->pipe_bpp == 30) {
0291 hdmi_ncts_table = hdmi_aud_ncts_30bpp;
0292 size = ARRAY_SIZE(hdmi_aud_ncts_30bpp);
0293 } else {
0294 hdmi_ncts_table = hdmi_aud_ncts_24bpp;
0295 size = ARRAY_SIZE(hdmi_aud_ncts_24bpp);
0296 }
0297
0298 for (i = 0; i < size; i++) {
0299 if (rate == hdmi_ncts_table[i].sample_rate &&
0300 crtc_state->port_clock == hdmi_ncts_table[i].clock) {
0301 return hdmi_ncts_table[i].n;
0302 }
0303 }
0304 return 0;
0305 }
0306
0307 static bool intel_eld_uptodate(struct drm_connector *connector,
0308 i915_reg_t reg_eldv, u32 bits_eldv,
0309 i915_reg_t reg_elda, u32 bits_elda,
0310 i915_reg_t reg_edid)
0311 {
0312 struct drm_i915_private *dev_priv = to_i915(connector->dev);
0313 const u8 *eld = connector->eld;
0314 u32 tmp;
0315 int i;
0316
0317 tmp = intel_de_read(dev_priv, reg_eldv);
0318 tmp &= bits_eldv;
0319
0320 if (!tmp)
0321 return false;
0322
0323 tmp = intel_de_read(dev_priv, reg_elda);
0324 tmp &= ~bits_elda;
0325 intel_de_write(dev_priv, reg_elda, tmp);
0326
0327 for (i = 0; i < drm_eld_size(eld) / 4; i++)
0328 if (intel_de_read(dev_priv, reg_edid) != *((const u32 *)eld + i))
0329 return false;
0330
0331 return true;
0332 }
0333
0334 static void g4x_audio_codec_disable(struct intel_encoder *encoder,
0335 const struct intel_crtc_state *old_crtc_state,
0336 const struct drm_connector_state *old_conn_state)
0337 {
0338 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0339 u32 eldv, tmp;
0340
0341 tmp = intel_de_read(dev_priv, G4X_AUD_VID_DID);
0342 if (tmp == INTEL_AUDIO_DEVBLC || tmp == INTEL_AUDIO_DEVCL)
0343 eldv = G4X_ELDV_DEVCL_DEVBLC;
0344 else
0345 eldv = G4X_ELDV_DEVCTG;
0346
0347
0348 tmp = intel_de_read(dev_priv, G4X_AUD_CNTL_ST);
0349 tmp &= ~eldv;
0350 intel_de_write(dev_priv, G4X_AUD_CNTL_ST, tmp);
0351 }
0352
0353 static void g4x_audio_codec_enable(struct intel_encoder *encoder,
0354 const struct intel_crtc_state *crtc_state,
0355 const struct drm_connector_state *conn_state)
0356 {
0357 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0358 struct drm_connector *connector = conn_state->connector;
0359 const u8 *eld = connector->eld;
0360 u32 eldv;
0361 u32 tmp;
0362 int len, i;
0363
0364 tmp = intel_de_read(dev_priv, G4X_AUD_VID_DID);
0365 if (tmp == INTEL_AUDIO_DEVBLC || tmp == INTEL_AUDIO_DEVCL)
0366 eldv = G4X_ELDV_DEVCL_DEVBLC;
0367 else
0368 eldv = G4X_ELDV_DEVCTG;
0369
0370 if (intel_eld_uptodate(connector,
0371 G4X_AUD_CNTL_ST, eldv,
0372 G4X_AUD_CNTL_ST, G4X_ELD_ADDR_MASK,
0373 G4X_HDMIW_HDMIEDID))
0374 return;
0375
0376 tmp = intel_de_read(dev_priv, G4X_AUD_CNTL_ST);
0377 tmp &= ~(eldv | G4X_ELD_ADDR_MASK);
0378 len = (tmp >> 9) & 0x1f;
0379 intel_de_write(dev_priv, G4X_AUD_CNTL_ST, tmp);
0380
0381 len = min(drm_eld_size(eld) / 4, len);
0382 for (i = 0; i < len; i++)
0383 intel_de_write(dev_priv, G4X_HDMIW_HDMIEDID,
0384 *((const u32 *)eld + i));
0385
0386 tmp = intel_de_read(dev_priv, G4X_AUD_CNTL_ST);
0387 tmp |= eldv;
0388 intel_de_write(dev_priv, G4X_AUD_CNTL_ST, tmp);
0389 }
0390
0391 static void
0392 hsw_dp_audio_config_update(struct intel_encoder *encoder,
0393 const struct intel_crtc_state *crtc_state)
0394 {
0395 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0396 struct i915_audio_component *acomp = dev_priv->audio.component;
0397 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
0398 enum port port = encoder->port;
0399 const struct dp_aud_n_m *nm;
0400 int rate;
0401 u32 tmp;
0402
0403 rate = acomp ? acomp->aud_sample_rate[port] : 0;
0404 nm = audio_config_dp_get_n_m(crtc_state, rate);
0405 if (nm)
0406 drm_dbg_kms(&dev_priv->drm, "using Maud %u, Naud %u\n", nm->m,
0407 nm->n);
0408 else
0409 drm_dbg_kms(&dev_priv->drm, "using automatic Maud, Naud\n");
0410
0411 tmp = intel_de_read(dev_priv, HSW_AUD_CFG(cpu_transcoder));
0412 tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
0413 tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
0414 tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
0415 tmp |= AUD_CONFIG_N_VALUE_INDEX;
0416
0417 if (nm) {
0418 tmp &= ~AUD_CONFIG_N_MASK;
0419 tmp |= AUD_CONFIG_N(nm->n);
0420 tmp |= AUD_CONFIG_N_PROG_ENABLE;
0421 }
0422
0423 intel_de_write(dev_priv, HSW_AUD_CFG(cpu_transcoder), tmp);
0424
0425 tmp = intel_de_read(dev_priv, HSW_AUD_M_CTS_ENABLE(cpu_transcoder));
0426 tmp &= ~AUD_CONFIG_M_MASK;
0427 tmp &= ~AUD_M_CTS_M_VALUE_INDEX;
0428 tmp &= ~AUD_M_CTS_M_PROG_ENABLE;
0429
0430 if (nm) {
0431 tmp |= nm->m;
0432 tmp |= AUD_M_CTS_M_VALUE_INDEX;
0433 tmp |= AUD_M_CTS_M_PROG_ENABLE;
0434 }
0435
0436 intel_de_write(dev_priv, HSW_AUD_M_CTS_ENABLE(cpu_transcoder), tmp);
0437 }
0438
0439 static void
0440 hsw_hdmi_audio_config_update(struct intel_encoder *encoder,
0441 const struct intel_crtc_state *crtc_state)
0442 {
0443 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0444 struct i915_audio_component *acomp = dev_priv->audio.component;
0445 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
0446 enum port port = encoder->port;
0447 int n, rate;
0448 u32 tmp;
0449
0450 rate = acomp ? acomp->aud_sample_rate[port] : 0;
0451
0452 tmp = intel_de_read(dev_priv, HSW_AUD_CFG(cpu_transcoder));
0453 tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
0454 tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
0455 tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
0456 tmp |= audio_config_hdmi_pixel_clock(crtc_state);
0457
0458 n = audio_config_hdmi_get_n(crtc_state, rate);
0459 if (n != 0) {
0460 drm_dbg_kms(&dev_priv->drm, "using N %d\n", n);
0461
0462 tmp &= ~AUD_CONFIG_N_MASK;
0463 tmp |= AUD_CONFIG_N(n);
0464 tmp |= AUD_CONFIG_N_PROG_ENABLE;
0465 } else {
0466 drm_dbg_kms(&dev_priv->drm, "using automatic N\n");
0467 }
0468
0469 intel_de_write(dev_priv, HSW_AUD_CFG(cpu_transcoder), tmp);
0470
0471
0472
0473
0474
0475 tmp = intel_de_read(dev_priv, HSW_AUD_M_CTS_ENABLE(cpu_transcoder));
0476 tmp &= ~AUD_M_CTS_M_PROG_ENABLE;
0477 tmp &= ~AUD_M_CTS_M_VALUE_INDEX;
0478 intel_de_write(dev_priv, HSW_AUD_M_CTS_ENABLE(cpu_transcoder), tmp);
0479 }
0480
0481 static void
0482 hsw_audio_config_update(struct intel_encoder *encoder,
0483 const struct intel_crtc_state *crtc_state)
0484 {
0485 if (intel_crtc_has_dp_encoder(crtc_state))
0486 hsw_dp_audio_config_update(encoder, crtc_state);
0487 else
0488 hsw_hdmi_audio_config_update(encoder, crtc_state);
0489 }
0490
0491 static void hsw_audio_codec_disable(struct intel_encoder *encoder,
0492 const struct intel_crtc_state *old_crtc_state,
0493 const struct drm_connector_state *old_conn_state)
0494 {
0495 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0496 enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder;
0497 u32 tmp;
0498
0499 mutex_lock(&dev_priv->audio.mutex);
0500
0501
0502 tmp = intel_de_read(dev_priv, HSW_AUD_CFG(cpu_transcoder));
0503 tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
0504 tmp |= AUD_CONFIG_N_PROG_ENABLE;
0505 tmp &= ~AUD_CONFIG_UPPER_N_MASK;
0506 tmp &= ~AUD_CONFIG_LOWER_N_MASK;
0507 if (intel_crtc_has_dp_encoder(old_crtc_state))
0508 tmp |= AUD_CONFIG_N_VALUE_INDEX;
0509 intel_de_write(dev_priv, HSW_AUD_CFG(cpu_transcoder), tmp);
0510
0511
0512 tmp = intel_de_read(dev_priv, HSW_AUD_PIN_ELD_CP_VLD);
0513 tmp &= ~AUDIO_ELD_VALID(cpu_transcoder);
0514 tmp &= ~AUDIO_OUTPUT_ENABLE(cpu_transcoder);
0515 intel_de_write(dev_priv, HSW_AUD_PIN_ELD_CP_VLD, tmp);
0516
0517 mutex_unlock(&dev_priv->audio.mutex);
0518 }
0519
0520 static unsigned int calc_hblank_early_prog(struct intel_encoder *encoder,
0521 const struct intel_crtc_state *crtc_state)
0522 {
0523 struct drm_i915_private *i915 = to_i915(encoder->base.dev);
0524 unsigned int link_clks_available, link_clks_required;
0525 unsigned int tu_data, tu_line, link_clks_active;
0526 unsigned int h_active, h_total, hblank_delta, pixel_clk;
0527 unsigned int fec_coeff, cdclk, vdsc_bpp;
0528 unsigned int link_clk, lanes;
0529 unsigned int hblank_rise;
0530
0531 h_active = crtc_state->hw.adjusted_mode.crtc_hdisplay;
0532 h_total = crtc_state->hw.adjusted_mode.crtc_htotal;
0533 pixel_clk = crtc_state->hw.adjusted_mode.crtc_clock;
0534 vdsc_bpp = crtc_state->dsc.compressed_bpp;
0535 cdclk = i915->cdclk.hw.cdclk;
0536
0537 fec_coeff = 972261;
0538 link_clk = crtc_state->port_clock;
0539 lanes = crtc_state->lane_count;
0540
0541 drm_dbg_kms(&i915->drm, "h_active = %u link_clk = %u :"
0542 "lanes = %u vdsc_bpp = %u cdclk = %u\n",
0543 h_active, link_clk, lanes, vdsc_bpp, cdclk);
0544
0545 if (WARN_ON(!link_clk || !pixel_clk || !lanes || !vdsc_bpp || !cdclk))
0546 return 0;
0547
0548 link_clks_available = (h_total - h_active) * link_clk / pixel_clk - 28;
0549 link_clks_required = DIV_ROUND_UP(192000 * h_total, 1000 * pixel_clk) * (48 / lanes + 2);
0550
0551 if (link_clks_available > link_clks_required)
0552 hblank_delta = 32;
0553 else
0554 hblank_delta = DIV64_U64_ROUND_UP(mul_u32_u32(5 * (link_clk + cdclk), pixel_clk),
0555 mul_u32_u32(link_clk, cdclk));
0556
0557 tu_data = div64_u64(mul_u32_u32(pixel_clk * vdsc_bpp * 8, 1000000),
0558 mul_u32_u32(link_clk * lanes, fec_coeff));
0559 tu_line = div64_u64(h_active * mul_u32_u32(link_clk, fec_coeff),
0560 mul_u32_u32(64 * pixel_clk, 1000000));
0561 link_clks_active = (tu_line - 1) * 64 + tu_data;
0562
0563 hblank_rise = (link_clks_active + 6 * DIV_ROUND_UP(link_clks_active, 250) + 4) * pixel_clk / link_clk;
0564
0565 return h_active - hblank_rise + hblank_delta;
0566 }
0567
0568 static unsigned int calc_samples_room(const struct intel_crtc_state *crtc_state)
0569 {
0570 unsigned int h_active, h_total, pixel_clk;
0571 unsigned int link_clk, lanes;
0572
0573 h_active = crtc_state->hw.adjusted_mode.hdisplay;
0574 h_total = crtc_state->hw.adjusted_mode.htotal;
0575 pixel_clk = crtc_state->hw.adjusted_mode.clock;
0576 link_clk = crtc_state->port_clock;
0577 lanes = crtc_state->lane_count;
0578
0579 return ((h_total - h_active) * link_clk - 12 * pixel_clk) /
0580 (pixel_clk * (48 / lanes + 2));
0581 }
0582
0583 static void enable_audio_dsc_wa(struct intel_encoder *encoder,
0584 const struct intel_crtc_state *crtc_state)
0585 {
0586 struct drm_i915_private *i915 = to_i915(encoder->base.dev);
0587 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0588 enum pipe pipe = crtc->pipe;
0589 unsigned int hblank_early_prog, samples_room;
0590 unsigned int val;
0591
0592 if (DISPLAY_VER(i915) < 11)
0593 return;
0594
0595 val = intel_de_read(i915, AUD_CONFIG_BE);
0596
0597 if (DISPLAY_VER(i915) == 11)
0598 val |= HBLANK_EARLY_ENABLE_ICL(pipe);
0599 else if (DISPLAY_VER(i915) >= 12)
0600 val |= HBLANK_EARLY_ENABLE_TGL(pipe);
0601
0602 if (crtc_state->dsc.compression_enable &&
0603 crtc_state->hw.adjusted_mode.hdisplay >= 3840 &&
0604 crtc_state->hw.adjusted_mode.vdisplay >= 2160) {
0605
0606 val &= ~HBLANK_START_COUNT_MASK(pipe);
0607 hblank_early_prog = calc_hblank_early_prog(encoder, crtc_state);
0608 if (hblank_early_prog < 32)
0609 val |= HBLANK_START_COUNT(pipe, HBLANK_START_COUNT_32);
0610 else if (hblank_early_prog < 64)
0611 val |= HBLANK_START_COUNT(pipe, HBLANK_START_COUNT_64);
0612 else if (hblank_early_prog < 96)
0613 val |= HBLANK_START_COUNT(pipe, HBLANK_START_COUNT_96);
0614 else
0615 val |= HBLANK_START_COUNT(pipe, HBLANK_START_COUNT_128);
0616
0617
0618 val &= ~NUMBER_SAMPLES_PER_LINE_MASK(pipe);
0619 samples_room = calc_samples_room(crtc_state);
0620 if (samples_room < 3)
0621 val |= NUMBER_SAMPLES_PER_LINE(pipe, samples_room);
0622 else
0623 val |= NUMBER_SAMPLES_PER_LINE(pipe, 0x0);
0624 }
0625
0626 intel_de_write(i915, AUD_CONFIG_BE, val);
0627 }
0628
0629 #undef ROUNDING_FACTOR
0630
0631 static void hsw_audio_codec_enable(struct intel_encoder *encoder,
0632 const struct intel_crtc_state *crtc_state,
0633 const struct drm_connector_state *conn_state)
0634 {
0635 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0636 struct drm_connector *connector = conn_state->connector;
0637 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
0638 const u8 *eld = connector->eld;
0639 u32 tmp;
0640 int len, i;
0641
0642 mutex_lock(&dev_priv->audio.mutex);
0643
0644
0645 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP))
0646 enable_audio_dsc_wa(encoder, crtc_state);
0647
0648
0649 tmp = intel_de_read(dev_priv, HSW_AUD_PIN_ELD_CP_VLD);
0650 tmp |= AUDIO_OUTPUT_ENABLE(cpu_transcoder);
0651 tmp &= ~AUDIO_ELD_VALID(cpu_transcoder);
0652 intel_de_write(dev_priv, HSW_AUD_PIN_ELD_CP_VLD, tmp);
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662 tmp = intel_de_read(dev_priv, HSW_AUD_DIP_ELD_CTRL(cpu_transcoder));
0663 tmp &= ~IBX_ELD_ADDRESS_MASK;
0664 intel_de_write(dev_priv, HSW_AUD_DIP_ELD_CTRL(cpu_transcoder), tmp);
0665
0666
0667 len = min(drm_eld_size(eld), 84);
0668 for (i = 0; i < len / 4; i++)
0669 intel_de_write(dev_priv, HSW_AUD_EDID_DATA(cpu_transcoder),
0670 *((const u32 *)eld + i));
0671
0672
0673 tmp = intel_de_read(dev_priv, HSW_AUD_PIN_ELD_CP_VLD);
0674 tmp |= AUDIO_ELD_VALID(cpu_transcoder);
0675 intel_de_write(dev_priv, HSW_AUD_PIN_ELD_CP_VLD, tmp);
0676
0677
0678 hsw_audio_config_update(encoder, crtc_state);
0679
0680 mutex_unlock(&dev_priv->audio.mutex);
0681 }
0682
0683 static void ilk_audio_codec_disable(struct intel_encoder *encoder,
0684 const struct intel_crtc_state *old_crtc_state,
0685 const struct drm_connector_state *old_conn_state)
0686 {
0687 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0688 struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
0689 enum pipe pipe = crtc->pipe;
0690 enum port port = encoder->port;
0691 u32 tmp, eldv;
0692 i915_reg_t aud_config, aud_cntrl_st2;
0693
0694 if (drm_WARN_ON(&dev_priv->drm, port == PORT_A))
0695 return;
0696
0697 if (HAS_PCH_IBX(dev_priv)) {
0698 aud_config = IBX_AUD_CFG(pipe);
0699 aud_cntrl_st2 = IBX_AUD_CNTL_ST2;
0700 } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
0701 aud_config = VLV_AUD_CFG(pipe);
0702 aud_cntrl_st2 = VLV_AUD_CNTL_ST2;
0703 } else {
0704 aud_config = CPT_AUD_CFG(pipe);
0705 aud_cntrl_st2 = CPT_AUD_CNTRL_ST2;
0706 }
0707
0708
0709 tmp = intel_de_read(dev_priv, aud_config);
0710 tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
0711 tmp |= AUD_CONFIG_N_PROG_ENABLE;
0712 tmp &= ~AUD_CONFIG_UPPER_N_MASK;
0713 tmp &= ~AUD_CONFIG_LOWER_N_MASK;
0714 if (intel_crtc_has_dp_encoder(old_crtc_state))
0715 tmp |= AUD_CONFIG_N_VALUE_INDEX;
0716 intel_de_write(dev_priv, aud_config, tmp);
0717
0718 eldv = IBX_ELD_VALID(port);
0719
0720
0721 tmp = intel_de_read(dev_priv, aud_cntrl_st2);
0722 tmp &= ~eldv;
0723 intel_de_write(dev_priv, aud_cntrl_st2, tmp);
0724 }
0725
0726 static void ilk_audio_codec_enable(struct intel_encoder *encoder,
0727 const struct intel_crtc_state *crtc_state,
0728 const struct drm_connector_state *conn_state)
0729 {
0730 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0731 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0732 struct drm_connector *connector = conn_state->connector;
0733 enum pipe pipe = crtc->pipe;
0734 enum port port = encoder->port;
0735 const u8 *eld = connector->eld;
0736 u32 tmp, eldv;
0737 int len, i;
0738 i915_reg_t hdmiw_hdmiedid, aud_config, aud_cntl_st, aud_cntrl_st2;
0739
0740 if (drm_WARN_ON(&dev_priv->drm, port == PORT_A))
0741 return;
0742
0743
0744
0745
0746
0747
0748
0749
0750 if (HAS_PCH_IBX(dev_priv)) {
0751 hdmiw_hdmiedid = IBX_HDMIW_HDMIEDID(pipe);
0752 aud_config = IBX_AUD_CFG(pipe);
0753 aud_cntl_st = IBX_AUD_CNTL_ST(pipe);
0754 aud_cntrl_st2 = IBX_AUD_CNTL_ST2;
0755 } else if (IS_VALLEYVIEW(dev_priv) ||
0756 IS_CHERRYVIEW(dev_priv)) {
0757 hdmiw_hdmiedid = VLV_HDMIW_HDMIEDID(pipe);
0758 aud_config = VLV_AUD_CFG(pipe);
0759 aud_cntl_st = VLV_AUD_CNTL_ST(pipe);
0760 aud_cntrl_st2 = VLV_AUD_CNTL_ST2;
0761 } else {
0762 hdmiw_hdmiedid = CPT_HDMIW_HDMIEDID(pipe);
0763 aud_config = CPT_AUD_CFG(pipe);
0764 aud_cntl_st = CPT_AUD_CNTL_ST(pipe);
0765 aud_cntrl_st2 = CPT_AUD_CNTRL_ST2;
0766 }
0767
0768 eldv = IBX_ELD_VALID(port);
0769
0770
0771 tmp = intel_de_read(dev_priv, aud_cntrl_st2);
0772 tmp &= ~eldv;
0773 intel_de_write(dev_priv, aud_cntrl_st2, tmp);
0774
0775
0776 tmp = intel_de_read(dev_priv, aud_cntl_st);
0777 tmp &= ~IBX_ELD_ADDRESS_MASK;
0778 intel_de_write(dev_priv, aud_cntl_st, tmp);
0779
0780
0781 len = min(drm_eld_size(eld), 84);
0782 for (i = 0; i < len / 4; i++)
0783 intel_de_write(dev_priv, hdmiw_hdmiedid,
0784 *((const u32 *)eld + i));
0785
0786
0787 tmp = intel_de_read(dev_priv, aud_cntrl_st2);
0788 tmp |= eldv;
0789 intel_de_write(dev_priv, aud_cntrl_st2, tmp);
0790
0791
0792 tmp = intel_de_read(dev_priv, aud_config);
0793 tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
0794 tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
0795 tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
0796 if (intel_crtc_has_dp_encoder(crtc_state))
0797 tmp |= AUD_CONFIG_N_VALUE_INDEX;
0798 else
0799 tmp |= audio_config_hdmi_pixel_clock(crtc_state);
0800 intel_de_write(dev_priv, aud_config, tmp);
0801 }
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812 void intel_audio_codec_enable(struct intel_encoder *encoder,
0813 const struct intel_crtc_state *crtc_state,
0814 const struct drm_connector_state *conn_state)
0815 {
0816 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0817 struct i915_audio_component *acomp = dev_priv->audio.component;
0818 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0819 struct drm_connector *connector = conn_state->connector;
0820 const struct drm_display_mode *adjusted_mode =
0821 &crtc_state->hw.adjusted_mode;
0822 enum port port = encoder->port;
0823 enum pipe pipe = crtc->pipe;
0824
0825 if (!crtc_state->has_audio)
0826 return;
0827
0828 drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s][ENCODER:%d:%s] Enable audio codec on pipe %c, %u bytes ELD\n",
0829 connector->base.id, connector->name,
0830 encoder->base.base.id, encoder->base.name,
0831 pipe_name(pipe), drm_eld_size(connector->eld));
0832
0833
0834 if (!connector->eld[0])
0835 drm_dbg_kms(&dev_priv->drm,
0836 "Bogus ELD on [CONNECTOR:%d:%s]\n",
0837 connector->base.id, connector->name);
0838
0839 connector->eld[6] = drm_av_sync_delay(connector, adjusted_mode) / 2;
0840
0841 if (dev_priv->audio.funcs)
0842 dev_priv->audio.funcs->audio_codec_enable(encoder,
0843 crtc_state,
0844 conn_state);
0845
0846 mutex_lock(&dev_priv->audio.mutex);
0847 encoder->audio_connector = connector;
0848
0849
0850 dev_priv->audio.encoder_map[pipe] = encoder;
0851 mutex_unlock(&dev_priv->audio.mutex);
0852
0853 if (acomp && acomp->base.audio_ops &&
0854 acomp->base.audio_ops->pin_eld_notify) {
0855
0856 if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST))
0857 pipe = -1;
0858 acomp->base.audio_ops->pin_eld_notify(acomp->base.audio_ops->audio_ptr,
0859 (int) port, (int) pipe);
0860 }
0861
0862 intel_lpe_audio_notify(dev_priv, pipe, port, connector->eld,
0863 crtc_state->port_clock,
0864 intel_crtc_has_dp_encoder(crtc_state));
0865 }
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876 void intel_audio_codec_disable(struct intel_encoder *encoder,
0877 const struct intel_crtc_state *old_crtc_state,
0878 const struct drm_connector_state *old_conn_state)
0879 {
0880 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0881 struct i915_audio_component *acomp = dev_priv->audio.component;
0882 struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
0883 struct drm_connector *connector = old_conn_state->connector;
0884 enum port port = encoder->port;
0885 enum pipe pipe = crtc->pipe;
0886
0887 if (!old_crtc_state->has_audio)
0888 return;
0889
0890 drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s][ENCODER:%d:%s] Disable audio codec on pipe %c\n",
0891 connector->base.id, connector->name,
0892 encoder->base.base.id, encoder->base.name, pipe_name(pipe));
0893
0894 if (dev_priv->audio.funcs)
0895 dev_priv->audio.funcs->audio_codec_disable(encoder,
0896 old_crtc_state,
0897 old_conn_state);
0898
0899 mutex_lock(&dev_priv->audio.mutex);
0900 encoder->audio_connector = NULL;
0901 dev_priv->audio.encoder_map[pipe] = NULL;
0902 mutex_unlock(&dev_priv->audio.mutex);
0903
0904 if (acomp && acomp->base.audio_ops &&
0905 acomp->base.audio_ops->pin_eld_notify) {
0906
0907 if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST))
0908 pipe = -1;
0909 acomp->base.audio_ops->pin_eld_notify(acomp->base.audio_ops->audio_ptr,
0910 (int) port, (int) pipe);
0911 }
0912
0913 intel_lpe_audio_notify(dev_priv, pipe, port, NULL, 0, false);
0914 }
0915
0916 static const struct intel_audio_funcs g4x_audio_funcs = {
0917 .audio_codec_enable = g4x_audio_codec_enable,
0918 .audio_codec_disable = g4x_audio_codec_disable,
0919 };
0920
0921 static const struct intel_audio_funcs ilk_audio_funcs = {
0922 .audio_codec_enable = ilk_audio_codec_enable,
0923 .audio_codec_disable = ilk_audio_codec_disable,
0924 };
0925
0926 static const struct intel_audio_funcs hsw_audio_funcs = {
0927 .audio_codec_enable = hsw_audio_codec_enable,
0928 .audio_codec_disable = hsw_audio_codec_disable,
0929 };
0930
0931
0932
0933
0934
0935 void intel_audio_hooks_init(struct drm_i915_private *dev_priv)
0936 {
0937 if (IS_G4X(dev_priv)) {
0938 dev_priv->audio.funcs = &g4x_audio_funcs;
0939 } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
0940 dev_priv->audio.funcs = &ilk_audio_funcs;
0941 } else if (IS_HASWELL(dev_priv) || DISPLAY_VER(dev_priv) >= 8) {
0942 dev_priv->audio.funcs = &hsw_audio_funcs;
0943 } else if (HAS_PCH_SPLIT(dev_priv)) {
0944 dev_priv->audio.funcs = &ilk_audio_funcs;
0945 }
0946 }
0947
0948 struct aud_ts_cdclk_m_n {
0949 u8 m;
0950 u16 n;
0951 };
0952
0953 void intel_audio_cdclk_change_pre(struct drm_i915_private *i915)
0954 {
0955 if (DISPLAY_VER(i915) >= 13)
0956 intel_de_rmw(i915, AUD_TS_CDCLK_M, AUD_TS_CDCLK_M_EN, 0);
0957 }
0958
0959 static void get_aud_ts_cdclk_m_n(int refclk, int cdclk, struct aud_ts_cdclk_m_n *aud_ts)
0960 {
0961 if (refclk == 24000)
0962 aud_ts->m = 12;
0963 else
0964 aud_ts->m = 15;
0965
0966 aud_ts->n = cdclk * aud_ts->m / 24000;
0967 }
0968
0969 void intel_audio_cdclk_change_post(struct drm_i915_private *i915)
0970 {
0971 struct aud_ts_cdclk_m_n aud_ts;
0972
0973 if (DISPLAY_VER(i915) >= 13) {
0974 get_aud_ts_cdclk_m_n(i915->cdclk.hw.ref, i915->cdclk.hw.cdclk, &aud_ts);
0975
0976 intel_de_write(i915, AUD_TS_CDCLK_N, aud_ts.n);
0977 intel_de_write(i915, AUD_TS_CDCLK_M, aud_ts.m | AUD_TS_CDCLK_M_EN);
0978 drm_dbg_kms(&i915->drm, "aud_ts_cdclk set to M=%u, N=%u\n", aud_ts.m, aud_ts.n);
0979 }
0980 }
0981
0982 static int glk_force_audio_cdclk_commit(struct intel_atomic_state *state,
0983 struct intel_crtc *crtc,
0984 bool enable)
0985 {
0986 struct intel_cdclk_state *cdclk_state;
0987 int ret;
0988
0989
0990 ret = drm_modeset_lock(&crtc->base.mutex, state->base.acquire_ctx);
0991 if (ret)
0992 return ret;
0993
0994 cdclk_state = intel_atomic_get_cdclk_state(state);
0995 if (IS_ERR(cdclk_state))
0996 return PTR_ERR(cdclk_state);
0997
0998 cdclk_state->force_min_cdclk = enable ? 2 * 96000 : 0;
0999
1000 return drm_atomic_commit(&state->base);
1001 }
1002
1003 static void glk_force_audio_cdclk(struct drm_i915_private *dev_priv,
1004 bool enable)
1005 {
1006 struct drm_modeset_acquire_ctx ctx;
1007 struct drm_atomic_state *state;
1008 struct intel_crtc *crtc;
1009 int ret;
1010
1011 crtc = intel_first_crtc(dev_priv);
1012 if (!crtc)
1013 return;
1014
1015 drm_modeset_acquire_init(&ctx, 0);
1016 state = drm_atomic_state_alloc(&dev_priv->drm);
1017 if (drm_WARN_ON(&dev_priv->drm, !state))
1018 return;
1019
1020 state->acquire_ctx = &ctx;
1021
1022 retry:
1023 ret = glk_force_audio_cdclk_commit(to_intel_atomic_state(state), crtc,
1024 enable);
1025 if (ret == -EDEADLK) {
1026 drm_atomic_state_clear(state);
1027 drm_modeset_backoff(&ctx);
1028 goto retry;
1029 }
1030
1031 drm_WARN_ON(&dev_priv->drm, ret);
1032
1033 drm_atomic_state_put(state);
1034
1035 drm_modeset_drop_locks(&ctx);
1036 drm_modeset_acquire_fini(&ctx);
1037 }
1038
1039 static unsigned long i915_audio_component_get_power(struct device *kdev)
1040 {
1041 struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
1042 intel_wakeref_t ret;
1043
1044
1045 BUILD_BUG_ON(sizeof(intel_wakeref_t) > sizeof(unsigned long));
1046
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 drm_dbg_kms(&dev_priv->drm,
1054 "restored AUD_FREQ_CNTRL to 0x%x\n",
1055 dev_priv->audio.freq_cntrl);
1056 }
1057
1058
1059 if (IS_GEMINILAKE(dev_priv))
1060 glk_force_audio_cdclk(dev_priv, true);
1061
1062 if (DISPLAY_VER(dev_priv) >= 10)
1063 intel_de_write(dev_priv, AUD_PIN_BUF_CTL,
1064 (intel_de_read(dev_priv, AUD_PIN_BUF_CTL) | AUD_PIN_BUF_ENABLE));
1065 }
1066
1067 return ret;
1068 }
1069
1070 static void i915_audio_component_put_power(struct device *kdev,
1071 unsigned long cookie)
1072 {
1073 struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
1074
1075
1076 if (--dev_priv->audio.power_refcount == 0)
1077 if (IS_GEMINILAKE(dev_priv))
1078 glk_force_audio_cdclk(dev_priv, false);
1079
1080 intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO_PLAYBACK, cookie);
1081 }
1082
1083 static void i915_audio_component_codec_wake_override(struct device *kdev,
1084 bool enable)
1085 {
1086 struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
1087 unsigned long cookie;
1088 u32 tmp;
1089
1090 if (DISPLAY_VER(dev_priv) < 9)
1091 return;
1092
1093 cookie = i915_audio_component_get_power(kdev);
1094
1095
1096
1097
1098
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 usleep_range(1000, 1500);
1103
1104 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 usleep_range(1000, 1500);
1109 }
1110
1111 i915_audio_component_put_power(kdev, cookie);
1112 }
1113
1114
1115 static int i915_audio_component_get_cdclk_freq(struct device *kdev)
1116 {
1117 struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
1118
1119 if (drm_WARN_ON_ONCE(&dev_priv->drm, !HAS_DDI(dev_priv)))
1120 return -ENODEV;
1121
1122 return dev_priv->cdclk.hw.cdclk;
1123 }
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135 static struct intel_encoder *get_saved_enc(struct drm_i915_private *dev_priv,
1136 int port, int pipe)
1137 {
1138 struct intel_encoder *encoder;
1139
1140
1141 if (pipe >= 0) {
1142 if (drm_WARN_ON(&dev_priv->drm,
1143 pipe >= ARRAY_SIZE(dev_priv->audio.encoder_map)))
1144 return NULL;
1145
1146 encoder = dev_priv->audio.encoder_map[pipe];
1147
1148
1149
1150
1151
1152 if (encoder != NULL && encoder->port == port &&
1153 encoder->type == INTEL_OUTPUT_DP_MST)
1154 return encoder;
1155 }
1156
1157
1158 if (pipe > 0)
1159 return NULL;
1160
1161 for_each_pipe(dev_priv, pipe) {
1162 encoder = dev_priv->audio.encoder_map[pipe];
1163 if (encoder == NULL)
1164 continue;
1165
1166 if (encoder->type == INTEL_OUTPUT_DP_MST)
1167 continue;
1168
1169 if (port == encoder->port)
1170 return encoder;
1171 }
1172
1173 return NULL;
1174 }
1175
1176 static int i915_audio_component_sync_audio_rate(struct device *kdev, int port,
1177 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 struct intel_encoder *encoder;
1182 struct intel_crtc *crtc;
1183 unsigned long cookie;
1184 int err = 0;
1185
1186 if (!HAS_DDI(dev_priv))
1187 return 0;
1188
1189 cookie = i915_audio_component_get_power(kdev);
1190 mutex_lock(&dev_priv->audio.mutex);
1191
1192
1193 encoder = get_saved_enc(dev_priv, port, pipe);
1194 if (!encoder || !encoder->base.crtc) {
1195 drm_dbg_kms(&dev_priv->drm, "Not valid for port %c\n",
1196 port_name(port));
1197 err = -ENODEV;
1198 goto unlock;
1199 }
1200
1201 crtc = to_intel_crtc(encoder->base.crtc);
1202
1203
1204 acomp->aud_sample_rate[port] = rate;
1205
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 unsigned char *buf, int max_bytes)
1217 {
1218 struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
1219 struct intel_encoder *intel_encoder;
1220 const u8 *eld;
1221 int ret = -EINVAL;
1222
1223 mutex_lock(&dev_priv->audio.mutex);
1224
1225 intel_encoder = get_saved_enc(dev_priv, port, pipe);
1226 if (!intel_encoder) {
1227 drm_dbg_kms(&dev_priv->drm, "Not valid for port %c\n",
1228 port_name(port));
1229 mutex_unlock(&dev_priv->audio.mutex);
1230 return ret;
1231 }
1232
1233 ret = 0;
1234 *enabled = intel_encoder->audio_connector != NULL;
1235 if (*enabled) {
1236 eld = intel_encoder->audio_connector->eld;
1237 ret = drm_eld_size(eld);
1238 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 = {
1246 .owner = THIS_MODULE,
1247 .get_power = i915_audio_component_get_power,
1248 .put_power = i915_audio_component_put_power,
1249 .codec_wake_override = i915_audio_component_codec_wake_override,
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,
1253 };
1254
1255 static int i915_audio_component_bind(struct device *i915_kdev,
1256 struct device *hda_kdev, void *data)
1257 {
1258 struct i915_audio_component *acomp = data;
1259 struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
1260 int i;
1261
1262 if (drm_WARN_ON(&dev_priv->drm, acomp->base.ops || acomp->base.dev))
1263 return -EEXIST;
1264
1265 if (drm_WARN_ON(&dev_priv->drm,
1266 !device_link_add(hda_kdev, i915_kdev,
1267 DL_FLAG_STATELESS)))
1268 return -ENOMEM;
1269
1270 drm_modeset_lock_all(&dev_priv->drm);
1271 acomp->base.ops = &i915_audio_component_ops;
1272 acomp->base.dev = i915_kdev;
1273 BUILD_BUG_ON(MAX_PORTS != I915_MAX_PORTS);
1274 for (i = 0; i < ARRAY_SIZE(acomp->aud_sample_rate); i++)
1275 acomp->aud_sample_rate[i] = 0;
1276 dev_priv->audio.component = acomp;
1277 drm_modeset_unlock_all(&dev_priv->drm);
1278
1279 return 0;
1280 }
1281
1282 static void i915_audio_component_unbind(struct device *i915_kdev,
1283 struct device *hda_kdev, void *data)
1284 {
1285 struct i915_audio_component *acomp = data;
1286 struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
1287
1288 drm_modeset_lock_all(&dev_priv->drm);
1289 acomp->base.ops = NULL;
1290 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);
1299 }
1300
1301 static const struct component_ops i915_audio_component_bind_ops = {
1302 .bind = i915_audio_component_bind,
1303 .unbind = i915_audio_component_unbind,
1304 };
1305
1306 #define AUD_FREQ_TMODE_SHIFT 14
1307 #define AUD_FREQ_4T 0
1308 #define AUD_FREQ_8T (2 << AUD_FREQ_TMODE_SHIFT)
1309 #define AUD_FREQ_PULLCLKS(x) (((x) & 0x3) << 11)
1310 #define AUD_FREQ_BCLK_96M BIT(4)
1311
1312 #define AUD_FREQ_GEN12 (AUD_FREQ_8T | AUD_FREQ_PULLCLKS(0) | AUD_FREQ_BCLK_96M)
1313 #define AUD_FREQ_TGL_BROKEN (AUD_FREQ_8T | AUD_FREQ_PULLCLKS(2) | AUD_FREQ_BCLK_96M)
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331 static void i915_audio_component_init(struct drm_i915_private *dev_priv)
1332 {
1333 u32 aud_freq, aud_freq_init;
1334 int ret;
1335
1336 ret = component_add_typed(dev_priv->drm.dev,
1337 &i915_audio_component_bind_ops,
1338 I915_COMPONENT_AUDIO);
1339 if (ret < 0) {
1340 drm_err(&dev_priv->drm,
1341 "failed to add audio component (%d)\n", ret);
1342
1343 return;
1344 }
1345
1346 if (DISPLAY_VER(dev_priv) >= 9) {
1347 aud_freq_init = intel_de_read(dev_priv, AUD_FREQ_CNTRL);
1348
1349 if (DISPLAY_VER(dev_priv) >= 12)
1350 aud_freq = AUD_FREQ_GEN12;
1351 else
1352 aud_freq = aud_freq_init;
1353
1354
1355 if ((IS_TIGERLAKE(dev_priv) || IS_ROCKETLAKE(dev_priv)) &&
1356 aud_freq_init != AUD_FREQ_TGL_BROKEN)
1357 aud_freq = aud_freq_init;
1358
1359 drm_dbg_kms(&dev_priv->drm, "use AUD_FREQ_CNTRL of 0x%x (init value 0x%x)\n",
1360 aud_freq, aud_freq_init);
1361
1362 dev_priv->audio.freq_cntrl = aud_freq;
1363 }
1364
1365
1366 intel_audio_cdclk_change_post(dev_priv);
1367
1368 dev_priv->audio.component_registered = true;
1369 }
1370
1371
1372
1373
1374
1375
1376
1377
1378 static void i915_audio_component_cleanup(struct drm_i915_private *dev_priv)
1379 {
1380 if (!dev_priv->audio.component_registered)
1381 return;
1382
1383 component_del(dev_priv->drm.dev, &i915_audio_component_bind_ops);
1384 dev_priv->audio.component_registered = false;
1385 }
1386
1387
1388
1389
1390
1391
1392
1393 void intel_audio_init(struct drm_i915_private *dev_priv)
1394 {
1395 if (intel_lpe_audio_init(dev_priv) < 0)
1396 i915_audio_component_init(dev_priv);
1397 }
1398
1399
1400
1401
1402
1403
1404 void intel_audio_deinit(struct drm_i915_private *dev_priv)
1405 {
1406 if ((dev_priv)->audio.lpe.platdev != NULL)
1407 intel_lpe_audio_teardown(dev_priv);
1408 else
1409 i915_audio_component_cleanup(dev_priv);
1410 }