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
