Skip to content

Commit 112a87c

Browse files
kv2019iuma-intel
authored andcommitted
drm/i915/display: program audio CDCLK-TS for keepalives
XE_LPD display adds support for display audio codec keepalive feature. This feature works also when display codec is in D3 state and the audio link is off (BCLK off). To enable this functionality, display driver must update the AUD_TS_CDCLK_M/N registers whenever CDCLK is changed. Actual timestamps are generated only when the audio codec driver specifically enables the KeepAlive (KAE) feature. This patch adds new hooks to intel_set_cdclk() in order to inform display audio driver when CDCLK change is started and when it is complete. Bspec: 53679 Signed-off-by: Kai Vehmanen <[email protected]> Reviewed-by: Uma Shankar <[email protected]> Acked-by: Ville Syrjälä <[email protected]> Signed-off-by: Uma Shankar <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 0826edb commit 112a87c

File tree

4 files changed

+48
-0
lines changed

4 files changed

+48
-0
lines changed

drivers/gpu/drm/i915/display/intel_audio.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,40 @@ void intel_init_audio_hooks(struct drm_i915_private *dev_priv)
947947
}
948948
}
949949

950+
struct aud_ts_cdclk_m_n {
951+
u8 m;
952+
u16 n;
953+
};
954+
955+
void intel_audio_cdclk_change_pre(struct drm_i915_private *i915)
956+
{
957+
if (DISPLAY_VER(i915) >= 13)
958+
intel_de_rmw(i915, AUD_TS_CDCLK_M, AUD_TS_CDCLK_M_EN, 0);
959+
}
960+
961+
static void get_aud_ts_cdclk_m_n(int refclk, int cdclk, struct aud_ts_cdclk_m_n *aud_ts)
962+
{
963+
if (refclk == 24000)
964+
aud_ts->m = 12;
965+
else
966+
aud_ts->m = 15;
967+
968+
aud_ts->n = cdclk * aud_ts->m / 24000;
969+
}
970+
971+
void intel_audio_cdclk_change_post(struct drm_i915_private *i915)
972+
{
973+
struct aud_ts_cdclk_m_n aud_ts;
974+
975+
if (DISPLAY_VER(i915) >= 13) {
976+
get_aud_ts_cdclk_m_n(i915->cdclk.hw.ref, i915->cdclk.hw.cdclk, &aud_ts);
977+
978+
intel_de_write(i915, AUD_TS_CDCLK_N, aud_ts.n);
979+
intel_de_write(i915, AUD_TS_CDCLK_M, aud_ts.m | AUD_TS_CDCLK_M_EN);
980+
drm_dbg_kms(&i915->drm, "aud_ts_cdclk set to M=%u, N=%u\n", aud_ts.m, aud_ts.n);
981+
}
982+
}
983+
950984
static int glk_force_audio_cdclk_commit(struct intel_atomic_state *state,
951985
struct intel_crtc *crtc,
952986
bool enable)
@@ -1330,6 +1364,9 @@ static void i915_audio_component_init(struct drm_i915_private *dev_priv)
13301364
dev_priv->audio_freq_cntrl = aud_freq;
13311365
}
13321366

1367+
/* init with current cdclk */
1368+
intel_audio_cdclk_change_post(dev_priv);
1369+
13331370
dev_priv->audio_component_registered = true;
13341371
}
13351372

drivers/gpu/drm/i915/display/intel_audio.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ void intel_audio_codec_enable(struct intel_encoder *encoder,
1818
void intel_audio_codec_disable(struct intel_encoder *encoder,
1919
const struct intel_crtc_state *old_crtc_state,
2020
const struct drm_connector_state *old_conn_state);
21+
void intel_audio_cdclk_change_pre(struct drm_i915_private *dev_priv);
22+
void intel_audio_cdclk_change_post(struct drm_i915_private *dev_priv);
2123
void intel_audio_init(struct drm_i915_private *dev_priv);
2224
void intel_audio_deinit(struct drm_i915_private *dev_priv);
2325

drivers/gpu/drm/i915/display/intel_cdclk.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <linux/time.h>
2525

2626
#include "intel_atomic.h"
27+
#include "intel_audio.h"
2728
#include "intel_bw.h"
2829
#include "intel_cdclk.h"
2930
#include "intel_de.h"
@@ -1975,6 +1976,8 @@ static void intel_set_cdclk(struct drm_i915_private *dev_priv,
19751976
intel_psr_pause(intel_dp);
19761977
}
19771978

1979+
intel_audio_cdclk_change_pre(dev_priv);
1980+
19781981
/*
19791982
* Lock aux/gmbus while we change cdclk in case those
19801983
* functions use cdclk. Not all platforms/ports do,
@@ -2003,6 +2006,8 @@ static void intel_set_cdclk(struct drm_i915_private *dev_priv,
20032006
intel_psr_resume(intel_dp);
20042007
}
20052008

2009+
intel_audio_cdclk_change_post(dev_priv);
2010+
20062011
if (drm_WARN(&dev_priv->drm,
20072012
intel_cdclk_changed(&dev_priv->cdclk.hw, cdclk_config),
20082013
"cdclk state doesn't match!\n")) {

drivers/gpu/drm/i915/i915_reg.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9782,6 +9782,10 @@ enum {
97829782
#define AUD_PIN_BUF_CTL _MMIO(0x48414)
97839783
#define AUD_PIN_BUF_ENABLE REG_BIT(31)
97849784

9785+
#define AUD_TS_CDCLK_M _MMIO(0x65ea0)
9786+
#define AUD_TS_CDCLK_M_EN REG_BIT(31)
9787+
#define AUD_TS_CDCLK_N _MMIO(0x65ea4)
9788+
97859789
/* Display Audio Config Reg */
97869790
#define AUD_CONFIG_BE _MMIO(0x65ef0)
97879791
#define HBLANK_EARLY_ENABLE_ICL(pipe) (0x1 << (20 - (pipe)))

0 commit comments

Comments
 (0)