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. v2: set panel->vbt.edp.pipe_joiner_enable directly in intel_bios.c (Jani) 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_bios.c | 5 +++++ drivers/gpu/drm/i915/display/intel_quirks.c | 13 +++++++++++++ drivers/gpu/drm/i915/display/intel_quirks.h | 1 + 3 files changed, 19 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c index 7b6a6f8c3cf1..b77d1599482a 100644 --- a/drivers/gpu/drm/i915/display/intel_bios.c +++ b/drivers/gpu/drm/i915/display/intel_bios.c @@ -41,6 +41,7 @@ #include "intel_display_types.h" #include "intel_display_utils.h" #include "intel_gmbus.h" +#include "intel_quirks.h" #include "intel_rom.h" #include "intel_vdsc.h" @@ -1575,6 +1576,10 @@ parse_edp(struct intel_display *display, if (display->vbt.version >= 261) panel->vbt.edp.pipe_joiner_enable = panel_bool(edp->pipe_joiner_enable, panel_type); + + /* Some machines need the joiner regardless of what VBT says */ + if (intel_has_quirk(display, QUIRK_ALLOW_EDP_JOINER)) + panel->vbt.edp.pipe_joiner_enable = true; } static void diff --git a/drivers/gpu/drm/i915/display/intel_quirks.c b/drivers/gpu/drm/i915/display/intel_quirks.c index 96eb9a40df9b..613a847184db 100644 --- a/drivers/gpu/drm/i915/display/intel_quirks.c +++ b/drivers/gpu/drm/i915/display/intel_quirks.c @@ -108,6 +108,16 @@ static void quirk_enable_dpcd_backlight(struct intel_dp *intel_dp) drm_info(display->drm, "Applying Enable DPCD Backlight 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; @@ -270,6 +280,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 4996419ae76b..c64d0fc39905 100644 --- a/drivers/gpu/drm/i915/display/intel_quirks.h +++ b/drivers/gpu/drm/i915/display/intel_quirks.h @@ -24,6 +24,7 @@ enum intel_quirk_id { QUIRK_DISABLE_EDP_PANEL_REPLAY, QUIRK_DISABLE_PSR2, QUIRK_ENABLE_DPCD_BACKLIGHT, + QUIRK_ALLOW_EDP_JOINER, }; void intel_init_quirks(struct intel_display *display); -- 2.50.1