Move all the static functions intel_joiner* to the new file
intel_joiner.c.

Signed-off-by: Ankit Nautiyal <[email protected]>
---
 drivers/gpu/drm/i915/Makefile                |   1 +
 drivers/gpu/drm/i915/display/intel_display.c | 234 +------------------
 drivers/gpu/drm/i915/display/intel_display.h |   5 +
 drivers/gpu/drm/i915/display/intel_joiner.c  | 233 ++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_joiner.h  |  32 +++
 drivers/gpu/drm/xe/Makefile                  |   1 +
 6 files changed, 278 insertions(+), 228 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/display/intel_joiner.c
 create mode 100644 drivers/gpu/drm/i915/display/intel_joiner.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index e55ce8ba123c..c337385bbe7d 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -333,6 +333,7 @@ i915-y += \
        display/intel_encoder.o \
        display/intel_gmbus.o \
        display/intel_hdmi.o \
+       display/intel_joiner.o \
        display/intel_lspcon.o \
        display/intel_lvds.o \
        display/intel_panel.o \
diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
b/drivers/gpu/drm/i915/display/intel_display.c
index 371318f69d1d..49591d108565 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -97,6 +97,7 @@
 #include "intel_frontbuffer.h"
 #include "intel_hdmi.h"
 #include "intel_hotplug.h"
+#include "intel_joiner.h"
 #include "intel_link_bw.h"
 #include "intel_lvds.h"
 #include "intel_lvds_regs.h"
@@ -249,11 +250,6 @@ is_trans_port_sync_mode(const struct intel_crtc_state 
*crtc_state)
                is_trans_port_sync_slave(crtc_state);
 }
 
-static enum pipe intel_joiner_get_primary_pipe(const struct intel_crtc_state 
*crtc_state)
-{
-       return ffs(crtc_state->joiner_pipes) - 1;
-}
-
 u8 intel_crtc_joiner_secondary_pipes(const struct intel_crtc_state *crtc_state)
 {
        if (crtc_state->joiner_pipes)
@@ -278,11 +274,6 @@ bool intel_crtc_is_joiner_primary(const struct 
intel_crtc_state *crtc_state)
                crtc->pipe == intel_joiner_get_primary_pipe(crtc_state);
 }
 
-static int intel_joiner_get_num_pipes(const struct intel_crtc_state 
*crtc_state)
-{
-       return hweight8(crtc_state->joiner_pipes);
-}
-
 u8 intel_crtc_joined_pipe_mask(const struct intel_crtc_state *crtc_state)
 {
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
@@ -2341,23 +2332,6 @@ static void intel_crtc_compute_pixel_rate(struct 
intel_crtc_state *crtc_state)
                        ilk_pipe_pixel_rate(crtc_state);
 }
 
