Commit 45c77d4b authored by Jouni Högander's avatar Jouni Högander
Browse files

drm/i915/psr: Disable Panel Replay on Dell XPS 14 DA14260 as a quirk

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: default avatarJouni Högander <jouni.hogander@intel.com>
Reviewed-by: default avatarMika Kahola <mika.kahola@intel.com>
Link: https://patch.msgid.link/20260317062402.1888624-1-jouni.hogander@intel.com
parent b63c6b9b
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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));
+16 −1
Original line number Diff line number Diff line
@@ -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)
+1 −0
Original line number Diff line number Diff line
@@ -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);