lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20250210162950.4102846-1-qs315490@outlook.com>
Date: Mon, 10 Feb 2025 16:30:07 +0000
From: 李 政 <qs315490@...look.com>
To: "airlied@...il.com" <airlied@...il.com>
CC: "dri-devel@...ts.freedesktop.org" <dri-devel@...ts.freedesktop.org>,
	"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
	李 政 <qs315490@...look.com>
Subject: [PATCH] drm/i915/quirks: Add no dpio-common-bc powerwell init quirk
 for xiaomi-latte

This tablet does not have dpio-common-bc powerwell init.

i915 0000:00:02.0: [drm] *ERROR* timeout setting power well state 00000000 (fffff3ff)
i915 0000:00:02.0: [drm] *ERROR* Display PHY 0 is not power up

Signed-off-by: Qs315490 <qs315490@...look.com>
---
 .../drm/i915/display/intel_display_driver.c   |  4 ++--
 .../drm/i915/display/intel_display_power.c    | 21 +++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_quirks.c   |  8 +++++++
 drivers/gpu/drm/i915/display/intel_quirks.h   |  1 +
 4 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index 50ec0c3c7..36338e12f 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -226,6 +226,8 @@ int intel_display_driver_probe_noirq(struct intel_display *display)
 	if (ret)
 		goto cleanup_bios;
 
+	intel_init_quirks(display);
+
 	/* FIXME: completely on the wrong abstraction layer */
 	ret = intel_power_domains_init(display);
 	if (ret < 0)
@@ -267,8 +269,6 @@ int intel_display_driver_probe_noirq(struct intel_display *display)
 	if (ret)
 		goto cleanup_vga_client_pw_domain_dmc;
 
-	intel_init_quirks(display);
-
 	intel_fbc_init(display);
 
 	return 0;
diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c
index d3b8453a1..c589836cb 100644
--- a/drivers/gpu/drm/i915/display/intel_display_power.c
+++ b/drivers/gpu/drm/i915/display/intel_display_power.c
@@ -23,6 +23,7 @@
 #include "intel_pcode.h"
 #include "intel_pmdemand.h"
 #include "intel_pps_regs.h"
+#include "intel_quirks.h"
 #include "intel_snps_phy.h"
 #include "skl_watermark.h"
 #include "skl_watermark_regs.h"
@@ -482,6 +483,12 @@ intel_display_power_grab_async_put_ref(struct intel_display *display,
 	return ret;
 }
 
+static const struct i915_power_well_instance *
+i915_power_well_instance(const struct i915_power_well *power_well)
+{
+    return &power_well->desc->instances->list[power_well->instance_idx];
+}
+
 static void
 __intel_display_power_get_domain(struct intel_display *display,
 				 enum intel_display_power_domain domain)
@@ -493,7 +500,14 @@ __intel_display_power_get_domain(struct intel_display *display,
 		return;
 
 	for_each_power_domain_well(display, power_well, domain)
+	{
+		if (domain == POWER_DOMAIN_INIT &&
+		    intel_has_quirk(display, QUIRK_NO_VLV_DISP_PW_DPIO_CMN_BC_INIT) &&
+		    i915_power_well_instance(power_well)->id == VLV_DISP_PW_DPIO_CMN_BC)
+			continue;
+
 		intel_power_well_get(display, power_well);
+	}
 
 	power_domains->domain_use_count[domain]++;
 }
@@ -589,7 +603,14 @@ __intel_display_power_put_domain(struct intel_display *display,
 	power_domains->domain_use_count[domain]--;
 
 	for_each_power_domain_well_reverse(display, power_well, domain)
+	{
+		if (domain == POWER_DOMAIN_INIT &&
+			intel_has_quirk(display, QUIRK_NO_VLV_DISP_PW_DPIO_CMN_BC_INIT) &&
+			i915_power_well_instance(power_well)->id == VLV_DISP_PW_DPIO_CMN_BC)
+			continue;
+
 		intel_power_well_put(display, power_well);
+	}
 }
 
 static void __intel_display_power_put(struct intel_display *display,
diff --git a/drivers/gpu/drm/i915/display/intel_quirks.c b/drivers/gpu/drm/i915/display/intel_quirks.c
index 8b30e9fd9..af2fa6b67 100644
--- a/drivers/gpu/drm/i915/display/intel_quirks.c
+++ b/drivers/gpu/drm/i915/display/intel_quirks.c
@@ -78,6 +78,12 @@ static void quirk_fw_sync_len(struct intel_dp *intel_dp)
 	drm_info(display->drm, "Applying Fast Wake sync pulse count quirk\n");
 }
 
+static void quirk_no_vlv_disp_pw_dpio_cmn_bc_init(struct intel_display *display)
+{
+	intel_set_quirk(display, QUIRK_NO_VLV_DISP_PW_DPIO_CMN_BC_INIT);
+	drm_info(display->drm, "Applying no dpio-common-bc powerwell init quirk\n");
+}
+
 struct intel_quirk {
 	int device;
 	int subsystem_vendor;
@@ -229,6 +235,8 @@ static struct intel_quirk intel_quirks[] = {
 	{ 0x3184, 0x1019, 0xa94d, quirk_increase_ddi_disabled_time },
 	/* HP Notebook - 14-r206nv */
 	{ 0x0f31, 0x103c, 0x220f, quirk_invert_brightness },
+	/* Xiaomi Pad 2 - xiaomi-latte */
+	{ 0x22b0, 0x1d72, 0x1502, quirk_no_vlv_disp_pw_dpio_cmn_bc_init },
 };
 
 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 cafdebda7..6e7ea8c13 100644
--- a/drivers/gpu/drm/i915/display/intel_quirks.h
+++ b/drivers/gpu/drm/i915/display/intel_quirks.h
@@ -20,6 +20,7 @@ enum intel_quirk_id {
 	QUIRK_LVDS_SSC_DISABLE,
 	QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK,
 	QUIRK_FW_SYNC_LEN,
+	QUIRK_NO_VLV_DISP_PW_DPIO_CMN_BC_INIT,
 };
 
 void intel_init_quirks(struct intel_display *display);
-- 
2.39.5


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