-static void intel_joiner_adjust_timings(const struct intel_crtc_state 
*crtc_state,
-                                       struct drm_display_mode *mode)
-{
-       int num_pipes = intel_joiner_get_num_pipes(crtc_state);
-
-       if (num_pipes < 2)
-               return;
-
-       mode->crtc_clock /= num_pipes;
-       mode->crtc_hdisplay /= num_pipes;
-       mode->crtc_hblank_start /= num_pipes;
-       mode->crtc_hblank_end /= num_pipes;
-       mode->crtc_hsync_start /= num_pipes;
-       mode->crtc_hsync_end /= num_pipes;
-       mode->crtc_htotal /= num_pipes;
-}
-
 static void intel_splitter_adjust_timings(const struct intel_crtc_state 
*crtc_state,
                                          struct drm_display_mode *mode)
 {
@@ -2426,21 +2400,6 @@ void intel_encoder_get_config(struct intel_encoder 
*encoder,
        intel_crtc_readout_derived_state(crtc_state);
 }
 
-static void intel_joiner_compute_pipe_src(struct intel_crtc_state *crtc_state)
-{
-       int num_pipes = intel_joiner_get_num_pipes(crtc_state);
-       int width, height;
-
-       if (num_pipes < 2)
-               return;
-
-       width = drm_rect_width(&crtc_state->pipe_src);
-       height = drm_rect_height(&crtc_state->pipe_src);
-
-       drm_rect_init(&crtc_state->pipe_src, 0, 0,
-                     width / num_pipes, height);
-}
-
 static int intel_crtc_compute_pipe_src(struct intel_crtc_state *crtc_state)
 {
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
@@ -2885,23 +2844,6 @@ static void intel_get_transcoder_timings(struct 
intel_crtc *crtc,
                                      TRANS_SET_CONTEXT_LATENCY(dev_priv, 
cpu_transcoder));
 }
 
-static void intel_joiner_adjust_pipe_src(struct intel_crtc_state *crtc_state)
-{
-       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
-       int num_pipes = intel_joiner_get_num_pipes(crtc_state);
-       enum pipe primary_pipe, pipe = crtc->pipe;
-       int width;
-
-       if (num_pipes < 2)
-               return;
-
-       primary_pipe = intel_joiner_get_primary_pipe(crtc_state);
-       width = drm_rect_width(&crtc_state->pipe_src);
-
-       drm_rect_translate_to(&crtc_state->pipe_src,
-                             (pipe - primary_pipe) * width, 0);
-}
-
 static void intel_get_pipe_src_size(struct intel_crtc *crtc,
                                    struct intel_crtc_state *pipe_config)
 {
@@ -3505,20 +3447,6 @@ static bool ilk_get_pipe_config(struct intel_crtc *crtc,
        return ret;
 }
 
-static u8 intel_joiner_supported_pipes(struct drm_i915_private *i915)
-{
-       u8 pipes;
-
-       if (DISPLAY_VER(i915) >= 12)
-               pipes = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D);
-       else if (DISPLAY_VER(i915) >= 11)
-               pipes = BIT(PIPE_B) | BIT(PIPE_C);
-       else
-               pipes = 0;
-
-       return pipes & DISPLAY_RUNTIME_INFO(i915)->pipe_mask;
-}
-
 static bool transcoder_ddi_func_is_enabled(struct drm_i915_private *dev_priv,
                                           enum transcoder cpu_transcoder)
 {
@@ -3535,66 +3463,6 @@ static bool transcoder_ddi_func_is_enabled(struct 
drm_i915_private *dev_priv,
        return tmp & TRANS_DDI_FUNC_ENABLE;
 }
 
-static void intel_joiner_enabled_pipes(struct drm_i915_private *dev_priv,
-                                      u8 *primary_pipes, u8 *secondary_pipes)
-{
-       struct intel_crtc *crtc;
-
-       *primary_pipes = 0;
-       *secondary_pipes = 0;
-
-       for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, crtc,
-                                        
intel_joiner_supported_pipes(dev_priv)) {
-               intel_dss_get_compressed_joiner_pipes(crtc,
-                                                     primary_pipes,
-                                                     secondary_pipes);
-
-               intel_dss_get_uncompressed_joiner_pipes(crtc,
-                                                       primary_pipes,
-                                                       secondary_pipes);
-       }
-
-       /* Joiner pipes should always be consecutive primary and secondary */
-       drm_WARN(&dev_priv->drm, *secondary_pipes != *primary_pipes << 1,
-                "Joiner misconfigured (primary pipes 0x%x, secondary pipes 
0x%x)\n",
-                *primary_pipes, *secondary_pipes);
-}
-
-static enum pipe intel_joiner_find_primary_pipe(enum pipe pipe,
-                                               u8 primary_pipes,
-                                               u8 secondary_pipes)
-{
-       if ((secondary_pipes & BIT(pipe)) == 0)
-               return pipe;
-
-       /* ignore everything above our pipe */
-       primary_pipes &= ~GENMASK(7, pipe);
-
-       /* highest remaining bit should be our primary pipe */
-       return fls(primary_pipes) - 1;
-}
-
-static u8 intel_joiner_find_secondary_pipes(enum pipe pipe,
-                                           u8 primary_pipes,
-                                           u8 secondary_pipes)
-{
-       enum pipe primary_pipe, next_primary_pipe;
-
-       primary_pipe = intel_joiner_find_primary_pipe(pipe, primary_pipes, 
secondary_pipes);
-
-       if ((primary_pipes & BIT(primary_pipe)) == 0)
-               return 0;
-
-       /* ignore our primary pipe and everything below it */
-       primary_pipes &= ~GENMASK(primary_pipe, 0);
-       /* make sure a high bit is set for the ffs() */
-       primary_pipes |= BIT(7);
-       /* lowest remaining bit should be the next primary pipe */
-       next_primary_pipe = ffs(primary_pipes) - 1;
-
-       return secondary_pipes & GENMASK(next_primary_pipe - 1, primary_pipe);
-}
-
 static u8 hsw_panel_transcoders(struct drm_i915_private *i915)
 {
        u8 panel_transcoder_mask = BIT(TRANSCODER_EDP);
@@ -3794,23 +3662,6 @@ static bool bxt_get_dsi_transcoder_state(struct 
intel_crtc *crtc,
        return transcoder_is_dsi(pipe_config->cpu_transcoder);
 }
 
-static void intel_joiner_get_config(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);
-       u8 primary_pipes, secondary_pipes;
-       enum pipe pipe = crtc->pipe;
-
-       intel_joiner_enabled_pipes(i915, &primary_pipes, &secondary_pipes);
-
-       if (((primary_pipes | secondary_pipes) & BIT(pipe)) == 0)
-               return;
-
-       crtc_state->joiner_pipes =
-               BIT(intel_joiner_find_primary_pipe(pipe, primary_pipes, 
secondary_pipes)) |
-               intel_joiner_find_secondary_pipes(pipe, primary_pipes, 
secondary_pipes);
-}
-
 static bool hsw_get_pipe_config(struct intel_crtc *crtc,
                                struct intel_crtc_state *pipe_config)
 {
@@ -5822,9 +5673,9 @@ static bool active_planes_affects_min_cdclk(struct 
drm_i915_private *dev_priv)
                IS_IVYBRIDGE(dev_priv);
 }
 
