* [PATCH] drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059)
@ 2026-01-28 7:48 Mika Kahola
2026-01-28 10:14 ` ✗ i915.CI.BAT: failure for " Patchwork
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Mika Kahola @ 2026-01-28 7:48 UTC (permalink / raw)
To: intel-gfx, intel-xe; +Cc: Mika Kahola
Prevent display corruption observed after restart, hotplug, or unplug
operations on Meteor Lake and newer platforms. The issue is caused by
DSS clock gating affecting DSC logic when pipe power wells are disabled.
Apply WA 22021048059 by disabling DSS clock gating for the affected pipes
before turning off their power wells. This avoids DSC corruption on
external displays.
WA: 22021048059
BSpec: 690991, 666241
Signed-off-by: Mika Kahola <mika.kahola@intel.com>
---
.../i915/display/intel_display_power_well.c | 78 ++++++++++++++++++-
.../gpu/drm/i915/display/intel_display_regs.h | 7 ++
.../gpu/drm/i915/display/intel_display_wa.c | 2 +
.../gpu/drm/i915/display/intel_display_wa.h | 1 +
4 files changed, 86 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_power_well.c b/drivers/gpu/drm/i915/display/intel_display_power_well.c
index 6f9bc6f9615e..1ef450f26879 100644
--- a/drivers/gpu/drm/i915/display/intel_display_power_well.c
+++ b/drivers/gpu/drm/i915/display/intel_display_power_well.c
@@ -14,10 +14,13 @@
#include "intel_crt.h"
#include "intel_de.h"
#include "intel_display_irq.h"
+#include "intel_display_limits.h"
#include "intel_display_power_well.h"
#include "intel_display_regs.h"
#include "intel_display_rpm.h"
#include "intel_display_types.h"
+#include "intel_display_utils.h"
+#include "intel_display_wa.h"
#include "intel_dkl_phy.h"
#include "intel_dkl_phy_regs.h"
#include "intel_dmc.h"
@@ -194,6 +197,69 @@ int intel_power_well_refcount(struct i915_power_well *power_well)
return power_well->count;
}
+static void clock_gating_dss_enable_disable(struct intel_display *display,
+ u8 irq_pipe_mask,
+ bool disable)
+{
+ struct drm_printer p;
+ enum pipe pipe;
+
+ switch (irq_pipe_mask) {
+ case BIT(PIPE_A):
+ pipe = PIPE_A;
+
+ if (disable)
+ intel_de_rmw(display, CLKGATE_DIS_DSSDSC,
+ 0, DSS_PIPE_A_GATING_DISABLED);
+ else
+ intel_de_rmw(display, CLKGATE_DIS_DSSDSC,
+ DSS_PIPE_A_GATING_DISABLED, 0);
+ break;
+ case BIT(PIPE_B):
+ pipe = PIPE_B;
+
+ if (disable)
+ intel_de_rmw(display, CLKGATE_DIS_DSSDSC,
+ 0, DSS_PIPE_B_GATING_DISABLED);
+ else
+ intel_de_rmw(display, CLKGATE_DIS_DSSDSC,
+ DSS_PIPE_B_GATING_DISABLED, 0);
+ break;
+ case BIT(PIPE_C):
+ pipe = PIPE_C;
+
+ if (disable)
+ intel_de_rmw(display, CLKGATE_DIS_DSSDSC,
+ 0, DSS_PIPE_C_GATING_DISABLED);
+ else
+ intel_de_rmw(display, CLKGATE_DIS_DSSDSC,
+ DSS_PIPE_C_GATING_DISABLED, 0);
+ break;
+ case BIT(PIPE_D):
+ pipe = PIPE_D;
+
+ if (disable)
+ intel_de_rmw(display, CLKGATE_DIS_DSSDSC,
+ 0, DSS_PIPE_D_GATING_DISABLED);
+ else
+ intel_de_rmw(display, CLKGATE_DIS_DSSDSC,
+ DSS_PIPE_D_GATING_DISABLED, 0);
+ break;
+ default:
+ MISSING_CASE(irq_pipe_mask);
+ break;
+ }
+
+ if (!drm_debug_enabled(DRM_UT_KMS))
+ return;
+
+ p = drm_dbg_printer(display->drm, DRM_UT_KMS, NULL);
+
+ drm_printf(&p, "dss clock gating %sd on pipe %c (0x%.8x)\n",
+ str_enable_disable(!disable), pipe_name(pipe),
+ intel_de_read(display, CLKGATE_DIS_DSSDSC));
+}
+
/*
* Starting with Haswell, we have a "Power Down Well" that can be turned off
* when not needed anymore. We have 4 registers that can request the power well
@@ -203,15 +269,23 @@ int intel_power_well_refcount(struct i915_power_well *power_well)
static void hsw_power_well_post_enable(struct intel_display *display,
u8 irq_pipe_mask)
{
- if (irq_pipe_mask)
+ if (irq_pipe_mask) {
gen8_irq_power_well_post_enable(display, irq_pipe_mask);
+
+ if (intel_display_wa(display, 22021048059))
+ clock_gating_dss_enable_disable(display, irq_pipe_mask, false);
+ }
}
static void hsw_power_well_pre_disable(struct intel_display *display,
u8 irq_pipe_mask)
{
- if (irq_pipe_mask)
+ if (irq_pipe_mask) {
+ if (intel_display_wa(display, 22021048059))
+ clock_gating_dss_enable_disable(display, irq_pipe_mask, true);
+
gen8_irq_power_well_pre_disable(display, irq_pipe_mask);
+ }
}
#define ICL_AUX_PW_TO_PHY(pw_idx) \
diff --git a/drivers/gpu/drm/i915/display/intel_display_regs.h b/drivers/gpu/drm/i915/display/intel_display_regs.h
index 9e0d853f4b61..9740f32ced24 100644
--- a/drivers/gpu/drm/i915/display/intel_display_regs.h
+++ b/drivers/gpu/drm/i915/display/intel_display_regs.h
@@ -2211,6 +2211,13 @@
#define HSW_PWR_WELL_FORCE_ON (1 << 19)
#define HSW_PWR_WELL_CTL6 _MMIO(0x45414)
+/* clock gating DSS DSC disable register */
+#define CLKGATE_DIS_DSSDSC _MMIO(0x46548)
+#define DSS_PIPE_D_GATING_DISABLED REG_BIT(31)
+#define DSS_PIPE_C_GATING_DISABLED REG_BIT(29)
+#define DSS_PIPE_B_GATING_DISABLED REG_BIT(27)
+#define DSS_PIPE_A_GATING_DISABLED REG_BIT(25)
+
/* SKL Fuse Status */
enum skl_power_gate {
SKL_PG0,
diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.c b/drivers/gpu/drm/i915/display/intel_display_wa.c
index 86a6cc45b6ab..f8e14aa34dae 100644
--- a/drivers/gpu/drm/i915/display/intel_display_wa.c
+++ b/drivers/gpu/drm/i915/display/intel_display_wa.c
@@ -84,6 +84,8 @@ bool __intel_display_wa(struct intel_display *display, enum intel_display_wa wa,
return intel_display_needs_wa_16025573575(display);
case INTEL_DISPLAY_WA_22014263786:
return IS_DISPLAY_VERx100(display, 1100, 1400);
+ case INTEL_DISPLAY_WA_22021048059:
+ return DISPLAY_VER(display) >= 14;
default:
drm_WARN(display->drm, 1, "Missing Wa number: %s\n", name);
break;
diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.h b/drivers/gpu/drm/i915/display/intel_display_wa.h
index 40f989f19df1..767420d5f406 100644
--- a/drivers/gpu/drm/i915/display/intel_display_wa.h
+++ b/drivers/gpu/drm/i915/display/intel_display_wa.h
@@ -34,6 +34,7 @@ enum intel_display_wa {
INTEL_DISPLAY_WA_16023588340,
INTEL_DISPLAY_WA_16025573575,
INTEL_DISPLAY_WA_22014263786,
+ INTEL_DISPLAY_WA_22021048059,
};
bool __intel_display_wa(struct intel_display *display, enum intel_display_wa wa, const char *name);
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* ✗ i915.CI.BAT: failure for drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059) 2026-01-28 7:48 [PATCH] drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059) Mika Kahola @ 2026-01-28 10:14 ` Patchwork 2026-01-28 10:36 ` [PATCH] " Jani Nikula 2026-01-29 3:11 ` Kandpal, Suraj 2 siblings, 0 replies; 6+ messages in thread From: Patchwork @ 2026-01-28 10:14 UTC (permalink / raw) To: Mika Kahola; +Cc: intel-gfx [-- Attachment #1: Type: text/plain, Size: 4518 bytes --] == Series Details == Series: drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059) URL : https://patchwork.freedesktop.org/series/160741/ State : failure == Summary == CI Bug Log - changes from CI_DRM_17899 -> Patchwork_160741v1 ==================================================== Summary ------- **FAILURE** Serious unknown changes coming with Patchwork_160741v1 absolutely need to be verified manually. If you think the reported changes have nothing to do with the changes introduced in Patchwork_160741v1, please notify your bug team (I915-ci-infra@lists.freedesktop.org) to allow them to document this new failure mode, which will reduce false positives in CI. External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_160741v1/index.html Participating hosts (43 -> 40) ------------------------------ Missing (3): bat-dg2-13 fi-glk-j4005 fi-snb-2520m Possible new issues ------------------- Here are the unknown changes that may have been introduced in Patchwork_160741v1: ### IGT changes ### #### Possible regressions #### * igt@i915_selftest@live@client: - bat-mtlp-9: [PASS][1] -> [INCOMPLETE][2] [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17899/bat-mtlp-9/igt@i915_selftest@live@client.html [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_160741v1/bat-mtlp-9/igt@i915_selftest@live@client.html Known issues ------------ Here are the changes found in Patchwork_160741v1 that come from known issues: ### IGT changes ### #### Issues hit #### * igt@core_hotunplug@unbind-rebind: - bat-rpls-4: [PASS][3] -> [DMESG-WARN][4] ([i915#13400]) [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17899/bat-rpls-4/igt@core_hotunplug@unbind-rebind.html [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_160741v1/bat-rpls-4/igt@core_hotunplug@unbind-rebind.html * igt@i915_selftest@live: - bat-mtlp-8: [PASS][5] -> [DMESG-FAIL][6] ([i915#12061]) +1 other test dmesg-fail [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17899/bat-mtlp-8/igt@i915_selftest@live.html [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_160741v1/bat-mtlp-8/igt@i915_selftest@live.html - bat-mtlp-9: [PASS][7] -> [INCOMPLETE][8] ([i915#15176]) [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17899/bat-mtlp-9/igt@i915_selftest@live.html [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_160741v1/bat-mtlp-9/igt@i915_selftest@live.html * igt@i915_selftest@live@reset: - bat-twl-2: [PASS][9] -> [ABORT][10] ([i915#14365]) +1 other test abort [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17899/bat-twl-2/igt@i915_selftest@live@reset.html [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_160741v1/bat-twl-2/igt@i915_selftest@live@reset.html * igt@i915_selftest@live@workarounds: - bat-arls-5: [PASS][11] -> [DMESG-FAIL][12] ([i915#12061]) +1 other test dmesg-fail [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17899/bat-arls-5/igt@i915_selftest@live@workarounds.html [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_160741v1/bat-arls-5/igt@i915_selftest@live@workarounds.html #### Possible fixes #### * igt@kms_hdmi_inject@inject-audio: - fi-tgl-1115g4: [FAIL][13] ([i915#14867]) -> [PASS][14] [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_17899/fi-tgl-1115g4/igt@kms_hdmi_inject@inject-audio.html [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_160741v1/fi-tgl-1115g4/igt@kms_hdmi_inject@inject-audio.html [i915#12061]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12061 [i915#13400]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/13400 [i915#14365]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14365 [i915#14867]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/14867 [i915#15176]: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/15176 Build changes ------------- * Linux: CI_DRM_17899 -> Patchwork_160741v1 CI-20190529: 20190529 CI_DRM_17899: 23ebb43006b887363bd6653fbc4a327fd3072226 @ git://anongit.freedesktop.org/gfx-ci/linux IGT_8721: 3707bb4267de22a18d61b232c4ab5fbaf61db90c @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git Patchwork_160741v1: 23ebb43006b887363bd6653fbc4a327fd3072226 @ git://anongit.freedesktop.org/gfx-ci/linux == Logs == For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_160741v1/index.html [-- Attachment #2: Type: text/html, Size: 5334 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059) 2026-01-28 7:48 [PATCH] drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059) Mika Kahola 2026-01-28 10:14 ` ✗ i915.CI.BAT: failure for " Patchwork @ 2026-01-28 10:36 ` Jani Nikula 2026-01-30 10:02 ` Kahola, Mika 2026-01-29 3:11 ` Kandpal, Suraj 2 siblings, 1 reply; 6+ messages in thread From: Jani Nikula @ 2026-01-28 10:36 UTC (permalink / raw) To: Mika Kahola, intel-gfx, intel-xe; +Cc: Mika Kahola On Wed, 28 Jan 2026, Mika Kahola <mika.kahola@intel.com> wrote: > Prevent display corruption observed after restart, hotplug, or unplug > operations on Meteor Lake and newer platforms. The issue is caused by > DSS clock gating affecting DSC logic when pipe power wells are disabled. > > Apply WA 22021048059 by disabling DSS clock gating for the affected pipes > before turning off their power wells. This avoids DSC corruption on > external displays. > > WA: 22021048059 > BSpec: 690991, 666241 > Superfluous blank line. The git commit trailers belong together. > Signed-off-by: Mika Kahola <mika.kahola@intel.com> > --- > .../i915/display/intel_display_power_well.c | 78 ++++++++++++++++++- > .../gpu/drm/i915/display/intel_display_regs.h | 7 ++ > .../gpu/drm/i915/display/intel_display_wa.c | 2 + > .../gpu/drm/i915/display/intel_display_wa.h | 1 + > 4 files changed, 86 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display_power_well.c b/drivers/gpu/drm/i915/display/intel_display_power_well.c > index 6f9bc6f9615e..1ef450f26879 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_power_well.c > +++ b/drivers/gpu/drm/i915/display/intel_display_power_well.c > @@ -14,10 +14,13 @@ > #include "intel_crt.h" > #include "intel_de.h" > #include "intel_display_irq.h" > +#include "intel_display_limits.h" > #include "intel_display_power_well.h" > #include "intel_display_regs.h" > #include "intel_display_rpm.h" > #include "intel_display_types.h" > +#include "intel_display_utils.h" > +#include "intel_display_wa.h" > #include "intel_dkl_phy.h" > #include "intel_dkl_phy_regs.h" > #include "intel_dmc.h" > @@ -194,6 +197,69 @@ int intel_power_well_refcount(struct i915_power_well *power_well) > return power_well->count; > } > > +static void clock_gating_dss_enable_disable(struct intel_display *display, > + u8 irq_pipe_mask, > + bool disable) > +{ > + struct drm_printer p; > + enum pipe pipe; > + > + switch (irq_pipe_mask) { > + case BIT(PIPE_A): > + pipe = PIPE_A; > + > + if (disable) > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + 0, DSS_PIPE_A_GATING_DISABLED); > + else > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + DSS_PIPE_A_GATING_DISABLED, 0); > + break; > + case BIT(PIPE_B): > + pipe = PIPE_B; > + > + if (disable) > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + 0, DSS_PIPE_B_GATING_DISABLED); > + else > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + DSS_PIPE_B_GATING_DISABLED, 0); > + break; > + case BIT(PIPE_C): > + pipe = PIPE_C; > + > + if (disable) > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + 0, DSS_PIPE_C_GATING_DISABLED); > + else > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + DSS_PIPE_C_GATING_DISABLED, 0); > + break; > + case BIT(PIPE_D): > + pipe = PIPE_D; > + > + if (disable) > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + 0, DSS_PIPE_D_GATING_DISABLED); > + else > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + DSS_PIPE_D_GATING_DISABLED, 0); > + break; > + default: > + MISSING_CASE(irq_pipe_mask); > + break; > + } irq_pipe_mask implies it can have multiple pipes set. That will lead to a warning here. Does this need to use for_each_pipe_masked() instead? The whole thing is awfully verbose as well. Perhaps figure out the bits to set/unset based on the pipes, and have just one intel_de_rmw() statement? > + > + if (!drm_debug_enabled(DRM_UT_KMS)) > + return; This is redundant. > + > + p = drm_dbg_printer(display->drm, DRM_UT_KMS, NULL); > + > + drm_printf(&p, "dss clock gating %sd on pipe %c (0x%.8x)\n", > + str_enable_disable(!disable), pipe_name(pipe), > + intel_de_read(display, CLKGATE_DIS_DSSDSC)); Using a printer is overkill for one line. This should just be a drm_dbg_kms(). And this also assumes just one pipe. BR, Jani. > +} > + > /* > * Starting with Haswell, we have a "Power Down Well" that can be turned off > * when not needed anymore. We have 4 registers that can request the power well > @@ -203,15 +269,23 @@ int intel_power_well_refcount(struct i915_power_well *power_well) > static void hsw_power_well_post_enable(struct intel_display *display, > u8 irq_pipe_mask) > { > - if (irq_pipe_mask) > + if (irq_pipe_mask) { > gen8_irq_power_well_post_enable(display, irq_pipe_mask); > + > + if (intel_display_wa(display, 22021048059)) > + clock_gating_dss_enable_disable(display, irq_pipe_mask, false); > + } > } > > static void hsw_power_well_pre_disable(struct intel_display *display, > u8 irq_pipe_mask) > { > - if (irq_pipe_mask) > + if (irq_pipe_mask) { > + if (intel_display_wa(display, 22021048059)) > + clock_gating_dss_enable_disable(display, irq_pipe_mask, true); > + > gen8_irq_power_well_pre_disable(display, irq_pipe_mask); > + } > } > > #define ICL_AUX_PW_TO_PHY(pw_idx) \ > diff --git a/drivers/gpu/drm/i915/display/intel_display_regs.h b/drivers/gpu/drm/i915/display/intel_display_regs.h > index 9e0d853f4b61..9740f32ced24 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_regs.h > +++ b/drivers/gpu/drm/i915/display/intel_display_regs.h > @@ -2211,6 +2211,13 @@ > #define HSW_PWR_WELL_FORCE_ON (1 << 19) > #define HSW_PWR_WELL_CTL6 _MMIO(0x45414) > > +/* clock gating DSS DSC disable register */ > +#define CLKGATE_DIS_DSSDSC _MMIO(0x46548) > +#define DSS_PIPE_D_GATING_DISABLED REG_BIT(31) > +#define DSS_PIPE_C_GATING_DISABLED REG_BIT(29) > +#define DSS_PIPE_B_GATING_DISABLED REG_BIT(27) > +#define DSS_PIPE_A_GATING_DISABLED REG_BIT(25) > + > /* SKL Fuse Status */ > enum skl_power_gate { > SKL_PG0, > diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.c b/drivers/gpu/drm/i915/display/intel_display_wa.c > index 86a6cc45b6ab..f8e14aa34dae 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_wa.c > +++ b/drivers/gpu/drm/i915/display/intel_display_wa.c > @@ -84,6 +84,8 @@ bool __intel_display_wa(struct intel_display *display, enum intel_display_wa wa, > return intel_display_needs_wa_16025573575(display); > case INTEL_DISPLAY_WA_22014263786: > return IS_DISPLAY_VERx100(display, 1100, 1400); > + case INTEL_DISPLAY_WA_22021048059: > + return DISPLAY_VER(display) >= 14; > default: > drm_WARN(display->drm, 1, "Missing Wa number: %s\n", name); > break; > diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.h b/drivers/gpu/drm/i915/display/intel_display_wa.h > index 40f989f19df1..767420d5f406 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_wa.h > +++ b/drivers/gpu/drm/i915/display/intel_display_wa.h > @@ -34,6 +34,7 @@ enum intel_display_wa { > INTEL_DISPLAY_WA_16023588340, > INTEL_DISPLAY_WA_16025573575, > INTEL_DISPLAY_WA_22014263786, > + INTEL_DISPLAY_WA_22021048059, > }; > > bool __intel_display_wa(struct intel_display *display, enum intel_display_wa wa, const char *name); -- Jani Nikula, Intel ^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [PATCH] drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059) 2026-01-28 10:36 ` [PATCH] " Jani Nikula @ 2026-01-30 10:02 ` Kahola, Mika 0 siblings, 0 replies; 6+ messages in thread From: Kahola, Mika @ 2026-01-30 10:02 UTC (permalink / raw) To: Jani Nikula, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org > -----Original Message----- > From: Jani Nikula <jani.nikula@linux.intel.com> > Sent: Wednesday, 28 January 2026 12.37 > To: Kahola, Mika <mika.kahola@intel.com>; intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org > Cc: Kahola, Mika <mika.kahola@intel.com> > Subject: Re: [PATCH] drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059) > > On Wed, 28 Jan 2026, Mika Kahola <mika.kahola@intel.com> wrote: > > Prevent display corruption observed after restart, hotplug, or unplug > > operations on Meteor Lake and newer platforms. The issue is caused by > > DSS clock gating affecting DSC logic when pipe power wells are disabled. > > > > Apply WA 22021048059 by disabling DSS clock gating for the affected > > pipes before turning off their power wells. This avoids DSC corruption > > on external displays. > > > > WA: 22021048059 > > BSpec: 690991, 666241 > > > > Superfluous blank line. The git commit trailers belong together. Ok, I'll remove this blank line > > > Signed-off-by: Mika Kahola <mika.kahola@intel.com> > > --- > > .../i915/display/intel_display_power_well.c | 78 ++++++++++++++++++- > > .../gpu/drm/i915/display/intel_display_regs.h | 7 ++ > > .../gpu/drm/i915/display/intel_display_wa.c | 2 + > > .../gpu/drm/i915/display/intel_display_wa.h | 1 + > > 4 files changed, 86 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display_power_well.c > > b/drivers/gpu/drm/i915/display/intel_display_power_well.c > > index 6f9bc6f9615e..1ef450f26879 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display_power_well.c > > +++ b/drivers/gpu/drm/i915/display/intel_display_power_well.c > > @@ -14,10 +14,13 @@ > > #include "intel_crt.h" > > #include "intel_de.h" > > #include "intel_display_irq.h" > > +#include "intel_display_limits.h" > > #include "intel_display_power_well.h" > > #include "intel_display_regs.h" > > #include "intel_display_rpm.h" > > #include "intel_display_types.h" > > +#include "intel_display_utils.h" > > +#include "intel_display_wa.h" > > #include "intel_dkl_phy.h" > > #include "intel_dkl_phy_regs.h" > > #include "intel_dmc.h" > > @@ -194,6 +197,69 @@ int intel_power_well_refcount(struct i915_power_well *power_well) > > return power_well->count; > > } > > > > +static void clock_gating_dss_enable_disable(struct intel_display *display, > > + u8 irq_pipe_mask, > > + bool disable) > > +{ > > + struct drm_printer p; > > + enum pipe pipe; > > + > > + switch (irq_pipe_mask) { > > + case BIT(PIPE_A): > > + pipe = PIPE_A; > > + > > + if (disable) > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + 0, DSS_PIPE_A_GATING_DISABLED); > > + else > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + DSS_PIPE_A_GATING_DISABLED, 0); > > + break; > > + case BIT(PIPE_B): > > + pipe = PIPE_B; > > + > > + if (disable) > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + 0, DSS_PIPE_B_GATING_DISABLED); > > + else > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + DSS_PIPE_B_GATING_DISABLED, 0); > > + break; > > + case BIT(PIPE_C): > > + pipe = PIPE_C; > > + > > + if (disable) > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + 0, DSS_PIPE_C_GATING_DISABLED); > > + else > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + DSS_PIPE_C_GATING_DISABLED, 0); > > + break; > > + case BIT(PIPE_D): > > + pipe = PIPE_D; > > + > > + if (disable) > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + 0, DSS_PIPE_D_GATING_DISABLED); > > + else > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + DSS_PIPE_D_GATING_DISABLED, 0); > > + break; > > + default: > > + MISSING_CASE(irq_pipe_mask); > > + break; > > + } > > irq_pipe_mask implies it can have multiple pipes set. That will lead to a warning here. Does this need to use > for_each_pipe_masked() instead? > > The whole thing is awfully verbose as well. Perhaps figure out the bits to set/unset based on the pipes, and have just one > intel_de_rmw() statement? Let me rephrase this. I will try to simplify this such that only one intel_de_rmw() call will be used. > > > + > > + if (!drm_debug_enabled(DRM_UT_KMS)) > > + return; > > This is redundant. > > > + > > + p = drm_dbg_printer(display->drm, DRM_UT_KMS, NULL); > > + > > + drm_printf(&p, "dss clock gating %sd on pipe %c (0x%.8x)\n", > > + str_enable_disable(!disable), pipe_name(pipe), > > + intel_de_read(display, CLKGATE_DIS_DSSDSC)); > > Using a printer is overkill for one line. This should just be a drm_dbg_kms(). I had an impression that drm_printf() would be a preferred way but nice to hear that drm_dbg_kms() is still going strong. I will switch to use that instead of drm_printf(). Thanks for the comments and review! -Mika- > > And this also assumes just one pipe. > > BR, > Jani. > > > > +} > > + > > /* > > * Starting with Haswell, we have a "Power Down Well" that can be turned off > > * when not needed anymore. We have 4 registers that can request the > > power well @@ -203,15 +269,23 @@ int intel_power_well_refcount(struct > > i915_power_well *power_well) static void hsw_power_well_post_enable(struct intel_display *display, > > u8 irq_pipe_mask) > > { > > - if (irq_pipe_mask) > > + if (irq_pipe_mask) { > > gen8_irq_power_well_post_enable(display, irq_pipe_mask); > > + > > + if (intel_display_wa(display, 22021048059)) > > + clock_gating_dss_enable_disable(display, irq_pipe_mask, false); > > + } > > } > > > > static void hsw_power_well_pre_disable(struct intel_display *display, > > u8 irq_pipe_mask) > > { > > - if (irq_pipe_mask) > > + if (irq_pipe_mask) { > > + if (intel_display_wa(display, 22021048059)) > > + clock_gating_dss_enable_disable(display, irq_pipe_mask, true); > > + > > gen8_irq_power_well_pre_disable(display, irq_pipe_mask); > > + } > > } > > > > #define ICL_AUX_PW_TO_PHY(pw_idx) \ > > diff --git a/drivers/gpu/drm/i915/display/intel_display_regs.h > > b/drivers/gpu/drm/i915/display/intel_display_regs.h > > index 9e0d853f4b61..9740f32ced24 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display_regs.h > > +++ b/drivers/gpu/drm/i915/display/intel_display_regs.h > > @@ -2211,6 +2211,13 @@ > > #define HSW_PWR_WELL_FORCE_ON (1 << 19) > > #define HSW_PWR_WELL_CTL6 _MMIO(0x45414) > > > > +/* clock gating DSS DSC disable register */ > > +#define CLKGATE_DIS_DSSDSC _MMIO(0x46548) > > +#define DSS_PIPE_D_GATING_DISABLED REG_BIT(31) > > +#define DSS_PIPE_C_GATING_DISABLED REG_BIT(29) > > +#define DSS_PIPE_B_GATING_DISABLED REG_BIT(27) > > +#define DSS_PIPE_A_GATING_DISABLED REG_BIT(25) > > + > > /* SKL Fuse Status */ > > enum skl_power_gate { > > SKL_PG0, > > diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.c > > b/drivers/gpu/drm/i915/display/intel_display_wa.c > > index 86a6cc45b6ab..f8e14aa34dae 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display_wa.c > > +++ b/drivers/gpu/drm/i915/display/intel_display_wa.c > > @@ -84,6 +84,8 @@ bool __intel_display_wa(struct intel_display *display, enum intel_display_wa wa, > > return intel_display_needs_wa_16025573575(display); > > case INTEL_DISPLAY_WA_22014263786: > > return IS_DISPLAY_VERx100(display, 1100, 1400); > > + case INTEL_DISPLAY_WA_22021048059: > > + return DISPLAY_VER(display) >= 14; > > default: > > drm_WARN(display->drm, 1, "Missing Wa number: %s\n", name); > > break; > > diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.h > > b/drivers/gpu/drm/i915/display/intel_display_wa.h > > index 40f989f19df1..767420d5f406 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display_wa.h > > +++ b/drivers/gpu/drm/i915/display/intel_display_wa.h > > @@ -34,6 +34,7 @@ enum intel_display_wa { > > INTEL_DISPLAY_WA_16023588340, > > INTEL_DISPLAY_WA_16025573575, > > INTEL_DISPLAY_WA_22014263786, > > + INTEL_DISPLAY_WA_22021048059, > > }; > > > > bool __intel_display_wa(struct intel_display *display, enum > > intel_display_wa wa, const char *name); > > -- > Jani Nikula, Intel ^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [PATCH] drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059) 2026-01-28 7:48 [PATCH] drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059) Mika Kahola 2026-01-28 10:14 ` ✗ i915.CI.BAT: failure for " Patchwork 2026-01-28 10:36 ` [PATCH] " Jani Nikula @ 2026-01-29 3:11 ` Kandpal, Suraj 2026-01-30 10:03 ` Kahola, Mika 2 siblings, 1 reply; 6+ messages in thread From: Kandpal, Suraj @ 2026-01-29 3:11 UTC (permalink / raw) To: Kahola, Mika, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org Cc: Kahola, Mika > Subject: [PATCH] drm/i915/power_well: Enable workaround for DSS clock > gating issue (22021048059) You don't need to mention the WA no in the subject since you describe what you are doing in the patch > > Prevent display corruption observed after restart, hotplug, or unplug > operations on Meteor Lake and newer platforms. The issue is caused by DSS > clock gating affecting DSC logic when pipe power wells are disabled. > > Apply WA 22021048059 by disabling DSS clock gating for the affected pipes Also no need to mention it here since you have mentioned the WA no. in the trailer Regards, Suraj Kandpal > before turning off their power wells. This avoids DSC corruption on external > displays. > > WA: 22021048059 > BSpec: 690991, 666241 > > Signed-off-by: Mika Kahola <mika.kahola@intel.com> > --- > .../i915/display/intel_display_power_well.c | 78 ++++++++++++++++++- > .../gpu/drm/i915/display/intel_display_regs.h | 7 ++ > .../gpu/drm/i915/display/intel_display_wa.c | 2 + > .../gpu/drm/i915/display/intel_display_wa.h | 1 + > 4 files changed, 86 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display_power_well.c > b/drivers/gpu/drm/i915/display/intel_display_power_well.c > index 6f9bc6f9615e..1ef450f26879 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_power_well.c > +++ b/drivers/gpu/drm/i915/display/intel_display_power_well.c > @@ -14,10 +14,13 @@ > #include "intel_crt.h" > #include "intel_de.h" > #include "intel_display_irq.h" > +#include "intel_display_limits.h" > #include "intel_display_power_well.h" > #include "intel_display_regs.h" > #include "intel_display_rpm.h" > #include "intel_display_types.h" > +#include "intel_display_utils.h" > +#include "intel_display_wa.h" > #include "intel_dkl_phy.h" > #include "intel_dkl_phy_regs.h" > #include "intel_dmc.h" > @@ -194,6 +197,69 @@ int intel_power_well_refcount(struct > i915_power_well *power_well) > return power_well->count; > } > > +static void clock_gating_dss_enable_disable(struct intel_display *display, > + u8 irq_pipe_mask, > + bool disable) > +{ > + struct drm_printer p; > + enum pipe pipe; > + > + switch (irq_pipe_mask) { > + case BIT(PIPE_A): > + pipe = PIPE_A; > + > + if (disable) > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + 0, DSS_PIPE_A_GATING_DISABLED); > + else > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + DSS_PIPE_A_GATING_DISABLED, 0); > + break; > + case BIT(PIPE_B): > + pipe = PIPE_B; > + > + if (disable) > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + 0, DSS_PIPE_B_GATING_DISABLED); > + else > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + DSS_PIPE_B_GATING_DISABLED, 0); > + break; > + case BIT(PIPE_C): > + pipe = PIPE_C; > + > + if (disable) > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + 0, DSS_PIPE_C_GATING_DISABLED); > + else > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + DSS_PIPE_C_GATING_DISABLED, 0); > + break; > + case BIT(PIPE_D): > + pipe = PIPE_D; > + > + if (disable) > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + 0, DSS_PIPE_D_GATING_DISABLED); > + else > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > + DSS_PIPE_D_GATING_DISABLED, 0); > + break; > + default: > + MISSING_CASE(irq_pipe_mask); > + break; > + } > + > + if (!drm_debug_enabled(DRM_UT_KMS)) > + return; > + > + p = drm_dbg_printer(display->drm, DRM_UT_KMS, NULL); > + > + drm_printf(&p, "dss clock gating %sd on pipe %c (0x%.8x)\n", > + str_enable_disable(!disable), pipe_name(pipe), > + intel_de_read(display, CLKGATE_DIS_DSSDSC)); } > + > /* > * Starting with Haswell, we have a "Power Down Well" that can be turned off > * when not needed anymore. We have 4 registers that can request the > power well @@ -203,15 +269,23 @@ int intel_power_well_refcount(struct > i915_power_well *power_well) static void > hsw_power_well_post_enable(struct intel_display *display, > u8 irq_pipe_mask) > { > - if (irq_pipe_mask) > + if (irq_pipe_mask) { > gen8_irq_power_well_post_enable(display, irq_pipe_mask); > + > + if (intel_display_wa(display, 22021048059)) > + clock_gating_dss_enable_disable(display, > irq_pipe_mask, false); > + } > } > > static void hsw_power_well_pre_disable(struct intel_display *display, > u8 irq_pipe_mask) > { > - if (irq_pipe_mask) > + if (irq_pipe_mask) { > + if (intel_display_wa(display, 22021048059)) > + clock_gating_dss_enable_disable(display, > irq_pipe_mask, true); > + > gen8_irq_power_well_pre_disable(display, irq_pipe_mask); > + } > } > > #define ICL_AUX_PW_TO_PHY(pw_idx) \ > diff --git a/drivers/gpu/drm/i915/display/intel_display_regs.h > b/drivers/gpu/drm/i915/display/intel_display_regs.h > index 9e0d853f4b61..9740f32ced24 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_regs.h > +++ b/drivers/gpu/drm/i915/display/intel_display_regs.h > @@ -2211,6 +2211,13 @@ > #define HSW_PWR_WELL_FORCE_ON (1 << 19) > #define HSW_PWR_WELL_CTL6 _MMIO(0x45414) > > +/* clock gating DSS DSC disable register */ > +#define CLKGATE_DIS_DSSDSC _MMIO(0x46548) > +#define DSS_PIPE_D_GATING_DISABLED REG_BIT(31) > +#define DSS_PIPE_C_GATING_DISABLED REG_BIT(29) > +#define DSS_PIPE_B_GATING_DISABLED REG_BIT(27) > +#define DSS_PIPE_A_GATING_DISABLED REG_BIT(25) > + > /* SKL Fuse Status */ > enum skl_power_gate { > SKL_PG0, > diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.c > b/drivers/gpu/drm/i915/display/intel_display_wa.c > index 86a6cc45b6ab..f8e14aa34dae 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_wa.c > +++ b/drivers/gpu/drm/i915/display/intel_display_wa.c > @@ -84,6 +84,8 @@ bool __intel_display_wa(struct intel_display *display, > enum intel_display_wa wa, > return intel_display_needs_wa_16025573575(display); > case INTEL_DISPLAY_WA_22014263786: > return IS_DISPLAY_VERx100(display, 1100, 1400); > + case INTEL_DISPLAY_WA_22021048059: > + return DISPLAY_VER(display) >= 14; > default: > drm_WARN(display->drm, 1, "Missing Wa number: %s\n", > name); > break; > diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.h > b/drivers/gpu/drm/i915/display/intel_display_wa.h > index 40f989f19df1..767420d5f406 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_wa.h > +++ b/drivers/gpu/drm/i915/display/intel_display_wa.h > @@ -34,6 +34,7 @@ enum intel_display_wa { > INTEL_DISPLAY_WA_16023588340, > INTEL_DISPLAY_WA_16025573575, > INTEL_DISPLAY_WA_22014263786, > + INTEL_DISPLAY_WA_22021048059, > }; > > bool __intel_display_wa(struct intel_display *display, enum intel_display_wa > wa, const char *name); > -- > 2.43.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
* RE: [PATCH] drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059) 2026-01-29 3:11 ` Kandpal, Suraj @ 2026-01-30 10:03 ` Kahola, Mika 0 siblings, 0 replies; 6+ messages in thread From: Kahola, Mika @ 2026-01-30 10:03 UTC (permalink / raw) To: Kandpal, Suraj, intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org > -----Original Message----- > From: Kandpal, Suraj <suraj.kandpal@intel.com> > Sent: Thursday, 29 January 2026 5.11 > To: Kahola, Mika <mika.kahola@intel.com>; intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org > Cc: Kahola, Mika <mika.kahola@intel.com> > Subject: RE: [PATCH] drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059) > > > Subject: [PATCH] drm/i915/power_well: Enable workaround for DSS clock > > gating issue (22021048059) > > You don’t need to mention the WA no in the subject since you describe what you are doing in the patch I will drop all mentions of WA number except the one in trailer. Thanks for the review & comments! -Mika- > > > > > Prevent display corruption observed after restart, hotplug, or unplug > > operations on Meteor Lake and newer platforms. The issue is caused by > > DSS clock gating affecting DSC logic when pipe power wells are disabled. > > > > Apply WA 22021048059 by disabling DSS clock gating for the affected > > pipes > > Also no need to mention it here since you have mentioned the WA no. in the trailer > > Regards, > Suraj Kandpal > > > before turning off their power wells. This avoids DSC corruption on > > external displays. > > > > WA: 22021048059 > > BSpec: 690991, 666241 > > > > Signed-off-by: Mika Kahola <mika.kahola@intel.com> > > --- > > .../i915/display/intel_display_power_well.c | 78 ++++++++++++++++++- > > .../gpu/drm/i915/display/intel_display_regs.h | 7 ++ > > .../gpu/drm/i915/display/intel_display_wa.c | 2 + > > .../gpu/drm/i915/display/intel_display_wa.h | 1 + > > 4 files changed, 86 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display_power_well.c > > b/drivers/gpu/drm/i915/display/intel_display_power_well.c > > index 6f9bc6f9615e..1ef450f26879 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display_power_well.c > > +++ b/drivers/gpu/drm/i915/display/intel_display_power_well.c > > @@ -14,10 +14,13 @@ > > #include "intel_crt.h" > > #include "intel_de.h" > > #include "intel_display_irq.h" > > +#include "intel_display_limits.h" > > #include "intel_display_power_well.h" > > #include "intel_display_regs.h" > > #include "intel_display_rpm.h" > > #include "intel_display_types.h" > > +#include "intel_display_utils.h" > > +#include "intel_display_wa.h" > > #include "intel_dkl_phy.h" > > #include "intel_dkl_phy_regs.h" > > #include "intel_dmc.h" > > @@ -194,6 +197,69 @@ int intel_power_well_refcount(struct > > i915_power_well *power_well) > > return power_well->count; > > } > > > > +static void clock_gating_dss_enable_disable(struct intel_display *display, > > + u8 irq_pipe_mask, > > + bool disable) > > +{ > > + struct drm_printer p; > > + enum pipe pipe; > > + > > + switch (irq_pipe_mask) { > > + case BIT(PIPE_A): > > + pipe = PIPE_A; > > + > > + if (disable) > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + 0, DSS_PIPE_A_GATING_DISABLED); > > + else > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + DSS_PIPE_A_GATING_DISABLED, 0); > > + break; > > + case BIT(PIPE_B): > > + pipe = PIPE_B; > > + > > + if (disable) > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + 0, DSS_PIPE_B_GATING_DISABLED); > > + else > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + DSS_PIPE_B_GATING_DISABLED, 0); > > + break; > > + case BIT(PIPE_C): > > + pipe = PIPE_C; > > + > > + if (disable) > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + 0, DSS_PIPE_C_GATING_DISABLED); > > + else > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + DSS_PIPE_C_GATING_DISABLED, 0); > > + break; > > + case BIT(PIPE_D): > > + pipe = PIPE_D; > > + > > + if (disable) > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + 0, DSS_PIPE_D_GATING_DISABLED); > > + else > > + intel_de_rmw(display, CLKGATE_DIS_DSSDSC, > > + DSS_PIPE_D_GATING_DISABLED, 0); > > + break; > > + default: > > + MISSING_CASE(irq_pipe_mask); > > + break; > > + } > > + > > + if (!drm_debug_enabled(DRM_UT_KMS)) > > + return; > > + > > + p = drm_dbg_printer(display->drm, DRM_UT_KMS, NULL); > > + > > + drm_printf(&p, "dss clock gating %sd on pipe %c (0x%.8x)\n", > > + str_enable_disable(!disable), pipe_name(pipe), > > + intel_de_read(display, CLKGATE_DIS_DSSDSC)); } > > + > > /* > > * Starting with Haswell, we have a "Power Down Well" that can be turned off > > * when not needed anymore. We have 4 registers that can request the > > power well @@ -203,15 +269,23 @@ int intel_power_well_refcount(struct > > i915_power_well *power_well) static void > > hsw_power_well_post_enable(struct intel_display *display, > > u8 irq_pipe_mask) > > { > > - if (irq_pipe_mask) > > + if (irq_pipe_mask) { > > gen8_irq_power_well_post_enable(display, irq_pipe_mask); > > + > > + if (intel_display_wa(display, 22021048059)) > > + clock_gating_dss_enable_disable(display, > > irq_pipe_mask, false); > > + } > > } > > > > static void hsw_power_well_pre_disable(struct intel_display *display, > > u8 irq_pipe_mask) > > { > > - if (irq_pipe_mask) > > + if (irq_pipe_mask) { > > + if (intel_display_wa(display, 22021048059)) > > + clock_gating_dss_enable_disable(display, > > irq_pipe_mask, true); > > + > > gen8_irq_power_well_pre_disable(display, irq_pipe_mask); > > + } > > } > > > > #define ICL_AUX_PW_TO_PHY(pw_idx) \ > > diff --git a/drivers/gpu/drm/i915/display/intel_display_regs.h > > b/drivers/gpu/drm/i915/display/intel_display_regs.h > > index 9e0d853f4b61..9740f32ced24 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display_regs.h > > +++ b/drivers/gpu/drm/i915/display/intel_display_regs.h > > @@ -2211,6 +2211,13 @@ > > #define HSW_PWR_WELL_FORCE_ON (1 << 19) > > #define HSW_PWR_WELL_CTL6 _MMIO(0x45414) > > > > +/* clock gating DSS DSC disable register */ > > +#define CLKGATE_DIS_DSSDSC _MMIO(0x46548) > > +#define DSS_PIPE_D_GATING_DISABLED REG_BIT(31) > > +#define DSS_PIPE_C_GATING_DISABLED REG_BIT(29) > > +#define DSS_PIPE_B_GATING_DISABLED REG_BIT(27) > > +#define DSS_PIPE_A_GATING_DISABLED REG_BIT(25) > > + > > /* SKL Fuse Status */ > > enum skl_power_gate { > > SKL_PG0, > > diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.c > > b/drivers/gpu/drm/i915/display/intel_display_wa.c > > index 86a6cc45b6ab..f8e14aa34dae 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display_wa.c > > +++ b/drivers/gpu/drm/i915/display/intel_display_wa.c > > @@ -84,6 +84,8 @@ bool __intel_display_wa(struct intel_display > > *display, enum intel_display_wa wa, > > return intel_display_needs_wa_16025573575(display); > > case INTEL_DISPLAY_WA_22014263786: > > return IS_DISPLAY_VERx100(display, 1100, 1400); > > + case INTEL_DISPLAY_WA_22021048059: > > + return DISPLAY_VER(display) >= 14; > > default: > > drm_WARN(display->drm, 1, "Missing Wa number: %s\n", name); > > break; > > diff --git a/drivers/gpu/drm/i915/display/intel_display_wa.h > > b/drivers/gpu/drm/i915/display/intel_display_wa.h > > index 40f989f19df1..767420d5f406 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display_wa.h > > +++ b/drivers/gpu/drm/i915/display/intel_display_wa.h > > @@ -34,6 +34,7 @@ enum intel_display_wa { > > INTEL_DISPLAY_WA_16023588340, > > INTEL_DISPLAY_WA_16025573575, > > INTEL_DISPLAY_WA_22014263786, > > + INTEL_DISPLAY_WA_22021048059, > > }; > > > > bool __intel_display_wa(struct intel_display *display, enum > > intel_display_wa wa, const char *name); > > -- > > 2.43.0 ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-01-30 10:03 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-01-28 7:48 [PATCH] drm/i915/power_well: Enable workaround for DSS clock gating issue (22021048059) Mika Kahola 2026-01-28 10:14 ` ✗ i915.CI.BAT: failure for " Patchwork 2026-01-28 10:36 ` [PATCH] " Jani Nikula 2026-01-30 10:02 ` Kahola, Mika 2026-01-29 3:11 ` Kandpal, Suraj 2026-01-30 10:03 ` Kahola, Mika
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox