From: Uma Shankar <uma.shankar@intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: kai.vehmanen@intel.com
Subject: [Intel-gfx] [PATCH v2] drm/i915/display: Enable DP Display Audio WA
Date: Tue, 7 Apr 2020 14:20:38 +0530 [thread overview]
Message-ID: <20200407085038.11602-1-uma.shankar@intel.com> (raw)
Enable Display Audio WA #1406928334 for 4k+VDSC usecase
on DP encoders.
v2: Fixed build failures on 32bit machine.
Signed-off-by: Uma Shankar <uma.shankar@intel.com>
---
drivers/gpu/drm/i915/display/intel_audio.c | 113 +++++++++++++++++++++
drivers/gpu/drm/i915/i915_reg.h | 16 +++
2 files changed, 129 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_audio.c b/drivers/gpu/drm/i915/display/intel_audio.c
index 950160f1a89f..ae896d75596b 100644
--- a/drivers/gpu/drm/i915/display/intel_audio.c
+++ b/drivers/gpu/drm/i915/display/intel_audio.c
@@ -512,6 +512,115 @@ static void hsw_audio_codec_disable(struct intel_encoder *encoder,
mutex_unlock(&dev_priv->av_mutex);
}
+static void enable_audio_dsc_wa(struct intel_encoder *encoder,
+ const struct intel_crtc_state *crtc_state)
+{
+ struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+ enum pipe pipe = crtc->pipe;
+ u64 link_clks_available, link_clks_required, link_clk;
+ u64 tu_data, tu_line, link_clks_active;
+ u64 hblank_rise, hblank_early_prog, samples_room;
+ u64 h_active, h_total, hblank_delta, pixel_clk, v_total, lanes;
+ u64 vdsc_bpp, fec_coeff, refresh_rate, cdclk;
+ u64 rounding_factor = 100000;
+ u32 val;
+
+ val = intel_de_read(dev_priv, AUD_CONFIG_BE);
+
+ if (INTEL_GEN(dev_priv) == 11)
+ val |= HBLANK_EARLY_ENABLE_ICL(pipe);
+ else if (INTEL_GEN(dev_priv) >= 12)
+ val |= HBLANK_EARLY_ENABLE_TGL(pipe);
+
+ if (crtc_state->dsc.compression_enable &&
+ (crtc_state->hw.adjusted_mode.hdisplay >= 3840 &&
+ crtc_state->hw.adjusted_mode.vdisplay >= 2160)) {
+ h_active = crtc_state->hw.adjusted_mode.hdisplay;
+ h_total = crtc_state->hw.adjusted_mode.htotal;
+ v_total = crtc_state->hw.adjusted_mode.vtotal;
+ hblank_rise = crtc_state->hw.adjusted_mode.hsync_start;
+ pixel_clk = crtc_state->hw.adjusted_mode.clock;
+ link_clk = crtc_state->port_clock;
+ lanes = crtc_state->lane_count;
+ vdsc_bpp = crtc_state->pipe_bpp;
+ refresh_rate = crtc_state->hw.adjusted_mode.vrefresh;
+ cdclk = dev_priv->cdclk.hw.cdclk;
+ /* fec= 0.972261, using rounding multiplier of 1000000 */
+ fec_coeff = 972261;
+
+ if (!(h_active && link_clk && lanes && vdsc_bpp && cdclk)) {
+ drm_err(&dev_priv->drm, "Null Parameters received\n");
+ return;
+ }
+
+ drm_dbg_kms(&dev_priv->drm, "h_active = %llu link_clk = %llu :"
+ "lanes = %llu vdsc_bpp = %llu cdclk = %llu\n",
+ h_active, link_clk, lanes, vdsc_bpp, cdclk);
+
+ link_clks_available = ((((h_total - h_active) *
+ ((link_clk * rounding_factor) /
+ pixel_clk)) / rounding_factor) - 28);
+
+ link_clks_required = DIV_ROUND_UP_ULL(192000, (refresh_rate *
+ v_total)) *
+ ((48 / lanes) + 2);
+
+ if (link_clks_available > link_clks_required)
+ hblank_delta = 32;
+ else
+ hblank_delta = DIV_ROUND_UP_ULL(((((5 *
+ rounding_factor) /
+ link_clk) + ((5 *
+ rounding_factor) /
+ cdclk)) * pixel_clk),
+ rounding_factor);
+
+ tu_data = (pixel_clk * vdsc_bpp * 8) / ((link_clk *
+ lanes * fec_coeff) /
+ 1000000);
+ tu_line = (((h_active * link_clk * fec_coeff) / 1000000) /
+ (64 * pixel_clk));
+ link_clks_active = (tu_line - 1) * 64 + tu_data;
+ hblank_rise = ((link_clks_active + 6 *
+ DIV_ROUND_UP_ULL(link_clks_active, 250) + 4) *
+ ((pixel_clk *
+ rounding_factor) /
+ link_clk)) / rounding_factor;
+
+ hblank_early_prog = h_active - hblank_rise + hblank_delta;
+
+ if (hblank_early_prog < 32) {
+ val &= ~HBLANK_START_COUNT_MASK(pipe);
+ val |= HBLANK_START_COUNT(HBLANK_START_COUNT_32, pipe);
+ } else if (hblank_early_prog < 64) {
+ val &= ~HBLANK_START_COUNT_MASK(pipe);
+ val |= HBLANK_START_COUNT(HBLANK_START_COUNT_64, pipe);
+ } else if (hblank_early_prog < 96) {
+ val &= ~HBLANK_START_COUNT_MASK(pipe);
+ val |= HBLANK_START_COUNT(HBLANK_START_COUNT_96, pipe);
+ } else {
+ val &= ~HBLANK_START_COUNT_MASK(pipe);
+ val |= HBLANK_START_COUNT(HBLANK_START_COUNT_128, pipe);
+ }
+
+ samples_room = ((((h_total - h_active) *
+ ((link_clk * rounding_factor) /
+ pixel_clk)) / rounding_factor) - 12) /
+ ((48 / lanes) + 2);
+
+ if (samples_room < 3) {
+ val &= ~NUMBER_SAMPLES_PER_LINE_MASK(pipe);
+ val |= NUMBER_SAMPLES_PER_LINE(samples_room, pipe);
+ } else {
+ val &= ~NUMBER_SAMPLES_PER_LINE_MASK(pipe);
+ val |= NUMBER_SAMPLES_PER_LINE(0x0, pipe);
+ }
+ }
+
+ intel_de_write(dev_priv, AUD_CONFIG_BE, val);
+}
+
static void hsw_audio_codec_enable(struct intel_encoder *encoder,
const struct intel_crtc_state *crtc_state,
const struct drm_connector_state *conn_state)
@@ -529,6 +638,10 @@ static void hsw_audio_codec_enable(struct intel_encoder *encoder,
mutex_lock(&dev_priv->av_mutex);
+ /* Enable Audio WA for 4k DSC usecases */
+ if (encoder->type == INTEL_OUTPUT_DP)
+ enable_audio_dsc_wa(encoder, crtc_state);
+
/* Enable audio presence detect, invalidate ELD */
tmp = intel_de_read(dev_priv, HSW_AUD_PIN_ELD_CP_VLD);
tmp |= AUDIO_OUTPUT_ENABLE(cpu_transcoder);
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 8cebb7a86b8c..ff293e9d5a63 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -9395,6 +9395,22 @@ enum {
#define AUD_PIN_BUF_CTL _MMIO(0x48414)
#define AUD_PIN_BUF_ENABLE REG_BIT(31)
+/* Display Audio Config Reg */
+#define AUD_CONFIG_BE _MMIO(0x65ef0)
+#define HBLANK_EARLY_ENABLE_ICL(pipe) (0x1 << (20 - (pipe)))
+#define HBLANK_EARLY_ENABLE_TGL(pipe) (0x1 << (24 + (pipe)))
+#define HBLANK_START_COUNT_MASK(pipe) (0x7 << (3 + ((pipe) * 6)))
+#define HBLANK_START_COUNT(val, pipe) (((val) & 0x7) << (3 + ((pipe)) * 6))
+#define NUMBER_SAMPLES_PER_LINE_MASK(pipe) (0x3 << ((pipe) * 6))
+#define NUMBER_SAMPLES_PER_LINE(val, pipe) (((val) & 0x3) << ((pipe) * 6))
+
+#define HBLANK_START_COUNT_8 0x0
+#define HBLANK_START_COUNT_16 0x1
+#define HBLANK_START_COUNT_32 0x2
+#define HBLANK_START_COUNT_64 0x3
+#define HBLANK_START_COUNT_96 0x4
+#define HBLANK_START_COUNT_128 0x5
+
/*
* HSW - ICL power wells
*
--
2.22.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next reply other threads:[~2020-04-07 8:22 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-07 8:50 Uma Shankar [this message]
2020-04-07 9:07 ` [Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915/display: Enable DP Display Audio WA (rev2) Patchwork
2020-04-07 9:07 ` [Intel-gfx] ✗ Fi.CI.BUILD: warning " Patchwork
2020-04-07 10:52 ` [Intel-gfx] [PATCH v2] drm/i915/display: Enable DP Display Audio WA Anshuman Gupta
2020-04-07 11:11 ` Shankar, Uma
2020-04-07 16:00 ` [Intel-gfx] ✓ Fi.CI.IGT: success for drm/i915/display: Enable DP Display Audio WA (rev2) Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200407085038.11602-1-uma.shankar@intel.com \
--to=uma.shankar@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=kai.vehmanen@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.