]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe/display: fix oops in suspend/shutdown without display
authorJani Nikula <jani.nikula@intel.com>
Fri, 15 May 2026 16:09:20 +0000 (19:09 +0300)
committerMatthew Brost <matthew.brost@intel.com>
Wed, 10 Jun 2026 16:33:09 +0000 (09:33 -0700)
The xe driver keeps track of whether to probe display, and whether
display hardware is there, using xe->info.probe_display. It gets set to
false if there's no display after intel_display_device_probe(). However,
the display may also be disabled via fuses, detected at a later time in
intel_display_device_info_runtime_init().

In this case, the xe driver does for_each_intel_crtc() on uninitialized
mode config in xe_display_flush_cleanup_work(), leading to a NULL
pointer dereference, and generally calls display code with display info
cleared.

Check for intel_display_device_present() after
intel_display_device_info_runtime_init(), and reset
xe->info.probe_display as necessary. Also do unset_display_features()
for completeness, although display runtime init has already done
that. This will need to be unified across all cases later.

Move intel_display_device_info_runtime_init() call slightly earlier,
similar to i915, to avoid a bunch of unnecessary setup for no display
cases.

Note #1: The xe driver has no business doing low level display plumbing
like for_each_intel_crtc() to begin with. It all needs to happen in
display code.

Note #2: The actual bug is present already in commit 44e694958b95
("drm/xe/display: Implement display support"), but the oops was likely
introduced later at commit ddf6492e0e50 ("drm/xe/display: Make display
suspend/resume work on discrete").

Fixes: 44e694958b95 ("drm/xe/display: Implement display support")
Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/7904
Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/6150
Cc: stable@vger.kernel.org # v6.8+
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Link: https://patch.msgid.link/20260515160920.1082842-1-jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
(cherry picked from commit 7c3eb9f47533220888a67266448185fd0775d4da)
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
drivers/gpu/drm/xe/display/xe_display.c

index 00dfa68af29aaf5e6781cf102b7de09c6f8b9396..b17fb698d2f8a44a931b8208ec886141ecc5abcc 100644 (file)
@@ -124,6 +124,15 @@ int xe_display_init_early(struct xe_device *xe)
 
        intel_display_driver_early_probe(display);
 
+       intel_display_device_info_runtime_init(display);
+
+       /* Display may have been disabled at runtime init */
+       if (!intel_display_device_present(display)) {
+               xe->info.probe_display = false;
+               unset_display_features(xe);
+               return 0;
+       }
+
        /* Early display init.. */
        intel_opregion_setup(display);
 
@@ -137,8 +146,6 @@ int xe_display_init_early(struct xe_device *xe)
 
        intel_bw_init_hw(display);
 
-       intel_display_device_info_runtime_init(display);
-
        err = intel_display_driver_probe_noirq(display);
        if (err)
                goto err_opregion;