drm/atomic-helper: Replace drm_atomic_helper_check_crtc_state()

Rename the atomic helper function drm_atomic_helper_check_crtc_state()
to drm_atomic_helper_check_crtc_primary_plane() and only check for an
attached primary plane. Adapt callers.

Instead of having one big function to check for various CRTC state
conditions, we rather want smaller functions that drivers can pick
individually.

v5:
	* rebase on top of udl changes

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221007124338.24152-3-tzimmermann@suse.de
This commit is contained in:
Thomas Zimmermann 2022-10-07 14:43:38 +02:00
parent dbbf933d36
commit 8f2fd57d83
8 changed files with 46 additions and 48 deletions

View File

@ -1161,13 +1161,13 @@ static int ast_crtc_helper_atomic_check(struct drm_crtc *crtc,
bool succ; bool succ;
int ret; int ret;
ret = drm_atomic_helper_check_crtc_state(crtc_state, false);
if (ret)
return ret;
if (!crtc_state->enable) if (!crtc_state->enable)
goto out; goto out;
ret = drm_atomic_helper_check_crtc_primary_plane(crtc_state);
if (ret)
return ret;
ast_state = to_ast_crtc_state(crtc_state); ast_state = to_ast_crtc_state(crtc_state);
format = ast_state->format; format = ast_state->format;

View File

@ -924,51 +924,35 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
EXPORT_SYMBOL(drm_atomic_helper_check_plane_state); EXPORT_SYMBOL(drm_atomic_helper_check_plane_state);
/** /**
* drm_atomic_helper_check_crtc_state() - Check CRTC state for validity * drm_atomic_helper_check_crtc_primary_plane() - Check CRTC state for primary plane
* @crtc_state: CRTC state to check * @crtc_state: CRTC state to check
* @can_disable_primary_planes: can the CRTC be enabled without a primary plane?
* *
* Checks that a desired CRTC update is valid. Drivers that provide * Checks that a CRTC has at least one primary plane attached to it, which is
* their own CRTC handling rather than helper-provided implementations may * a requirement on some hardware. Note that this only involves the CRTC side
* still wish to call this function to avoid duplication of error checking * of the test. To test if the primary plane is visible or if it can be updated
* code. * without the CRTC being enabled, use drm_atomic_helper_check_plane_state() in
* * the plane's atomic check.
* Note that @can_disable_primary_planes only tests if the CRTC can be
* enabled without a primary plane. To test if a primary plane can be updated
* without a CRTC, use drm_atomic_helper_check_plane_state() in the plane's
* atomic check.
* *
* RETURNS: * RETURNS:
* Zero if update appears valid, error code on failure * 0 if a primary plane is attached to the CRTC, or an error code otherwise
*/ */
int drm_atomic_helper_check_crtc_state(struct drm_crtc_state *crtc_state, int drm_atomic_helper_check_crtc_primary_plane(struct drm_crtc_state *crtc_state)
bool can_disable_primary_planes)
{ {
struct drm_device *dev = crtc_state->crtc->dev; struct drm_crtc *crtc = crtc_state->crtc;
struct drm_device *dev = crtc->dev;
if (!crtc_state->enable) struct drm_plane *plane;
return 0;
/* needs at least one primary plane to be enabled */ /* needs at least one primary plane to be enabled */
if (!can_disable_primary_planes) { drm_for_each_plane_mask(plane, dev, crtc_state->plane_mask) {
bool has_primary_plane = false; if (plane->type == DRM_PLANE_TYPE_PRIMARY)
struct drm_plane *plane; return 0;
drm_for_each_plane_mask(plane, dev, crtc_state->plane_mask) {
if (plane->type == DRM_PLANE_TYPE_PRIMARY) {
has_primary_plane = true;
break;
}
}
if (!has_primary_plane) {
drm_dbg_kms(dev, "Cannot enable CRTC without a primary plane.\n");
return -EINVAL;
}
} }
return 0; drm_dbg_atomic(dev, "[CRTC:%d:%s] primary plane missing\n", crtc->base.id, crtc->name);
return -EINVAL;
} }
EXPORT_SYMBOL(drm_atomic_helper_check_crtc_state); EXPORT_SYMBOL(drm_atomic_helper_check_crtc_primary_plane);
/** /**
* drm_atomic_helper_check_planes - validate state object for planes changes * drm_atomic_helper_check_planes - validate state object for planes changes

View File

@ -102,10 +102,14 @@ static int drm_simple_kms_crtc_check(struct drm_crtc *crtc,
struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc); struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
int ret; int ret;
ret = drm_atomic_helper_check_crtc_state(crtc_state, false); if (!crtc_state->enable)
goto out;
ret = drm_atomic_helper_check_crtc_primary_plane(crtc_state);
if (ret) if (ret)
return ret; return ret;
out:
return drm_atomic_add_affected_planes(state, crtc); return drm_atomic_add_affected_planes(state, crtc);
} }

View File

@ -579,13 +579,13 @@ int mgag200_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_st
struct drm_property_blob *new_gamma_lut = new_crtc_state->gamma_lut; struct drm_property_blob *new_gamma_lut = new_crtc_state->gamma_lut;
int ret; int ret;
ret = drm_atomic_helper_check_crtc_state(new_crtc_state, false);
if (ret)
return ret;
if (!new_crtc_state->enable) if (!new_crtc_state->enable)
return 0; return 0;
ret = drm_atomic_helper_check_crtc_primary_plane(new_crtc_state);
if (ret)
return ret;
if (new_crtc_state->mode_changed) { if (new_crtc_state->mode_changed) {
if (funcs->pixpllc_atomic_check) { if (funcs->pixpllc_atomic_check) {
ret = funcs->pixpllc_atomic_check(crtc, new_state); ret = funcs->pixpllc_atomic_check(crtc, new_state);

View File

@ -651,10 +651,14 @@ static int ssd130x_crtc_helper_atomic_check(struct drm_crtc *crtc,
struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(new_state, crtc); struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(new_state, crtc);
int ret; int ret;
ret = drm_atomic_helper_check_crtc_state(new_crtc_state, false); if (!new_crtc_state->enable)
goto out;
ret = drm_atomic_helper_check_crtc_primary_plane(new_crtc_state);
if (ret) if (ret)
return ret; return ret;
out:
return drm_atomic_add_affected_planes(new_state, crtc); return drm_atomic_add_affected_planes(new_state, crtc);
} }

View File

@ -551,10 +551,14 @@ static int simpledrm_crtc_helper_atomic_check(struct drm_crtc *crtc,
struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(new_state, crtc); struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(new_state, crtc);
int ret; int ret;
ret = drm_atomic_helper_check_crtc_state(new_crtc_state, false); if (!new_crtc_state->enable)
goto out;
ret = drm_atomic_helper_check_crtc_primary_plane(new_crtc_state);
if (ret) if (ret)
return ret; return ret;
out:
return drm_atomic_add_affected_planes(new_state, crtc); return drm_atomic_add_affected_planes(new_state, crtc);
} }

View File

@ -315,7 +315,10 @@ static int udl_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic
{ {
struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc); struct drm_crtc_state *new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
return drm_atomic_helper_check_crtc_state(new_crtc_state, false); if (!new_crtc_state->enable)
return 0;
return drm_atomic_helper_check_crtc_primary_plane(new_crtc_state);
} }
static void udl_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_state *state) static void udl_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_state *state)

View File

@ -58,10 +58,9 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
int max_scale, int max_scale,
bool can_position, bool can_position,
bool can_update_disabled); bool can_update_disabled);
int drm_atomic_helper_check_crtc_state(struct drm_crtc_state *crtc_state,
bool can_disable_primary_plane);
int drm_atomic_helper_check_planes(struct drm_device *dev, int drm_atomic_helper_check_planes(struct drm_device *dev,
struct drm_atomic_state *state); struct drm_atomic_state *state);
int drm_atomic_helper_check_crtc_primary_plane(struct drm_crtc_state *crtc_state);
int drm_atomic_helper_check(struct drm_device *dev, int drm_atomic_helper_check(struct drm_device *dev,
struct drm_atomic_state *state); struct drm_atomic_state *state);
void drm_atomic_helper_commit_tail(struct drm_atomic_state *state); void drm_atomic_helper_commit_tail(struct drm_atomic_state *state);