Lets implement or change basic functions required for ultrajoiner
support from atomic commit/modesetting point of view.

Signed-off-by: Stanislav Lisovskiy <stanislav.lisovs...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display.c | 66 +++++++++++++++++---
 1 file changed, 56 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index c74721188e59..c390b79a43d6 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -242,33 +242,65 @@ is_trans_port_sync_mode(const struct intel_crtc_state 
*crtc_state)
                is_trans_port_sync_slave(crtc_state);
 }
 
-static enum pipe joiner_master_pipe(const struct intel_crtc_state *crtc_state)
+static u8 joiner_master_pipes(const struct intel_crtc_state *crtc_state)
 {
-       return ffs(crtc_state->joiner_pipes) - 1;
+       return BIT(PIPE_A) | BIT(PIPE_C);
+}
+
+static u8 joiner_primary_master_pipes(const struct intel_crtc_state 
*crtc_state)
+{
+       return BIT(PIPE_A);
 }
 
 u8 intel_crtc_joiner_slave_pipes(const struct intel_crtc_state *crtc_state)
 {
-       if (crtc_state->joiner_pipes)
-               return crtc_state->joiner_pipes & 
~BIT(joiner_master_pipe(crtc_state));
+       if (intel_is_ultrajoiner(crtc_state))
+               return crtc_state->joiner_pipes & 
~joiner_primary_master_pipes(crtc_state);
+       else if (intel_is_bigjoiner(crtc_state))
+               return crtc_state->joiner_pipes & 
~joiner_master_pipes(crtc_state);
        else
                return 0;
 }
 
-bool intel_crtc_is_joiner_slave(const struct intel_crtc_state *crtc_state)
+bool intel_crtc_is_bigjoiner_slave(const struct intel_crtc_state *crtc_state)
 {
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 
        return crtc_state->joiner_pipes &&
-               crtc->pipe != joiner_master_pipe(crtc_state);
+               !(BIT(crtc->pipe) & joiner_master_pipes(crtc_state));
+}
+
+bool intel_crtc_is_bigjoiner_master(const struct intel_crtc_state *crtc_state)
+{
+       return !intel_crtc_is_bigjoiner_slave(crtc_state);
+}
+
+bool intel_crtc_is_joiner_slave(const struct intel_crtc_state *crtc_state)
+{
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+
+       if (intel_is_ultrajoiner(crtc_state))
+               return crtc_state->joiner_pipes &&
+                       !(BIT(crtc->pipe) & 
joiner_primary_master_pipes(crtc_state));
+       return intel_crtc_is_bigjoiner_slave(crtc_state);
 }
 
 bool intel_crtc_is_joiner_master(const struct intel_crtc_state *crtc_state)
 {
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
 
+       if (intel_is_ultrajoiner(crtc_state))
+               return crtc_state->joiner_pipes &&
+                       (BIT(crtc->pipe) & 
joiner_primary_master_pipes(crtc_state));
+       return intel_crtc_is_bigjoiner_master(crtc_state);
+}
+
+bool intel_crtc_is_joiner_primary_master(const struct intel_crtc_state 
*crtc_state)
+{
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+
        return crtc_state->joiner_pipes &&
-               crtc->pipe == joiner_master_pipe(crtc_state);
+               (BIT(crtc->pipe) & joiner_primary_master_pipes(crtc_state));
 }
 
 static int intel_joiner_num_pipes(const struct intel_crtc_state *crtc_state)
@@ -283,12 +315,26 @@ u8 intel_crtc_joined_pipe_mask(const struct 
intel_crtc_state *crtc_state)
        return BIT(crtc->pipe) | crtc_state->joiner_pipes;
 }
 
+enum pipe intel_crtc_master_pipe(const struct intel_crtc_state *crtc_state)
+{
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+
+       if (intel_is_ultrajoiner(crtc_state)) {
+               return ffs(joiner_primary_master_pipes(crtc_state)) - 1;
+       } else if (intel_is_bigjoiner(crtc_state)) {
+               return intel_crtc_is_joiner_slave(crtc_state) ?
+                       crtc->pipe - 1 : crtc->pipe;
+       } else {
+               return crtc->pipe;
+       }
+}
+
 struct intel_crtc *intel_master_crtc(const struct intel_crtc_state *crtc_state)
 {
        struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
 
        if (intel_crtc_is_joiner_slave(crtc_state))
-               return intel_crtc_for_pipe(i915, 
joiner_master_pipe(crtc_state));
+               return intel_crtc_for_pipe(i915, 
intel_crtc_master_pipe(crtc_state));
        else
                return to_intel_crtc(crtc_state->uapi.crtc);
 }
@@ -2857,7 +2903,7 @@ static void intel_joiner_adjust_pipe_src(struct 
intel_crtc_state *crtc_state)
        if (num_pipes < 2)
                return;
 
-       master_pipe = joiner_master_pipe(crtc_state);
+       master_pipe = intel_crtc_master_pipe(crtc_state);
        width = drm_rect_width(&crtc_state->pipe_src);
 
        drm_rect_translate_to(&crtc_state->pipe_src,
@@ -5898,7 +5944,7 @@ static int intel_atomic_check_joiner(struct 
intel_atomic_state *state,
 
        /* sanity check */
        if (drm_WARN_ON(&i915->drm,
-                       master_crtc->pipe != 
joiner_master_pipe(master_crtc_state)))
+                       master_crtc->pipe != 
intel_crtc_master_pipe(master_crtc_state)))
                return -EINVAL;
 
        if (master_crtc_state->joiner_pipes & ~joiner_pipes(i915)) {
-- 
2.37.3

Reply via email to