-static int intel_crtc_add_joiner_planes(struct intel_atomic_state *state,
-                                       struct intel_crtc *crtc,
-                                       struct intel_crtc *other)
+int intel_crtc_add_joiner_planes(struct intel_atomic_state *state,
+                                struct intel_crtc *crtc,
+                                struct intel_crtc *other)
 {
        const struct intel_plane_state __maybe_unused *plane_state;
        struct intel_plane *plane;
@@ -5839,32 +5690,6 @@ static int intel_crtc_add_joiner_planes(struct 
intel_atomic_state *state,
        return intel_crtc_add_planes_to_state(state, other, plane_ids);
 }
 
-static int intel_joiner_add_affected_planes(struct intel_atomic_state *state)
-{
-       struct drm_i915_private *i915 = to_i915(state->base.dev);
-       const struct intel_crtc_state *crtc_state;
-       struct intel_crtc *crtc;
-       int i;
-
-       for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
-               struct intel_crtc *other;
-
-               for_each_intel_crtc_in_pipe_mask(&i915->drm, other,
-                                                crtc_state->joiner_pipes) {
-                       int ret;
-
-                       if (crtc == other)
-                               continue;
-
-                       ret = intel_crtc_add_joiner_planes(state, crtc, other);
-                       if (ret)
-                               return ret;
-               }
-       }
-
-       return 0;
-}
-
 static int intel_atomic_check_planes(struct intel_atomic_state *state)
 {
        struct drm_i915_private *dev_priv = to_i915(state->base.dev);
@@ -6049,8 +5874,8 @@ static int intel_atomic_check_joiner(struct 
intel_atomic_state *state,
        return 0;
 }
 
-static void kill_joiner_secondaries(struct intel_atomic_state *state,
-                                   struct intel_crtc *primary_crtc)
+void intel_crtc_kill_joiner_secondaries(struct intel_atomic_state *state,
+                                       struct intel_crtc *primary_crtc)
 {
        struct drm_i915_private *i915 = to_i915(state->base.dev);
        struct intel_crtc_state *primary_crtc_state =
@@ -6349,53 +6174,6 @@ static int intel_async_flip_check_hw(struct 
intel_atomic_state *state, struct in
        return 0;
 }
 
-static int intel_joiner_add_affected_crtcs(struct intel_atomic_state *state)
-{
-       struct drm_i915_private *i915 = to_i915(state->base.dev);
-       struct intel_crtc_state *crtc_state;
-       struct intel_crtc *crtc;
-       u8 affected_pipes = 0;
-       u8 modeset_pipes = 0;
-       int i;
-
-       for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
-               affected_pipes |= crtc_state->joiner_pipes;
-               if (intel_crtc_needs_modeset(crtc_state))
-                       modeset_pipes |= crtc_state->joiner_pipes;
-       }
-
-       for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, affected_pipes) {
-               crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
-               if (IS_ERR(crtc_state))
-                       return PTR_ERR(crtc_state);
-       }
-
-       for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, modeset_pipes) {
-               int ret;
-
-               crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
-
-               crtc_state->uapi.mode_changed = true;
-
-               ret = drm_atomic_add_affected_connectors(&state->base, 
&crtc->base);
-               if (ret)
-                       return ret;
-
-               ret = intel_atomic_add_affected_planes(state, crtc);
-               if (ret)
-                       return ret;
-       }
-
-       for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
-               /* Kill old joiner link, we may re-establish afterwards */
-               if (intel_crtc_needs_modeset(crtc_state) &&
-                   intel_crtc_is_joiner_primary(crtc_state))
-                       kill_joiner_secondaries(state, crtc);
-       }
-
-       return 0;
-}
-
 static int intel_atomic_check_config(struct intel_atomic_state *state,
                                     struct intel_link_bw_limits *limits,
                                     enum pipe *failed_pipe)
