Dell wyse 3040 cat't poweroff aftet kernel 5.11. It happens because i915_driver_shutdown function. Disabling of this function mitigate this problem. Fixes: 440b354f3 ("drivers/gpu/drm:power off troubles on dell wyse 3040") Signed-off-by: Alexey Lukyanchuk <skif@xxxxxxxxxxx> --- There is trouble with i915_driver_shutdown function. After some diving I found that trouble looks like race condition in drm_atomic_get_connector_state function (drivers/gpu/drm/drm_atomic.c), maybe it linked to iterators. Now I fully exclude i915_driver_shutdown for wyse 3040 device. Can any one comment on this one please ? --- drivers/gpu/drm/i915/display/intel_quirks.c | 25 +++++++++++++++++++++ drivers/gpu/drm/i915/i915_driver.c | 3 +++ drivers/gpu/drm/i915/i915_drv.h | 1 + 3 files changed, 29 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_quirks.c b/drivers/gpu/drm/i915/display/intel_quirks.c index e415cd7c0..a6a549d48 100644 --- a/drivers/gpu/drm/i915/display/intel_quirks.c +++ b/drivers/gpu/drm/i915/display/intel_quirks.c @@ -60,6 +60,12 @@ static void quirk_no_pps_backlight_power_hook(struct drm_i915_private *i915) drm_info(&i915->drm, "Applying no pps backlight power quirk\n"); } +static void quirk_wyse_3040_shutdown_fix(struct drm_i915_private *i915) +{ + i915->quirks |= QUIRK_WYSE_3040_SHUTDOWN_FIX; + drm_info(&i915->drm, "Applying wyse 3040 shutdown fix\n"); +} + struct intel_quirk { int device; int subsystem_vendor; @@ -85,6 +91,12 @@ static int intel_dmi_no_pps_backlight(const struct dmi_system_id *id) return 1; } +static int wyse_3040_shutdown_fix(const struct dmi_system_id *id) +{ + DRM_INFO("This device need help with poweroff %s\n", id->ident); + return 1; +} + static const struct intel_dmi_quirk intel_dmi_quirks[] = { { .dmi_id_list = &(const struct dmi_system_id[]) { @@ -131,6 +143,19 @@ static const struct intel_dmi_quirk intel_dmi_quirks[] = { }, .hook = quirk_no_pps_backlight_power_hook, }, + { + .dmi_id_list = &(const struct dmi_system_id[]) { + { + .callback = wyse_3040_shutdown_fix, + .ident = "Dell Inc. 0G56C0", + .matches = {DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Dell Inc."), + DMI_EXACT_MATCH(DMI_BOARD_NAME, "0G56C0"), + }, + }, + { } + }, + .hook = quirk_wyse_3040_shutdown_fix, + }, }; static struct intel_quirk intel_quirks[] = { diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index deb8a8b76..af60fb79a 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -1079,6 +1079,9 @@ static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) void i915_driver_shutdown(struct drm_i915_private *i915) { + if (!(i915->quirks & QUIRK_WYSE_3040_SHUTDOWN_FIX)) + return; + disable_rpm_wakeref_asserts(&i915->runtime_pm); intel_runtime_pm_disable(&i915->runtime_pm); intel_power_domains_disable(i915); diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 086bbe894..fdd6866e7 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -200,6 +200,7 @@ struct drm_i915_display_funcs { #define QUIRK_INCREASE_T12_DELAY (1<<6) #define QUIRK_INCREASE_DDI_DISABLED_TIME (1<<7) #define QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK (1<<8) +#define QUIRK_WYSE_3040_SHUTDOWN_FIX (1<<9) struct i915_suspend_saved_registers { u32 saveDSPARB; -- 2.25.1