|
@@ -168,6 +168,43 @@ static int __vsp1_video_try_format(struct vsp1_video *video,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/* -----------------------------------------------------------------------------
|
|
|
+ * VSP1 Partition Algorithm support
|
|
|
+ */
|
|
|
+
|
|
|
+static void vsp1_video_pipeline_setup_partitions(struct vsp1_pipeline *pipe)
|
|
|
+{
|
|
|
+ struct vsp1_device *vsp1 = pipe->output->entity.vsp1;
|
|
|
+ const struct v4l2_mbus_framefmt *format;
|
|
|
+ struct vsp1_entity *entity;
|
|
|
+ unsigned int div_size;
|
|
|
+
|
|
|
+ format = vsp1_entity_get_pad_format(&pipe->output->entity,
|
|
|
+ pipe->output->entity.config,
|
|
|
+ RWPF_PAD_SOURCE);
|
|
|
+ div_size = format->width;
|
|
|
+
|
|
|
+ /* Gen2 hardware doesn't require image partitioning. */
|
|
|
+ if (vsp1->info->gen == 2) {
|
|
|
+ pipe->div_size = div_size;
|
|
|
+ pipe->partitions = 1;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ list_for_each_entry(entity, &pipe->entities, list_pipe) {
|
|
|
+ unsigned int entity_max = VSP1_VIDEO_MAX_WIDTH;
|
|
|
+
|
|
|
+ if (entity->ops->max_width) {
|
|
|
+ entity_max = entity->ops->max_width(entity, pipe);
|
|
|
+ if (entity_max)
|
|
|
+ div_size = min(div_size, entity_max);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ pipe->div_size = div_size;
|
|
|
+ pipe->partitions = DIV_ROUND_UP(format->width, div_size);
|
|
|
+}
|
|
|
+
|
|
|
/* -----------------------------------------------------------------------------
|
|
|
* Pipeline Management
|
|
|
*/
|
|
@@ -594,6 +631,9 @@ static int vsp1_video_setup_pipeline(struct vsp1_pipeline *pipe)
|
|
|
{
|
|
|
struct vsp1_entity *entity;
|
|
|
|
|
|
+ /* Determine this pipelines sizes for image partitioning support. */
|
|
|
+ vsp1_video_pipeline_setup_partitions(pipe);
|
|
|
+
|
|
|
/* Prepare the display list. */
|
|
|
pipe->dl = vsp1_dl_list_get(pipe->output->dlm);
|
|
|
if (!pipe->dl)
|