For Atomic Mode Setting, it is safer to use raw spin lock. Mutex may cause scheduling, which avoids the following warning.
BUG: sleeping function called from invalid context at /kernel/locking/mutex.c:283 in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 131, name: kworker/0:3 preempt_count: 1, expected: 0 RCU nest depth: 0, expected: 0 Hardware name: Freescale i.MX8QM MEK (DT) Workqueue: events drm_mode_rmfb_work_fn Call trace: dump_backtrace+0x98/0xf8 show_stack+0x20/0x38 dump_stack_lvl+0x48/0x60 dump_stack+0x18/0x28 __might_resched+0x120/0x188 __might_sleep+0x50/0x90 mutex_lock+0x2c/0x90 extdst_pixengcfg_sync_trigger+0x28/0x60 dpu_crtc_atomic_flush+0x394/0x610 drm_atomic_helper_commit_planes+0x178/0x2e8 drm_atomic_helper_commit_tail+0x5c/0xb0 commit_tail+0x168/0x1a0 drm_atomic_helper_commit+0x184/0x1a8 drm_atomic_commit+0xb4/0xf8 drm_framebuffer_remove+0x464/0x520 drm_mode_rmfb_work_fn+0x84/0xb0 process_one_work+0x160/0x3a8 worker_thread+0x338/0x458 kthread+0x124/0x130 ret_from_fork+0x10/0x20 Signed-off-by: Xulin Sun <xulin....@windriver.com> --- drivers/gpu/imx/dpu/dpu-extdst.c | 110 +++++++++++++++---------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/drivers/gpu/imx/dpu/dpu-extdst.c b/drivers/gpu/imx/dpu/dpu-extdst.c index 013e03a2537e..c4736632cff6 100644 --- a/drivers/gpu/imx/dpu/dpu-extdst.c +++ b/drivers/gpu/imx/dpu/dpu-extdst.c @@ -61,7 +61,7 @@ static u16 get_yval(u32 pixel_cnt) struct dpu_extdst { void __iomem *pec_base; void __iomem *base; - struct mutex mutex; + raw_spinlock_t lock; int id; bool inuse; struct dpu_soc *dpu; @@ -101,14 +101,14 @@ void extdst_pixengcfg_shden(struct dpu_extdst *ed, bool enable) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_pec_ed_read(ed, PIXENGCFG_STATIC); if (enable) val |= SHDEN; else val &= ~SHDEN; dpu_pec_ed_write(ed, PIXENGCFG_STATIC, val); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_pixengcfg_shden); @@ -116,14 +116,14 @@ void extdst_pixengcfg_powerdown(struct dpu_extdst *ed, bool powerdown) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_pec_ed_read(ed, PIXENGCFG_STATIC); if (powerdown) val |= POWERDOWN; else val &= ~POWERDOWN; dpu_pec_ed_write(ed, PIXENGCFG_STATIC, val); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_pixengcfg_powerdown); @@ -131,14 +131,14 @@ void extdst_pixengcfg_sync_mode(struct dpu_extdst *ed, ed_sync_mode_t mode) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_pec_ed_read(ed, PIXENGCFG_STATIC); if (mode == AUTO) val |= SYNC_MODE; else val &= ~SYNC_MODE; dpu_pec_ed_write(ed, PIXENGCFG_STATIC, val); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_pixengcfg_sync_mode); @@ -146,14 +146,14 @@ void extdst_pixengcfg_reset(struct dpu_extdst *ed, bool reset) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_pec_ed_read(ed, PIXENGCFG_STATIC); if (reset) val |= SW_RESET; else val &= ~SW_RESET; dpu_pec_ed_write(ed, PIXENGCFG_STATIC, val); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_pixengcfg_reset); @@ -161,12 +161,12 @@ void extdst_pixengcfg_div(struct dpu_extdst *ed, u16 div) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_pec_ed_read(ed, PIXENGCFG_STATIC); val &= ~0xFF0000; val |= DIV(div); dpu_pec_ed_write(ed, PIXENGCFG_STATIC, val); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_pixengcfg_div); @@ -174,22 +174,22 @@ void extdst_pixengcfg_syncmode_master(struct dpu_extdst *ed, bool enable) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_pec_ed_read(ed, PIXENGCFG_STATIC); if (enable) val |= BIT(16); else val &= ~BIT(16); dpu_pec_ed_write(ed, PIXENGCFG_STATIC, val); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_pixengcfg_syncmode_master); int extdst_pixengcfg_src_sel(struct dpu_extdst *ed, extdst_src_sel_t src) { - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); dpu_pec_ed_write(ed, PIXENGCFG_DYNAMIC, src); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); return 0; } @@ -199,11 +199,11 @@ void extdst_pixengcfg_sel_shdldreq(struct dpu_extdst *ed) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_pec_ed_read(ed, PIXENGCFG_REQUEST); val |= SEL_SHDLDREQ; dpu_pec_ed_write(ed, PIXENGCFG_REQUEST, val); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_pixengcfg_sel_shdldreq); @@ -211,27 +211,27 @@ void extdst_pixengcfg_shdldreq(struct dpu_extdst *ed, u32 req_mask) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_pec_ed_read(ed, PIXENGCFG_REQUEST); val |= req_mask; dpu_pec_ed_write(ed, PIXENGCFG_REQUEST, val); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_pixengcfg_shdldreq); void extdst_pixengcfg_sync_trigger(struct dpu_extdst *ed) { - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); dpu_pec_ed_write(ed, PIXENGCFG_TRIGGER, SYNC_TRIGGER); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_pixengcfg_sync_trigger); void extdst_pixengcfg_trigger_sequence_complete(struct dpu_extdst *ed) { - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); dpu_pec_ed_write(ed, PIXENGCFG_TRIGGER, TRIGGER_SEQUENCE_COMPLETE); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_pixengcfg_trigger_sequence_complete); @@ -239,9 +239,9 @@ bool extdst_pixengcfg_is_sync_busy(struct dpu_extdst *ed) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_pec_ed_read(ed, PIXENGCFG_STATUS); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); return val & SYNC_BUSY; } @@ -251,9 +251,9 @@ ed_pipeline_status_t extdst_pixengcfg_pipeline_status(struct dpu_extdst *ed) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_pec_ed_read(ed, PIXENGCFG_STATUS); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); return val & 0x3; } @@ -263,14 +263,14 @@ void extdst_shden(struct dpu_extdst *ed, bool enable) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_ed_read(ed, STATICCONTROL); if (enable) val |= SHDEN; else val &= ~SHDEN; dpu_ed_write(ed, STATICCONTROL, val); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_shden); @@ -278,12 +278,12 @@ void extdst_kick_mode(struct dpu_extdst *ed, ed_kick_mode_t mode) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_ed_read(ed, STATICCONTROL); val &= ~KICK_MODE; val |= mode; dpu_ed_write(ed, STATICCONTROL, val); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_kick_mode); @@ -291,14 +291,14 @@ void extdst_perfcountmode(struct dpu_extdst *ed, bool enable) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_ed_read(ed, STATICCONTROL); if (enable) val |= PERFCOUNTMODE; else val &= ~PERFCOUNTMODE; dpu_ed_write(ed, STATICCONTROL, val); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_perfcountmode); @@ -306,30 +306,30 @@ void extdst_gamma_apply_enable(struct dpu_extdst *ed, bool enable) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_ed_read(ed, CONTROL); if (enable) val |= GAMMAAPPLYENABLE; else val &= ~GAMMAAPPLYENABLE; dpu_ed_write(ed, CONTROL, val); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_gamma_apply_enable); void extdst_kick(struct dpu_extdst *ed) { - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); dpu_ed_write(ed, SOFTWAREKICK, KICK); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_kick); void extdst_cnt_err_clear(struct dpu_extdst *ed) { - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); dpu_ed_write(ed, STATUS, CNT_ERR_STS); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(extdst_cnt_err_clear); @@ -337,9 +337,9 @@ bool extdst_cnt_err_status(struct dpu_extdst *ed) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_ed_read(ed, STATUS); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); return val & CNT_ERR_STS; } @@ -349,9 +349,9 @@ u32 extdst_last_control_word(struct dpu_extdst *ed) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_ed_read(ed, CONTROLWORD); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); return val; } @@ -361,9 +361,9 @@ void extdst_pixel_cnt(struct dpu_extdst *ed, u16 *x, u16 *y) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_ed_read(ed, CURPIXELCNT); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); *x = get_xval(val); *y = get_yval(val); @@ -374,9 +374,9 @@ void extdst_last_pixel_cnt(struct dpu_extdst *ed, u16 *x, u16 *y) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_ed_read(ed, LASTPIXELCNT); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); *x = get_xval(val); *y = get_yval(val); @@ -387,9 +387,9 @@ u32 extdst_perfresult(struct dpu_extdst *ed) { u32 val; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); val = dpu_ed_read(ed, PERFCOUNTER); - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); return val; } @@ -417,16 +417,16 @@ struct dpu_extdst *dpu_ed_get(struct dpu_soc *dpu, int id) ed = dpu->ed_priv[i]; - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); if (ed->inuse) { - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); return ERR_PTR(-EBUSY); } ed->inuse = true; - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); return ed; } @@ -434,11 +434,11 @@ EXPORT_SYMBOL_GPL(dpu_ed_get); void dpu_ed_put(struct dpu_extdst *ed) { - mutex_lock(&ed->mutex); + raw_spin_lock(&ed->lock); ed->inuse = false; - mutex_unlock(&ed->mutex); + raw_spin_unlock(&ed->lock); } EXPORT_SYMBOL_GPL(dpu_ed_put); @@ -509,7 +509,7 @@ int dpu_ed_init(struct dpu_soc *dpu, unsigned int id, ed->dpu = dpu; ed->id = id; - mutex_init(&ed->mutex); + raw_spin_lock_init(&ed->lock); ret = extdst_pixengcfg_src_sel(ed, ED_SRC_DISABLE); if (ret < 0) -- 2.34.1
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#14069): https://lists.yoctoproject.org/g/linux-yocto/message/14069 Mute This Topic: https://lists.yoctoproject.org/mt/106772839/21656 Group Owner: linux-yocto+ow...@lists.yoctoproject.org Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-