Re: [Nouveau] [PATCH v3 4/4] drm/nouveau: Move PBN and VCPI allocation into nv50_head_atom
On Sat, 2 Feb 2019 at 10:20, Lyude Paul wrote: > > Atomic checks should never modify anything outside of the state that > they're passed in. Unfortunately this appears to be exactly what we're > doing in nv50_msto_atomic_check() where we update mstc->pbn every time > the function is called. This hasn't caused any bugs yet, but it needs to > be fixed in order to ensure that when committing an artificially > duplicated state (like during system resume), that we reuse the PBN of > that state to perform VCPI allocations and don't recalculate a different > value from the drm connector's reported bpc. > > Also, move the VCPI slot allocations while we're at it as well. With > this, removing a topology in suspend while using nouveau no longer > causes the new atomic VCPI helpers to complain. > > Signed-off-by: Lyude Paul > Fixes: eceae1472467 ("drm/dp_mst: Start tracking per-port VCPI allocations") > Cc: Daniel Vetter Reviewed-by: Ben Skeggs > --- > drivers/gpu/drm/nouveau/dispnv50/atom.h | 6 ++ > drivers/gpu/drm/nouveau/dispnv50/disp.c | 28 +++-- > drivers/gpu/drm/nouveau/dispnv50/head.c | 1 + > 3 files changed, 24 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpu/drm/nouveau/dispnv50/atom.h > b/drivers/gpu/drm/nouveau/dispnv50/atom.h > index a194990d2b0d..b5fae5ab3fa8 100644 > --- a/drivers/gpu/drm/nouveau/dispnv50/atom.h > +++ b/drivers/gpu/drm/nouveau/dispnv50/atom.h > @@ -116,6 +116,12 @@ struct nv50_head_atom { > u8 depth:4; > } or; > > + /* Currently only used for MST */ > + struct { > + int pbn; > + u8 tu:6; > + } dp; > + > union nv50_head_atom_mask { > struct { > bool olut:1; > diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c > b/drivers/gpu/drm/nouveau/dispnv50/disp.c > index 60d858c2f2ce..e8bb35f6d015 100644 > --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c > +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c > @@ -659,8 +659,6 @@ struct nv50_mstc { > > struct drm_display_mode *native; > struct edid *edid; > - > - int pbn; > }; > > struct nv50_msto { > @@ -765,17 +763,26 @@ nv50_msto_atomic_check(struct drm_encoder *encoder, > struct drm_connector *connector = conn_state->connector; > struct nv50_mstc *mstc = nv50_mstc(connector); > struct nv50_mstm *mstm = mstc->mstm; > - int bpp = connector->display_info.bpc * 3; > + struct nv50_head_atom *asyh = nv50_head_atom(crtc_state); > int slots; > > - mstc->pbn = drm_dp_calc_pbn_mode(crtc_state->adjusted_mode.clock, > -bpp); > + /* When restoring duplicated states, we need to make sure that the > +* bw remains the same and avoid recalculating it, as the connector's > +* bpc may have changed after the state was duplicated > +*/ > + if (!state->duplicated) > + asyh->dp.pbn = > + drm_dp_calc_pbn_mode(crtc_state->adjusted_mode.clock, > +connector->display_info.bpc * 3); > > if (drm_atomic_crtc_needs_modeset(crtc_state)) { > slots = drm_dp_atomic_find_vcpi_slots(state, >mgr, > - mstc->port, mstc->pbn); > + mstc->port, > + asyh->dp.pbn); > if (slots < 0) > return slots; > + > + asyh->dp.tu = slots; > } > > return nv50_outp_atomic_check_view(encoder, crtc_state, conn_state, > @@ -786,13 +793,13 @@ static void > nv50_msto_enable(struct drm_encoder *encoder) > { > struct nv50_head *head = nv50_head(encoder->crtc); > + struct nv50_head_atom *armh = nv50_head_atom(head->base.base.state); > struct nv50_msto *msto = nv50_msto(encoder); > struct nv50_mstc *mstc = NULL; > struct nv50_mstm *mstm = NULL; > struct drm_connector *connector; > struct drm_connector_list_iter conn_iter; > u8 proto, depth; > - int slots; > bool r; > > drm_connector_list_iter_begin(encoder->dev, _iter); > @@ -808,8 +815,8 @@ nv50_msto_enable(struct drm_encoder *encoder) > if (WARN_ON(!mstc)) > return; > > - slots = drm_dp_find_vcpi_slots(>mgr, mstc->pbn); > - r = drm_dp_mst_allocate_vcpi(>mgr, mstc->port, mstc->pbn, > slots); > + r = drm_dp_mst_allocate_vcpi(>mgr, mstc->port, armh->dp.pbn, > +armh->dp.tu); > WARN_ON(!r); > > if (!mstm->links++) > @@ -827,8 +834,7 @@ nv50_msto_enable(struct drm_encoder *encoder) > default: depth = 0x6; break; > } > > - mstm->outp->update(mstm->outp, head->base.index, > - nv50_head_atom(head->base.base.state),
[Nouveau] [Bug 100567] Nouveau system freeze fifo: SCHED_ERROR 0a [CTXSW_TIMEOUT]
https://bugs.freedesktop.org/show_bug.cgi?id=100567 --- Comment #24 from ken...@gmail.com --- Happened another 3 times. Logs and stack traces: - https://gist.github.com/kenorb/9e6537747630f72bf7cc4a5afcc288a7 - https://gist.github.com/kenorb/0e85a737488ad8c294d70dd83d2bcd13 - https://gist.github.com/kenorb/abb9db39b04b9fd551429c79c6750883 Call Trace: __schedule+0x29e/0x840 schedule+0x2c/0x80 schedule_timeout+0x258/0x360 ? nv50_wndw_atomic_destroy_state+0x1d/0x20 [nouveau] dma_fence_default_wait+0x1fc/0x260 ? dma_fence_release+0xa0/0xa0 dma_fence_wait_timeout+0x3e/0xf0 drm_atomic_helper_wait_for_fences+0x3f/0xc0 [drm_kms_helper] nv50_disp_atomic_commit_tail+0x78/0x860 [nouveau] ? __switch_to_asm+0x40/0x70 ? __switch_to_asm+0x34/0x70 nv50_disp_atomic_commit_work+0x12/0x20 [nouveau] process_one_work+0x20f/0x3c0 worker_thread+0x34/0x400 kthread+0x120/0x140 ? pwq_unbound_release_workfn+0xd0/0xd0 ? kthread_bind+0x40/0x40 ret_from_fork+0x35/0x40 Workqueue: events_unbound nv50_disp_atomic_commit_work [nouveau] Call Trace: __schedule+0x29e/0x840 ? nvkm_ioctl_ntfy_get+0x5c/0x80 [nouveau] schedule+0x2c/0x80 schedule_timeout+0x258/0x360 ? nvif_object_ioctl+0x47/0x50 [nouveau] ? nouveau_bo_rd32+0x2a/0x30 [nouveau] ? nv84_fence_read+0x2c/0x30 [nouveau] ? nouveau_fence_no_signaling+0x2a/0x90 [nouveau] dma_fence_default_wait+0x1fc/0x260 ? dma_fence_release+0xa0/0xa0 dma_fence_wait_timeout+0x3e/0xf0 drm_atomic_helper_wait_for_fences+0x3f/0xc0 [drm_kms_helper] nv50_disp_atomic_commit_tail+0x78/0x860 [nouveau] ? __switch_to_asm+0x40/0x70 ? __switch_to_asm+0x34/0x70 nv50_disp_atomic_commit_work+0x12/0x20 [nouveau] process_one_work+0x20f/0x3c0 worker_thread+0x34/0x400 kthread+0x120/0x140 ? pwq_unbound_release_workfn+0xd0/0xd0 ? kthread_bind+0x40/0x40 ret_from_fork+0x35/0x40 INFO: task kworker/u72:1:35901 blocked for more than 120 seconds. Tainted: GW O 4.18.0-13-generic #14-Ubuntu INFO: task Xorg:5761 blocked for more than 120 seconds. Tainted: G O 4.18.0-13-generic #14-Ubuntu XorgD0 5761 5759 0x0004 Call Trace: __schedule+0x29e/0x840 ? kfree+0x15b/0x180 schedule+0x2c/0x80 schedule_preempt_disabled+0xe/0x10 __ww_mutex_lock.isra.6+0x3c1/0x660 __ww_mutex_lock_slowpath+0x16/0x20 ww_mutex_lock+0x34/0x50 drm_modeset_lock+0x6e/0xb0 [drm] drm_crtc_get_sequence_ioctl+0xbc/0x190 [drm] ? drm_wait_vblank_ioctl+0x610/0x610 [drm] drm_ioctl_kernel+0xa4/0xf0 [drm] drm_ioctl+0x227/0x400 [drm] ? drm_wait_vblank_ioctl+0x610/0x610 [drm] ? ep_modify+0x160/0x160 nouveau_drm_ioctl+0x73/0xc0 [nouveau] do_vfs_ioctl+0xa8/0x620 ? __sys_recvmsg+0x88/0xa0 ksys_ioctl+0x67/0x90 __x64_sys_ioctl+0x1a/0x20 do_syscall_64+0x5a/0x110 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f8bb9f703c7 Code: Bad RIP value. RSP: 002b:7ffd077cc868 EFLAGS: 0246 ORIG_RAX: 0010 RAX: ffda RBX: 7ffd077cc900 RCX: 7f8bb9f703c7 RDX: 7ffd077cc8a0 RSI: c018643b RDI: 000e RBP: 7ffd077cc8a0 R08: R09: 55aba56d3850 R10: R11: 0246 R12: c018643b R13: 000e R14: 55aba5402c30 R15: 55aba531dcb0 INFO: task kworker/u72:1:8681 blocked for more than 120 seconds. Tainted: G O 4.18.0-13-generic #14-Ubuntu INFO: task kworker/u72:3:14273 blocked for more than 120 seconds. Tainted: G O 4.18.0-13-generic #14-Ubuntu "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. kworker/u72:3 D0 14273 2 0x8000 Workqueue: events_unbound nv50_disp_atomic_commit_work [nouveau] Call Trace: __schedule+0x29e/0x840 schedule+0x2c/0x80 schedule_timeout+0x258/0x360 ? nv50_wndw_atomic_destroy_state+0x1d/0x20 [nouveau] dma_fence_default_wait+0x1fc/0x260 ? dma_fence_release+0xa0/0xa0 dma_fence_wait_timeout+0x3e/0xf0 drm_atomic_helper_wait_for_fences+0x3f/0xc0 [drm_kms_helper] nv50_disp_atomic_commit_tail+0x78/0x860 [nouveau] ? __switch_to_asm+0x40/0x70 ? __switch_to_asm+0x34/0x70 nv50_disp_atomic_commit_work+0x12/0x20 [nouveau] process_one_work+0x20f/0x3c0 worker_thread+0x34/0x400 kthread+0x120/0x140 ? pwq_unbound_release_workfn+0xd0/0xd0 ? kthread_bind+0x40/0x40 ret_from_fork+0x35/0x40 -- You are receiving this mail because: You are the assignee for the bug.___ Nouveau mailing list Nouveau@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/nouveau
[Nouveau] [Bug 100446] Backlight control not working on Pascal / GP106 using nouveau drivers
https://bugs.freedesktop.org/show_bug.cgi?id=100446 Ilia Mirkin changed: What|Removed |Added Resolution|--- |FIXED Status|NEW |RESOLVED -- You are receiving this mail because: You are the assignee for the bug.___ Nouveau mailing list Nouveau@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/nouveau
Re: [Nouveau] [PATCH v3 3/4] drm/atomic: Add drm_atomic_state->duplicated
On Fri, Feb 01, 2019 at 07:20:03PM -0500, Lyude Paul wrote: > Since > > commit 39b50c603878 ("drm/atomic_helper: Stop modesets on unregistered > connectors harder") > > We've been failing atomic checks if they try to enable new displays on > unregistered connectors. This is fine except for the one situation that > breaks atomic assumptions: suspend/resume. If a connector is > unregistered before we attempt to restore the atomic state, something we > end up failing the atomic check that happens when trying to restore the > state during resume. > > Normally this would be OK: we try our best to make sure that the atomic > state pre-suspend can be restored post-suspend, but failures at that > point usually don't cause problems. That is of course, until we > introduced the new atomic MST VCPI helpers: > > [drm:drm_atomic_helper_check_modeset [drm_kms_helper]] [CRTC:65:pipe B] > active changed > [drm:drm_atomic_helper_check_modeset [drm_kms_helper]] Updating routing for > [CONNECTOR:123:DP-5] > [drm:drm_atomic_helper_check_modeset [drm_kms_helper]] Disabling > [CONNECTOR:123:DP-5] > [drm:drm_atomic_get_private_obj_state [drm]] Added new private object > 25844636 state 9fd2899a to 3a13d7b8 > WARNING: CPU: 6 PID: 1070 at drivers/gpu/drm/drm_dp_mst_topology.c:3153 > drm_dp_atomic_release_vcpi_slots+0xb9/0x200 [drm_kms_helper] > Modules linked in: fuse vfat fat snd_hda_codec_hdmi snd_hda_codec_realtek > snd_hda_codec_generic joydev iTCO_wdt i915(O) wmi_bmof intel_rapl btusb btrtl > x86_pkg_temp_thermal btbcm btintel coretemp i2c_algo_bit drm_kms_helper(O) > crc32_pclmul snd_hda_intel syscopyarea sysfillrect snd_hda_codec sysimgblt > snd_hda_core bluetooth fb_sys_fops snd_pcm pcspkr drm(O) psmouse snd_timer > mei_me ecdh_generic i2c_i801 mei i2c_core ucsi_acpi typec_ucsi typec wmi > thinkpad_acpi ledtrig_audio snd soundcore tpm_tis rfkill tpm_tis_core video > tpm acpi_pad pcc_cpufreq uas usb_storage crc32c_intel nvme serio_raw xhci_pci > nvme_core xhci_hcd > CPU: 6 PID: 1070 Comm: gnome-shell Tainted: GW O > 5.0.0-rc2Lyude-Test+ #1 > Hardware name: LENOVO 20L8S2N800/20L8S2N800, BIOS N22ET35W (1.12 ) 04/09/2018 > RIP: 0010:drm_dp_atomic_release_vcpi_slots+0xb9/0x200 [drm_kms_helper] > Code: 00 4c 39 6d f0 74 49 48 8d 7b 10 48 89 f9 48 c1 e9 03 42 80 3c 21 00 0f > 85 d2 00 00 00 48 8b 6b 10 48 8d 5d f0 49 39 ee 75 c5 <0f> 0b 48 c7 c7 c0 78 > b3 a0 48 89 c2 4c 89 ee e8 03 6c aa ff b8 ea > RSP: 0018:88841235f268 EFLAGS: 00010246 > RAX: 88841bf12ab0 RBX: 88841bf12aa8 RCX: 1110837e2557 > RDX: dc00 RSI: RDI: ed108246bde0 > RBP: 88841bf12ab8 R08: ed1083db3c93 R09: ed1083db3c92 > R10: ed1083db3c92 R11: 88841ed9e497 R12: 888419555d80 > R13: 8883bc499100 R14: 88841bf12ab8 R15: > FS: 7f16fbd4cd00() GS:88841ed8() knlGS: > CS: 0010 DS: ES: CR0: 80050033 > CR2: 7f1687c9f000 CR3: 0003ba3cc003 CR4: 003606e0 > DR0: DR1: DR2: > DR3: DR6: fffe0ff0 DR7: 0400 > Call Trace: > drm_atomic_helper_check_modeset+0xf21/0x2f50 [drm_kms_helper] > ? drm_atomic_helper_commit_modeset_enables+0xa90/0xa90 [drm_kms_helper] > ? __printk_safe_exit+0x10/0x10 > ? save_stack+0x8c/0xb0 > ? vprintk_func+0x96/0x1bf > ? __printk_safe_exit+0x10/0x10 > intel_atomic_check+0x234/0x4750 [i915] > ? printk+0x9f/0xc5 > ? kmsg_dump_rewind_nolock+0xd9/0xd9 > ? _raw_spin_lock_irqsave+0xa4/0x140 > ? drm_atomic_check_only+0xb1/0x28b0 [drm] > ? drm_dbg+0x186/0x1b0 [drm] > ? drm_dev_dbg+0x200/0x200 [drm] > ? intel_link_compute_m_n+0xb0/0xb0 [i915] > ? drm_mode_put_tile_group+0x20/0x20 [drm] > ? skl_plane_format_mod_supported+0x17f/0x1b0 [i915] > ? drm_plane_check_pixel_format+0x14a/0x310 [drm] > drm_atomic_check_only+0x13c4/0x28b0 [drm] > ? drm_state_info+0x220/0x220 [drm] > ? drm_atomic_helper_disable_plane+0x1d0/0x1d0 [drm_kms_helper] > ? pick_single_encoder_for_connector+0xe0/0xe0 [drm_kms_helper] > ? kasan_unpoison_shadow+0x35/0x40 > drm_atomic_commit+0x3b/0x100 [drm] > drm_atomic_helper_set_config+0xd5/0x100 [drm_kms_helper] > drm_mode_setcrtc+0x636/0x1660 [drm] > ? vprintk_func+0x96/0x1bf > ? drm_dev_dbg+0x200/0x200 [drm] > ? drm_mode_getcrtc+0x790/0x790 [drm] > ? printk+0x9f/0xc5 > ? mutex_unlock+0x1d/0x40 > ? drm_mode_addfb2+0x2e9/0x3a0 [drm] > ? rcu_sync_dtor+0x2e0/0x2e0 > ? drm_dbg+0x186/0x1b0 [drm] > ? set_page_dirty+0x271/0x4d0 > drm_ioctl_kernel+0x203/0x290 [drm] > ? drm_mode_getcrtc+0x790/0x790 [drm] > ? drm_setversion+0x7f0/0x7f0 [drm] > ? __switch_to_asm+0x34/0x70 > ? __switch_to_asm+0x34/0x70 > drm_ioctl+0x445/0x950 [drm] > ? drm_mode_getcrtc+0x790/0x790 [drm] > ? drm_getunique+0x220/0x220 [drm] > ? expand_files.part.10+0x920/0x920 > do_vfs_ioctl+0x1a1/0x13d0 > ? ioctl_preallocate+0x2b0/0x2b0 > ?
Re: [Nouveau] [PATCH v2 3/4] drm/atomic: Add drm_atomic_state->duplicated
On Fri, Feb 01, 2019 at 05:41:58PM -0500, Lyude Paul wrote: > Important! below > > On Fri, 2019-02-01 at 18:57 +0100, Daniel Vetter wrote: > > On Thu, Jan 31, 2019 at 08:14:50PM -0500, Lyude Paul wrote: > > > Since > > > > > > commit 39b50c603878 ("drm/atomic_helper: Stop modesets on unregistered > > > connectors harder") > > > > > > We've been failing atomic checks if they try to enable new displays on > > > unregistered connectors. This is fine except for the one situation that > > > breaks atomic assumptions: suspend/resume. If a connector is > > > unregistered before we attempt to restore the atomic state, something we > > > end up failing the atomic check that happens when trying to restore the > > > state during resume. > > > > > > Normally this would be OK: we try our best to make sure that the atomic > > > state pre-suspend can be restored post-suspend, but failures at that > > > point usually don't cause problems. That is of course, until we > > > introduced the new atomic MST VCPI helpers: > > > > > > [drm:drm_atomic_helper_check_modeset [drm_kms_helper]] [CRTC:65:pipe B] > > > active changed > > > [drm:drm_atomic_helper_check_modeset [drm_kms_helper]] Updating routing > > > for [CONNECTOR:123:DP-5] > > > [drm:drm_atomic_helper_check_modeset [drm_kms_helper]] Disabling > > > [CONNECTOR:123:DP-5] > > > [drm:drm_atomic_get_private_obj_state [drm]] Added new private object > > > 25844636 state 9fd2899a to 3a13d7b8 > > > WARNING: CPU: 6 PID: 1070 at drivers/gpu/drm/drm_dp_mst_topology.c:3153 > > > drm_dp_atomic_release_vcpi_slots+0xb9/0x200 [drm_kms_helper] > > > Modules linked in: fuse vfat fat snd_hda_codec_hdmi snd_hda_codec_realtek > > > snd_hda_codec_generic joydev iTCO_wdt i915(O) wmi_bmof intel_rapl btusb > > > btrtl x86_pkg_temp_thermal btbcm btintel coretemp i2c_algo_bit > > > drm_kms_helper(O) crc32_pclmul snd_hda_intel syscopyarea sysfillrect > > > snd_hda_codec sysimgblt snd_hda_core bluetooth fb_sys_fops snd_pcm pcspkr > > > drm(O) psmouse snd_timer mei_me ecdh_generic i2c_i801 mei i2c_core > > > ucsi_acpi typec_ucsi typec wmi thinkpad_acpi ledtrig_audio snd soundcore > > > tpm_tis rfkill tpm_tis_core video tpm acpi_pad pcc_cpufreq uas usb_storage > > > crc32c_intel nvme serio_raw xhci_pci nvme_core xhci_hcd > > > CPU: 6 PID: 1070 Comm: gnome-shell Tainted: GW O 5.0.0- > > > rc2Lyude-Test+ #1 > > > Hardware name: LENOVO 20L8S2N800/20L8S2N800, BIOS N22ET35W (1.12 ) > > > 04/09/2018 > > > RIP: 0010:drm_dp_atomic_release_vcpi_slots+0xb9/0x200 [drm_kms_helper] > > > Code: 00 4c 39 6d f0 74 49 48 8d 7b 10 48 89 f9 48 c1 e9 03 42 80 3c 21 00 > > > 0f 85 d2 00 00 00 48 8b 6b 10 48 8d 5d f0 49 39 ee 75 c5 <0f> 0b 48 c7 c7 > > > c0 78 b3 a0 48 89 c2 4c 89 ee e8 03 6c aa ff b8 ea > > > RSP: 0018:88841235f268 EFLAGS: 00010246 > > > RAX: 88841bf12ab0 RBX: 88841bf12aa8 RCX: 1110837e2557 > > > RDX: dc00 RSI: RDI: ed108246bde0 > > > RBP: 88841bf12ab8 R08: ed1083db3c93 R09: ed1083db3c92 > > > R10: ed1083db3c92 R11: 88841ed9e497 R12: 888419555d80 > > > R13: 8883bc499100 R14: 88841bf12ab8 R15: > > > FS: 7f16fbd4cd00() GS:88841ed8() > > > knlGS: > > > CS: 0010 DS: ES: CR0: 80050033 > > > CR2: 7f1687c9f000 CR3: 0003ba3cc003 CR4: 003606e0 > > > DR0: DR1: DR2: > > > DR3: DR6: fffe0ff0 DR7: 0400 > > > Call Trace: > > > drm_atomic_helper_check_modeset+0xf21/0x2f50 [drm_kms_helper] > > > ? drm_atomic_helper_commit_modeset_enables+0xa90/0xa90 [drm_kms_helper] > > > ? __printk_safe_exit+0x10/0x10 > > > ? save_stack+0x8c/0xb0 > > > ? vprintk_func+0x96/0x1bf > > > ? __printk_safe_exit+0x10/0x10 > > > intel_atomic_check+0x234/0x4750 [i915] > > > ? printk+0x9f/0xc5 > > > ? kmsg_dump_rewind_nolock+0xd9/0xd9 > > > ? _raw_spin_lock_irqsave+0xa4/0x140 > > > ? drm_atomic_check_only+0xb1/0x28b0 [drm] > > > ? drm_dbg+0x186/0x1b0 [drm] > > > ? drm_dev_dbg+0x200/0x200 [drm] > > > ? intel_link_compute_m_n+0xb0/0xb0 [i915] > > > ? drm_mode_put_tile_group+0x20/0x20 [drm] > > > ? skl_plane_format_mod_supported+0x17f/0x1b0 [i915] > > > ? drm_plane_check_pixel_format+0x14a/0x310 [drm] > > > drm_atomic_check_only+0x13c4/0x28b0 [drm] > > > ? drm_state_info+0x220/0x220 [drm] > > > ? drm_atomic_helper_disable_plane+0x1d0/0x1d0 [drm_kms_helper] > > > ? pick_single_encoder_for_connector+0xe0/0xe0 [drm_kms_helper] > > > ? kasan_unpoison_shadow+0x35/0x40 > > > drm_atomic_commit+0x3b/0x100 [drm] > > > drm_atomic_helper_set_config+0xd5/0x100 [drm_kms_helper] > > > drm_mode_setcrtc+0x636/0x1660 [drm] > > > ? vprintk_func+0x96/0x1bf > > > ? drm_dev_dbg+0x200/0x200 [drm] > > > ? drm_mode_getcrtc+0x790/0x790 [drm] > > > ? printk+0x9f/0xc5 > > > ? mutex_unlock+0x1d/0x40 > > > ? drm_mode_addfb2+0x2e9/0x3a0 [drm] > > > ?