Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 07cc0ef6 authored by Daniel Vetter's avatar Daniel Vetter
Browse files

drm/atomic: Introduce state->obj backpointers



Useful since this way we can pass around just the state objects and
will get ther real object, too.

Specifically this allows us to again simplify the parameters for
set_crtc_for_plane.

v2: msm already has it's own specific plane_reset hook, don't forget
that one!

v3: Fixup kerneldoc, reported by 0-day builder.

Cc: Rob Clark <robdclark@gmail.com>
Reviewed-by: Rob Clark <robdclark@gmail.com> (v2)
Tested-by: Rob Clark <robdclark@gmail.com> (v2)
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
parent b4274fbe
Loading
Loading
Loading
Loading
+4 −9
Original line number Diff line number Diff line
@@ -344,8 +344,7 @@ EXPORT_SYMBOL(drm_atomic_get_connector_state);

/**
 * drm_atomic_set_crtc_for_plane - set crtc for plane
 * @state: the incoming atomic state
 * @plane: the plane whose incoming state to update
 * @plane_state: the plane whose incoming state to update
 * @crtc: crtc to use for the plane
 *
 * Changing the assigned crtc for a plane requires us to grab the lock and state
@@ -358,16 +357,12 @@ EXPORT_SYMBOL(drm_atomic_get_connector_state);
 * sequence must be restarted. All other errors are fatal.
 */
int
drm_atomic_set_crtc_for_plane(struct drm_atomic_state *state,
			      struct drm_plane *plane, struct drm_crtc *crtc)
drm_atomic_set_crtc_for_plane(struct drm_plane_state *plane_state,
			      struct drm_crtc *crtc)
{
	struct drm_plane_state *plane_state =
			drm_atomic_get_plane_state(state, plane);
	struct drm_plane *plane = plane_state->plane;
	struct drm_crtc_state *crtc_state;

	if (WARN_ON(IS_ERR(plane_state)))
		return PTR_ERR(plane_state);

	if (plane_state->crtc) {
		crtc_state = drm_atomic_get_crtc_state(plane_state->state,
						       plane_state->crtc);
+14 −5
Original line number Diff line number Diff line
@@ -1277,7 +1277,7 @@ int drm_atomic_helper_update_plane(struct drm_plane *plane,
		goto fail;
	}

	ret = drm_atomic_set_crtc_for_plane(state, plane, crtc);
	ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
	if (ret != 0)
		goto fail;
	drm_atomic_set_fb_for_plane(plane_state, fb);
@@ -1356,7 +1356,7 @@ int drm_atomic_helper_disable_plane(struct drm_plane *plane)
		goto fail;
	}

	ret = drm_atomic_set_crtc_for_plane(state, plane, NULL);
	ret = drm_atomic_set_crtc_for_plane(plane_state, NULL);
	if (ret != 0)
		goto fail;
	drm_atomic_set_fb_for_plane(plane_state, NULL);
@@ -1519,7 +1519,7 @@ int drm_atomic_helper_set_config(struct drm_mode_set *set)

		crtc_state->enable = false;

		ret = drm_atomic_set_crtc_for_plane(state, crtc->primary, NULL);
		ret = drm_atomic_set_crtc_for_plane(primary_state, NULL);
		if (ret != 0)
			goto fail;

@@ -1534,7 +1534,7 @@ int drm_atomic_helper_set_config(struct drm_mode_set *set)
	crtc_state->enable = true;
	drm_mode_copy(&crtc_state->mode, set->mode);

	ret = drm_atomic_set_crtc_for_plane(state, crtc->primary, crtc);
	ret = drm_atomic_set_crtc_for_plane(primary_state, crtc);
	if (ret != 0)
		goto fail;
	drm_atomic_set_fb_for_plane(primary_state, set->fb);
@@ -1806,7 +1806,7 @@ int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
		goto fail;
	}

	ret = drm_atomic_set_crtc_for_plane(state, plane, crtc);
	ret = drm_atomic_set_crtc_for_plane(plane_state, crtc);
	if (ret != 0)
		goto fail;
	drm_atomic_set_fb_for_plane(plane_state, fb);
@@ -1869,6 +1869,9 @@ void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc)
{
	kfree(crtc->state);
	crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL);

	if (crtc->state)
		crtc->state->crtc = crtc;
}
EXPORT_SYMBOL(drm_atomic_helper_crtc_reset);

@@ -1928,6 +1931,9 @@ void drm_atomic_helper_plane_reset(struct drm_plane *plane)

	kfree(plane->state);
	plane->state = kzalloc(sizeof(*plane->state), GFP_KERNEL);

	if (plane->state)
		plane->state->plane = plane;
}
EXPORT_SYMBOL(drm_atomic_helper_plane_reset);

@@ -1985,6 +1991,9 @@ void drm_atomic_helper_connector_reset(struct drm_connector *connector)
{
	kfree(connector->state);
	connector->state = kzalloc(sizeof(*connector->state), GFP_KERNEL);

	if (connector->state)
		connector->state->connector = connector;
}
EXPORT_SYMBOL(drm_atomic_helper_connector_reset);

+2 −0
Original line number Diff line number Diff line
@@ -946,6 +946,7 @@ int drm_helper_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mod
		crtc_state = kzalloc(sizeof(*crtc_state), GFP_KERNEL);
	if (!crtc_state)
		return -ENOMEM;
	crtc_state->crtc = crtc;

	crtc_state->enable = true;
	crtc_state->planes_changed = true;
@@ -1005,6 +1006,7 @@ int drm_helper_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
		plane_state = kzalloc(sizeof(*plane_state), GFP_KERNEL);
	if (!plane_state)
		return -ENOMEM;
	plane_state->plane = plane;

	plane_state->crtc = crtc;
	drm_atomic_set_fb_for_plane(plane_state, crtc->primary->fb);
+2 −0
Original line number Diff line number Diff line
@@ -517,6 +517,7 @@ int drm_plane_helper_update(struct drm_plane *plane, struct drm_crtc *crtc,
		plane_state = kzalloc(sizeof(*plane_state), GFP_KERNEL);
	if (!plane_state)
		return -ENOMEM;
	plane_state->plane = plane;

	plane_state->crtc = crtc;
	drm_atomic_set_fb_for_plane(plane_state, fb);
@@ -563,6 +564,7 @@ int drm_plane_helper_disable(struct drm_plane *plane)
		plane_state = kzalloc(sizeof(*plane_state), GFP_KERNEL);
	if (!plane_state)
		return -ENOMEM;
	plane_state->plane = plane;

	plane_state->crtc = NULL;
	drm_atomic_set_fb_for_plane(plane_state, NULL);
+1 −0
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ static void mdp5_plane_reset(struct drm_plane *plane)
	} else {
		mdp5_state->zpos = 1 + drm_plane_index(plane);
	}
	mdp5_state->base.plane = plane;

	plane->state = &mdp5_state->base;
}
Loading