drm: Fix up drm_atomic_state_helper.[hc] extraction
I've misplaced two functions by accident:
- drm_atomic_helper_duplicate_state is really part of the
resume/suspend/shutdown device-wide helpers.
- drm_atomic_helper_legacy_gamma_set is part of the legacy ioctl
compat helpers.
Move them both back.
Fixes: 9ef8a9dc4b ("drm: Extract drm_atomic_state_helper.[hc]")
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Sean Paul <sean@poorly.run>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181128100728.4674-1-daniel.vetter@ffwll.ch
This commit is contained in:
@@ -3138,6 +3138,93 @@ void drm_atomic_helper_shutdown(struct drm_device *dev)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_atomic_helper_shutdown);
|
EXPORT_SYMBOL(drm_atomic_helper_shutdown);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* drm_atomic_helper_duplicate_state - duplicate an atomic state object
|
||||||
|
* @dev: DRM device
|
||||||
|
* @ctx: lock acquisition context
|
||||||
|
*
|
||||||
|
* Makes a copy of the current atomic state by looping over all objects and
|
||||||
|
* duplicating their respective states. This is used for example by suspend/
|
||||||
|
* resume support code to save the state prior to suspend such that it can
|
||||||
|
* be restored upon resume.
|
||||||
|
*
|
||||||
|
* Note that this treats atomic state as persistent between save and restore.
|
||||||
|
* Drivers must make sure that this is possible and won't result in confusion
|
||||||
|
* or erroneous behaviour.
|
||||||
|
*
|
||||||
|
* Note that if callers haven't already acquired all modeset locks this might
|
||||||
|
* return -EDEADLK, which must be handled by calling drm_modeset_backoff().
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* A pointer to the copy of the atomic state object on success or an
|
||||||
|
* ERR_PTR()-encoded error code on failure.
|
||||||
|
*
|
||||||
|
* See also:
|
||||||
|
* drm_atomic_helper_suspend(), drm_atomic_helper_resume()
|
||||||
|
*/
|
||||||
|
struct drm_atomic_state *
|
||||||
|
drm_atomic_helper_duplicate_state(struct drm_device *dev,
|
||||||
|
struct drm_modeset_acquire_ctx *ctx)
|
||||||
|
{
|
||||||
|
struct drm_atomic_state *state;
|
||||||
|
struct drm_connector *conn;
|
||||||
|
struct drm_connector_list_iter conn_iter;
|
||||||
|
struct drm_plane *plane;
|
||||||
|
struct drm_crtc *crtc;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
state = drm_atomic_state_alloc(dev);
|
||||||
|
if (!state)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
state->acquire_ctx = ctx;
|
||||||
|
|
||||||
|
drm_for_each_crtc(crtc, dev) {
|
||||||
|
struct drm_crtc_state *crtc_state;
|
||||||
|
|
||||||
|
crtc_state = drm_atomic_get_crtc_state(state, crtc);
|
||||||
|
if (IS_ERR(crtc_state)) {
|
||||||
|
err = PTR_ERR(crtc_state);
|
||||||
|
goto free;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drm_for_each_plane(plane, dev) {
|
||||||
|
struct drm_plane_state *plane_state;
|
||||||
|
|
||||||
|
plane_state = drm_atomic_get_plane_state(state, plane);
|
||||||
|
if (IS_ERR(plane_state)) {
|
||||||
|
err = PTR_ERR(plane_state);
|
||||||
|
goto free;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||||
|
drm_for_each_connector_iter(conn, &conn_iter) {
|
||||||
|
struct drm_connector_state *conn_state;
|
||||||
|
|
||||||
|
conn_state = drm_atomic_get_connector_state(state, conn);
|
||||||
|
if (IS_ERR(conn_state)) {
|
||||||
|
err = PTR_ERR(conn_state);
|
||||||
|
drm_connector_list_iter_end(&conn_iter);
|
||||||
|
goto free;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
drm_connector_list_iter_end(&conn_iter);
|
||||||
|
|
||||||
|
/* clear the acquire context so that it isn't accidentally reused */
|
||||||
|
state->acquire_ctx = NULL;
|
||||||
|
|
||||||
|
free:
|
||||||
|
if (err < 0) {
|
||||||
|
drm_atomic_state_put(state);
|
||||||
|
state = ERR_PTR(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_atomic_helper_duplicate_state);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_atomic_helper_suspend - subsystem-level suspend helper
|
* drm_atomic_helper_suspend - subsystem-level suspend helper
|
||||||
* @dev: DRM device
|
* @dev: DRM device
|
||||||
@@ -3407,3 +3494,73 @@ fail:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_atomic_helper_page_flip_target);
|
EXPORT_SYMBOL(drm_atomic_helper_page_flip_target);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* drm_atomic_helper_legacy_gamma_set - set the legacy gamma correction table
|
||||||
|
* @crtc: CRTC object
|
||||||
|
* @red: red correction table
|
||||||
|
* @green: green correction table
|
||||||
|
* @blue: green correction table
|
||||||
|
* @size: size of the tables
|
||||||
|
* @ctx: lock acquire context
|
||||||
|
*
|
||||||
|
* Implements support for legacy gamma correction table for drivers
|
||||||
|
* that support color management through the DEGAMMA_LUT/GAMMA_LUT
|
||||||
|
* properties. See drm_crtc_enable_color_mgmt() and the containing chapter for
|
||||||
|
* how the atomic color management and gamma tables work.
|
||||||
|
*/
|
||||||
|
int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
|
||||||
|
u16 *red, u16 *green, u16 *blue,
|
||||||
|
uint32_t size,
|
||||||
|
struct drm_modeset_acquire_ctx *ctx)
|
||||||
|
{
|
||||||
|
struct drm_device *dev = crtc->dev;
|
||||||
|
struct drm_atomic_state *state;
|
||||||
|
struct drm_crtc_state *crtc_state;
|
||||||
|
struct drm_property_blob *blob = NULL;
|
||||||
|
struct drm_color_lut *blob_data;
|
||||||
|
int i, ret = 0;
|
||||||
|
bool replaced;
|
||||||
|
|
||||||
|
state = drm_atomic_state_alloc(crtc->dev);
|
||||||
|
if (!state)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
blob = drm_property_create_blob(dev,
|
||||||
|
sizeof(struct drm_color_lut) * size,
|
||||||
|
NULL);
|
||||||
|
if (IS_ERR(blob)) {
|
||||||
|
ret = PTR_ERR(blob);
|
||||||
|
blob = NULL;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prepare GAMMA_LUT with the legacy values. */
|
||||||
|
blob_data = blob->data;
|
||||||
|
for (i = 0; i < size; i++) {
|
||||||
|
blob_data[i].red = red[i];
|
||||||
|
blob_data[i].green = green[i];
|
||||||
|
blob_data[i].blue = blue[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
state->acquire_ctx = ctx;
|
||||||
|
crtc_state = drm_atomic_get_crtc_state(state, crtc);
|
||||||
|
if (IS_ERR(crtc_state)) {
|
||||||
|
ret = PTR_ERR(crtc_state);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset DEGAMMA_LUT and CTM properties. */
|
||||||
|
replaced = drm_property_replace_blob(&crtc_state->degamma_lut, NULL);
|
||||||
|
replaced |= drm_property_replace_blob(&crtc_state->ctm, NULL);
|
||||||
|
replaced |= drm_property_replace_blob(&crtc_state->gamma_lut, blob);
|
||||||
|
crtc_state->color_mgmt_changed |= replaced;
|
||||||
|
|
||||||
|
ret = drm_atomic_commit(state);
|
||||||
|
|
||||||
|
fail:
|
||||||
|
drm_atomic_state_put(state);
|
||||||
|
drm_property_blob_put(blob);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(drm_atomic_helper_legacy_gamma_set);
|
||||||
|
|||||||
@@ -393,93 +393,6 @@ drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_atomic_helper_connector_duplicate_state);
|
EXPORT_SYMBOL(drm_atomic_helper_connector_duplicate_state);
|
||||||
|
|
||||||
/**
|
|
||||||
* drm_atomic_helper_duplicate_state - duplicate an atomic state object
|
|
||||||
* @dev: DRM device
|
|
||||||
* @ctx: lock acquisition context
|
|
||||||
*
|
|
||||||
* Makes a copy of the current atomic state by looping over all objects and
|
|
||||||
* duplicating their respective states. This is used for example by suspend/
|
|
||||||
* resume support code to save the state prior to suspend such that it can
|
|
||||||
* be restored upon resume.
|
|
||||||
*
|
|
||||||
* Note that this treats atomic state as persistent between save and restore.
|
|
||||||
* Drivers must make sure that this is possible and won't result in confusion
|
|
||||||
* or erroneous behaviour.
|
|
||||||
*
|
|
||||||
* Note that if callers haven't already acquired all modeset locks this might
|
|
||||||
* return -EDEADLK, which must be handled by calling drm_modeset_backoff().
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* A pointer to the copy of the atomic state object on success or an
|
|
||||||
* ERR_PTR()-encoded error code on failure.
|
|
||||||
*
|
|
||||||
* See also:
|
|
||||||
* drm_atomic_helper_suspend(), drm_atomic_helper_resume()
|
|
||||||
*/
|
|
||||||
struct drm_atomic_state *
|
|
||||||
drm_atomic_helper_duplicate_state(struct drm_device *dev,
|
|
||||||
struct drm_modeset_acquire_ctx *ctx)
|
|
||||||
{
|
|
||||||
struct drm_atomic_state *state;
|
|
||||||
struct drm_connector *conn;
|
|
||||||
struct drm_connector_list_iter conn_iter;
|
|
||||||
struct drm_plane *plane;
|
|
||||||
struct drm_crtc *crtc;
|
|
||||||
int err = 0;
|
|
||||||
|
|
||||||
state = drm_atomic_state_alloc(dev);
|
|
||||||
if (!state)
|
|
||||||
return ERR_PTR(-ENOMEM);
|
|
||||||
|
|
||||||
state->acquire_ctx = ctx;
|
|
||||||
|
|
||||||
drm_for_each_crtc(crtc, dev) {
|
|
||||||
struct drm_crtc_state *crtc_state;
|
|
||||||
|
|
||||||
crtc_state = drm_atomic_get_crtc_state(state, crtc);
|
|
||||||
if (IS_ERR(crtc_state)) {
|
|
||||||
err = PTR_ERR(crtc_state);
|
|
||||||
goto free;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
drm_for_each_plane(plane, dev) {
|
|
||||||
struct drm_plane_state *plane_state;
|
|
||||||
|
|
||||||
plane_state = drm_atomic_get_plane_state(state, plane);
|
|
||||||
if (IS_ERR(plane_state)) {
|
|
||||||
err = PTR_ERR(plane_state);
|
|
||||||
goto free;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
|
||||||
drm_for_each_connector_iter(conn, &conn_iter) {
|
|
||||||
struct drm_connector_state *conn_state;
|
|
||||||
|
|
||||||
conn_state = drm_atomic_get_connector_state(state, conn);
|
|
||||||
if (IS_ERR(conn_state)) {
|
|
||||||
err = PTR_ERR(conn_state);
|
|
||||||
drm_connector_list_iter_end(&conn_iter);
|
|
||||||
goto free;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
drm_connector_list_iter_end(&conn_iter);
|
|
||||||
|
|
||||||
/* clear the acquire context so that it isn't accidentally reused */
|
|
||||||
state->acquire_ctx = NULL;
|
|
||||||
|
|
||||||
free:
|
|
||||||
if (err < 0) {
|
|
||||||
drm_atomic_state_put(state);
|
|
||||||
state = ERR_PTR(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(drm_atomic_helper_duplicate_state);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __drm_atomic_helper_connector_destroy_state - release connector state
|
* __drm_atomic_helper_connector_destroy_state - release connector state
|
||||||
* @state: connector state object to release
|
* @state: connector state object to release
|
||||||
@@ -515,76 +428,6 @@ void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_state);
|
EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_state);
|
||||||
|
|
||||||
/**
|
|
||||||
* drm_atomic_helper_legacy_gamma_set - set the legacy gamma correction table
|
|
||||||
* @crtc: CRTC object
|
|
||||||
* @red: red correction table
|
|
||||||
* @green: green correction table
|
|
||||||
* @blue: green correction table
|
|
||||||
* @size: size of the tables
|
|
||||||
* @ctx: lock acquire context
|
|
||||||
*
|
|
||||||
* Implements support for legacy gamma correction table for drivers
|
|
||||||
* that support color management through the DEGAMMA_LUT/GAMMA_LUT
|
|
||||||
* properties. See drm_crtc_enable_color_mgmt() and the containing chapter for
|
|
||||||
* how the atomic color management and gamma tables work.
|
|
||||||
*/
|
|
||||||
int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
|
|
||||||
u16 *red, u16 *green, u16 *blue,
|
|
||||||
uint32_t size,
|
|
||||||
struct drm_modeset_acquire_ctx *ctx)
|
|
||||||
{
|
|
||||||
struct drm_device *dev = crtc->dev;
|
|
||||||
struct drm_atomic_state *state;
|
|
||||||
struct drm_crtc_state *crtc_state;
|
|
||||||
struct drm_property_blob *blob = NULL;
|
|
||||||
struct drm_color_lut *blob_data;
|
|
||||||
int i, ret = 0;
|
|
||||||
bool replaced;
|
|
||||||
|
|
||||||
state = drm_atomic_state_alloc(crtc->dev);
|
|
||||||
if (!state)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
blob = drm_property_create_blob(dev,
|
|
||||||
sizeof(struct drm_color_lut) * size,
|
|
||||||
NULL);
|
|
||||||
if (IS_ERR(blob)) {
|
|
||||||
ret = PTR_ERR(blob);
|
|
||||||
blob = NULL;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Prepare GAMMA_LUT with the legacy values. */
|
|
||||||
blob_data = blob->data;
|
|
||||||
for (i = 0; i < size; i++) {
|
|
||||||
blob_data[i].red = red[i];
|
|
||||||
blob_data[i].green = green[i];
|
|
||||||
blob_data[i].blue = blue[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
state->acquire_ctx = ctx;
|
|
||||||
crtc_state = drm_atomic_get_crtc_state(state, crtc);
|
|
||||||
if (IS_ERR(crtc_state)) {
|
|
||||||
ret = PTR_ERR(crtc_state);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reset DEGAMMA_LUT and CTM properties. */
|
|
||||||
replaced = drm_property_replace_blob(&crtc_state->degamma_lut, NULL);
|
|
||||||
replaced |= drm_property_replace_blob(&crtc_state->ctm, NULL);
|
|
||||||
replaced |= drm_property_replace_blob(&crtc_state->gamma_lut, blob);
|
|
||||||
crtc_state->color_mgmt_changed |= replaced;
|
|
||||||
|
|
||||||
ret = drm_atomic_commit(state);
|
|
||||||
|
|
||||||
fail:
|
|
||||||
drm_atomic_state_put(state);
|
|
||||||
drm_property_blob_put(blob);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(drm_atomic_helper_legacy_gamma_set);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __drm_atomic_helper_private_duplicate_state - copy atomic private state
|
* __drm_atomic_helper_private_duplicate_state - copy atomic private state
|
||||||
* @obj: CRTC object
|
* @obj: CRTC object
|
||||||
|
|||||||
@@ -127,6 +127,9 @@ int __drm_atomic_helper_set_config(struct drm_mode_set *set,
|
|||||||
int drm_atomic_helper_disable_all(struct drm_device *dev,
|
int drm_atomic_helper_disable_all(struct drm_device *dev,
|
||||||
struct drm_modeset_acquire_ctx *ctx);
|
struct drm_modeset_acquire_ctx *ctx);
|
||||||
void drm_atomic_helper_shutdown(struct drm_device *dev);
|
void drm_atomic_helper_shutdown(struct drm_device *dev);
|
||||||
|
struct drm_atomic_state *
|
||||||
|
drm_atomic_helper_duplicate_state(struct drm_device *dev,
|
||||||
|
struct drm_modeset_acquire_ctx *ctx);
|
||||||
struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev);
|
struct drm_atomic_state *drm_atomic_helper_suspend(struct drm_device *dev);
|
||||||
int drm_atomic_helper_commit_duplicated_state(struct drm_atomic_state *state,
|
int drm_atomic_helper_commit_duplicated_state(struct drm_atomic_state *state,
|
||||||
struct drm_modeset_acquire_ctx *ctx);
|
struct drm_modeset_acquire_ctx *ctx);
|
||||||
@@ -145,6 +148,10 @@ int drm_atomic_helper_page_flip_target(
|
|||||||
uint32_t flags,
|
uint32_t flags,
|
||||||
uint32_t target,
|
uint32_t target,
|
||||||
struct drm_modeset_acquire_ctx *ctx);
|
struct drm_modeset_acquire_ctx *ctx);
|
||||||
|
int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
|
||||||
|
u16 *red, u16 *green, u16 *blue,
|
||||||
|
uint32_t size,
|
||||||
|
struct drm_modeset_acquire_ctx *ctx);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* drm_atomic_crtc_for_each_plane - iterate over planes currently attached to CRTC
|
* drm_atomic_crtc_for_each_plane - iterate over planes currently attached to CRTC
|
||||||
|
|||||||
@@ -65,16 +65,9 @@ __drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
|
|||||||
struct drm_connector_state *state);
|
struct drm_connector_state *state);
|
||||||
struct drm_connector_state *
|
struct drm_connector_state *
|
||||||
drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector);
|
drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector);
|
||||||
struct drm_atomic_state *
|
|
||||||
drm_atomic_helper_duplicate_state(struct drm_device *dev,
|
|
||||||
struct drm_modeset_acquire_ctx *ctx);
|
|
||||||
void
|
void
|
||||||
__drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state);
|
__drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state);
|
||||||
void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
|
void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
|
||||||
struct drm_connector_state *state);
|
struct drm_connector_state *state);
|
||||||
int drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
|
|
||||||
u16 *red, u16 *green, u16 *blue,
|
|
||||||
uint32_t size,
|
|
||||||
struct drm_modeset_acquire_ctx *ctx);
|
|
||||||
void __drm_atomic_helper_private_obj_duplicate_state(struct drm_private_obj *obj,
|
void __drm_atomic_helper_private_obj_duplicate_state(struct drm_private_obj *obj,
|
||||||
struct drm_private_state *state);
|
struct drm_private_state *state);
|
||||||
|
|||||||
Reference in New Issue
Block a user