drm/i915: Use full atomic modeset.
Huzzah! \o/ Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Reviewed-by: Daniel Stone <daniels@collabora.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:

committed by
Daniel Vetter

parent
9b01435d28
commit
74c090b1bd
@@ -35,129 +35,6 @@
|
||||
#include <drm/drm_plane_helper.h>
|
||||
#include "intel_drv.h"
|
||||
|
||||
|
||||
/**
|
||||
* intel_atomic_check - validate state object
|
||||
* @dev: drm device
|
||||
* @state: state to validate
|
||||
*/
|
||||
int intel_atomic_check(struct drm_device *dev,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
int nplanes = dev->mode_config.num_total_plane;
|
||||
int ncrtcs = dev->mode_config.num_crtc;
|
||||
int nconnectors = dev->mode_config.num_connector;
|
||||
enum pipe nuclear_pipe = INVALID_PIPE;
|
||||
struct intel_crtc *nuclear_crtc = NULL;
|
||||
struct intel_crtc_state *crtc_state = NULL;
|
||||
int ret;
|
||||
int i;
|
||||
bool not_nuclear = false;
|
||||
|
||||
to_intel_atomic_state(state)->cdclk = to_i915(dev)->cdclk_freq;
|
||||
|
||||
/*
|
||||
* FIXME: At the moment, we only support "nuclear pageflip" on a
|
||||
* single CRTC. Cross-crtc updates will be added later.
|
||||
*/
|
||||
for (i = 0; i < nplanes; i++) {
|
||||
struct intel_plane *plane = to_intel_plane(state->planes[i]);
|
||||
if (!plane)
|
||||
continue;
|
||||
|
||||
if (nuclear_pipe == INVALID_PIPE) {
|
||||
nuclear_pipe = plane->pipe;
|
||||
} else if (nuclear_pipe != plane->pipe) {
|
||||
DRM_DEBUG_KMS("i915 only support atomic plane operations on a single CRTC at the moment\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: We only handle planes for now; make sure there are no CRTC's
|
||||
* or connectors involved.
|
||||
*/
|
||||
state->allow_modeset = false;
|
||||
for (i = 0; i < ncrtcs; i++) {
|
||||
struct intel_crtc *crtc = to_intel_crtc(state->crtcs[i]);
|
||||
if (crtc)
|
||||
memset(&crtc->atomic, 0, sizeof(crtc->atomic));
|
||||
if (crtc && crtc->pipe != nuclear_pipe)
|
||||
not_nuclear = true;
|
||||
if (crtc && crtc->pipe == nuclear_pipe) {
|
||||
nuclear_crtc = crtc;
|
||||
crtc_state = to_intel_crtc_state(state->crtc_states[i]);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < nconnectors; i++)
|
||||
if (state->connectors[i] != NULL)
|
||||
not_nuclear = true;
|
||||
|
||||
if (not_nuclear) {
|
||||
DRM_DEBUG_KMS("i915 only supports atomic plane operations at the moment\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = drm_atomic_helper_check_planes(dev, state);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* intel_atomic_commit - commit validated state object
|
||||
* @dev: DRM device
|
||||
* @state: the top-level driver state object
|
||||
* @async: asynchronous commit
|
||||
*
|
||||
* This function commits a top-level state object that has been validated
|
||||
* with drm_atomic_helper_check().
|
||||
*
|
||||
* FIXME: Atomic modeset support for i915 is not yet complete. At the moment
|
||||
* we can only handle plane-related operations and do not yet support
|
||||
* asynchronous commit.
|
||||
*
|
||||
* RETURNS
|
||||
* Zero for success or -errno.
|
||||
*/
|
||||
int intel_atomic_commit(struct drm_device *dev,
|
||||
struct drm_atomic_state *state,
|
||||
bool async)
|
||||
{
|
||||
struct drm_crtc_state *crtc_state;
|
||||
struct drm_crtc *crtc;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
if (async) {
|
||||
DRM_DEBUG_KMS("i915 does not yet support async commit\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = drm_atomic_helper_prepare_planes(dev, state);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Point of no return */
|
||||
drm_atomic_helper_swap_state(dev, state);
|
||||
|
||||
for_each_crtc_in_state(state, crtc, crtc_state, i) {
|
||||
to_intel_crtc(crtc)->config = to_intel_crtc_state(crtc->state);
|
||||
|
||||
drm_atomic_helper_commit_planes_on_crtc(crtc_state);
|
||||
}
|
||||
|
||||
/* FIXME: This function should eventually call __intel_set_mode when needed */
|
||||
|
||||
drm_atomic_helper_wait_for_vblanks(dev, state);
|
||||
drm_atomic_helper_cleanup_planes(dev, state);
|
||||
drm_atomic_state_free(state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_connector_atomic_get_property - fetch connector property value
|
||||
* @connector: connector to fetch property for
|
||||
|
Reference in New Issue
Block a user