#include "intel_cdclk.h"
 #include "intel_crtc.h"
 #include "intel_de.h"
+#include "intel_dp.h"
 #include "intel_display_types.h"
 #include "intel_mchbar_regs.h"
 #include "intel_pci_config.h"
        return min_cdclk;
 }
 
+static int intel_vdsc_min_cdclk(const struct intel_crtc_state *crtc_state)
+{
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+       struct drm_i915_private *i915 = to_i915(crtc->base.dev);
+       int num_vdsc_instances = intel_dsc_get_num_vdsc_instances(crtc_state);
+       int min_cdclk = 0;
+
+       /*
+        * When we decide to use only one VDSC engine, since
+        * each VDSC operates with 1 ppc throughput, pixel clock
+        * cannot be higher than the VDSC clock (cdclk)
+        * If there 2 VDSC engines, then pixel clock can't be higher than
+        * VDSC clock(cdclk) * 2 and so on.
+        */
+       min_cdclk = max_t(int, min_cdclk,
+                         DIV_ROUND_UP(crtc_state->pixel_rate, num_vdsc_instances));
+
+       if (crtc_state->bigjoiner_pipes) {
+               int pixel_clock = intel_dp_mode_to_fec_clock(crtc_state->hw.adjusted_mode.clock);
+
+               /*
+                * According to Bigjoiner bw check:
+                * compressed_bpp <= PPC * CDCLK * Big joiner Interface bits / Pixel clock
+                *
+                * We have already computed compressed_bpp, so now compute the min CDCLK that
+                * is required to support this compressed_bpp.
+                *
+                * => CDCLK >= compressed_bpp * Pixel clock / (PPC * Bigjoiner Interface bits)
+                *
+                * Since PPC = 2 with bigjoiner
+                * => CDCLK >= compressed_bpp * Pixel clock  / 2 * Bigjoiner Interface bits
+                */
+               int bigjoiner_interface_bits = DISPLAY_VER(i915) > 13 ? 36 : 24;
+               int min_cdclk_bj = (crtc_state->dsc.compressed_bpp * pixel_clock) /
+                                  (2 * bigjoiner_interface_bits);
+
+               min_cdclk = max(min_cdclk, min_cdclk_bj);
+       }
+
+       return min_cdclk;
+}
+
 int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state)
 {
        struct drm_i915_private *dev_priv =
        /* Account for additional needs from the planes */
        min_cdclk = max(intel_planes_min_cdclk(crtc_state), min_cdclk);
 
-       /*
-        * When we decide to use only one VDSC engine, since
-        * each VDSC operates with 1 ppc throughput, pixel clock
-        * cannot be higher than the VDSC clock (cdclk)
-        * If there 2 VDSC engines, then pixel clock can't be higher than
-        * VDSC clock(cdclk) * 2 and so on.
-        */
-       if (crtc_state->dsc.compression_enable) {
-               int num_vdsc_instances = intel_dsc_get_num_vdsc_instances(crtc_state);
-
-               min_cdclk = max_t(int, min_cdclk,
-                                 DIV_ROUND_UP(crtc_state->pixel_rate,
-                                              num_vdsc_instances));
-       }
+       if (crtc_state->dsc.compression_enable)
+               min_cdclk = max(min_cdclk, intel_vdsc_min_cdclk(crtc_state));
 
        /*
         * HACK. Currently for TGL/DG2 platforms we calculate