Hi Dave,

The conflict below now exists between the drm-misc-fixes tree and the
drm tree.

On Tue, 18 Jul 2017 11:39:46 +1000 Stephen Rothwell <s...@canb.auug.org.au> 
wrote:
>
> Today's linux-next merge of the drm-misc tree got a conflict in:
> 
>   drivers/gpu/drm/vc4/vc4_crtc.c
> 
> between commit:
> 
>   1ed134e6526b ("drm/vc4: Fix VBLANK handling in crtc->enable() path")
> 
> from the drm-misc-fixes tree and commit:
> 
>   0b20a0f8c3cb ("drm: Add old state pointer to CRTC .enable() helper 
> function")
> 
> from the drm-misc tree.
> 
> I fixed it up (see below) and can carry the fix as necessary. This
> is now fixed as far as linux-next is concerned, but any non trivial
> conflicts should be mentioned to your upstream maintainer when your tree
> is submitted for merging.  You may also want to consider cooperating
> with the maintainer of the conflicting tree to minimise any particularly
> complex conflicts.
> 
> -- 
> Cheers,
> Stephen Rothwell
> 
> diff --cc drivers/gpu/drm/vc4/vc4_crtc.c
> index a12cc7ea99b6,9e0c1500375c..000000000000
> --- a/drivers/gpu/drm/vc4/vc4_crtc.c
> +++ b/drivers/gpu/drm/vc4/vc4_crtc.c
> @@@ -518,37 -519,23 +519,51 @@@ static void vc4_crtc_atomic_disable(str
>       WARN_ON_ONCE((HVS_READ(SCALER_DISPSTATX(chan)) &
>                     (SCALER_DISPSTATX_FULL | SCALER_DISPSTATX_EMPTY)) !=
>                    SCALER_DISPSTATX_EMPTY);
> + 
> +     /*
> +      * Make sure we issue a vblank event after disabling the CRTC if
> +      * someone was waiting it.
> +      */
> +     if (crtc->state->event) {
> +             unsigned long flags;
> + 
> +             spin_lock_irqsave(&dev->event_lock, flags);
> +             drm_crtc_send_vblank_event(crtc, crtc->state->event);
> +             crtc->state->event = NULL;
> +             spin_unlock_irqrestore(&dev->event_lock, flags);
> +     }
>   }
>   
>  +static void vc4_crtc_update_dlist(struct drm_crtc *crtc)
>  +{
>  +    struct drm_device *dev = crtc->dev;
>  +    struct vc4_dev *vc4 = to_vc4_dev(dev);
>  +    struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
>  +    struct vc4_crtc_state *vc4_state = to_vc4_crtc_state(crtc->state);
>  +
>  +    if (crtc->state->event) {
>  +            unsigned long flags;
>  +
>  +            crtc->state->event->pipe = drm_crtc_index(crtc);
>  +
>  +            WARN_ON(drm_crtc_vblank_get(crtc) != 0);
>  +
>  +            spin_lock_irqsave(&dev->event_lock, flags);
>  +            vc4_crtc->event = crtc->state->event;
>  +            crtc->state->event = NULL;
>  +
>  +            HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel),
>  +                      vc4_state->mm.start);
>  +
>  +            spin_unlock_irqrestore(&dev->event_lock, flags);
>  +    } else {
>  +            HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel),
>  +                      vc4_state->mm.start);
>  +    }
>  +}
>  +
> - static void vc4_crtc_enable(struct drm_crtc *crtc)
> + static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
> +                                struct drm_crtc_state *old_state)
>   {
>       struct drm_device *dev = crtc->dev;
>       struct vc4_dev *vc4 = to_vc4_dev(dev);
> @@@ -575,20 -556,22 +590,19 @@@
>       /* Turn on the pixel valve, which will emit the vstart signal. */
>       CRTC_WRITE(PV_V_CONTROL,
>                  CRTC_READ(PV_V_CONTROL) | PV_VCONTROL_VIDEN);
>  -
>  -    /* Enable vblank irq handling after crtc is started. */
>  -    drm_crtc_vblank_on(crtc);
>   }
>   
> - static bool vc4_crtc_mode_fixup(struct drm_crtc *crtc,
> -                             const struct drm_display_mode *mode,
> -                             struct drm_display_mode *adjusted_mode)
> + static enum drm_mode_status vc4_crtc_mode_valid(struct drm_crtc *crtc,
> +                                             const struct drm_display_mode 
> *mode)
>   {
>       /* Do not allow doublescan modes from user space */
> -     if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) {
> +     if (mode->flags & DRM_MODE_FLAG_DBLSCAN) {
>               DRM_DEBUG_KMS("[CRTC:%d] Doublescan mode rejected.\n",
>                             crtc->base.id);
> -             return false;
> +             return MODE_NO_DBLESCAN;
>       }
>   
> -     return true;
> +     return MODE_OK;
>   }
>   
>   static int vc4_crtc_atomic_check(struct drm_crtc *crtc,
> @@@ -650,15 -634,25 +664,15 @@@ static void vc4_crtc_atomic_flush(struc
>   
>       WARN_ON_ONCE(dlist_next - dlist_start != vc4_state->mm.size);
>   
>  -    if (crtc->state->event) {
>  -            unsigned long flags;
>  -
>  -            crtc->state->event->pipe = drm_crtc_index(crtc);
>  -
>  -            WARN_ON(drm_crtc_vblank_get(crtc) != 0);
>  -
>  -            spin_lock_irqsave(&dev->event_lock, flags);
>  -            vc4_crtc->event = crtc->state->event;
>  -            crtc->state->event = NULL;
>  -
>  -            HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel),
>  -                      vc4_state->mm.start);
>  -
>  -            spin_unlock_irqrestore(&dev->event_lock, flags);
>  -    } else {
>  -            HVS_WRITE(SCALER_DISPLISTX(vc4_crtc->channel),
>  -                      vc4_state->mm.start);
>  -    }
>  +    /* Only update DISPLIST if the CRTC was already running and is not
>  +     * being disabled.
> -      * vc4_crtc_enable() takes care of updating the dlist just after
> ++     * vc4_crtc_atomic_enable() takes care of updating the dlist just after
>  +     * re-enabling VBLANK interrupts and before enabling the engine.
>  +     * If the CRTC is being disabled, there's no point in updating this
>  +     * information.
>  +     */
>  +    if (crtc->state->active && old_state->active)
>  +            vc4_crtc_update_dlist(crtc);
>   
>       if (debug_dump_regs) {
>               DRM_INFO("CRTC %d HVS after:\n", drm_crtc_index(crtc));



-- 
Cheers,
Stephen Rothwell

Reply via email to