Message ID | 20250416-drm_adp_fixes-v1-1-772699f13293@jannau.net (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Apple Display Pipe driver fixes | expand |
Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Le Wed , Apr 16, 2025 at 10:25:27PM +0200, Janne Grunau via B4 Relay a écrit : > From: Janne Grunau <j@jannau.net> > > The lock is used in the interrupt handler so use spin_lock_irqsave to > disable interrupts and avoid deadlocks with the irq handler. > > Fixes: 332122eba628 ("drm: adp: Add Apple Display Pipe driver") > Signed-off-by: Janne Grunau <j@jannau.net> > --- > drivers/gpu/drm/adp/adp_drv.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/adp/adp_drv.c b/drivers/gpu/drm/adp/adp_drv.c > index c98c647f981d5383149647126762a5cdec8f4e4b..157298a8ff42b95275411dd4a7a0c70780fd86fd 100644 > --- a/drivers/gpu/drm/adp/adp_drv.c > +++ b/drivers/gpu/drm/adp/adp_drv.c > @@ -310,6 +310,7 @@ static void adp_crtc_atomic_flush(struct drm_crtc *crtc, > struct drm_atomic_state *state) > { > u32 frame_num = 1; > + unsigned long flags; > struct adp_drv_private *adp = crtc_to_adp(crtc); > struct drm_crtc_state *new_state = drm_atomic_get_new_crtc_state(state, crtc); > u64 new_size = ALIGN(new_state->mode.hdisplay * > @@ -330,13 +331,13 @@ static void adp_crtc_atomic_flush(struct drm_crtc *crtc, > } > writel(ADBE_FIFO_SYNC | frame_num, adp->be + ADBE_FIFO); > //FIXME: use adbe flush interrupt > - spin_lock_irq(&crtc->dev->event_lock); > + spin_lock_irqsave(&crtc->dev->event_lock, flags); > if (crtc->state->event) { > drm_crtc_vblank_get(crtc); > adp->event = crtc->state->event; > } > crtc->state->event = NULL; > - spin_unlock_irq(&crtc->dev->event_lock); > + spin_unlock_irqrestore(&crtc->dev->event_lock, flags); > } > > static const struct drm_crtc_funcs adp_crtc_funcs = { > > -- > 2.49.0 > >
diff --git a/drivers/gpu/drm/adp/adp_drv.c b/drivers/gpu/drm/adp/adp_drv.c index c98c647f981d5383149647126762a5cdec8f4e4b..157298a8ff42b95275411dd4a7a0c70780fd86fd 100644 --- a/drivers/gpu/drm/adp/adp_drv.c +++ b/drivers/gpu/drm/adp/adp_drv.c @@ -310,6 +310,7 @@ static void adp_crtc_atomic_flush(struct drm_crtc *crtc, struct drm_atomic_state *state) { u32 frame_num = 1; + unsigned long flags; struct adp_drv_private *adp = crtc_to_adp(crtc); struct drm_crtc_state *new_state = drm_atomic_get_new_crtc_state(state, crtc); u64 new_size = ALIGN(new_state->mode.hdisplay * @@ -330,13 +331,13 @@ static void adp_crtc_atomic_flush(struct drm_crtc *crtc, } writel(ADBE_FIFO_SYNC | frame_num, adp->be + ADBE_FIFO); //FIXME: use adbe flush interrupt - spin_lock_irq(&crtc->dev->event_lock); + spin_lock_irqsave(&crtc->dev->event_lock, flags); if (crtc->state->event) { drm_crtc_vblank_get(crtc); adp->event = crtc->state->event; } crtc->state->event = NULL; - spin_unlock_irq(&crtc->dev->event_lock); + spin_unlock_irqrestore(&crtc->dev->event_lock, flags); } static const struct drm_crtc_funcs adp_crtc_funcs = {