Lines Matching full:display
43 * DOC: High Definition Audio over HDMI and Display Port
46 * HDMI and Display Port. The audio programming sequences are divided into audio
191 static bool needs_wa_14020863754(struct intel_display *display) in needs_wa_14020863754() argument
193 return DISPLAY_VERx100(display) == 3000 || in needs_wa_14020863754()
194 DISPLAY_VERx100(display) == 2000 || in needs_wa_14020863754()
195 DISPLAY_VERx100(display) == 1401; in needs_wa_14020863754()
201 struct intel_display *display = to_intel_display(crtc_state); in audio_config_hdmi_pixel_clock() local
211 if (DISPLAY_VER(display) < 12 && adjusted_mode->crtc_clock > 148500) in audio_config_hdmi_pixel_clock()
215 drm_dbg_kms(display->drm, in audio_config_hdmi_pixel_clock()
221 drm_dbg_kms(display->drm, in audio_config_hdmi_pixel_clock()
256 static int g4x_eld_buffer_size(struct intel_display *display) in g4x_eld_buffer_size() argument
260 tmp = intel_de_read(display, G4X_AUD_CNTL_ST); in g4x_eld_buffer_size()
268 struct intel_display *display = to_intel_display(encoder); in g4x_audio_codec_get_config() local
273 tmp = intel_de_read(display, G4X_AUD_CNTL_ST); in g4x_audio_codec_get_config()
277 intel_de_rmw(display, G4X_AUD_CNTL_ST, G4X_ELD_ADDRESS_MASK, 0); in g4x_audio_codec_get_config()
279 eld_buffer_size = g4x_eld_buffer_size(display); in g4x_audio_codec_get_config()
283 eld[i] = intel_de_read(display, G4X_HDMIW_HDMIEDID); in g4x_audio_codec_get_config()
290 struct intel_display *display = to_intel_display(encoder); in g4x_audio_codec_disable() local
294 intel_de_rmw(display, G4X_AUD_CNTL_ST, in g4x_audio_codec_disable()
305 struct intel_display *display = to_intel_display(encoder); in g4x_audio_codec_enable() local
312 intel_de_rmw(display, G4X_AUD_CNTL_ST, in g4x_audio_codec_enable()
315 eld_buffer_size = g4x_eld_buffer_size(display); in g4x_audio_codec_enable()
319 intel_de_write(display, G4X_HDMIW_HDMIEDID, eld[i]); in g4x_audio_codec_enable()
321 intel_de_write(display, G4X_HDMIW_HDMIEDID, 0); in g4x_audio_codec_enable()
323 drm_WARN_ON(display->drm, in g4x_audio_codec_enable()
324 (intel_de_read(display, G4X_AUD_CNTL_ST) & G4X_ELD_ADDRESS_MASK) != 0); in g4x_audio_codec_enable()
326 intel_de_rmw(display, G4X_AUD_CNTL_ST, in g4x_audio_codec_enable()
334 struct intel_display *display = to_intel_display(encoder); in hsw_dp_audio_config_update() local
338 intel_de_rmw(display, HSW_AUD_CFG(cpu_transcoder), in hsw_dp_audio_config_update()
352 struct intel_display *display = to_intel_display(encoder); in hsw_hdmi_audio_config_update() local
353 struct i915_audio_component *acomp = display->audio.component; in hsw_hdmi_audio_config_update()
361 tmp = intel_de_read(display, HSW_AUD_CFG(cpu_transcoder)); in hsw_hdmi_audio_config_update()
369 drm_dbg_kms(display->drm, "using N %d\n", n); in hsw_hdmi_audio_config_update()
375 drm_dbg_kms(display->drm, "using automatic N\n"); in hsw_hdmi_audio_config_update()
378 intel_de_write(display, HSW_AUD_CFG(cpu_transcoder), tmp); in hsw_hdmi_audio_config_update()
384 tmp = intel_de_read(display, HSW_AUD_M_CTS_ENABLE(cpu_transcoder)); in hsw_hdmi_audio_config_update()
387 intel_de_write(display, HSW_AUD_M_CTS_ENABLE(cpu_transcoder), tmp); in hsw_hdmi_audio_config_update()
403 struct intel_display *display = to_intel_display(crtc_state); in intel_audio_sdp_split_update() local
406 if (!HAS_DP20(display)) in intel_audio_sdp_split_update()
409 intel_de_rmw(display, AUD_DP_2DOT0_CTRL(trans), AUD_ENABLE_SDP_SPLIT, in intel_audio_sdp_split_update()
417 struct intel_display *display = to_intel_display(encoder); in hsw_audio_codec_disable() local
421 mutex_lock(&display->audio.mutex); in hsw_audio_codec_disable()
424 intel_de_rmw(display, HSW_AUD_CFG(cpu_transcoder), in hsw_audio_codec_disable()
433 intel_de_rmw(display, HSW_AUD_PIN_ELD_CP_VLD, in hsw_audio_codec_disable()
440 intel_de_rmw(display, HSW_AUD_PIN_ELD_CP_VLD, in hsw_audio_codec_disable()
443 if (needs_wa_14020863754(display)) in hsw_audio_codec_disable()
444 intel_de_rmw(display, AUD_CHICKENBIT_REG3, DACBE_DISABLE_MIN_HBLANK_FIX, 0); in hsw_audio_codec_disable()
448 mutex_unlock(&display->audio.mutex); in hsw_audio_codec_disable()
454 struct intel_display *display = to_intel_display(encoder); in calc_hblank_early_prog() local
466 cdclk = display->cdclk.hw.cdclk; in calc_hblank_early_prog()
472 drm_dbg_kms(display->drm, in calc_hblank_early_prog()
517 struct intel_display *display = to_intel_display(encoder); in enable_audio_dsc_wa() local
522 if (DISPLAY_VER(display) < 11) in enable_audio_dsc_wa()
525 val = intel_de_read(display, AUD_CONFIG_BE); in enable_audio_dsc_wa()
527 if (DISPLAY_VER(display) == 11) in enable_audio_dsc_wa()
529 else if (DISPLAY_VER(display) >= 12) in enable_audio_dsc_wa()
556 intel_de_write(display, AUD_CONFIG_BE, val); in enable_audio_dsc_wa()
563 struct intel_display *display = to_intel_display(encoder); in hsw_audio_codec_enable() local
567 mutex_lock(&display->audio.mutex); in hsw_audio_codec_enable()
575 if (needs_wa_14020863754(display)) in hsw_audio_codec_enable()
576 intel_de_rmw(display, AUD_CHICKENBIT_REG3, 0, DACBE_DISABLE_MIN_HBLANK_FIX); in hsw_audio_codec_enable()
579 intel_de_rmw(display, HSW_AUD_PIN_ELD_CP_VLD, in hsw_audio_codec_enable()
585 intel_de_rmw(display, HSW_AUD_PIN_ELD_CP_VLD, in hsw_audio_codec_enable()
596 mutex_unlock(&display->audio.mutex); in hsw_audio_codec_enable()
603 static void ibx_audio_regs_init(struct intel_display *display, in ibx_audio_regs_init() argument
607 if (display->platform.valleyview || display->platform.cherryview) { in ibx_audio_regs_init()
612 } else if (HAS_PCH_CPT(display)) { in ibx_audio_regs_init()
617 } else if (HAS_PCH_IBX(display)) { in ibx_audio_regs_init()
629 struct intel_display *display = to_intel_display(encoder); in ibx_audio_codec_disable() local
635 if (drm_WARN_ON(display->drm, port == PORT_A)) in ibx_audio_codec_disable()
638 ibx_audio_regs_init(display, pipe, ®s); in ibx_audio_codec_disable()
640 mutex_lock(&display->audio.mutex); in ibx_audio_codec_disable()
643 intel_de_rmw(display, regs.aud_config, in ibx_audio_codec_disable()
652 intel_de_rmw(display, regs.aud_cntrl_st2, in ibx_audio_codec_disable()
655 mutex_unlock(&display->audio.mutex); in ibx_audio_codec_disable()
665 struct intel_display *display = to_intel_display(encoder); in ibx_audio_codec_enable() local
671 if (drm_WARN_ON(display->drm, port == PORT_A)) in ibx_audio_codec_enable()
676 ibx_audio_regs_init(display, pipe, ®s); in ibx_audio_codec_enable()
678 mutex_lock(&display->audio.mutex); in ibx_audio_codec_enable()
681 intel_de_rmw(display, regs.aud_cntrl_st2, in ibx_audio_codec_enable()
690 intel_de_rmw(display, regs.aud_config, in ibx_audio_codec_enable()
698 mutex_unlock(&display->audio.mutex); in ibx_audio_codec_enable()
705 struct intel_display *display = to_intel_display(encoder); in intel_audio_compute_config() local
712 drm_dbg_kms(display->drm, in intel_audio_compute_config()
741 struct intel_display *display = to_intel_display(encoder); in intel_audio_codec_enable() local
742 struct i915_audio_component *acomp = display->audio.component; in intel_audio_codec_enable()
752 drm_dbg_kms(display->drm, in intel_audio_codec_enable()
759 if (display->funcs.audio) in intel_audio_codec_enable()
760 display->funcs.audio->audio_codec_enable(encoder, in intel_audio_codec_enable()
764 mutex_lock(&display->audio.mutex); in intel_audio_codec_enable()
766 audio_state = &display->audio.state[cpu_transcoder]; in intel_audio_codec_enable()
772 mutex_unlock(&display->audio.mutex); in intel_audio_codec_enable()
783 intel_lpe_audio_notify(display, cpu_transcoder, port, crtc_state->eld, in intel_audio_codec_enable()
801 struct intel_display *display = to_intel_display(encoder); in intel_audio_codec_disable() local
802 struct i915_audio_component *acomp = display->audio.component; in intel_audio_codec_disable()
812 drm_dbg_kms(display->drm, in intel_audio_codec_disable()
818 if (display->funcs.audio) in intel_audio_codec_disable()
819 display->funcs.audio->audio_codec_disable(encoder, in intel_audio_codec_disable()
823 mutex_lock(&display->audio.mutex); in intel_audio_codec_disable()
825 audio_state = &display->audio.state[cpu_transcoder]; in intel_audio_codec_disable()
830 mutex_unlock(&display->audio.mutex); in intel_audio_codec_disable()
841 intel_lpe_audio_notify(display, cpu_transcoder, port, NULL, 0, false); in intel_audio_codec_disable()
847 struct intel_display *display = to_intel_display(encoder); in intel_acomp_get_config() local
851 mutex_lock(&display->audio.mutex); in intel_acomp_get_config()
853 audio_state = &display->audio.state[cpu_transcoder]; in intel_acomp_get_config()
858 mutex_unlock(&display->audio.mutex); in intel_acomp_get_config()
864 struct intel_display *display = to_intel_display(encoder); in intel_audio_codec_get_config() local
869 if (display->funcs.audio) in intel_audio_codec_get_config()
870 display->funcs.audio->audio_codec_get_config(encoder, crtc_state); in intel_audio_codec_get_config()
893 * @display: display device
895 void intel_audio_hooks_init(struct intel_display *display) in intel_audio_hooks_init() argument
897 if (display->platform.g4x) in intel_audio_hooks_init()
898 display->funcs.audio = &g4x_audio_funcs; in intel_audio_hooks_init()
899 else if (display->platform.valleyview || display->platform.cherryview || in intel_audio_hooks_init()
900 HAS_PCH_CPT(display) || HAS_PCH_IBX(display)) in intel_audio_hooks_init()
901 display->funcs.audio = &ibx_audio_funcs; in intel_audio_hooks_init()
902 else if (display->platform.haswell || DISPLAY_VER(display) >= 8) in intel_audio_hooks_init()
903 display->funcs.audio = &hsw_audio_funcs; in intel_audio_hooks_init()
911 void intel_audio_cdclk_change_pre(struct intel_display *display) in intel_audio_cdclk_change_pre() argument
913 if (DISPLAY_VER(display) >= 13) in intel_audio_cdclk_change_pre()
914 intel_de_rmw(display, AUD_TS_CDCLK_M, AUD_TS_CDCLK_M_EN, 0); in intel_audio_cdclk_change_pre()
923 void intel_audio_cdclk_change_post(struct intel_display *display) in intel_audio_cdclk_change_post() argument
927 if (DISPLAY_VER(display) >= 13) { in intel_audio_cdclk_change_post()
928 get_aud_ts_cdclk_m_n(display->cdclk.hw.ref, in intel_audio_cdclk_change_post()
929 display->cdclk.hw.cdclk, &aud_ts); in intel_audio_cdclk_change_post()
931 intel_de_write(display, AUD_TS_CDCLK_N, aud_ts.n); in intel_audio_cdclk_change_post()
932 intel_de_write(display, AUD_TS_CDCLK_M, aud_ts.m | AUD_TS_CDCLK_M_EN); in intel_audio_cdclk_change_post()
933 drm_dbg_kms(display->drm, "aud_ts_cdclk set to M=%u, N=%u\n", in intel_audio_cdclk_change_post()
959 static void glk_force_audio_cdclk(struct intel_display *display, in glk_force_audio_cdclk() argument
967 crtc = intel_first_crtc(display); in glk_force_audio_cdclk()
972 state = drm_atomic_state_alloc(display->drm); in glk_force_audio_cdclk()
973 if (drm_WARN_ON(display->drm, !state)) in glk_force_audio_cdclk()
988 drm_WARN_ON(display->drm, ret); in glk_force_audio_cdclk()
998 struct intel_display *display = to_intel_display(crtc_state); in intel_audio_min_cdclk() local
1012 if (DISPLAY_VER(display) == 10) { in intel_audio_min_cdclk()
1013 /* Display WA #1145: glk */ in intel_audio_min_cdclk()
1015 } else if (DISPLAY_VER(display) == 9 || display->platform.broadwell) { in intel_audio_min_cdclk()
1016 /* Display WA #1144: skl,bxt */ in intel_audio_min_cdclk()
1025 if (DISPLAY_VER(display) >= 9) in intel_audio_min_cdclk()
1035 if ((display->platform.valleyview || display->platform.cherryview) && in intel_audio_min_cdclk()
1044 struct intel_display *display = to_intel_display(kdev); in intel_audio_component_get_power() local
1050 wakeref = intel_display_power_get(display, POWER_DOMAIN_AUDIO_PLAYBACK); in intel_audio_component_get_power()
1052 if (display->audio.power_refcount++ == 0) { in intel_audio_component_get_power()
1053 if (DISPLAY_VER(display) >= 9) { in intel_audio_component_get_power()
1054 intel_de_write(display, AUD_FREQ_CNTRL, in intel_audio_component_get_power()
1055 display->audio.freq_cntrl); in intel_audio_component_get_power()
1056 drm_dbg_kms(display->drm, in intel_audio_component_get_power()
1058 display->audio.freq_cntrl); in intel_audio_component_get_power()
1062 if (display->platform.geminilake) in intel_audio_component_get_power()
1063 glk_force_audio_cdclk(display, true); in intel_audio_component_get_power()
1065 if (DISPLAY_VER(display) >= 10) in intel_audio_component_get_power()
1066 intel_de_rmw(display, AUD_PIN_BUF_CTL, in intel_audio_component_get_power()
1076 struct intel_display *display = to_intel_display(kdev); in intel_audio_component_put_power() local
1080 if (--display->audio.power_refcount == 0) in intel_audio_component_put_power()
1081 if (display->platform.geminilake) in intel_audio_component_put_power()
1082 glk_force_audio_cdclk(display, false); in intel_audio_component_put_power()
1084 intel_display_power_put(display, POWER_DOMAIN_AUDIO_PLAYBACK, wakeref); in intel_audio_component_put_power()
1090 struct intel_display *display = to_intel_display(kdev); in intel_audio_component_codec_wake_override() local
1093 if (DISPLAY_VER(display) < 9) in intel_audio_component_codec_wake_override()
1102 intel_de_rmw(display, HSW_AUD_CHICKENBIT, in intel_audio_component_codec_wake_override()
1107 intel_de_rmw(display, HSW_AUD_CHICKENBIT, in intel_audio_component_codec_wake_override()
1118 struct intel_display *display = to_intel_display(kdev); in intel_audio_component_get_cdclk_freq() local
1120 if (drm_WARN_ON_ONCE(display->drm, !HAS_DDI(display))) in intel_audio_component_get_cdclk_freq()
1123 return display->cdclk.hw.cdclk; in intel_audio_component_get_cdclk_freq()
1135 static struct intel_audio_state *find_audio_state(struct intel_display *display, in find_audio_state() argument
1143 if (drm_WARN_ON(display->drm, in find_audio_state()
1144 cpu_transcoder >= ARRAY_SIZE(display->audio.state))) in find_audio_state()
1147 audio_state = &display->audio.state[cpu_transcoder]; in find_audio_state()
1159 for_each_cpu_transcoder(display, cpu_transcoder) { in find_audio_state()
1163 audio_state = &display->audio.state[cpu_transcoder]; in find_audio_state()
1177 struct intel_display *display = to_intel_display(kdev); in intel_audio_component_sync_audio_rate() local
1178 struct i915_audio_component *acomp = display->audio.component; in intel_audio_component_sync_audio_rate()
1185 if (!HAS_DDI(display)) in intel_audio_component_sync_audio_rate()
1189 mutex_lock(&display->audio.mutex); in intel_audio_component_sync_audio_rate()
1191 audio_state = find_audio_state(display, port, cpu_transcoder); in intel_audio_component_sync_audio_rate()
1193 drm_dbg_kms(display->drm, "Not valid for port %c\n", in intel_audio_component_sync_audio_rate()
1211 mutex_unlock(&display->audio.mutex); in intel_audio_component_sync_audio_rate()
1220 struct intel_display *display = to_intel_display(kdev); in intel_audio_component_get_eld() local
1224 mutex_lock(&display->audio.mutex); in intel_audio_component_get_eld()
1226 audio_state = find_audio_state(display, port, cpu_transcoder); in intel_audio_component_get_eld()
1228 drm_dbg_kms(display->drm, "Not valid for port %c\n", in intel_audio_component_get_eld()
1230 mutex_unlock(&display->audio.mutex); in intel_audio_component_get_eld()
1242 mutex_unlock(&display->audio.mutex); in intel_audio_component_get_eld()
1259 struct intel_display *display = to_intel_display(drv_kdev); in intel_audio_component_bind() local
1263 if (drm_WARN_ON(display->drm, acomp->base.ops || acomp->base.dev)) in intel_audio_component_bind()
1266 if (drm_WARN_ON(display->drm, in intel_audio_component_bind()
1271 drm_modeset_lock_all(display->drm); in intel_audio_component_bind()
1277 display->audio.component = acomp; in intel_audio_component_bind()
1278 drm_modeset_unlock_all(display->drm); in intel_audio_component_bind()
1286 struct intel_display *display = to_intel_display(drv_kdev); in intel_audio_component_unbind() local
1289 drm_modeset_lock_all(display->drm); in intel_audio_component_unbind()
1292 display->audio.component = NULL; in intel_audio_component_unbind()
1293 drm_modeset_unlock_all(display->drm); in intel_audio_component_unbind()
1297 if (display->audio.power_refcount) in intel_audio_component_unbind()
1298 drm_err(display->drm, in intel_audio_component_unbind()
1300 display->audio.power_refcount); in intel_audio_component_unbind()
1319 * @display: display device
1333 static void intel_audio_component_init(struct intel_display *display) in intel_audio_component_init() argument
1337 if (DISPLAY_VER(display) >= 9) { in intel_audio_component_init()
1338 aud_freq_init = intel_de_read(display, AUD_FREQ_CNTRL); in intel_audio_component_init()
1340 if (DISPLAY_VER(display) >= 12) in intel_audio_component_init()
1346 if ((display->platform.tigerlake || display->platform.rocketlake) && in intel_audio_component_init()
1350 drm_dbg_kms(display->drm, in intel_audio_component_init()
1354 display->audio.freq_cntrl = aud_freq; in intel_audio_component_init()
1358 intel_audio_cdclk_change_post(display); in intel_audio_component_init()
1361 static void intel_audio_component_register(struct intel_display *display) in intel_audio_component_register() argument
1365 ret = component_add_typed(display->drm->dev, in intel_audio_component_register()
1369 drm_err(display->drm, in intel_audio_component_register()
1375 display->audio.component_registered = true; in intel_audio_component_register()
1380 * @display: display device
1385 static void intel_audio_component_cleanup(struct intel_display *display) in intel_audio_component_cleanup() argument
1387 if (!display->audio.component_registered) in intel_audio_component_cleanup()
1390 component_del(display->drm->dev, &intel_audio_component_bind_ops); in intel_audio_component_cleanup()
1391 display->audio.component_registered = false; in intel_audio_component_cleanup()
1397 * @display: display device
1400 void intel_audio_init(struct intel_display *display) in intel_audio_init() argument
1402 if (intel_lpe_audio_init(display) < 0) in intel_audio_init()
1403 intel_audio_component_init(display); in intel_audio_init()
1406 void intel_audio_register(struct intel_display *display) in intel_audio_register() argument
1408 if (!display->audio.lpe.platdev) in intel_audio_register()
1409 intel_audio_component_register(display); in intel_audio_register()
1414 * @display: display device
1416 void intel_audio_deinit(struct intel_display *display) in intel_audio_deinit() argument
1418 if (display->audio.lpe.platdev) in intel_audio_deinit()
1419 intel_lpe_audio_teardown(display); in intel_audio_deinit()
1421 intel_audio_component_cleanup(display); in intel_audio_deinit()