Skip to content

Commit 5f105b2

Browse files
vivekkreddyjnikula
authored andcommitted
Revert "drm/xe/display: use xe->display to decide whether to do anything"
This reverts commit 5a9f299. The following crash/regression was seen with the reverted commit on a specific BMG SKU with no display capabilities: [ 115.582833] BUG: kernel NULL pointer dereference, address: 00000000000005d0 [ 115.589775] #PF: supervisor write access in kernel mode [ 115.594976] #PF: error_code(0x0002) - not-present page [ 115.600088] PGD 0 P4D 0 [ 115.602617] Oops: Oops: 0002 [#1] SMP [ 115.606267] CPU: 14 UID: 0 PID: 1547 Comm: kworker/14:3 Tainted: G U E 6.15.0-local+ #62 PREEMPT(voluntary) [ 115.617332] Tainted: [U]=USER, [E]=UNSIGNED_MODULE [ 115.622100] Hardware name: Intel Corporation Meteor Lake Client Platform/MTL-P DDR5 SODIMM SBS RVP, BIOS MTLPEMI1.R00.3471.D49.2401260852 01/26/2024 [ 115.635314] Workqueue: pm pm_runtime_work [ 115.639309] RIP: 0010:_raw_spin_lock+0x17/0x30 [ 115.662382] RSP: 0018:ffffd13f82e7bc30 EFLAGS: 00010246 [ 115.667581] RAX: 0000000000000000 RBX: ffff8be919076000 RCX: 0000000000000002 [ 115.674675] RDX: 0000000000000001 RSI: 000000000000004b RDI: 00000000000005d0 [ 115.681775] RBP: ffffd13f82e7bc60 R08: ffffd13f82e7bb00 R09: ffff8beb0c1b06c0 [ 115.688869] R10: ffff8be7c034f4c0 R11: fefefefefefefeff R12: fffffffffffffff0 [ 115.695965] R13: ffff8be9190762e8 R14: ffff8be919077798 R15: 00000000000005d0 [ 115.703062] FS: 0000000000000000(0000) GS:ffff8beb552b6000(0000) knlGS:0000000000000000 [ 115.711106] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 115.716826] CR2: 00000000000005d0 CR3: 000000024c68d002 CR4: 0000000000f72ef0 [ 115.723921] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 115.731015] DR3: 0000000000000000 DR6: 00000000ffff07f0 DR7: 0000000000000400 [ 115.738113] PKRU: 55555554 [ 115.740816] Call Trace: [ 115.743258] <TASK> [ 115.745363] ? xe_display_flush_cleanup_work+0x92/0x120 [xe] [ 115.751102] xe_display_pm_runtime_suspend+0x42/0x80 [xe] [ 115.756542] xe_pm_runtime_suspend+0x11b/0x1b0 [xe] [ 115.761463] xe_pci_runtime_suspend+0x23/0xd0 [xe] [ 115.766291] pci_pm_runtime_suspend+0x6b/0x1a0 [ 115.770717] ? pci_pm_thaw_noirq+0xa0/0xa0 [ 115.774797] __rpm_callback+0x48/0x1e0 [ 115.778531] ? pci_pm_thaw_noirq+0xa0/0xa0 [ 115.782614] rpm_callback+0x66/0x70 [ 115.786090] ? pci_pm_thaw_noirq+0xa0/0xa0 [ 115.790173] rpm_suspend+0xe1/0x5e0 [ 115.793647] ? psi_task_switch+0xb8/0x200 [ 115.797643] ? finish_task_switch.isra.0+0x8d/0x270 [ 115.802502] pm_runtime_work+0xa6/0xc0 [ 115.806238] process_one_work+0x186/0x350 [ 115.810234] worker_thread+0x33a/0x480 [ 115.813968] ? process_one_work+0x350/0x350 [ 115.818132] kthread+0x10c/0x220 [ 115.821350] ? kthreads_online_cpu+0x120/0x120 [ 115.825774] ret_from_fork+0x3a/0x60 [ 115.829339] ? kthreads_online_cpu+0x120/0x120 [ 115.833768] ret_from_fork_asm+0x11/0x20 [ 115.829339] ? kthreads_online_cpu+0x120/0x120 [ 115.833768] ret_from_fork_asm+0x11/0x20 [ 115.837680] </TASK> [ 115.839907] acpi_tad(E) drm(E) [ 115.931629] CR2: 00000000000005d0 [ 115.934935] ---[ end trace 0000000000000000 ]--- [ 115.939531] RIP: 0010:_raw_spin_lock+0x17/0x30 We cannot yet use xe->display to determine whether display hardware has been successfully probed/initialized or not. This is because xe->display would not be set to NULL even with GPUs with no display capabilities (e.g, GMD_ID_DISPLAY = 0). However, this might change in the future as Xe and i915 code is unified to deal with no display cases. Therefore, for now we have to continue to rely on xe->info.probe_display (which would be set to false with display-less GPUs) to decide whether to invoke any display related functions or not. Cc: Jani Nikula <[email protected]> Cc: Matt Roper <[email protected]> Cc: Lucas De Marchi <[email protected]> Signed-off-by: Vivek Kasireddy <[email protected]> Reviewed-by: Jani Nikula <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jani Nikula <[email protected]>
1 parent 188bdfb commit 5f105b2

File tree

1 file changed

+20
-20
lines changed

1 file changed

+20
-20
lines changed

drivers/gpu/drm/xe/display/xe_display.c

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ static void xe_display_fini_early(void *arg)
9393
struct xe_device *xe = arg;
9494
struct intel_display *display = xe->display;
9595

96-
if (!display)
96+
if (!xe->info.probe_display)
9797
return;
9898

