Currently pipe-joiner is supported only for DP. To enable higher resolution
for HDMI, joiner support is required for HDMI also.

Create a new file intel_joiner.c to have the common joiner helpers that
can be used by any encoder.

Start with moving intel_dp_joiner_needs_dsc() helper from intel_dp.c
to the new file.

In subsequent changes other joiner helpers will follow.

Signed-off-by: Ankit Nautiyal <[email protected]>
---
 drivers/gpu/drm/i915/Makefile               |  1 +
 drivers/gpu/drm/i915/display/intel_dp.c     | 18 +++--------------
 drivers/gpu/drm/i915/display/intel_dp.h     |  2 --
 drivers/gpu/drm/i915/display/intel_dp_mst.c |  5 +++--
 drivers/gpu/drm/i915/display/intel_joiner.c | 22 +++++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_joiner.h | 16 +++++++++++++++
 drivers/gpu/drm/xe/Makefile                 |  1 +
 7 files changed, 46 insertions(+), 19 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 d6abb79d5696..be5fe25ca314 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -369,6 +369,7 @@ i915-y += \
        display/intel_gmbus.o \
        display/intel_hdmi.o \
        display/intel_hdmi_frl_dfm.o \
+       display/intel_joiner.o \
        display/intel_lspcon.o \
        display/intel_lt_phy.o \
        display/intel_lvds.o \
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index d8c0d9381471..49e4c77b5142 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -86,6 +86,7 @@
 #include "intel_hdmi.h"
 #include "intel_hotplug.h"
 #include "intel_hotplug_irq.h"
+#include "intel_joiner.h"
 #include "intel_lspcon.h"
 #include "intel_lvds.h"
 #include "intel_modeset_lock.h"
@@ -1390,7 +1391,7 @@ intel_dp_mode_valid_format(struct intel_connector 
*connector,
                        }
                }
 
-               if (intel_dp_joiner_needs_dsc(display, num_joined_pipes) && 
!dsc) {
+               if (intel_joiner_needs_dsc(display, num_joined_pipes) && !dsc) {
                        status = MODE_CLOCK_HIGH;
                        continue;
                }
@@ -2794,19 +2795,6 @@ int intel_dp_config_required_rate(const struct 
intel_crtc_state *crtc_state)
                                      link_bpp_x16, 0);
 }
 
