• Daniel Vetter's avatar
    drm: Global atomic state handling · cc4ceb48
    Daniel Vetter authored
    Some differences compared to Rob's patches again:
    - Dropped the committed and checked booleans. Checking will be
      internally enforced by always calling ->atomic_check before
      ->atomic_commit. And async handling needs to be solved differently
      because the current scheme completely side-steps ww mutex deadlock
      avoidance (and so either reinvents a new deadlock avoidance wheel or
      like the current code just deadlocks).
    
    - State for connectors needed to be added, since now they have a
      full-blown drm_connector_state (so that drivers have something to
      attach their own stuff to).
    
    - Refcounting is gone. I plane to solve async updates differently,
      since the lock-passing scheme doesn't cut it (since it abuses ww
      mutexes). Essentially what we need for async is a simple ownership
      transfer from the caller to the driver. That doesn't need full-blown
      refcounting.
    
    - The acquire ctx is a pointer. Real atomic callers should have that
      on their stack, legacy entry points need to put the right one
      (obtained by drm_modeset_legacy_acuire_ctx) in there.
    
    - I've dropped all hooks except check/commit. All the begin/end
      handling is done by core functions and is the same.
    
    - commit/check are just thin wrappers that ensure that ->check is
      always called.
    
    - To help out with locking in the legacy implementations I've added a
      helper to just grab all locks in the backoff case.
    
    v2: Add notices that check/commit can fail with EDEADLK.
    
    v3:
    - More consistent naming for state_alloc.
    - Add state_clear which is needed for backoff and retry.
    
    v4: Planes/connectors can switch between crtcs, and we need to be
    careful that we grab the state (and locks) for both the old and new
    crtc. Improve the interface functions to ensure this.
    
    v5: Add functions to grab affected connectors for a crtc and to recompute
    the crtc->enable state. This is useful for both helper and atomic ioctl
    code when e.g. removing a connector.
    
    v6: Squash in fixup from Fengguang to use ERR_CAST.
    
    v7: Add debug output.
    
    v8: Make checkpatch happy about kcalloc argument ordering.
    
    v9: Improve kerneldoc in drm_crtc.h
    
    v10:
    - Fix another kcalloc argument misorder I've missed.
    - More polish for kerneldoc.
    
    v11: Clarify the ownership rules for the state object. The new rule is
    that a successful drm_atomic_commit (whether synchronous or asnyc)
    always inherits the state and is responsible for the clean-up. That
    way async and sync ->commit functions are more similar.
    
    v12: A few bugfixes:
    - Assign state->state pointers correctly when grabbing state objects -
      we need to link them up with the global state.
    - Handle a NULL crtc in set_crtc_for_plane to simplify code flow a bit
      for the callers of this function.
    
    v13: Review from Sean:
    - kerneldoc spelling fixes
    - Don't overallocate states->planes.
    - Handle NULL crtc in set_crtc_for_connector.
    
    v14: Sprinkle __must_check over all functions which do wait/wound
    locking to make sure callers don't forget this. Since I have ;-)
    
    v15: Be more explicit in the kerneldoc when functions can return
    -EDEADLK what to do. And that every other -errno is fatal.
    
    v16: Indent with tabs instead of space, spotted by Ander.
    
    v17: Review from Thierry, small kerneldoc and other naming polish.
    
    Cc: Thierry Reding <thierry.reding@gmail.com>
    Cc: Ander Conselvan de Oliveira <conselvan2@gmail.com>
    Cc: Daniel Thompson <daniel.thompson@linaro.org>
    Cc: Fengguang Wu <fengguang.wu@intel.com>
    Cc: Sean Paul <seanpaul@chromium.org>
    Cc: Matt Roper <matthew.d.roper@intel.com>
    Reviewed-by: default avatarSean Paul <seanpaul@chromium.org>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    cc4ceb48
drm_crtc.h 47.4 KB