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

Commit 70e8a0c7 authored by Lucas Stach's avatar Lucas Stach Committed by Philipp Zabel
Browse files

drm/imx: ipuv3-plane: add function to query atomic update status



This function allows upper layer to check if a requested atomic update
to the plane has been applied or is still pending.

Signed-off-by: default avatarLucas Stach <l.stach@pengutronix.de>
[p.zabel@pengutronix.de: inverted logic: done -> pending]
Signed-off-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
parent 4bfbd561
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -582,6 +582,7 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
		active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch);
		ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba);
		ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active);
		ipu_plane->next_buf = !active;
		if (ipu_plane_separate_alpha(ipu_plane)) {
			active = ipu_idmac_get_current_buffer(ipu_plane->alpha_ch);
			ipu_cpmem_set_buffer(ipu_plane->alpha_ch, !active,
@@ -709,6 +710,7 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
	ipu_cpmem_set_buffer(ipu_plane->ipu_ch, 1, eba);
	ipu_idmac_lock_enable(ipu_plane->ipu_ch, num_bursts);
	ipu_plane_enable(ipu_plane);
	ipu_plane->next_buf = -1;
}

static const struct drm_plane_helper_funcs ipu_plane_helper_funcs = {
@@ -718,6 +720,24 @@ static const struct drm_plane_helper_funcs ipu_plane_helper_funcs = {
	.atomic_update = ipu_plane_atomic_update,
};

bool ipu_plane_atomic_update_pending(struct drm_plane *plane)
{
	struct ipu_plane *ipu_plane = to_ipu_plane(plane);
	struct drm_plane_state *state = plane->state;
	struct ipu_plane_state *ipu_state = to_ipu_plane_state(state);

	/* disabled crtcs must not block the update */
	if (!state->crtc)
		return false;

	if (ipu_state->use_pre)
		return ipu_prg_channel_configure_pending(ipu_plane->ipu_ch);
	else if (ipu_plane->next_buf >= 0)
		return ipu_idmac_get_current_buffer(ipu_plane->ipu_ch) !=
		       ipu_plane->next_buf;

	return false;
}
int ipu_planes_assign_pre(struct drm_device *dev,
			  struct drm_atomic_state *state)
{
+2 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ struct ipu_plane {
	int			dp_flow;

	bool			disabling;
	int			next_buf;
};

struct ipu_plane *ipu_plane_init(struct drm_device *dev, struct ipu_soc *ipu,
@@ -48,5 +49,6 @@ int ipu_plane_irq(struct ipu_plane *plane);

void ipu_plane_disable(struct ipu_plane *ipu_plane, bool disable_dp_channel);
void ipu_plane_disable_deferred(struct drm_plane *plane);
bool ipu_plane_atomic_update_pending(struct drm_plane *plane);

#endif