-bool intel_dp_joiner_needs_dsc(struct intel_display *display,
-                              int num_joined_pipes)
-{
-       /*
-        * Pipe joiner needs compression up to display 12 due to bandwidth
-        * limitation. DG2 onwards pipe joiner can be enabled without
-        * compression.
-        * Ultrajoiner always needs compression.
-        */
-       return (!HAS_UNCOMPRESSED_JOINER(display) && num_joined_pipes == 2) ||
-               num_joined_pipes == 4;
-}
-
 static int
 intel_dp_compute_link_for_joined_pipes(struct intel_encoder *encoder,
                                       struct intel_crtc_state *pipe_config,
@@ -2826,7 +2814,7 @@ intel_dp_compute_link_for_joined_pipes(struct 
intel_encoder *encoder,
 
        intel_dp_dsc_reset_config(pipe_config);
 
-       joiner_needs_dsc = intel_dp_joiner_needs_dsc(display, num_joined_pipes);
+       joiner_needs_dsc = intel_joiner_needs_dsc(display, num_joined_pipes);
 
        dsc_needed = joiner_needs_dsc || intel_dp->force_dsc_en ||
                     !intel_dp_compute_config_limits(intel_dp, conn_state, 
pipe_config,
diff --git a/drivers/gpu/drm/i915/display/intel_dp.h 
b/drivers/gpu/drm/i915/display/intel_dp.h
index 04fae203bb69..17b6e270b05e 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.h
+++ b/drivers/gpu/drm/i915/display/intel_dp.h
@@ -125,8 +125,6 @@ int intel_dp_effective_data_rate(int pixel_clock, int 
bpp_x16,
                                 int bw_overhead);
 int intel_dp_max_link_data_rate(struct intel_dp *intel_dp,
                                int max_dprx_rate, int max_dprx_lanes);
-bool intel_dp_joiner_needs_dsc(struct intel_display *display,
-                              int num_joined_pipes);
 bool intel_dp_has_joiner(struct intel_dp *intel_dp);
 bool intel_dp_needs_vsc_colorimetry(const struct intel_crtc_state *crtc_state,
                                    const struct drm_connector_state 
*conn_state);
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c 
b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 7023619aaaba..89f107b8271c 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -55,6 +55,7 @@
 #include "intel_dpio_phy.h"
 #include "intel_hdcp.h"
 #include "intel_hotplug.h"
+#include "intel_joiner.h"
 #include "intel_link_bw.h"
 #include "intel_pfit.h"
 #include "intel_psr.h"
@@ -652,7 +653,7 @@ static int mst_stream_compute_link_for_joined_pipes(struct 
intel_encoder *encode
 
        intel_dp_dsc_reset_config(pipe_config);
 
-       joiner_needs_dsc = intel_dp_joiner_needs_dsc(display, num_joined_pipes);
+       joiner_needs_dsc = intel_joiner_needs_dsc(display, num_joined_pipes);
 
        dsc_needed = joiner_needs_dsc || intel_dp->force_dsc_en ||
                !mst_stream_compute_config_limits(intel_dp, conn_state,
@@ -1621,7 +1622,7 @@ mst_connector_mode_valid_ctx(struct drm_connector 
*_connector,
                                                           bw_overhead_flags);
                }
 
-               if (intel_dp_joiner_needs_dsc(display, num_joined_pipes) && 
!dsc) {
+               if (intel_joiner_needs_dsc(display, num_joined_pipes) && !dsc) {
                        *status = MODE_CLOCK_HIGH;
                        continue;
                }
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..b9d7c9bfd1a6
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_joiner.c
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2026 Intel Corporation
+ */
+
+#include "intel_display_core.h"
+#include "intel_display_types.h"
+#include "intel_dp.h"
+#include "intel_joiner.h"
+
+bool intel_joiner_needs_dsc(struct intel_display *display,
+                           int num_joined_pipes)
+{
+       /*
+        * Pipe joiner needs compression up to display 12 due to bandwidth
+        * limitation. DG2 onwards pipe joiner can be enabled without
+        * compression.
+        * Ultrajoiner always needs compression.
+        */
+       return (!HAS_UNCOMPRESSED_JOINER(display) && num_joined_pipes == 2) ||
+               num_joined_pipes == 4;
+}
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..a091eab2f86d
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/intel_joiner.h
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2026 Intel Corporation
+ */
+
+#ifndef __INTEL_JOINER_H__
+#define __INTEL_JOINER_H__
+
+#include <linux/types.h>
+
+struct intel_display;
+
+bool intel_joiner_needs_dsc(struct intel_display *display,
+                           int num_joined_pipes);
+
+#endif /* __INTEL_JOINER_H__ */
diff --git a/drivers/gpu/drm/xe/Makefile b/drivers/gpu/drm/xe/Makefile
index b950ea6bb303..a920db3232e0 100644
--- a/drivers/gpu/drm/xe/Makefile
+++ b/drivers/gpu/drm/xe/Makefile
@@ -313,6 +313,7 @@ xe-$(CONFIG_DRM_XE_DISPLAY) += \
        i915-display/intel_hotplug_irq.o \
        i915-display/intel_hti.o \
        i915-display/intel_initial_plane.o \
+       i915-display/intel_joiner.o \
        i915-display/intel_link_bw.o \
        i915-display/intel_lspcon.o \
        i915-display/intel_lt_phy.o \
-- 
2.50.1

Reply via email to