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: Lucas Stach <l.stach@pengutronix.de> [p.zabel@pengutronix.de: inverted logic: done -> pending] Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
This commit is contained in:
Родитель
4bfbd561fc
Коммит
70e8a0c71e
drivers/gpu/drm/imx
|
@ -582,6 +582,7 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
|
||||||
active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch);
|
active = ipu_idmac_get_current_buffer(ipu_plane->ipu_ch);
|
||||||
ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba);
|
ipu_cpmem_set_buffer(ipu_plane->ipu_ch, !active, eba);
|
||||||
ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active);
|
ipu_idmac_select_buffer(ipu_plane->ipu_ch, !active);
|
||||||
|
ipu_plane->next_buf = !active;
|
||||||
if (ipu_plane_separate_alpha(ipu_plane)) {
|
if (ipu_plane_separate_alpha(ipu_plane)) {
|
||||||
active = ipu_idmac_get_current_buffer(ipu_plane->alpha_ch);
|
active = ipu_idmac_get_current_buffer(ipu_plane->alpha_ch);
|
||||||
ipu_cpmem_set_buffer(ipu_plane->alpha_ch, !active,
|
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_cpmem_set_buffer(ipu_plane->ipu_ch, 1, eba);
|
||||||
ipu_idmac_lock_enable(ipu_plane->ipu_ch, num_bursts);
|
ipu_idmac_lock_enable(ipu_plane->ipu_ch, num_bursts);
|
||||||
ipu_plane_enable(ipu_plane);
|
ipu_plane_enable(ipu_plane);
|
||||||
|
ipu_plane->next_buf = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct drm_plane_helper_funcs ipu_plane_helper_funcs = {
|
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,
|
.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,
|
int ipu_planes_assign_pre(struct drm_device *dev,
|
||||||
struct drm_atomic_state *state)
|
struct drm_atomic_state *state)
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,6 +27,7 @@ struct ipu_plane {
|
||||||
int dp_flow;
|
int dp_flow;
|
||||||
|
|
||||||
bool disabling;
|
bool disabling;
|
||||||
|
int next_buf;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ipu_plane *ipu_plane_init(struct drm_device *dev, struct ipu_soc *ipu,
|
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(struct ipu_plane *ipu_plane, bool disable_dp_channel);
|
||||||
void ipu_plane_disable_deferred(struct drm_plane *plane);
|
void ipu_plane_disable_deferred(struct drm_plane *plane);
|
||||||
|
bool ipu_plane_atomic_update_pending(struct drm_plane *plane);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Загрузка…
Ссылка в новой задаче