On Arrow Lake, VBT defaults the eDP pipe joiner enable bit to disabled, and commit 650471948e49 ("drm/i915/dp: Avoid joiner for eDP if not enabled in VBT") made the driver honor that default. On the ASUS ROG Strix SCAR 18 (G835LXG), the bit in VBT is left to the platform default instead of enabling it, even though the 3840x2400@240Hz panel requires the joiner to reach its native mode. As a result the mode is pruned and the panel is limited to 120Hz. Since the VBT bit cannot be relied upon globally for ARL (it is needed to block the joiner on at least one other machine), add a machine-specific quirk, to bypass the VBT restriction and allow the joiner on this machine. Fixes: 650471948e49 ("drm/i915/dp: Avoid joiner for eDP if not enabled in VBT") Cc: Suraj Kandpal Cc: Jani Nikula Cc: # v7.1+ Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/work_items/16854 Signed-off-by: Ankit Nautiyal --- drivers/gpu/drm/i915/display/intel_dp.c | 3 ++- drivers/gpu/drm/i915/display/intel_quirks.c | 13 +++++++++++++ drivers/gpu/drm/i915/display/intel_quirks.h | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 00e02e019d25..7b83cc83eede 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -476,7 +476,8 @@ bool intel_dp_has_joiner(struct intel_dp *intel_dp) return false; if (intel_dp_is_edp(intel_dp)) { - bool pipe_joiner_enable = connector->panel.vbt.edp.pipe_joiner_enable; + bool pipe_joiner_enable = connector->panel.vbt.edp.pipe_joiner_enable || + intel_has_quirk(display, QUIRK_ALLOW_EDP_JOINER); if (connector->force_joined_pipes > 1) pipe_joiner_enable = true; diff --git a/drivers/gpu/drm/i915/display/intel_quirks.c b/drivers/gpu/drm/i915/display/intel_quirks.c index 7d7db774d8c7..ba7bce7f2827 100644 --- a/drivers/gpu/drm/i915/display/intel_quirks.c +++ b/drivers/gpu/drm/i915/display/intel_quirks.c @@ -100,6 +100,16 @@ static void quirk_disable_psr2(struct intel_display *display) drm_info(display->drm, "PSR2 support not currently available for this setup, applying disable PSR2 quirk\n"); } +/* + * VBT on some machines defaults the eDP pipe joiner to disabled even though + * the panel requires it to achieve its native mode, so allow it regardless. + */ +static void quirk_allow_edp_joiner(struct intel_display *display) +{ + intel_set_quirk(display, QUIRK_ALLOW_EDP_JOINER); + drm_info(display->drm, "Applying allow eDP joiner quirk\n"); +} + struct intel_quirk { int device; int subsystem_vendor; @@ -262,6 +272,9 @@ static struct intel_quirk intel_quirks[] = { /* Xiaomi Book Pro 14 2026 */ { 0xb081, 0x1d72, 0x2424, quirk_disable_psr2 }, + + /* ASUS ROG Strix SCAR 18 G835LXG */ + { 0x7d67, 0x1043, 0x3b29, quirk_allow_edp_joiner }, }; static const struct intel_dpcd_quirk intel_dpcd_quirks[] = { diff --git a/drivers/gpu/drm/i915/display/intel_quirks.h b/drivers/gpu/drm/i915/display/intel_quirks.h index 970a4fe52faf..84f31809011c 100644 --- a/drivers/gpu/drm/i915/display/intel_quirks.h +++ b/drivers/gpu/drm/i915/display/intel_quirks.h @@ -23,6 +23,7 @@ enum intel_quirk_id { QUIRK_EDP_LIMIT_RATE_HBR2, QUIRK_DISABLE_EDP_PANEL_REPLAY, QUIRK_DISABLE_PSR2, + QUIRK_ALLOW_EDP_JOINER, }; void intel_init_quirks(struct intel_display *display); -- 2.50.1