9999
intel_display_driver_remove_nogem(display);
@@ -107,7 +107,7 @@ int xe_display_init_early(struct xe_device *xe)
107107
struct intel_display *display = xe->display;
108108
int err;
109109

110-
if (!display)
110+
if (!xe->info.probe_display)
111111
return 0;
112112

113113
/* Fake uncore lock */
@@ -163,7 +163,7 @@ int xe_display_init(struct xe_device *xe)
163163
struct intel_display *display = xe->display;
164164
int err;
165165

166-
if (!display)
166+
if (!xe->info.probe_display)
167167
return 0;
168168

169169
err = intel_display_driver_probe(display);
@@ -177,7 +177,7 @@ void xe_display_register(struct xe_device *xe)
177177
{
178178
struct intel_display *display = xe->display;
179179

180-
if (!display)
180+
if (!xe->info.probe_display)
181181
return;
182182

183183
intel_display_driver_register(display);
@@ -188,7 +188,7 @@ void xe_display_unregister(struct xe_device *xe)
188188
{
189189
struct intel_display *display = xe->display;
190190

191-
if (!display)
191+
if (!xe->info.probe_display)
192192
return;
193193

194194
intel_power_domains_disable(display);
@@ -201,7 +201,7 @@ void xe_display_irq_handler(struct xe_device *xe, u32 master_ctl)
201201
{
202202
struct intel_display *display = xe->display;
203203

204-
if (!display)
204+
if (!xe->info.probe_display)
205205
return;
206206

207207
if (master_ctl & DISPLAY_IRQ)
@@ -212,7 +212,7 @@ void xe_display_irq_enable(struct xe_device *xe, u32 gu_misc_iir)
212212
{
213213
struct intel_display *display = xe->display;
214214

215-
if (!display)
215+
if (!xe->info.probe_display)
216216
return;
217217

218218
if (gu_misc_iir & GU_MISC_GSE)
@@ -223,7 +223,7 @@ void xe_display_irq_reset(struct xe_device *xe)
223223
{
224224
struct intel_display *display = xe->display;
225225

226-
if (!display)
226+
if (!xe->info.probe_display)
227227
return;
228228

229229
gen11_display_irq_reset(display);
@@ -233,7 +233,7 @@ void xe_display_irq_postinstall(struct xe_device *xe, struct xe_gt *gt)
233233
{
234234
struct intel_display *display = xe->display;
235235

236-
if (!display)
236+
if (!xe->info.probe_display)
237237
return;
238238

239239
if (gt->info.id == XE_GT0)
@@ -274,7 +274,7 @@ static void xe_display_enable_d3cold(struct xe_device *xe)
274274
{
275275
struct intel_display *display = xe->display;
276276

277-
if (!display)
277+
if (!xe->info.probe_display)
278278
return;
279279

280280
/*
@@ -297,7 +297,7 @@ static void xe_display_disable_d3cold(struct xe_device *xe)
297297
{
298298
struct intel_display *display = xe->display;
299299

300-
if (!display)
300+
if (!xe->info.probe_display)
301301
return;
302302

303303
intel_dmc_resume(display);
@@ -322,7 +322,7 @@ void xe_display_pm_suspend(struct xe_device *xe)
322322
struct intel_display *display = xe->display;
323323
bool s2idle = suspend_to_idle();
324324

325-
if (!display)
325+
if (!xe->info.probe_display)
326326
return;
327327

328328
/*
@@ -356,7 +356,7 @@ void xe_display_pm_shutdown(struct xe_device *xe)
356356
{
357357
struct intel_display *display = xe->display;
358358

359-
if (!display)
359+
if (!xe->info.probe_display)
360360
return;
361361

362362
intel_power_domains_disable(display);
@@ -387,7 +387,7 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
387387
{
388388
struct intel_display *display = xe->display;
389389

390-
if (!display)
390+
if (!xe->info.probe_display)
391391
return;
392392

393393
if (xe->d3cold.allowed) {
@@ -403,7 +403,7 @@ void xe_display_pm_suspend_late(struct xe_device *xe)
403403
struct intel_display *display = xe->display;
404404
bool s2idle = suspend_to_idle();
405405

406-
if (!display)
406+
if (!xe->info.probe_display)
407407
return;
408408

409409
intel_display_power_suspend_late(display, s2idle);
@@ -413,7 +413,7 @@ void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
413413
{
414414
struct intel_display *display = xe->display;
415415

416-
if (!display)
416+
if (!xe->info.probe_display)
417417
return;
418418

419419
if (xe->d3cold.allowed)
@@ -431,7 +431,7 @@ void xe_display_pm_shutdown_late(struct xe_device *xe)
431431
{
432432
struct intel_display *display = xe->display;
433433

434-
if (!display)
434+
if (!xe->info.probe_display)
435435
return;
436436

437437
/*
@@ -446,7 +446,7 @@ void xe_display_pm_resume_early(struct xe_device *xe)
446446
{
447447
struct intel_display *display = xe->display;
448448

449-
if (!display)
449+
if (!xe->info.probe_display)
450450
return;
451451

452452
intel_display_power_resume_early(display);
@@ -456,7 +456,7 @@ void xe_display_pm_resume(struct xe_device *xe)
456456
{
457457
struct intel_display *display = xe->display;
458458

459-
if (!display)
459+
if (!xe->info.probe_display)
460460
return;
461461

462462
intel_dmc_resume(display);
@@ -491,7 +491,7 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
491491
{
492492
struct intel_display *display = xe->display;
493493

494-
if (!display)
494+
if (!xe->info.probe_display)
495495
return;
496496

497497
if (xe->d3cold.allowed) {

0 commit comments

Comments
 (0)