merged. Bruce
In message: [linux-yocto][linux-yocto v6.6/standard/nxp-sdk-6.6/nxp-soc & v6.6/standard/preempt-rt/nxp-sdk-6.6/nxp-soc][PATCH] gpu: imx: dpu: extdst: use raw_spin_lock instead of mutex_lock on 20/06/2024 Xulin Sun wrote: > 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 (#14082): https://lists.yoctoproject.org/g/linux-yocto/message/14082 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] -=-=-=-=-=-=-=-=-=-=-=-