From: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
To: intel-gfx@lists.freedesktop.org
Cc: intel-xe@lists.freedesktop.org
Subject: [PATCH 6/9] drm/i915/display: Add DSC pixel replication
Date: Mon, 14 Oct 2024 13:39:57 +0530 [thread overview]
Message-ID: <20241014081000.2844245-7-ankit.k.nautiyal@intel.com> (raw)
In-Reply-To: <20241014081000.2844245-1-ankit.k.nautiyal@intel.com>
With 3 VDSC engines and Ultrajoiner, we may encounter a situation where
hdisplay is not a multiple of slice count. In this case we need to add
extra pixels to the last slice to distribute pixels evenly across
slices.
Add member to store DSC pixel replication when hdisplay is not divisible
by slice_width. Fill DSS_CTL3 register with the pixel replication count.
TODO:
1. Scaler:
If the DSC is enabled and pixel replication is occurring, then the
scaler window size and position must fit within the pipe active size
plus the pixel replication.
2. PIPE_SRC:
Horizontal Src size must always be programmed to the same value as the
Horizontal Active except when panel fitting is enabled or DSC pixel
replication is enabled.
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 1 +
.../drm/i915/display/intel_display_types.h | 1 +
drivers/gpu/drm/i915/display/intel_vdsc.c | 22 ++++++++++++++++++-
.../gpu/drm/i915/display/intel_vdsc_regs.h | 8 +++++++
4 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 86c7ac600122..5846f16f0ee9 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -5725,6 +5725,7 @@ intel_pipe_config_compare(const struct intel_crtc_state *current_config,
PIPE_CONF_CHECK_BOOL(dsc.compression_enable);
PIPE_CONF_CHECK_I(dsc.dsc_split);
PIPE_CONF_CHECK_I(dsc.compressed_bpp_x16);
+ PIPE_CONF_CHECK_I(dsc.pixel_replication_count);
PIPE_CONF_CHECK_BOOL(splitter.enable);
PIPE_CONF_CHECK_I(splitter.link_count);
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
index e6d37d28c5c1..41a4e062e047 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -1245,6 +1245,7 @@ struct intel_crtc_state {
/* Compressed Bpp in U6.4 format (first 4 bits for fractional part) */
u16 compressed_bpp_x16;
u8 slice_count;
+ int pixel_replication_count;
struct drm_dsc_config config;
} dsc;
diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c
index 982dc326b4a1..f58dac630bb8 100644
--- a/drivers/gpu/drm/i915/display/intel_vdsc.c
+++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
@@ -774,6 +774,7 @@ void intel_dsc_enable(const struct intel_crtc_state *crtc_state)
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
u32 dss_ctl1_val = 0;
u32 dss_ctl2_val = 0;
+ u32 dss_ctl3_val = 0;
int vdsc_instances_per_pipe = intel_dsc_get_vdsc_per_pipe(crtc_state);
if (!crtc_state->dsc.compression_enable)
@@ -804,8 +805,16 @@ void intel_dsc_enable(const struct intel_crtc_state *crtc_state)
if (intel_crtc_is_bigjoiner_primary(crtc_state))
dss_ctl1_val |= PRIMARY_BIG_JOINER_ENABLE;
}
+
+ if (crtc_state->dsc.pixel_replication_count)
+ dss_ctl3_val = DSC_PIXEL_REPLICATION(crtc_state->dsc.pixel_replication_count);
+
intel_de_write(dev_priv, dss_ctl1_reg(crtc, crtc_state->cpu_transcoder), dss_ctl1_val);
intel_de_write(dev_priv, dss_ctl2_reg(crtc, crtc_state->cpu_transcoder), dss_ctl2_val);
+
+ if (IS_BATTLEMAGE(dev_priv) && dss_ctl3_val)
+ intel_de_write(dev_priv,
+ BMG_PIPE_DSS_CTL3(crtc_state->cpu_transcoder), dss_ctl3_val);
}
void intel_dsc_disable(const struct intel_crtc_state *old_crtc_state)
@@ -818,6 +827,10 @@ void intel_dsc_disable(const struct intel_crtc_state *old_crtc_state)
old_crtc_state->joiner_pipes) {
intel_de_write(dev_priv, dss_ctl1_reg(crtc, old_crtc_state->cpu_transcoder), 0);
intel_de_write(dev_priv, dss_ctl2_reg(crtc, old_crtc_state->cpu_transcoder), 0);
+
+ if (IS_BATTLEMAGE(dev_priv))
+ intel_de_write(dev_priv,
+ BMG_PIPE_DSS_CTL3(old_crtc_state->cpu_transcoder), 0);
}
}
@@ -975,7 +988,7 @@ void intel_dsc_get_config(struct intel_crtc_state *crtc_state)
enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
enum intel_display_power_domain power_domain;
intel_wakeref_t wakeref;
- u32 dss_ctl1, dss_ctl2;
+ u32 dss_ctl1, dss_ctl2, dss_ctl3;
if (!intel_dsc_source_support(crtc_state))
return;
@@ -989,6 +1002,9 @@ void intel_dsc_get_config(struct intel_crtc_state *crtc_state)
dss_ctl1 = intel_de_read(dev_priv, dss_ctl1_reg(crtc, cpu_transcoder));
dss_ctl2 = intel_de_read(dev_priv, dss_ctl2_reg(crtc, cpu_transcoder));
+ if (IS_BATTLEMAGE(dev_priv))
+ dss_ctl3 = intel_de_read(dev_priv, BMG_PIPE_DSS_CTL3(crtc_state->cpu_transcoder));
+
crtc_state->dsc.compression_enable = dss_ctl2 & VDSC0_ENABLE;
if (!crtc_state->dsc.compression_enable)
goto out;
@@ -1003,6 +1019,10 @@ void intel_dsc_get_config(struct intel_crtc_state *crtc_state)
crtc_state->dsc.dsc_split = INTEL_DSC_SPLIT_DISABLED;
}
+ if (dss_ctl3 & DSC_PIXEL_REPLICATION_MASK)
+ crtc_state->dsc.pixel_replication_count =
+ dss_ctl3 & DSC_PIXEL_REPLICATION_MASK;
+
intel_dsc_get_pps_config(crtc_state);
out:
intel_display_power_put(dev_priv, power_domain, wakeref);
diff --git a/drivers/gpu/drm/i915/display/intel_vdsc_regs.h b/drivers/gpu/drm/i915/display/intel_vdsc_regs.h
index efaeb5e0aea3..a588ce61cba7 100644
--- a/drivers/gpu/drm/i915/display/intel_vdsc_regs.h
+++ b/drivers/gpu/drm/i915/display/intel_vdsc_regs.h
@@ -52,6 +52,14 @@
_ICL_PIPE_DSS_CTL2_PB, \
_ICL_PIPE_DSS_CTL2_PC)
+#define _BMG_PIPE_DSS_CTL3_PB 0x782F0
+#define _BMG_PIPE_DSS_CTL3_PC 0x784F0
+#define BMG_PIPE_DSS_CTL3(pipe) _MMIO_PIPE((pipe) - PIPE_B, \
+ _BMG_PIPE_DSS_CTL3_PB, \
+ _BMG_PIPE_DSS_CTL3_PC)
+#define DSC_PIXEL_REPLICATION_MASK REG_GENMASK(15, 0)
+#define DSC_PIXEL_REPLICATION(count) ((count) << 0)
+
/* Icelake Display Stream Compression Registers */
#define DSCA_PICTURE_PARAMETER_SET_0 _MMIO(0x6B200)
#define DSCC_PICTURE_PARAMETER_SET_0 _MMIO(0x6BA00)
--
2.45.2
next prev parent reply other threads:[~2024-10-14 8:08 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-14 8:09 [PATCH 0/9] Add support for 3 VDSC engines 12 slices Ankit Nautiyal
2024-10-14 8:09 ` [PATCH 1/9] drm/i915/display: Prepare for dsc 3 stream splitter Ankit Nautiyal
2024-10-14 8:09 ` [PATCH 2/9] drm/i915/vdsc: Use VDSC0/VDSC1 for LEFT/RIGHT VDSC engine Ankit Nautiyal
2024-10-14 8:09 ` [PATCH 3/9] drm/i915/vdsc: Add register bits for VDSC2 engine Ankit Nautiyal
2024-10-14 8:09 ` [PATCH 4/9] drm/i915/vdsc: Add support for read/write PPS for DSC3 Ankit Nautiyal
2024-10-14 8:09 ` [PATCH 5/9] drm/i915/dp: Add check for hdisplay divisible by slice count Ankit Nautiyal
2024-10-14 8:09 ` Ankit Nautiyal [this message]
2024-10-15 17:01 ` [PATCH 6/9] drm/i915/display: Add DSC pixel replication kernel test robot
2024-10-16 11:00 ` kernel test robot
2024-10-14 8:09 ` [PATCH 7/9] drm/i915/dp: Compute pixel replication count for DSC 12 slices case Ankit Nautiyal
2024-10-18 2:21 ` Kandpal, Suraj
2024-10-14 8:09 ` [PATCH 8/9] drm/i915/dsc: Account for Odd pixel removal Ankit Nautiyal
2024-10-14 8:10 ` [PATCH 9/9] drm/i915/dp: Add support for 3 vdsc engines and 12 slices Ankit Nautiyal
2024-10-14 8:32 ` ✓ CI.Patch_applied: success for Add support for 3 VDSC engines 12 slices (rev2) Patchwork
2024-10-14 8:33 ` ✓ CI.checkpatch: " Patchwork
2024-10-14 8:34 ` ✓ CI.KUnit: " Patchwork
2024-10-14 8:45 ` ✓ CI.Build: " Patchwork
2024-10-14 8:48 ` ✓ CI.Hooks: " Patchwork
2024-10-14 8:49 ` ✗ CI.checksparse: warning " Patchwork
2024-10-14 9:14 ` ✓ CI.BAT: success " Patchwork
2024-10-14 10:58 ` ✗ CI.FULL: failure " Patchwork
-- strict thread matches above, loose matches on Subject: below --
2024-10-14 7:02 [PATCH 0/9] Add support for 3 VDSC engines 12 slices Ankit Nautiyal
2024-10-14 7:02 ` [PATCH 6/9] drm/i915/display: Add DSC pixel replication Ankit Nautiyal
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=20241014081000.2844245-7-ankit.k.nautiyal@intel.com \
--to=ankit.k.nautiyal@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox