drm: Extract drm_plane.[hc]
Just pure code movement, cleanup and polish will happen in later
patches.
v2: Don't forget all the ioctl! To extract those cleanly I decided to
put check_src_coords into drm_framebuffer.c (and give it a
drm_framebuffer_ prefix), since that just checks framebuffer
constraints.
v3: rebase over PAGE_FLIP_TARGET.
Reviewed-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
[seanpaul]
This patch as posted on the list was rebased on:
commit 6f00975c61
Author: Daniel Vetter <daniel.vetter@ffwll.ch>
Date: Sat Aug 20 12:22:11 2016 +0200
drm: Reject page_flip for !DRIVER_MODESET
so as a result of moving the page_flip ioctl, this fix has
been rolled into this patch.
Signed-off-by: Sean Paul <seanpaul@chromium.org>
This commit is contained in:
@@ -30,6 +30,160 @@
|
||||
|
||||
#include <drm/drm_crtc.h>
|
||||
|
||||
/**
|
||||
* struct drm_crtc_commit - track modeset commits on a CRTC
|
||||
*
|
||||
* This structure is used to track pending modeset changes and atomic commit on
|
||||
* a per-CRTC basis. Since updating the list should never block this structure
|
||||
* is reference counted to allow waiters to safely wait on an event to complete,
|
||||
* without holding any locks.
|
||||
*
|
||||
* It has 3 different events in total to allow a fine-grained synchronization
|
||||
* between outstanding updates::
|
||||
*
|
||||
* atomic commit thread hardware
|
||||
*
|
||||
* write new state into hardware ----> ...
|
||||
* signal hw_done
|
||||
* switch to new state on next
|
||||
* ... v/hblank
|
||||
*
|
||||
* wait for buffers to show up ...
|
||||
*
|
||||
* ... send completion irq
|
||||
* irq handler signals flip_done
|
||||
* cleanup old buffers
|
||||
*
|
||||
* signal cleanup_done
|
||||
*
|
||||
* wait for flip_done <----
|
||||
* clean up atomic state
|
||||
*
|
||||
* The important bit to know is that cleanup_done is the terminal event, but the
|
||||
* ordering between flip_done and hw_done is entirely up to the specific driver
|
||||
* and modeset state change.
|
||||
*
|
||||
* For an implementation of how to use this look at
|
||||
* drm_atomic_helper_setup_commit() from the atomic helper library.
|
||||
*/
|
||||
struct drm_crtc_commit {
|
||||
/**
|
||||
* @crtc:
|
||||
*
|
||||
* DRM CRTC for this commit.
|
||||
*/
|
||||
struct drm_crtc *crtc;
|
||||
|
||||
/**
|
||||
* @ref:
|
||||
*
|
||||
* Reference count for this structure. Needed to allow blocking on
|
||||
* completions without the risk of the completion disappearing
|
||||
* meanwhile.
|
||||
*/
|
||||
struct kref ref;
|
||||
|
||||
/**
|
||||
* @flip_done:
|
||||
*
|
||||
* Will be signaled when the hardware has flipped to the new set of
|
||||
* buffers. Signals at the same time as when the drm event for this
|
||||
* commit is sent to userspace, or when an out-fence is singalled. Note
|
||||
* that for most hardware, in most cases this happens after @hw_done is
|
||||
* signalled.
|
||||
*/
|
||||
struct completion flip_done;
|
||||
|
||||
/**
|
||||
* @hw_done:
|
||||
*
|
||||
* Will be signalled when all hw register changes for this commit have
|
||||
* been written out. Especially when disabling a pipe this can be much
|
||||
* later than than @flip_done, since that can signal already when the
|
||||
* screen goes black, whereas to fully shut down a pipe more register
|
||||
* I/O is required.
|
||||
*
|
||||
* Note that this does not need to include separately reference-counted
|
||||
* resources like backing storage buffer pinning, or runtime pm
|
||||
* management.
|
||||
*/
|
||||
struct completion hw_done;
|
||||
|
||||
/**
|
||||
* @cleanup_done:
|
||||
*
|
||||
* Will be signalled after old buffers have been cleaned up by calling
|
||||
* drm_atomic_helper_cleanup_planes(). Since this can only happen after
|
||||
* a vblank wait completed it might be a bit later. This completion is
|
||||
* useful to throttle updates and avoid hardware updates getting ahead
|
||||
* of the buffer cleanup too much.
|
||||
*/
|
||||
struct completion cleanup_done;
|
||||
|
||||
/**
|
||||
* @commit_entry:
|
||||
*
|
||||
* Entry on the per-CRTC commit_list. Protected by crtc->commit_lock.
|
||||
*/
|
||||
struct list_head commit_entry;
|
||||
|
||||
/**
|
||||
* @event:
|
||||
*
|
||||
* &drm_pending_vblank_event pointer to clean up private events.
|
||||
*/
|
||||
struct drm_pending_vblank_event *event;
|
||||
};
|
||||
|
||||
struct __drm_planes_state {
|
||||
struct drm_plane *ptr;
|
||||
struct drm_plane_state *state;
|
||||
};
|
||||
|
||||
struct __drm_crtcs_state {
|
||||
struct drm_crtc *ptr;
|
||||
struct drm_crtc_state *state;
|
||||
struct drm_crtc_commit *commit;
|
||||
};
|
||||
|
||||
struct __drm_connnectors_state {
|
||||
struct drm_connector *ptr;
|
||||
struct drm_connector_state *state;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_atomic_state - the global state object for atomic updates
|
||||
* @dev: parent DRM device
|
||||
* @allow_modeset: allow full modeset
|
||||
* @legacy_cursor_update: hint to enforce legacy cursor IOCTL semantics
|
||||
* @legacy_set_config: Disable conflicting encoders instead of failing with -EINVAL.
|
||||
* @planes: pointer to array of structures with per-plane data
|
||||
* @crtcs: pointer to array of CRTC pointers
|
||||
* @num_connector: size of the @connectors and @connector_states arrays
|
||||
* @connectors: pointer to array of structures with per-connector data
|
||||
* @acquire_ctx: acquire context for this atomic modeset state update
|
||||
*/
|
||||
struct drm_atomic_state {
|
||||
struct drm_device *dev;
|
||||
bool allow_modeset : 1;
|
||||
bool legacy_cursor_update : 1;
|
||||
bool legacy_set_config : 1;
|
||||
struct __drm_planes_state *planes;
|
||||
struct __drm_crtcs_state *crtcs;
|
||||
int num_connector;
|
||||
struct __drm_connnectors_state *connectors;
|
||||
|
||||
struct drm_modeset_acquire_ctx *acquire_ctx;
|
||||
|
||||
/**
|
||||
* @commit_work:
|
||||
*
|
||||
* Work item which can be used by the driver or helpers to execute the
|
||||
* commit without blocking.
|
||||
*/
|
||||
struct work_struct commit_work;
|
||||
};
|
||||
|
||||
void drm_crtc_commit_put(struct drm_crtc_commit *commit);
|
||||
static inline void drm_crtc_commit_get(struct drm_crtc_commit *commit)
|
||||
{
|
||||
|
Reference in New Issue
Block a user