media: v4l: vsp1: Turn frame end completion status into a bitfield

We will soon need to return more than a boolean completion status from
the vsp1_dlm_irq_frame_end() IRQ handler. Turn the return value into a
bitfield to prepare for that. No functional change is introduced here.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
Laurent Pinchart 2018-04-04 17:30:49 -04:00 committed by Mauro Carvalho Chehab
parent 5a4d566a5b
commit bbc56faf3c
6 changed files with 26 additions and 19 deletions

View File

@ -616,14 +616,18 @@ void vsp1_dl_list_commit(struct vsp1_dl_list *dl)
* vsp1_dlm_irq_frame_end - Display list handler for the frame end interrupt
* @dlm: the display list manager
*
* Return true if the previous display list has completed at frame end, or false
* if it has been delayed by one frame because the display list commit raced
* with the frame end interrupt. The function always returns true in header mode
* as display list processing is then not continuous and races never occur.
* Return a set of flags that indicates display list completion status.
*
* The VSP1_DL_FRAME_END_COMPLETED flag indicates that the previous display list
* has completed at frame end. If the flag is not returned display list
* completion has been delayed by one frame because the display list commit
* raced with the frame end interrupt. The function always returns with the flag
* set in header mode as display list processing is then not continuous and
* races never occur.
*/
bool vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm)
unsigned int vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm)
{
bool completed = false;
unsigned int flags = 0;
spin_lock(&dlm->lock);
@ -634,7 +638,7 @@ bool vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm)
if (dlm->singleshot) {
__vsp1_dl_list_put(dlm->active);
dlm->active = NULL;
completed = true;
flags |= VSP1_DL_FRAME_END_COMPLETED;
goto done;
}
@ -655,7 +659,7 @@ bool vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm)
__vsp1_dl_list_put(dlm->active);
dlm->active = dlm->queued;
dlm->queued = NULL;
completed = true;
flags |= VSP1_DL_FRAME_END_COMPLETED;
}
/*
@ -672,7 +676,7 @@ bool vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm)
done:
spin_unlock(&dlm->lock);
return completed;
return flags;
}
/* Hardware Setup */

View File

@ -20,6 +20,8 @@ struct vsp1_dl_fragment;
struct vsp1_dl_list;
struct vsp1_dl_manager;
#define VSP1_DL_FRAME_END_COMPLETED BIT(0)
void vsp1_dlm_setup(struct vsp1_device *vsp1);
struct vsp1_dl_manager *vsp1_dlm_create(struct vsp1_device *vsp1,
@ -27,7 +29,7 @@ struct vsp1_dl_manager *vsp1_dlm_create(struct vsp1_device *vsp1,
unsigned int prealloc);
void vsp1_dlm_destroy(struct vsp1_dl_manager *dlm);
void vsp1_dlm_reset(struct vsp1_dl_manager *dlm);
bool vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm);
unsigned int vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm);
struct vsp1_dl_list *vsp1_dl_list_get(struct vsp1_dl_manager *dlm);
void vsp1_dl_list_put(struct vsp1_dl_list *dl);

View File

@ -34,12 +34,13 @@
*/
static void vsp1_du_pipeline_frame_end(struct vsp1_pipeline *pipe,
bool completed)
unsigned int completion)
{
struct vsp1_drm_pipeline *drm_pipe = to_vsp1_drm_pipeline(pipe);
if (drm_pipe->du_complete)
drm_pipe->du_complete(drm_pipe->du_private, completed);
drm_pipe->du_complete(drm_pipe->du_private,
completion & VSP1_DL_FRAME_END_COMPLETED);
}
/* -----------------------------------------------------------------------------

View File

@ -315,17 +315,17 @@ bool vsp1_pipeline_ready(struct vsp1_pipeline *pipe)
void vsp1_pipeline_frame_end(struct vsp1_pipeline *pipe)
{
bool completed;
unsigned int flags;
if (pipe == NULL)
return;
/*
* If the DL commit raced with the frame end interrupt, the commit ends
* up being postponed by one frame. @completed represents whether the
* up being postponed by one frame. The returned flags tell whether the
* active frame was finished or postponed.
*/
completed = vsp1_dlm_irq_frame_end(pipe->output->dlm);
flags = vsp1_dlm_irq_frame_end(pipe->output->dlm);
if (pipe->hgo)
vsp1_hgo_frame_end(pipe->hgo);
@ -338,7 +338,7 @@ void vsp1_pipeline_frame_end(struct vsp1_pipeline *pipe)
* frame_end to account for vblank events.
*/
if (pipe->frame_end)
pipe->frame_end(pipe, completed);
pipe->frame_end(pipe, flags);
pipe->sequence++;
}

View File

@ -118,7 +118,7 @@ struct vsp1_pipeline {
enum vsp1_pipeline_state state;
wait_queue_head_t wq;
void (*frame_end)(struct vsp1_pipeline *pipe, bool completed);
void (*frame_end)(struct vsp1_pipeline *pipe, unsigned int completion);
struct mutex lock;
struct kref kref;

View File

@ -444,7 +444,7 @@ static void vsp1_video_pipeline_run(struct vsp1_pipeline *pipe)
}
static void vsp1_video_pipeline_frame_end(struct vsp1_pipeline *pipe,
bool completed)
unsigned int completion)
{
struct vsp1_device *vsp1 = pipe->output->entity.vsp1;
enum vsp1_pipeline_state state;
@ -452,7 +452,7 @@ static void vsp1_video_pipeline_frame_end(struct vsp1_pipeline *pipe,
unsigned int i;
/* M2M Pipelines should never call here with an incomplete frame. */
WARN_ON_ONCE(!completed);
WARN_ON_ONCE(!(completion & VSP1_DL_FRAME_END_COMPLETED));
spin_lock_irqsave(&pipe->irqlock, flags);