Move the array of BRU inputs and the RPF BRU input index to the pipeline structure. This prepares the driver for the request API that will need to handle pipeline state for every request separately from the active state. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@xxxxxxxxxxxxxxxx> --- drivers/media/platform/vsp1/vsp1_bru.c | 4 ++-- drivers/media/platform/vsp1/vsp1_bru.h | 4 ---- drivers/media/platform/vsp1/vsp1_drm.c | 20 ++++++++++---------- drivers/media/platform/vsp1/vsp1_pipe.c | 12 ++++-------- drivers/media/platform/vsp1/vsp1_pipe.h | 11 +++++++++-- drivers/media/platform/vsp1/vsp1_rpf.c | 4 +++- drivers/media/platform/vsp1/vsp1_rwpf.h | 1 - drivers/media/platform/vsp1/vsp1_video.c | 21 ++++++++++----------- drivers/media/platform/vsp1/vsp1_wpf.c | 2 +- 9 files changed, 39 insertions(+), 40 deletions(-) diff --git a/drivers/media/platform/vsp1/vsp1_bru.c b/drivers/media/platform/vsp1/vsp1_bru.c index 841a5c402c99..f46fd79fc3be 100644 --- a/drivers/media/platform/vsp1/vsp1_bru.c +++ b/drivers/media/platform/vsp1/vsp1_bru.c @@ -363,10 +363,10 @@ static void bru_configure(struct vsp1_entity *entity, * disabled BRU inputs are used in ROP NOP mode to ignore the * SRC input. */ - if (bru->inputs[i].rpf) { + if (pipe->bru_inputs[i]) { ctrl |= VI6_BRU_CTRL_RBC; - premultiplied = bru->inputs[i].rpf->format.flags + premultiplied = pipe->bru_inputs[i]->format.flags & V4L2_PIX_FMT_FLAG_PREMUL_ALPHA; } else { ctrl |= VI6_BRU_CTRL_CROP(VI6_ROP_NOP) diff --git a/drivers/media/platform/vsp1/vsp1_bru.h b/drivers/media/platform/vsp1/vsp1_bru.h index 828a3fcadea8..4bb047f7ba52 100644 --- a/drivers/media/platform/vsp1/vsp1_bru.h +++ b/drivers/media/platform/vsp1/vsp1_bru.h @@ -29,10 +29,6 @@ struct vsp1_bru { struct v4l2_ctrl_handler ctrls; - struct { - struct vsp1_rwpf *rpf; - } inputs[VSP1_MAX_RPF]; - u32 bgcolor; }; diff --git a/drivers/media/platform/vsp1/vsp1_drm.c b/drivers/media/platform/vsp1/vsp1_drm.c index e9817ef8bd71..c2c127a30c5a 100644 --- a/drivers/media/platform/vsp1/vsp1_drm.c +++ b/drivers/media/platform/vsp1/vsp1_drm.c @@ -93,8 +93,8 @@ int vsp1_du_setup_lif(struct device *dev, unsigned int width, media_entity_pipeline_stop(&pipe->output->entity.subdev.entity); for (i = 0; i < bru->entity.source_pad; ++i) { - bru->inputs[i].rpf = NULL; - pipe->inputs[i] = NULL; + pipe->bru_inputs[i] = NULL; + pipe->inputs[i].rpf = NULL; } pipe->num_inputs = 0; @@ -290,12 +290,12 @@ int vsp1_du_atomic_update(struct device *dev, unsigned int rpf_index, spin_lock_irqsave(&pipe->irqlock, flags); - if (pipe->inputs[rpf_index]) { + if (pipe->inputs[rpf_index].rpf) { /* Remove the RPF from the pipeline if it was previously * enabled. */ - vsp1->bru->inputs[rpf_index].rpf = NULL; - pipe->inputs[rpf_index] = NULL; + pipe->bru_inputs[rpf_index] = NULL; + pipe->inputs[rpf_index].rpf = NULL; pipe->num_inputs--; } @@ -411,7 +411,7 @@ int vsp1_du_atomic_update(struct device *dev, unsigned int rpf_index, sel.pad); /* Store the BRU input pad number in the RPF. */ - rpf->bru_input = rpf->entity.index; + pipe->inputs[rpf->entity.index].bru_pad = rpf->entity.index; /* Cache the memory buffer address but don't apply the values to the * hardware as the crop offsets haven't been computed yet. @@ -425,9 +425,9 @@ int vsp1_du_atomic_update(struct device *dev, unsigned int rpf_index, /* If the RPF was previously stopped set the BRU input to the RPF and * store the RPF in the pipeline inputs array. */ - if (!pipe->inputs[rpf->entity.index]) { - vsp1->bru->inputs[rpf_index].rpf = rpf; - pipe->inputs[rpf->entity.index] = rpf; + if (!pipe->inputs[rpf->entity.index].rpf) { + pipe->bru_inputs[rpf_index] = rpf; + pipe->inputs[rpf->entity.index].rpf = rpf; pipe->num_inputs++; } @@ -454,7 +454,7 @@ void vsp1_du_atomic_flush(struct device *dev) if (entity->type == VSP1_ENTITY_RPF) { struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev); - if (!pipe->inputs[rpf->entity.index]) { + if (!pipe->inputs[rpf->entity.index].rpf) { vsp1_dl_list_write(pipe->dl, entity->route->reg, VI6_DPR_NODE_UNUSED); continue; diff --git a/drivers/media/platform/vsp1/vsp1_pipe.c b/drivers/media/platform/vsp1/vsp1_pipe.c index 1a9ca1dd9417..6c590b857812 100644 --- a/drivers/media/platform/vsp1/vsp1_pipe.c +++ b/drivers/media/platform/vsp1/vsp1_pipe.c @@ -164,16 +164,12 @@ void vsp1_pipeline_reset(struct vsp1_pipeline *pipe) { unsigned int i; - if (pipe->bru) { - struct vsp1_bru *bru = to_bru(&pipe->bru->subdev); - - for (i = 0; i < ARRAY_SIZE(bru->inputs); ++i) - bru->inputs[i].rpf = NULL; - } + for (i = 0; i < ARRAY_SIZE(pipe->bru_inputs); ++i) + pipe->bru_inputs[i] = NULL; for (i = 0; i < pipe->num_inputs; ++i) { - pipe->inputs[i]->pipe = NULL; - pipe->inputs[i] = NULL; + pipe->inputs[i].rpf->pipe = NULL; + pipe->inputs[i].rpf = NULL; } pipe->output->pipe = NULL; diff --git a/drivers/media/platform/vsp1/vsp1_pipe.h b/drivers/media/platform/vsp1/vsp1_pipe.h index 9fd688bfe638..5ef1a7f374d6 100644 --- a/drivers/media/platform/vsp1/vsp1_pipe.h +++ b/drivers/media/platform/vsp1/vsp1_pipe.h @@ -67,11 +67,13 @@ enum vsp1_pipeline_state { * @stream_count: number of streaming video nodes * @buffers_ready: bitmask of RPFs and WPFs with at least one buffer available * @num_inputs: number of RPFs - * @inputs: array of RPFs in the pipeline (indexed by RPF index) + * @inputs.rpf: RPFs in the pipeline (indexed by RPF index) + * @inputs.bru_pad: BRU input pad for each RPF (indexed by RPF index) * @output: WPF at the output of the pipeline * @bru: BRU entity, if present * @lif: LIF entity, if present * @uds: UDS entity, if present + * @bru_inputs: RPFs at the inputs of the BRU, if the BRU is present * @uds_input: entity at the input of the UDS, if the UDS is present * @entities: list of entities in the pipeline * @dl: display list associated with the pipeline @@ -91,11 +93,16 @@ struct vsp1_pipeline { unsigned int buffers_ready; unsigned int num_inputs; - struct vsp1_rwpf *inputs[VSP1_MAX_RPF]; + struct { + struct vsp1_rwpf *rpf; + unsigned int bru_pad; + } inputs[VSP1_MAX_RPF]; struct vsp1_rwpf *output; struct vsp1_entity *bru; struct vsp1_entity *lif; struct vsp1_entity *uds; + + struct vsp1_rwpf *bru_inputs[VSP1_MAX_RPF]; struct vsp1_entity *uds_input; struct list_head entities; diff --git a/drivers/media/platform/vsp1/vsp1_rpf.c b/drivers/media/platform/vsp1/vsp1_rpf.c index dd8995f6f9f8..13a853664853 100644 --- a/drivers/media/platform/vsp1/vsp1_rpf.c +++ b/drivers/media/platform/vsp1/vsp1_rpf.c @@ -134,10 +134,12 @@ static void rpf_configure(struct vsp1_entity *entity, if (pipe->bru) { struct v4l2_subdev_pad_config *bru_config; const struct v4l2_rect *compose; + unsigned int bru_pad; bru_config = vsp1_entity_get_req_pad_config(pipe->bru, req); + bru_pad = pipe->inputs[rpf->entity.index].bru_pad; compose = vsp1_entity_get_pad_compose(pipe->bru, bru_config, - rpf->bru_input); + bru_pad); left = compose->left; top = compose->top; } diff --git a/drivers/media/platform/vsp1/vsp1_rwpf.h b/drivers/media/platform/vsp1/vsp1_rwpf.h index a88589988b76..f8bfd26e0026 100644 --- a/drivers/media/platform/vsp1/vsp1_rwpf.h +++ b/drivers/media/platform/vsp1/vsp1_rwpf.h @@ -44,7 +44,6 @@ struct vsp1_rwpf { unsigned int max_height; struct v4l2_pix_format_mplane format; - unsigned int bru_input; unsigned int alpha; diff --git a/drivers/media/platform/vsp1/vsp1_video.c b/drivers/media/platform/vsp1/vsp1_video.c index 5c239b436bde..2d0cf154e45a 100644 --- a/drivers/media/platform/vsp1/vsp1_video.c +++ b/drivers/media/platform/vsp1/vsp1_video.c @@ -194,13 +194,11 @@ static int vsp1_video_pipeline_build_branch(struct vsp1_pipeline *pipe, entity = to_vsp1_entity(media_entity_to_v4l2_subdev(pad->entity)); /* A BRU is present in the pipeline, store the BRU input pad - * number in the input RPF for use when configuring the RPF. + * number for use when configuring the RPF. */ if (entity->type == VSP1_ENTITY_BRU) { - struct vsp1_bru *bru = to_bru(&entity->subdev); - - bru->inputs[pad->index].rpf = input; - input->bru_input = pad->index; + pipe->bru_inputs[pad->index] = input; + pipe->inputs[input->entity.index].bru_pad = pad->index; bru_found = true; } @@ -269,7 +267,7 @@ static int vsp1_video_pipeline_build(struct vsp1_pipeline *pipe, if (e->type == VSP1_ENTITY_RPF) { rwpf = to_rwpf(subdev); - pipe->inputs[rwpf->entity.index] = rwpf; + pipe->inputs[rwpf->entity.index].rpf = rwpf; rwpf->video->pipe_index = ++pipe->num_inputs; rwpf->pipe = pipe; } else if (e->type == VSP1_ENTITY_WPF) { @@ -296,10 +294,11 @@ static int vsp1_video_pipeline_build(struct vsp1_pipeline *pipe, * contains no loop and that all branches end at the output WPF. */ for (i = 0; i < video->vsp1->info->rpf_count; ++i) { - if (!pipe->inputs[i]) + if (!pipe->inputs[i].rpf) continue; - ret = vsp1_video_pipeline_build_branch(pipe, pipe->inputs[i], + ret = vsp1_video_pipeline_build_branch(pipe, + pipe->inputs[i].rpf, pipe->output); if (ret < 0) goto error; @@ -430,7 +429,7 @@ static void vsp1_video_pipeline_run(struct vsp1_pipeline *pipe) pipe->dl = vsp1_dl_list_get(pipe->output->dlm); for (i = 0; i < vsp1->info->rpf_count; ++i) { - struct vsp1_rwpf *rwpf = pipe->inputs[i]; + struct vsp1_rwpf *rwpf = pipe->inputs[i].rpf; if (rwpf) vsp1_rwpf_set_memory(rwpf, pipe->dl); @@ -454,10 +453,10 @@ static void vsp1_video_pipeline_frame_end(struct vsp1_pipeline *pipe) /* Complete buffers on all video nodes. */ for (i = 0; i < vsp1->info->rpf_count; ++i) { - if (!pipe->inputs[i]) + if (!pipe->inputs[i].rpf) continue; - vsp1_video_frame_end(pipe, pipe->inputs[i]); + vsp1_video_frame_end(pipe, pipe->inputs[i].rpf); } vsp1_video_frame_end(pipe, pipe->output); diff --git a/drivers/media/platform/vsp1/vsp1_wpf.c b/drivers/media/platform/vsp1/vsp1_wpf.c index f5e17b08860c..a7d94a76032c 100644 --- a/drivers/media/platform/vsp1/vsp1_wpf.c +++ b/drivers/media/platform/vsp1/vsp1_wpf.c @@ -164,7 +164,7 @@ static void wpf_configure(struct vsp1_entity *entity, * layer. */ for (i = 0; i < vsp1->info->rpf_count; ++i) { - struct vsp1_rwpf *input = pipe->inputs[i]; + struct vsp1_rwpf *input = pipe->inputs[i].rpf; if (!input) continue; -- 2.4.10