@@ -865,24 +865,39 @@ u32 get_max_compressed_bpp_with_joiner(struct drm_i915_private *i915,
int num_joined_pipes)
{
u32 max_bpp_small_joiner_ram;
+ u32 max_bpp_bigjoiner;
+ u32 max_bpp;
/* Small Joiner Check: output bpp <= joiner RAM (bits) / Horiz. width */
max_bpp_small_joiner_ram = small_joiner_ram_size_bits(i915) / mode_hdisplay;
- if (num_joined_pipes == 2) {
+ if (num_joined_pipes == 1)
+ return max_bpp_small_joiner_ram;
+
+ if (num_joined_pipes > 1) {
int bigjoiner_interface_bits = DISPLAY_VER(i915) >= 14 ? 36 : 24;
/* With bigjoiner multiple dsc engines are used in parallel so PPC is 2 */
int ppc = 2;
- u32 max_bpp_bigjoiner =
- i915->display.cdclk.max_cdclk_freq * ppc * bigjoiner_interface_bits /
+ int num_bigjoiners = num_joined_pipes / 2;
+
+ max_bpp_bigjoiner =
+ i915->display.cdclk.max_cdclk_freq * ppc * bigjoiner_interface_bits *
intel_dp_mode_to_fec_clock(mode_clock);
- max_bpp_small_joiner_ram *= 2;
+ max_bpp_bigjoiner *= num_bigjoiners;
+
+ max_bpp_small_joiner_ram *= num_joined_pipes;
+ }
+
+ max_bpp = min(max_bpp_small_joiner_ram, max_bpp_bigjoiner);
+
+ if (num_joined_pipes == 4) {
+ u32 max_bpp_ultrajoiner_ram = (4 * 72 * 512) / mode_hdisplay;
- return min(max_bpp_small_joiner_ram, max_bpp_bigjoiner);
+ max_bpp = min(max_bpp, max_bpp_ultrajoiner_ram);
}
- return max_bpp_small_joiner_ram;
+ return max_bpp;
}
u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915,
Add compressed bpp limitations for ultrajoiner. v2: Fix the case for 1 pipe. (Ankit) Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> --- drivers/gpu/drm/i915/display/intel_dp.c | 27 +++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-)