drm/atomic: Move __drm_atomic_helper_disable_plane/set_config()
Prepare for moving drm_fb_helper modesetting code to drm_client. drm_client will be linked to drm.ko, so move __drm_atomic_helper_disable_plane() and __drm_atomic_helper_set_config() out of drm_kms_helper.ko. While at it, fix two checkpatch complaints: - WARNING: Block comments use a trailing */ on a separate line - CHECK: Alignment should match open parenthesis v7: Declare drm_mode_set and drm_plane_state Signed-off-by: Noralf Trønnes <noralf@tronnes.org> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Maxime Ripard <maxime.ripard@bootlin.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190531140117.37751-2-noralf@tronnes.org
This commit is contained in:
Родитель
d99004d720
Коммит
df73789514
|
@ -1179,6 +1179,174 @@ int drm_atomic_nonblocking_commit(struct drm_atomic_state *state)
|
|||
}
|
||||
EXPORT_SYMBOL(drm_atomic_nonblocking_commit);
|
||||
|
||||
/* just used from drm-client and atomic-helper: */
|
||||
int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
|
||||
struct drm_plane_state *plane_state)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
drm_atomic_set_fb_for_plane(plane_state, NULL);
|
||||
plane_state->crtc_x = 0;
|
||||
plane_state->crtc_y = 0;
|
||||
plane_state->crtc_w = 0;
|
||||
plane_state->crtc_h = 0;
|
||||
plane_state->src_x = 0;
|
||||
plane_state->src_y = 0;
|
||||
plane_state->src_w = 0;
|
||||
plane_state->src_h = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(__drm_atomic_helper_disable_plane);
|
||||
|
||||
static int update_output_state(struct drm_atomic_state *state,
|
||||
struct drm_mode_set *set)
|
||||
{
|
||||
struct drm_device *dev = set->crtc->dev;
|
||||
struct drm_crtc *crtc;
|
||||
struct drm_crtc_state *new_crtc_state;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_state *new_conn_state;
|
||||
int ret, i;
|
||||
|
||||
ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
|
||||
state->acquire_ctx);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* First disable all connectors on the target crtc. */
|
||||
ret = drm_atomic_add_affected_connectors(state, set->crtc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for_each_new_connector_in_state(state, connector, new_conn_state, i) {
|
||||
if (new_conn_state->crtc == set->crtc) {
|
||||
ret = drm_atomic_set_crtc_for_connector(new_conn_state,
|
||||
NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Make sure legacy setCrtc always re-trains */
|
||||
new_conn_state->link_status = DRM_LINK_STATUS_GOOD;
|
||||
}
|
||||
}
|
||||
|
||||
/* Then set all connectors from set->connectors on the target crtc */
|
||||
for (i = 0; i < set->num_connectors; i++) {
|
||||
new_conn_state = drm_atomic_get_connector_state(state,
|
||||
set->connectors[i]);
|
||||
if (IS_ERR(new_conn_state))
|
||||
return PTR_ERR(new_conn_state);
|
||||
|
||||
ret = drm_atomic_set_crtc_for_connector(new_conn_state,
|
||||
set->crtc);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
|
||||
/*
|
||||
* Don't update ->enable for the CRTC in the set_config request,
|
||||
* since a mismatch would indicate a bug in the upper layers.
|
||||
* The actual modeset code later on will catch any
|
||||
* inconsistencies here.
|
||||
*/
|
||||
if (crtc == set->crtc)
|
||||
continue;
|
||||
|
||||
if (!new_crtc_state->connector_mask) {
|
||||
ret = drm_atomic_set_mode_prop_for_crtc(new_crtc_state,
|
||||
NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
new_crtc_state->active = false;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* just used from drm-client and atomic-helper: */
|
||||
int __drm_atomic_helper_set_config(struct drm_mode_set *set,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_crtc_state *crtc_state;
|
||||
struct drm_plane_state *primary_state;
|
||||
struct drm_crtc *crtc = set->crtc;
|
||||
int hdisplay, vdisplay;
|
||||
int ret;
|
||||
|
||||
crtc_state = drm_atomic_get_crtc_state(state, crtc);
|
||||
if (IS_ERR(crtc_state))
|
||||
return PTR_ERR(crtc_state);
|
||||
|
||||
primary_state = drm_atomic_get_plane_state(state, crtc->primary);
|
||||
if (IS_ERR(primary_state))
|
||||
return PTR_ERR(primary_state);
|
||||
|
||||
if (!set->mode) {
|
||||
WARN_ON(set->fb);
|
||||
WARN_ON(set->num_connectors);
|
||||
|
||||
ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
crtc_state->active = false;
|
||||
|
||||
ret = drm_atomic_set_crtc_for_plane(primary_state, NULL);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
drm_atomic_set_fb_for_plane(primary_state, NULL);
|
||||
|
||||
goto commit;
|
||||
}
|
||||
|
||||
WARN_ON(!set->fb);
|
||||
WARN_ON(!set->num_connectors);
|
||||
|
||||
ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
crtc_state->active = true;
|
||||
|
||||
ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
drm_mode_get_hv_timing(set->mode, &hdisplay, &vdisplay);
|
||||
|
||||
drm_atomic_set_fb_for_plane(primary_state, set->fb);
|
||||
primary_state->crtc_x = 0;
|
||||
primary_state->crtc_y = 0;
|
||||
primary_state->crtc_w = hdisplay;
|
||||
primary_state->crtc_h = vdisplay;
|
||||
primary_state->src_x = set->x << 16;
|
||||
primary_state->src_y = set->y << 16;
|
||||
if (drm_rotation_90_or_270(primary_state->rotation)) {
|
||||
primary_state->src_w = vdisplay << 16;
|
||||
primary_state->src_h = hdisplay << 16;
|
||||
} else {
|
||||
primary_state->src_w = hdisplay << 16;
|
||||
primary_state->src_h = vdisplay << 16;
|
||||
}
|
||||
|
||||
commit:
|
||||
ret = update_output_state(state, set);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(__drm_atomic_helper_set_config);
|
||||
|
||||
void drm_atomic_print_state(const struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_printer p = drm_info_printer(state->dev->dev);
|
||||
|
|
|
@ -2844,95 +2844,6 @@ fail:
|
|||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_disable_plane);
|
||||
|
||||
/* just used from fb-helper and atomic-helper: */
|
||||
int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
|
||||
struct drm_plane_state *plane_state)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
drm_atomic_set_fb_for_plane(plane_state, NULL);
|
||||
plane_state->crtc_x = 0;
|
||||
plane_state->crtc_y = 0;
|
||||
plane_state->crtc_w = 0;
|
||||
plane_state->crtc_h = 0;
|
||||
plane_state->src_x = 0;
|
||||
plane_state->src_y = 0;
|
||||
plane_state->src_w = 0;
|
||||
plane_state->src_h = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int update_output_state(struct drm_atomic_state *state,
|
||||
struct drm_mode_set *set)
|
||||
{
|
||||
struct drm_device *dev = set->crtc->dev;
|
||||
struct drm_crtc *crtc;
|
||||
struct drm_crtc_state *new_crtc_state;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_state *new_conn_state;
|
||||
int ret, i;
|
||||
|
||||
ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
|
||||
state->acquire_ctx);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* First disable all connectors on the target crtc. */
|
||||
ret = drm_atomic_add_affected_connectors(state, set->crtc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for_each_new_connector_in_state(state, connector, new_conn_state, i) {
|
||||
if (new_conn_state->crtc == set->crtc) {
|
||||
ret = drm_atomic_set_crtc_for_connector(new_conn_state,
|
||||
NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Make sure legacy setCrtc always re-trains */
|
||||
new_conn_state->link_status = DRM_LINK_STATUS_GOOD;
|
||||
}
|
||||
}
|
||||
|
||||
/* Then set all connectors from set->connectors on the target crtc */
|
||||
for (i = 0; i < set->num_connectors; i++) {
|
||||
new_conn_state = drm_atomic_get_connector_state(state,
|
||||
set->connectors[i]);
|
||||
if (IS_ERR(new_conn_state))
|
||||
return PTR_ERR(new_conn_state);
|
||||
|
||||
ret = drm_atomic_set_crtc_for_connector(new_conn_state,
|
||||
set->crtc);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
|
||||
/* Don't update ->enable for the CRTC in the set_config request,
|
||||
* since a mismatch would indicate a bug in the upper layers.
|
||||
* The actual modeset code later on will catch any
|
||||
* inconsistencies here. */
|
||||
if (crtc == set->crtc)
|
||||
continue;
|
||||
|
||||
if (!new_crtc_state->connector_mask) {
|
||||
ret = drm_atomic_set_mode_prop_for_crtc(new_crtc_state,
|
||||
NULL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
new_crtc_state->active = false;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_atomic_helper_set_config - set a new config from userspace
|
||||
* @set: mode set configuration
|
||||
|
@ -2977,81 +2888,6 @@ fail:
|
|||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_set_config);
|
||||
|
||||
/* just used from fb-helper and atomic-helper: */
|
||||
int __drm_atomic_helper_set_config(struct drm_mode_set *set,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_crtc_state *crtc_state;
|
||||
struct drm_plane_state *primary_state;
|
||||
struct drm_crtc *crtc = set->crtc;
|
||||
int hdisplay, vdisplay;
|
||||
int ret;
|
||||
|
||||
crtc_state = drm_atomic_get_crtc_state(state, crtc);
|
||||
if (IS_ERR(crtc_state))
|
||||
return PTR_ERR(crtc_state);
|
||||
|
||||
primary_state = drm_atomic_get_plane_state(state, crtc->primary);
|
||||
if (IS_ERR(primary_state))
|
||||
return PTR_ERR(primary_state);
|
||||
|
||||
if (!set->mode) {
|
||||
WARN_ON(set->fb);
|
||||
WARN_ON(set->num_connectors);
|
||||
|
||||
ret = drm_atomic_set_mode_for_crtc(crtc_state, NULL);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
crtc_state->active = false;
|
||||
|
||||
ret = drm_atomic_set_crtc_for_plane(primary_state, NULL);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
drm_atomic_set_fb_for_plane(primary_state, NULL);
|
||||
|
||||
goto commit;
|
||||
}
|
||||
|
||||
WARN_ON(!set->fb);
|
||||
WARN_ON(!set->num_connectors);
|
||||
|
||||
ret = drm_atomic_set_mode_for_crtc(crtc_state, set->mode);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
crtc_state->active = true;
|
||||
|
||||
ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
drm_mode_get_hv_timing(set->mode, &hdisplay, &vdisplay);
|
||||
|
||||
drm_atomic_set_fb_for_plane(primary_state, set->fb);
|
||||
primary_state->crtc_x = 0;
|
||||
primary_state->crtc_y = 0;
|
||||
primary_state->crtc_w = hdisplay;
|
||||
primary_state->crtc_h = vdisplay;
|
||||
primary_state->src_x = set->x << 16;
|
||||
primary_state->src_y = set->y << 16;
|
||||
if (drm_rotation_90_or_270(primary_state->rotation)) {
|
||||
primary_state->src_w = vdisplay << 16;
|
||||
primary_state->src_h = hdisplay << 16;
|
||||
} else {
|
||||
primary_state->src_w = hdisplay << 16;
|
||||
primary_state->src_h = vdisplay << 16;
|
||||
}
|
||||
|
||||
commit:
|
||||
ret = update_output_state(state, set);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_atomic_helper_disable_all - disable all currently active outputs
|
||||
* @dev: DRM device
|
||||
|
|
|
@ -50,7 +50,9 @@ struct drm_mode_create_dumb;
|
|||
struct drm_mode_fb_cmd2;
|
||||
struct drm_mode_fb_cmd;
|
||||
struct drm_mode_object;
|
||||
struct drm_mode_set;
|
||||
struct drm_plane;
|
||||
struct drm_plane_state;
|
||||
struct drm_property;
|
||||
struct edid;
|
||||
struct kref;
|
||||
|
@ -223,6 +225,11 @@ struct drm_minor;
|
|||
int drm_atomic_debugfs_init(struct drm_minor *minor);
|
||||
#endif
|
||||
|
||||
int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
|
||||
struct drm_plane_state *plane_state);
|
||||
int __drm_atomic_helper_set_config(struct drm_mode_set *set,
|
||||
struct drm_atomic_state *state);
|
||||
|
||||
void drm_atomic_print_state(const struct drm_atomic_state *state);
|
||||
|
||||
/* drm_atomic_uapi.c */
|
||||
|
|
|
@ -117,12 +117,8 @@ int drm_atomic_helper_update_plane(struct drm_plane *plane,
|
|||
struct drm_modeset_acquire_ctx *ctx);
|
||||
int drm_atomic_helper_disable_plane(struct drm_plane *plane,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
int __drm_atomic_helper_disable_plane(struct drm_plane *plane,
|
||||
struct drm_plane_state *plane_state);
|
||||
int drm_atomic_helper_set_config(struct drm_mode_set *set,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
int __drm_atomic_helper_set_config(struct drm_mode_set *set,
|
||||
struct drm_atomic_state *state);
|
||||
|
||||
int drm_atomic_helper_disable_all(struct drm_device *dev,
|
||||
struct drm_modeset_acquire_ctx *ctx);
|
||||
|
|
Загрузка…
Ссылка в новой задаче