• Daniel Vetter's avatar
    drm: Add atomic/plane helpers · c2fcd274
    Daniel Vetter authored
    This is the first cut of atomic helper code. As-is it's only useful to
    implement a pure atomic interface for plane updates.
    
    Later patches will integrate this with the crtc helpers so that full
    atomic updates are possible. We also need a pile of helpers to aid
    drivers in transitioning from the legacy world to the shiny new atomic
    age. Finally we need helpers to implement legacy ioctls on top of the
    atomic interface.
    
    The design of the overall helpers<->driver interaction is fairly
    simple, but has an unfortunate large interface:
    
    - We have ->atomic_check callbacks for crtcs and planes. The idea is
      that connectors don't need any checking, and if they do they can
      adjust the relevant crtc driver-private state. So no connector hooks
      should be needed. Also the crtc helpers integration will do the
      ->best_encoder checks, so no need for that.
    
    - Framebuffer pinning needs to be done before we can commit to the hw
      state. This is especially important for async updates where we must
      pin all buffers before returning to userspace, so that really only
      hw failures can happen in the asynchronous worker.
    
      Hence we add ->prepare_fb and ->cleanup_fb hooks for this resources
      management.
    
    - The actual atomic plane commit can't fail (except hw woes), so has
      void return type. It has three stages:
      1. Prepare all affected crtcs with crtc->atomic_begin. Drivers can
         use this to unset the GO bit or similar latches to prevent plane
         updates.
      2. Update plane state by looping over all changed planes and calling
         plane->atomic_update. Presuming the hardware is sane and has GO
         bits drivers can simply bash the state into the hardware in this
         function. Other drivers might use this to precompute hw state for
         the final step.
      3. Finally latch the update for the next vblank with
         crtc->atomic_flush. Note that this function doesn't need to wait
         for the vblank to happen even for the synchronous case.
    
    v2: Clear drm_<obj>_state->state to NULL when swapping in state.
    
    v3: Add TODO that we don't short-circuit plane updates for now. Likely
    no one will care.
    
    v4: Squash in a bit of polish that somehow landed in the wrong (later)
    patche.
    
    v5: Integrate atomic functions into the drm docbook and fixup the
    kerneldoc.
    
    v6: Fixup fixup patch squashing fumble.
    
    v7: Don't touch the legacy plane state plane->fb and plane->crtc. This
    is only used by the legacy ioctl code in the drm core, and that code
    already takes care of updating the pointers in all relevant cases.
    This is in stark contrast to connector->encoder->crtc links on the
    modeset side, which we still need to set since the core doesn't touch
    them.
    
    Also some more kerneldoc polish.
    
    v8: Drop outdated comment.
    
    v9: Handle the state->state pointer correctly: Only clearing the
    ->state pointer when assigning the state to the kms object isn't good
    enough. We also need to re-link the swapped out state into the
    drm_atomic_state structure.
    
    v10: Shuffle the misplaced docbook template hunk around that Sean spotted.
    
    Cc: Sean Paul <seanpaul@chromium.org>
    Reviewed-by: default avatarSean Paul <seanpaul@chromium.org>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    c2fcd274
drm_crtc_helper.h 6.84 KB