]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915/psr: Disable Panel Replay on Dell XPS 14 DA14260 as a quirk
authorJouni Högander <jouni.hogander@intel.com>
Tue, 17 Mar 2026 06:24:02 +0000 (08:24 +0200)
committerJouni Högander <jouni.hogander@intel.com>
Wed, 18 Mar 2026 11:35:36 +0000 (13:35 +0200)
Add new quirk (QUIRK_DISABLE_PANEL_REPLAY) for disabling Panel Replay as
quirk for problematic setups. Apply this newly added quirk on Dell XPS 14
DA14260 if specific panel model is installed.

We are observing problems with Dell XPS 14 DA14260. This device has certain
LGD panel model which seems to be problematic. We have seen other LGD panel
model with same OUI is working fine. Due to this we can't apply the quirk
only based on panel OUI. There are also cases where same device model has
differing panel model. We don't want to disable Panel Replay on such
devices. Best we can do is to apply the quirk based on both device model
and panel model.

Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/7521
Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
Reviewed-by: Mika Kahola <mika.kahola@intel.com>
Link: https://patch.msgid.link/20260317062402.1888624-1-jouni.hogander@intel.com
drivers/gpu/drm/i915/display/intel_psr.c
drivers/gpu/drm/i915/display/intel_quirks.c
drivers/gpu/drm/i915/display/intel_quirks.h

index c13116e6f17f270fcc5a88eb442bdcd8d3ce2653..b319e5bd62747de8bf84854c71ca9dadf8b9864b 100644 (file)
@@ -49,6 +49,7 @@
 #include "intel_hdmi.h"
 #include "intel_psr.h"
 #include "intel_psr_regs.h"
+#include "intel_quirks.h"
 #include "intel_snps_phy.h"
 #include "intel_step.h"
 #include "intel_vblank.h"
@@ -609,6 +610,12 @@ static void _panel_replay_init_dpcd(struct intel_dp *intel_dp, struct intel_conn
        if (intel_dp->mst_detect == DRM_DP_MST)
                return;
 
+       if (intel_has_dpcd_quirk(intel_dp, QUIRK_DISABLE_PANEL_REPLAY)) {
+               drm_dbg_kms(display->drm,
+                           "Panel Replay support not currently available for this setup\n");
+               return;
+       }
+
        ret = drm_dp_dpcd_read_data(&intel_dp->aux, DP_PANEL_REPLAY_CAP_SUPPORT,
                                    &connector->dp.panel_replay_caps.dpcd,
                                    sizeof(connector->dp.panel_replay_caps.dpcd));
index 1abbdd426e5873ff35a9f59b92cf2b0d3e3774a3..8f1bf8f418ec76f777cb3fe3b77c8b08ff34ac1b 100644 (file)
@@ -86,6 +86,14 @@ static void quirk_edp_limit_rate_hbr2(struct intel_display *display)
        drm_info(display->drm, "Applying eDP Limit rate to HBR2 quirk\n");
 }
 
+static void quirk_disable_panel_replay(struct intel_dp *intel_dp)
+{
+       struct intel_display *display = to_intel_display(intel_dp);
+
+       intel_set_dpcd_quirk(intel_dp, QUIRK_DISABLE_PANEL_REPLAY);
+       drm_info(display->drm, "Applying disable Panel Replay quirk\n");
+}
+
 struct intel_quirk {
        int device;
        int subsystem_vendor;
@@ -251,7 +259,14 @@ static const struct intel_dpcd_quirk intel_dpcd_quirks[] = {
                .sink_oui = SINK_OUI(0x38, 0xec, 0x11),
                .hook = quirk_fw_sync_len,
        },
-
+       /* Dell XPS 14 DA14260 */
+       {
+               .device = 0xb080,
+               .subsystem_vendor = 0x1028,
+               .subsystem_device = 0x0db9,
+               .sink_oui = SINK_OUI(0x00, 0x22, 0xb9),
+               .hook = quirk_disable_panel_replay,
+       },
 };
 
 void intel_init_quirks(struct intel_display *display)
index 06da0e286c67c44146df4162ed20fd17576e9a74..77e490caed0d863119c54af75375f1ba42f655be 100644 (file)
@@ -21,6 +21,7 @@ enum intel_quirk_id {
        QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK,
        QUIRK_FW_SYNC_LEN,
        QUIRK_EDP_LIMIT_RATE_HBR2,
+       QUIRK_DISABLE_PANEL_REPLAY,
 };
 
 void intel_init_quirks(struct intel_display *display);