return ffs(crtc_state->joiner_pipes) - 1;
 }
 
+/*
+ * The following helper functions, despite being named for bigjoiner,
+ * are applicable to both bigjoiner and uncompressed joiner configurations.
+ */
+static bool is_bigjoiner(const struct intel_crtc_state *crtc_state)
+{
+       return hweight8(crtc_state->joiner_pipes) >= 2;
+}
+
+static u8 bigjoiner_primary_pipes(const struct intel_crtc_state *crtc_state)
+{
+       if (!is_bigjoiner(crtc_state))
+               return 0;
+
+       return crtc_state->joiner_pipes & (0b01010101 << joiner_primary_pipe(crtc_state));
+}
+
+static unsigned int bigjoiner_secondary_pipes(const struct intel_crtc_state *crtc_state)
+{
+       if (!is_bigjoiner(crtc_state))
+               return 0;
+
+       return crtc_state->joiner_pipes & (0b10101010 << joiner_primary_pipe(crtc_state));
+}
+
+bool intel_crtc_is_bigjoiner_primary(const struct intel_crtc_state *crtc_state)
+{
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+
+       if (!is_bigjoiner(crtc_state))
+               return false;
+
+       return BIT(crtc->pipe) & bigjoiner_primary_pipes(crtc_state);
+}
+
+bool intel_crtc_is_bigjoiner_secondary(const struct intel_crtc_state *crtc_state)
+{
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+
+       if (!is_bigjoiner(crtc_state))
+               return false;
+
+       return BIT(crtc->pipe) & bigjoiner_secondary_pipes(crtc_state);
+}
+
 u8 intel_crtc_joiner_secondary_pipes(const struct intel_crtc_state *crtc_state)
 {
        if (crtc_state->joiner_pipes)
 
 u8 intel_crtc_joined_pipe_mask(const struct intel_crtc_state *crtc_state);
 bool intel_crtc_is_joiner_secondary(const struct intel_crtc_state *crtc_state);
 bool intel_crtc_is_joiner_primary(const struct intel_crtc_state *crtc_state);
+bool intel_crtc_is_bigjoiner_primary(const struct intel_crtc_state *crtc_state);
+bool intel_crtc_is_bigjoiner_secondary(const struct intel_crtc_state *crtc_state);
 u8 intel_crtc_joiner_secondary_pipes(const struct intel_crtc_state *crtc_state);
 struct intel_crtc *intel_primary_crtc(const struct intel_crtc_state *crtc_state);
 bool intel_crtc_get_pipe_config(struct intel_crtc_state *crtc_state);
 
        u32 dss_ctl1_val = 0;
 
        if (crtc_state->joiner_pipes && !crtc_state->dsc.compression_enable) {
-               if (intel_crtc_is_joiner_secondary(crtc_state))
+               if (intel_crtc_is_bigjoiner_secondary(crtc_state))
                        dss_ctl1_val |= UNCOMPRESSED_JOINER_SECONDARY;
                else
                        dss_ctl1_val |= UNCOMPRESSED_JOINER_PRIMARY;
        }
        if (crtc_state->joiner_pipes) {
                dss_ctl1_val |= BIG_JOINER_ENABLE;
-               if (!intel_crtc_is_joiner_secondary(crtc_state))
+               if (intel_crtc_is_bigjoiner_primary(crtc_state))
                        dss_ctl1_val |= PRIMARY_BIG_JOINER_ENABLE;
        }
        intel_de_write(dev_priv, dss_ctl1_reg(crtc, crtc_state->cpu_transcoder), dss_ctl1_val);