diff --git a/drivers/gpu/drm/i915/display/intel_display.h 
b/drivers/gpu/drm/i915/display/intel_display.h
index b0cf6ca70952..37d658bfd235 100644
--- a/drivers/gpu/drm/i915/display/intel_display.h
+++ b/drivers/gpu/drm/i915/display/intel_display.h
@@ -583,5 +583,10 @@ bool assert_port_valid(struct drm_i915_private *i915, enum 
port port);
 })
 
 bool intel_scanout_needs_vtd_wa(struct drm_i915_private *i915);
+int intel_crtc_add_joiner_planes(struct intel_atomic_state *state,
+                                struct intel_crtc *crtc,
+                                struct intel_crtc *other);
+void intel_crtc_kill_joiner_secondaries(struct intel_atomic_state *state,
+                                       struct intel_crtc *primary_crtc);
 
 #endif
diff --git a/drivers/gpu/drm/i915/display/intel_joiner.c 
b/drivers/gpu/drm/i915/display/intel_joiner.c
new file mode 100644
index 000000000000..b24dfdbc9840
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_joiner.c
@@ -0,0 +1,233 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#include <drm/drm_rect.h>
+
+#include "i915_drv.h"
+#include "intel_atomic.h"
+#include "intel_display.h"
+#include "intel_display_device.h"
+#include "intel_display_types.h"
+#include "intel_dss.h"
+#include "intel_joiner.h"
+
+enum pipe intel_joiner_get_primary_pipe(const struct intel_crtc_state 
*crtc_state)
+{
+       return ffs(crtc_state->joiner_pipes) - 1;
+}
+
+int intel_joiner_get_num_pipes(const struct intel_crtc_state *crtc_state)
+{
+       return hweight8(crtc_state->joiner_pipes);
+}
+
+void intel_joiner_adjust_timings(const struct intel_crtc_state *crtc_state,
+                                struct drm_display_mode *mode)
+{
+       int num_pipes = intel_joiner_get_num_pipes(crtc_state);
+
+       if (num_pipes < 2)
+               return;
+
+       mode->crtc_clock /= num_pipes;
+       mode->crtc_hdisplay /= num_pipes;
+       mode->crtc_hblank_start /= num_pipes;
+       mode->crtc_hblank_end /= num_pipes;
+       mode->crtc_hsync_start /= num_pipes;
+       mode->crtc_hsync_end /= num_pipes;
+       mode->crtc_htotal /= num_pipes;
+}
+
+void intel_joiner_compute_pipe_src(struct intel_crtc_state *crtc_state)
+{
+       int num_pipes = intel_joiner_get_num_pipes(crtc_state);
+       int width, height;
+
+       if (num_pipes < 2)
+               return;
+
+       width = drm_rect_width(&crtc_state->pipe_src);
+       height = drm_rect_height(&crtc_state->pipe_src);
+
+       drm_rect_init(&crtc_state->pipe_src, 0, 0,
+                     width / num_pipes, height);
+}
+
+void intel_joiner_adjust_pipe_src(struct intel_crtc_state *crtc_state)
+{
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
+       int num_pipes = intel_joiner_get_num_pipes(crtc_state);
+       enum pipe primary_pipe, pipe = crtc->pipe;
+       int width;
+
+       if (num_pipes < 2)
+               return;
+
+       primary_pipe = intel_joiner_get_primary_pipe(crtc_state);
+       width = drm_rect_width(&crtc_state->pipe_src);
+
+       drm_rect_translate_to(&crtc_state->pipe_src,
+                             (pipe - primary_pipe) * width, 0);
+}
+
+u8 intel_joiner_supported_pipes(struct drm_i915_private *i915)
+{
+       u8 pipes;
+
+       if (DISPLAY_VER(i915) >= 12)
+               pipes = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D);
+       else if (DISPLAY_VER(i915) >= 11)
+               pipes = BIT(PIPE_B) | BIT(PIPE_C);
+       else
+               pipes = 0;
+
+       return pipes & DISPLAY_RUNTIME_INFO(i915)->pipe_mask;
+}
+
+void intel_joiner_enabled_pipes(struct drm_i915_private *dev_priv,
+                               u8 *primary_pipes, u8 *secondary_pipes)
+{
+       struct intel_crtc *crtc;
+
+       *primary_pipes = 0;
+       *secondary_pipes = 0;
+
+       for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, crtc,
+                                        
intel_joiner_supported_pipes(dev_priv)) {
+               intel_dss_get_compressed_joiner_pipes(crtc,
+                                                     primary_pipes,
+                                                     secondary_pipes);
+
+               intel_dss_get_uncompressed_joiner_pipes(crtc,
+                                                       primary_pipes,
+                                                       secondary_pipes);
+       }
+
+       /* Joiner pipes should always be consecutive primary and secondary */
+       drm_WARN(&dev_priv->drm, *secondary_pipes != *primary_pipes << 1,
+                "Joiner misconfigured (primary pipes 0x%x, secondary pipes 
0x%x)\n",
+                *primary_pipes, *secondary_pipes);
+}
+
+enum pipe intel_joiner_find_primary_pipe(enum pipe pipe, u8 primary_pipes, u8 
secondary_pipes)
+{
+       if ((secondary_pipes & BIT(pipe)) == 0)
+               return pipe;
+
+       /* ignore everything above our pipe */
+       primary_pipes &= ~GENMASK(7, pipe);
+
+       /* highest remaining bit should be our primary pipe */
+       return fls(primary_pipes) - 1;
+}
+
+u8 intel_joiner_find_secondary_pipes(enum pipe pipe, u8 primary_pipes, u8 
secondary_pipes)
+{
+       enum pipe primary_pipe, next_primary_pipe;
+
+       primary_pipe = intel_joiner_find_primary_pipe(pipe, primary_pipes, 
secondary_pipes);
+
+       if ((primary_pipes & BIT(primary_pipe)) == 0)
+               return 0;
+
+       /* ignore our primary pipe and everything below it */
+       primary_pipes &= ~GENMASK(primary_pipe, 0);
+       /* make sure a high bit is set for the ffs() */
+       primary_pipes |= BIT(7);
+       /* lowest remaining bit should be the next primary pipe */
+       next_primary_pipe = ffs(primary_pipes) - 1;
+
+       return secondary_pipes & GENMASK(next_primary_pipe - 1, primary_pipe);
+}
+
+void intel_joiner_get_config(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);
+       u8 primary_pipes, secondary_pipes;
+       enum pipe pipe = crtc->pipe;
+
+       intel_joiner_enabled_pipes(i915, &primary_pipes, &secondary_pipes);
+
+       if (((primary_pipes | secondary_pipes) & BIT(pipe)) == 0)
+               return;
+
+       crtc_state->joiner_pipes =
+               BIT(intel_joiner_find_primary_pipe(pipe, primary_pipes, 
secondary_pipes)) |
+               intel_joiner_find_secondary_pipes(pipe, primary_pipes, 
secondary_pipes);
+}
+
+int intel_joiner_add_affected_planes(struct intel_atomic_state *state)
+{
+       struct drm_i915_private *i915 = to_i915(state->base.dev);
+       const struct intel_crtc_state *crtc_state;
+       struct intel_crtc *crtc;
+       int i;
+
+       for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
+               struct intel_crtc *other;
+
+               for_each_intel_crtc_in_pipe_mask(&i915->drm, other,
+                                                crtc_state->joiner_pipes) {
+                       int ret;
+
+                       if (crtc == other)
+                               continue;
+
+                       ret = intel_crtc_add_joiner_planes(state, crtc, other);
+                       if (ret)
+                               return ret;
+               }
+       }
+
+       return 0;
+}
+
+int intel_joiner_add_affected_crtcs(struct intel_atomic_state *state)
+{
+       struct drm_i915_private *i915 = to_i915(state->base.dev);
+       struct intel_crtc_state *crtc_state;
+       struct intel_crtc *crtc;
+       u8 affected_pipes = 0;
+       u8 modeset_pipes = 0;
+       int i;
+
+       for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
+               affected_pipes |= crtc_state->joiner_pipes;
+               if (intel_crtc_needs_modeset(crtc_state))
+                       modeset_pipes |= crtc_state->joiner_pipes;
+       }
+
+       for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, affected_pipes) {
+               crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
+               if (IS_ERR(crtc_state))
+                       return PTR_ERR(crtc_state);
+       }
+
+       for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, modeset_pipes) {
+               int ret;
+
+               crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
+
+               crtc_state->uapi.mode_changed = true;
+
+               ret = drm_atomic_add_affected_connectors(&state->base, 
&crtc->base);
+               if (ret)
+                       return ret;
+
+               ret = intel_atomic_add_affected_planes(state, crtc);
+               if (ret)
+                       return ret;
+       }
+
+       for_each_new_intel_crtc_in_state(state, crtc, crtc_state, i) {
+               /* Kill old joiner link, we may re-establish afterwards */
+               if (intel_crtc_needs_modeset(crtc_state) &&
+                   intel_crtc_is_joiner_primary(crtc_state))
+                       intel_crtc_kill_joiner_secondaries(state, crtc);
+       }
+
+       return 0;
+}
diff --git a/drivers/gpu/drm/i915/display/intel_joiner.h 
b/drivers/gpu/drm/i915/display/intel_joiner.h
new file mode 100644
index 000000000000..3417274de4a2
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_joiner.h
@@ -0,0 +1,32 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#ifndef __INTEL_JOINER_H__
+#define __INTEL_JOINER_H__
+
+#include "linux/types.h"
+
+enum pipe;
+struct drm_display_mode;
+struct drm_i915_private;
+struct intel_atomic_state;
+struct intel_crtc_state;
+
+enum pipe intel_joiner_get_primary_pipe(const struct intel_crtc_state 
*crtc_state);
+int intel_joiner_get_num_pipes(const struct intel_crtc_state *crtc_state);
+void intel_joiner_adjust_timings(const struct intel_crtc_state *crtc_state,
+                                struct drm_display_mode *mode);
+void intel_joiner_compute_pipe_src(struct intel_crtc_state *crtc_state);
+void intel_joiner_adjust_pipe_src(struct intel_crtc_state *crtc_state);
+u8 intel_joiner_supported_pipes(struct drm_i915_private *i915);
+void intel_joiner_enabled_pipes(struct drm_i915_private *dev_priv,
+                               u8 *primary_pipes, u8 *secondary_pipes);
+enum pipe intel_joiner_find_primary_pipe(enum pipe pipe, u8 primary_pipes, u8 
secondary_pipes);
+u8 intel_joiner_find_secondary_pipes(enum pipe pipe, u8 primary_pipes, u8 
secondary_pipes);
+void intel_joiner_get_config(struct intel_crtc_state *crtc_state);
+int intel_joiner_add_affected_planes(struct intel_atomic_state *state);
+int intel_joiner_add_affected_crtcs(struct intel_atomic_state *state);
+
+#endif/* __INTEL_JOINER_H__ */
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index 619272783669..fc452dcd1088 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -242,6 +242,7 @@ xe-$(CONFIG_DRM_XE_DISPLAY) += \
        i915-display/intel_hotplug.o \
        i915-display/intel_hotplug_irq.o \
        i915-display/intel_hti.o \
+       i915-display/intel_joiner.o \
        i915-display/intel_link_bw.o \
        i915-display/intel_lspcon.o \
        i915-display/intel_modeset_lock.o \
-- 
2.45.2

Reply via email to