Lines Matching full:i915
66 * struct &i915_audio_component_audio_ops @audio_ops is called from i915 driver.
191 static bool needs_wa_14020863754(struct drm_i915_private *i915) in needs_wa_14020863754() argument
193 return (DISPLAY_VER(i915) == 20 || IS_BATTLEMAGE(i915)); in needs_wa_14020863754()
199 struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev); in audio_config_hdmi_pixel_clock() local
209 if (DISPLAY_VER(i915) < 12 && adjusted_mode->crtc_clock > 148500) in audio_config_hdmi_pixel_clock()
213 drm_dbg_kms(&i915->drm, in audio_config_hdmi_pixel_clock()
219 drm_dbg_kms(&i915->drm, in audio_config_hdmi_pixel_clock()
254 static int g4x_eld_buffer_size(struct drm_i915_private *i915) in g4x_eld_buffer_size() argument
258 tmp = intel_de_read(i915, G4X_AUD_CNTL_ST); in g4x_eld_buffer_size()
266 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in g4x_audio_codec_get_config() local
271 tmp = intel_de_read(i915, G4X_AUD_CNTL_ST); in g4x_audio_codec_get_config()
275 intel_de_rmw(i915, G4X_AUD_CNTL_ST, G4X_ELD_ADDRESS_MASK, 0); in g4x_audio_codec_get_config()
277 eld_buffer_size = g4x_eld_buffer_size(i915); in g4x_audio_codec_get_config()
281 eld[i] = intel_de_read(i915, G4X_HDMIW_HDMIEDID); in g4x_audio_codec_get_config()
288 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in g4x_audio_codec_disable() local
292 intel_de_rmw(i915, G4X_AUD_CNTL_ST, in g4x_audio_codec_disable()
303 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in g4x_audio_codec_enable() local
310 intel_de_rmw(i915, G4X_AUD_CNTL_ST, in g4x_audio_codec_enable()
313 eld_buffer_size = g4x_eld_buffer_size(i915); in g4x_audio_codec_enable()
317 intel_de_write(i915, G4X_HDMIW_HDMIEDID, eld[i]); in g4x_audio_codec_enable()
319 intel_de_write(i915, G4X_HDMIW_HDMIEDID, 0); in g4x_audio_codec_enable()
321 drm_WARN_ON(&i915->drm, in g4x_audio_codec_enable()
322 (intel_de_read(i915, G4X_AUD_CNTL_ST) & G4X_ELD_ADDRESS_MASK) != 0); in g4x_audio_codec_enable()
324 intel_de_rmw(i915, G4X_AUD_CNTL_ST, in g4x_audio_codec_enable()
332 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in hsw_dp_audio_config_update() local
336 intel_de_rmw(i915, HSW_AUD_CFG(cpu_transcoder), in hsw_dp_audio_config_update()
350 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in hsw_hdmi_audio_config_update() local
351 struct i915_audio_component *acomp = i915->display.audio.component; in hsw_hdmi_audio_config_update()
359 tmp = intel_de_read(i915, HSW_AUD_CFG(cpu_transcoder)); in hsw_hdmi_audio_config_update()
367 drm_dbg_kms(&i915->drm, "using N %d\n", n); in hsw_hdmi_audio_config_update()
373 drm_dbg_kms(&i915->drm, "using automatic N\n"); in hsw_hdmi_audio_config_update()
376 intel_de_write(i915, HSW_AUD_CFG(cpu_transcoder), tmp); in hsw_hdmi_audio_config_update()
382 tmp = intel_de_read(i915, HSW_AUD_M_CTS_ENABLE(cpu_transcoder)); in hsw_hdmi_audio_config_update()
385 intel_de_write(i915, HSW_AUD_M_CTS_ENABLE(cpu_transcoder), tmp); in hsw_hdmi_audio_config_update()
402 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in hsw_audio_codec_disable() local
406 mutex_lock(&i915->display.audio.mutex); in hsw_audio_codec_disable()
409 intel_de_rmw(i915, HSW_AUD_CFG(cpu_transcoder), in hsw_audio_codec_disable()
418 intel_de_rmw(i915, HSW_AUD_PIN_ELD_CP_VLD, in hsw_audio_codec_disable()
425 intel_de_rmw(i915, HSW_AUD_PIN_ELD_CP_VLD, in hsw_audio_codec_disable()
428 if (needs_wa_14020863754(i915)) in hsw_audio_codec_disable()
429 intel_de_rmw(i915, AUD_CHICKENBIT_REG3, DACBE_DISABLE_MIN_HBLANK_FIX, 0); in hsw_audio_codec_disable()
431 mutex_unlock(&i915->display.audio.mutex); in hsw_audio_codec_disable()
437 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in calc_hblank_early_prog() local
449 cdclk = i915->display.cdclk.hw.cdclk; in calc_hblank_early_prog()
455 drm_dbg_kms(&i915->drm, in calc_hblank_early_prog()
500 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in enable_audio_dsc_wa() local
505 if (DISPLAY_VER(i915) < 11) in enable_audio_dsc_wa()
508 val = intel_de_read(i915, AUD_CONFIG_BE); in enable_audio_dsc_wa()
510 if (DISPLAY_VER(i915) == 11) in enable_audio_dsc_wa()
512 else if (DISPLAY_VER(i915) >= 12) in enable_audio_dsc_wa()
539 intel_de_write(i915, AUD_CONFIG_BE, val); in enable_audio_dsc_wa()
546 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in hsw_audio_codec_enable() local
550 mutex_lock(&i915->display.audio.mutex); in hsw_audio_codec_enable()
556 if (needs_wa_14020863754(i915)) in hsw_audio_codec_enable()
557 intel_de_rmw(i915, AUD_CHICKENBIT_REG3, 0, DACBE_DISABLE_MIN_HBLANK_FIX); in hsw_audio_codec_enable()
560 intel_de_rmw(i915, HSW_AUD_PIN_ELD_CP_VLD, in hsw_audio_codec_enable()
566 intel_de_rmw(i915, HSW_AUD_PIN_ELD_CP_VLD, in hsw_audio_codec_enable()
577 mutex_unlock(&i915->display.audio.mutex); in hsw_audio_codec_enable()
584 static void ibx_audio_regs_init(struct drm_i915_private *i915, in ibx_audio_regs_init() argument
588 if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915)) { in ibx_audio_regs_init()
593 } else if (HAS_PCH_CPT(i915)) { in ibx_audio_regs_init()
598 } else if (HAS_PCH_IBX(i915)) { in ibx_audio_regs_init()
610 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in ibx_audio_codec_disable() local
616 if (drm_WARN_ON(&i915->drm, port == PORT_A)) in ibx_audio_codec_disable()
619 ibx_audio_regs_init(i915, pipe, ®s); in ibx_audio_codec_disable()
621 mutex_lock(&i915->display.audio.mutex); in ibx_audio_codec_disable()
624 intel_de_rmw(i915, regs.aud_config, in ibx_audio_codec_disable()
633 intel_de_rmw(i915, regs.aud_cntrl_st2, in ibx_audio_codec_disable()
636 mutex_unlock(&i915->display.audio.mutex); in ibx_audio_codec_disable()
646 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in ibx_audio_codec_enable() local
652 if (drm_WARN_ON(&i915->drm, port == PORT_A)) in ibx_audio_codec_enable()
657 ibx_audio_regs_init(i915, pipe, ®s); in ibx_audio_codec_enable()
659 mutex_lock(&i915->display.audio.mutex); in ibx_audio_codec_enable()
662 intel_de_rmw(i915, regs.aud_cntrl_st2, in ibx_audio_codec_enable()
671 intel_de_rmw(i915, regs.aud_config, in ibx_audio_codec_enable()
679 mutex_unlock(&i915->display.audio.mutex); in ibx_audio_codec_enable()
696 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_audio_compute_config() local
703 drm_dbg_kms(&i915->drm, in intel_audio_compute_config()
732 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_audio_codec_enable() local
733 struct i915_audio_component *acomp = i915->display.audio.component; in intel_audio_codec_enable()
743 …drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s][ENCODER:%d:%s] Enable audio codec on [CRTC:%d:%s], %u b… in intel_audio_codec_enable()
749 if (i915->display.funcs.audio) in intel_audio_codec_enable()
750 i915->display.funcs.audio->audio_codec_enable(encoder, in intel_audio_codec_enable()
754 mutex_lock(&i915->display.audio.mutex); in intel_audio_codec_enable()
756 audio_state = &i915->display.audio.state[cpu_transcoder]; in intel_audio_codec_enable()
762 mutex_unlock(&i915->display.audio.mutex); in intel_audio_codec_enable()
773 intel_lpe_audio_notify(i915, cpu_transcoder, port, crtc_state->eld, in intel_audio_codec_enable()
791 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_audio_codec_disable() local
792 struct i915_audio_component *acomp = i915->display.audio.component; in intel_audio_codec_disable()
802 drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s][ENCODER:%d:%s] Disable audio codec on [CRTC:%d:%s]\n", in intel_audio_codec_disable()
807 if (i915->display.funcs.audio) in intel_audio_codec_disable()
808 i915->display.funcs.audio->audio_codec_disable(encoder, in intel_audio_codec_disable()
812 mutex_lock(&i915->display.audio.mutex); in intel_audio_codec_disable()
814 audio_state = &i915->display.audio.state[cpu_transcoder]; in intel_audio_codec_disable()
819 mutex_unlock(&i915->display.audio.mutex); in intel_audio_codec_disable()
830 intel_lpe_audio_notify(i915, cpu_transcoder, port, NULL, 0, false); in intel_audio_codec_disable()
836 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_acomp_get_config() local
840 mutex_lock(&i915->display.audio.mutex); in intel_acomp_get_config()
842 audio_state = &i915->display.audio.state[cpu_transcoder]; in intel_acomp_get_config()
847 mutex_unlock(&i915->display.audio.mutex); in intel_acomp_get_config()
853 struct drm_i915_private *i915 = to_i915(encoder->base.dev); in intel_audio_codec_get_config() local
858 if (i915->display.funcs.audio) in intel_audio_codec_get_config()
859 i915->display.funcs.audio->audio_codec_get_config(encoder, crtc_state); in intel_audio_codec_get_config()
882 * @i915: device private
884 void intel_audio_hooks_init(struct drm_i915_private *i915) in intel_audio_hooks_init() argument
886 if (IS_G4X(i915)) in intel_audio_hooks_init()
887 i915->display.funcs.audio = &g4x_audio_funcs; in intel_audio_hooks_init()
888 else if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915) || in intel_audio_hooks_init()
889 HAS_PCH_CPT(i915) || HAS_PCH_IBX(i915)) in intel_audio_hooks_init()
890 i915->display.funcs.audio = &ibx_audio_funcs; in intel_audio_hooks_init()
891 else if (IS_HASWELL(i915) || DISPLAY_VER(i915) >= 8) in intel_audio_hooks_init()
892 i915->display.funcs.audio = &hsw_audio_funcs; in intel_audio_hooks_init()
900 void intel_audio_cdclk_change_pre(struct drm_i915_private *i915) in intel_audio_cdclk_change_pre() argument
902 if (DISPLAY_VER(i915) >= 13) in intel_audio_cdclk_change_pre()
903 intel_de_rmw(i915, AUD_TS_CDCLK_M, AUD_TS_CDCLK_M_EN, 0); in intel_audio_cdclk_change_pre()
912 void intel_audio_cdclk_change_post(struct drm_i915_private *i915) in intel_audio_cdclk_change_post() argument
916 if (DISPLAY_VER(i915) >= 13) { in intel_audio_cdclk_change_post()
917 get_aud_ts_cdclk_m_n(i915->display.cdclk.hw.ref, i915->display.cdclk.hw.cdclk, &aud_ts); in intel_audio_cdclk_change_post()
919 intel_de_write(i915, AUD_TS_CDCLK_N, aud_ts.n); in intel_audio_cdclk_change_post()
920 intel_de_write(i915, AUD_TS_CDCLK_M, aud_ts.m | AUD_TS_CDCLK_M_EN); in intel_audio_cdclk_change_post()
921 drm_dbg_kms(&i915->drm, "aud_ts_cdclk set to M=%u, N=%u\n", aud_ts.m, aud_ts.n); in intel_audio_cdclk_change_post()
946 static void glk_force_audio_cdclk(struct drm_i915_private *i915, in glk_force_audio_cdclk() argument
954 crtc = intel_first_crtc(i915); in glk_force_audio_cdclk()
959 state = drm_atomic_state_alloc(&i915->drm); in glk_force_audio_cdclk()
960 if (drm_WARN_ON(&i915->drm, !state)) in glk_force_audio_cdclk()
975 drm_WARN_ON(&i915->drm, ret); in glk_force_audio_cdclk()
1033 struct drm_i915_private *i915 = to_i915(display->drm); in i915_audio_component_get_power() local
1039 wakeref = intel_display_power_get(i915, POWER_DOMAIN_AUDIO_PLAYBACK); in i915_audio_component_get_power()
1041 if (i915->display.audio.power_refcount++ == 0) { in i915_audio_component_get_power()
1042 if (DISPLAY_VER(i915) >= 9) { in i915_audio_component_get_power()
1043 intel_de_write(i915, AUD_FREQ_CNTRL, in i915_audio_component_get_power()
1044 i915->display.audio.freq_cntrl); in i915_audio_component_get_power()
1045 drm_dbg_kms(&i915->drm, in i915_audio_component_get_power()
1047 i915->display.audio.freq_cntrl); in i915_audio_component_get_power()
1051 if (IS_GEMINILAKE(i915)) in i915_audio_component_get_power()
1052 glk_force_audio_cdclk(i915, true); in i915_audio_component_get_power()
1054 if (DISPLAY_VER(i915) >= 10) in i915_audio_component_get_power()
1055 intel_de_rmw(i915, AUD_PIN_BUF_CTL, in i915_audio_component_get_power()
1066 struct drm_i915_private *i915 = to_i915(display->drm); in i915_audio_component_put_power() local
1070 if (--i915->display.audio.power_refcount == 0) in i915_audio_component_put_power()
1071 if (IS_GEMINILAKE(i915)) in i915_audio_component_put_power()
1072 glk_force_audio_cdclk(i915, false); in i915_audio_component_put_power()
1074 intel_display_power_put(i915, POWER_DOMAIN_AUDIO_PLAYBACK, wakeref); in i915_audio_component_put_power()
1081 struct drm_i915_private *i915 = to_i915(display->drm); in i915_audio_component_codec_wake_override() local
1084 if (DISPLAY_VER(i915) < 9) in i915_audio_component_codec_wake_override()
1093 intel_de_rmw(i915, HSW_AUD_CHICKENBIT, in i915_audio_component_codec_wake_override()
1098 intel_de_rmw(i915, HSW_AUD_CHICKENBIT, in i915_audio_component_codec_wake_override()
1110 struct drm_i915_private *i915 = to_i915(display->drm); in i915_audio_component_get_cdclk_freq() local
1112 if (drm_WARN_ON_ONCE(&i915->drm, !HAS_DDI(i915))) in i915_audio_component_get_cdclk_freq()
1115 return i915->display.cdclk.hw.cdclk; in i915_audio_component_get_cdclk_freq()
1127 static struct intel_audio_state *find_audio_state(struct drm_i915_private *i915, in find_audio_state() argument
1135 if (drm_WARN_ON(&i915->drm, in find_audio_state()
1136 cpu_transcoder >= ARRAY_SIZE(i915->display.audio.state))) in find_audio_state()
1139 audio_state = &i915->display.audio.state[cpu_transcoder]; in find_audio_state()
1151 for_each_cpu_transcoder(i915, cpu_transcoder) { in find_audio_state()
1155 audio_state = &i915->display.audio.state[cpu_transcoder]; in find_audio_state()
1170 struct drm_i915_private *i915 = to_i915(display->drm); in i915_audio_component_sync_audio_rate() local
1171 struct i915_audio_component *acomp = i915->display.audio.component; in i915_audio_component_sync_audio_rate()
1178 if (!HAS_DDI(i915)) in i915_audio_component_sync_audio_rate()
1182 mutex_lock(&i915->display.audio.mutex); in i915_audio_component_sync_audio_rate()
1184 audio_state = find_audio_state(i915, port, cpu_transcoder); in i915_audio_component_sync_audio_rate()
1186 drm_dbg_kms(&i915->drm, "Not valid for port %c\n", port_name(port)); in i915_audio_component_sync_audio_rate()
1203 mutex_unlock(&i915->display.audio.mutex); in i915_audio_component_sync_audio_rate()
1213 struct drm_i915_private *i915 = to_i915(display->drm); in i915_audio_component_get_eld() local
1217 mutex_lock(&i915->display.audio.mutex); in i915_audio_component_get_eld()
1219 audio_state = find_audio_state(i915, port, cpu_transcoder); in i915_audio_component_get_eld()
1221 drm_dbg_kms(&i915->drm, "Not valid for port %c\n", port_name(port)); in i915_audio_component_get_eld()
1222 mutex_unlock(&i915->display.audio.mutex); in i915_audio_component_get_eld()
1234 mutex_unlock(&i915->display.audio.mutex); in i915_audio_component_get_eld()
1252 struct drm_i915_private *i915 = to_i915(display->drm); in i915_audio_component_bind() local
1256 if (drm_WARN_ON(&i915->drm, acomp->base.ops || acomp->base.dev)) in i915_audio_component_bind()
1259 if (drm_WARN_ON(&i915->drm, in i915_audio_component_bind()
1264 drm_modeset_lock_all(&i915->drm); in i915_audio_component_bind()
1270 i915->display.audio.component = acomp; in i915_audio_component_bind()
1271 drm_modeset_unlock_all(&i915->drm); in i915_audio_component_bind()
1280 struct drm_i915_private *i915 = to_i915(display->drm); in i915_audio_component_unbind() local
1283 drm_modeset_lock_all(&i915->drm); in i915_audio_component_unbind()
1286 i915->display.audio.component = NULL; in i915_audio_component_unbind()
1287 drm_modeset_unlock_all(&i915->drm); in i915_audio_component_unbind()
1291 if (i915->display.audio.power_refcount) in i915_audio_component_unbind()
1292 drm_err(&i915->drm, "audio power refcount %d after unbind\n", in i915_audio_component_unbind()
1293 i915->display.audio.power_refcount); in i915_audio_component_unbind()
1312 * @i915: i915 device instance
1326 static void i915_audio_component_init(struct drm_i915_private *i915) in i915_audio_component_init() argument
1330 if (DISPLAY_VER(i915) >= 9) { in i915_audio_component_init()
1331 aud_freq_init = intel_de_read(i915, AUD_FREQ_CNTRL); in i915_audio_component_init()
1333 if (DISPLAY_VER(i915) >= 12) in i915_audio_component_init()
1339 if ((IS_TIGERLAKE(i915) || IS_ROCKETLAKE(i915)) && in i915_audio_component_init()
1343 drm_dbg_kms(&i915->drm, "use AUD_FREQ_CNTRL of 0x%x (init value 0x%x)\n", in i915_audio_component_init()
1346 i915->display.audio.freq_cntrl = aud_freq; in i915_audio_component_init()
1350 intel_audio_cdclk_change_post(i915); in i915_audio_component_init()
1353 static void i915_audio_component_register(struct drm_i915_private *i915) in i915_audio_component_register() argument
1357 ret = component_add_typed(i915->drm.dev, in i915_audio_component_register()
1361 drm_err(&i915->drm, in i915_audio_component_register()
1367 i915->display.audio.component_registered = true; in i915_audio_component_register()
1372 * @i915: i915 device instance
1377 static void i915_audio_component_cleanup(struct drm_i915_private *i915) in i915_audio_component_cleanup() argument
1379 if (!i915->display.audio.component_registered) in i915_audio_component_cleanup()
1382 component_del(i915->drm.dev, &i915_audio_component_bind_ops); in i915_audio_component_cleanup()
1383 i915->display.audio.component_registered = false; in i915_audio_component_cleanup()
1389 * @i915: the i915 drm device private data
1392 void intel_audio_init(struct drm_i915_private *i915) in intel_audio_init() argument
1394 if (intel_lpe_audio_init(i915) < 0) in intel_audio_init()
1395 i915_audio_component_init(i915); in intel_audio_init()
1398 void intel_audio_register(struct drm_i915_private *i915) in intel_audio_register() argument
1400 if (!i915->display.audio.lpe.platdev) in intel_audio_register()
1401 i915_audio_component_register(i915); in intel_audio_register()
1406 * @i915: the i915 drm device private data
1409 void intel_audio_deinit(struct drm_i915_private *i915) in intel_audio_deinit() argument
1411 if (i915->display.audio.lpe.platdev != NULL) in intel_audio_deinit()
1412 intel_lpe_audio_teardown(i915); in intel_audio_deinit()
1414 i915_audio_component_cleanup(i915); in intel_audio_deinit()