Commit 40650268 authored by Kieran Bingham's avatar Kieran Bingham Committed by Mauro Carvalho Chehab

media: v4l: vsp1: Move partition rectangles to struct and operate directly

As we develop the partition algorithm, we need to store more information
per partition to describe the phase and other parameters.

To keep this data together, further abstract the existing v4l2_rect
into a partition specific structure. As partitions only have horizontal
coordinates, store the left and width values only.

When generating the partition windows, operate directly on the partition
struct rather than copying and duplicating the processed data
Signed-off-by: default avatarKieran Bingham <kieran.bingham+renesas@ideasonboard.com>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarHans Verkuil <hansverk@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 62dad91c
...@@ -57,6 +57,17 @@ enum vsp1_pipeline_state { ...@@ -57,6 +57,17 @@ enum vsp1_pipeline_state {
VSP1_PIPELINE_STOPPING, VSP1_PIPELINE_STOPPING,
}; };
/*
* struct vsp1_partition - A description of a slice for the partition algorithm
* @left: horizontal coordinate of the partition start in pixels relative to the
* left edge of the image
* @width: partition width in pixels
*/
struct vsp1_partition {
unsigned int left;
unsigned int width;
};
/* /*
* struct vsp1_pipeline - A VSP1 hardware pipeline * struct vsp1_pipeline - A VSP1 hardware pipeline
* @pipe: the media pipeline * @pipe: the media pipeline
...@@ -114,8 +125,8 @@ struct vsp1_pipeline { ...@@ -114,8 +125,8 @@ struct vsp1_pipeline {
struct vsp1_dl_list *dl; struct vsp1_dl_list *dl;
unsigned int partitions; unsigned int partitions;
struct v4l2_rect partition; struct vsp1_partition *partition;
struct v4l2_rect *part_table; struct vsp1_partition *part_table;
}; };
void vsp1_pipeline_reset(struct vsp1_pipeline *pipe); void vsp1_pipeline_reset(struct vsp1_pipeline *pipe);
......
...@@ -108,9 +108,9 @@ static void rpf_configure(struct vsp1_entity *entity, ...@@ -108,9 +108,9 @@ static void rpf_configure(struct vsp1_entity *entity,
output = vsp1_entity_get_pad_format(wpf, wpf->config, output = vsp1_entity_get_pad_format(wpf, wpf->config,
RWPF_PAD_SINK); RWPF_PAD_SINK);
crop.width = pipe->partition.width * input_width crop.width = pipe->partition->width * input_width
/ output->width; / output->width;
crop.left += pipe->partition.left * input_width crop.left += pipe->partition->left * input_width
/ output->width; / output->width;
} }
......
...@@ -271,23 +271,25 @@ static void uds_configure(struct vsp1_entity *entity, ...@@ -271,23 +271,25 @@ static void uds_configure(struct vsp1_entity *entity,
unsigned int vscale; unsigned int vscale;
bool multitap; bool multitap;
input = vsp1_entity_get_pad_format(&uds->entity, uds->entity.config,
UDS_PAD_SINK);
output = vsp1_entity_get_pad_format(&uds->entity, uds->entity.config,
UDS_PAD_SOURCE);
if (params == VSP1_ENTITY_PARAMS_PARTITION) { if (params == VSP1_ENTITY_PARAMS_PARTITION) {
const struct v4l2_rect *clip = &pipe->partition; struct vsp1_partition *partition = pipe->partition;
vsp1_uds_write(uds, dl, VI6_UDS_CLIP_SIZE, vsp1_uds_write(uds, dl, VI6_UDS_CLIP_SIZE,
(clip->width << VI6_UDS_CLIP_SIZE_HSIZE_SHIFT) | (partition->width
(clip->height << VI6_UDS_CLIP_SIZE_VSIZE_SHIFT)); << VI6_UDS_CLIP_SIZE_HSIZE_SHIFT) |
(output->height
<< VI6_UDS_CLIP_SIZE_VSIZE_SHIFT));
return; return;
} }
if (params != VSP1_ENTITY_PARAMS_INIT) if (params != VSP1_ENTITY_PARAMS_INIT)
return; return;
input = vsp1_entity_get_pad_format(&uds->entity, uds->entity.config,
UDS_PAD_SINK);
output = vsp1_entity_get_pad_format(&uds->entity, uds->entity.config,
UDS_PAD_SOURCE);
hscale = uds_compute_ratio(input->width, output->width); hscale = uds_compute_ratio(input->width, output->width);
vscale = uds_compute_ratio(input->height, output->height); vscale = uds_compute_ratio(input->height, output->height);
......
...@@ -183,19 +183,19 @@ static int __vsp1_video_try_format(struct vsp1_video *video, ...@@ -183,19 +183,19 @@ static int __vsp1_video_try_format(struct vsp1_video *video,
*/ */
/** /**
* vsp1_video_partition - Calculate the active partition output window * vsp1_video_calculate_partition - Calculate the active partition output window
* *
* @pipe: the pipeline
* @partition: partition that will hold the calculated values
* @div_size: pre-determined maximum partition division size * @div_size: pre-determined maximum partition division size
* @index: partition index * @index: partition index
*
* Returns a v4l2_rect describing the partition window.
*/ */
static struct v4l2_rect vsp1_video_partition(struct vsp1_pipeline *pipe, static void vsp1_video_calculate_partition(struct vsp1_pipeline *pipe,
unsigned int div_size, struct vsp1_partition *partition,
unsigned int index) unsigned int div_size,
unsigned int index)
{ {
const struct v4l2_mbus_framefmt *format; const struct v4l2_mbus_framefmt *format;
struct v4l2_rect partition;
unsigned int modulus; unsigned int modulus;
/* /*
...@@ -208,18 +208,14 @@ static struct v4l2_rect vsp1_video_partition(struct vsp1_pipeline *pipe, ...@@ -208,18 +208,14 @@ static struct v4l2_rect vsp1_video_partition(struct vsp1_pipeline *pipe,
/* A single partition simply processes the output size in full. */ /* A single partition simply processes the output size in full. */
if (pipe->partitions <= 1) { if (pipe->partitions <= 1) {
partition.left = 0; partition->left = 0;
partition.top = 0; partition->width = format->width;
partition.width = format->width; return;
partition.height = format->height;
return partition;
} }
/* Initialise the partition with sane starting conditions. */ /* Initialise the partition with sane starting conditions. */
partition.left = index * div_size; partition->left = index * div_size;
partition.top = 0; partition->width = div_size;
partition.width = div_size;
partition.height = format->height;
modulus = format->width % div_size; modulus = format->width % div_size;
...@@ -242,18 +238,16 @@ static struct v4l2_rect vsp1_video_partition(struct vsp1_pipeline *pipe, ...@@ -242,18 +238,16 @@ static struct v4l2_rect vsp1_video_partition(struct vsp1_pipeline *pipe,
if (modulus < div_size / 2) { if (modulus < div_size / 2) {
if (index == partitions - 1) { if (index == partitions - 1) {
/* Halve the penultimate partition. */ /* Halve the penultimate partition. */
partition.width = div_size / 2; partition->width = div_size / 2;
} else if (index == partitions) { } else if (index == partitions) {
/* Increase the final partition. */ /* Increase the final partition. */
partition.width = (div_size / 2) + modulus; partition->width = (div_size / 2) + modulus;
partition.left -= div_size / 2; partition->left -= div_size / 2;
} }
} else if (index == partitions) { } else if (index == partitions) {
partition.width = modulus; partition->width = modulus;
} }
} }
return partition;
} }
static int vsp1_video_pipeline_setup_partitions(struct vsp1_pipeline *pipe) static int vsp1_video_pipeline_setup_partitions(struct vsp1_pipeline *pipe)
...@@ -297,7 +291,8 @@ static int vsp1_video_pipeline_setup_partitions(struct vsp1_pipeline *pipe) ...@@ -297,7 +291,8 @@ static int vsp1_video_pipeline_setup_partitions(struct vsp1_pipeline *pipe)
return -ENOMEM; return -ENOMEM;
for (i = 0; i < pipe->partitions; ++i) for (i = 0; i < pipe->partitions; ++i)
pipe->part_table[i] = vsp1_video_partition(pipe, div_size, i); vsp1_video_calculate_partition(pipe, &pipe->part_table[i],
div_size, i);
return 0; return 0;
} }
...@@ -383,7 +378,7 @@ static void vsp1_video_pipeline_run_partition(struct vsp1_pipeline *pipe, ...@@ -383,7 +378,7 @@ static void vsp1_video_pipeline_run_partition(struct vsp1_pipeline *pipe,
{ {
struct vsp1_entity *entity; struct vsp1_entity *entity;
pipe->partition = pipe->part_table[partition]; pipe->partition = &pipe->part_table[partition];
list_for_each_entry(entity, &pipe->entities, list_pipe) { list_for_each_entry(entity, &pipe->entities, list_pipe) {
if (entity->ops->configure) if (entity->ops->configure)
......
...@@ -291,7 +291,7 @@ static void wpf_configure(struct vsp1_entity *entity, ...@@ -291,7 +291,7 @@ static void wpf_configure(struct vsp1_entity *entity,
* multiple slices. * multiple slices.
*/ */
if (pipe->partitions > 1) if (pipe->partitions > 1)
width = pipe->partition.width; width = pipe->partition->width;
vsp1_wpf_write(wpf, dl, VI6_WPF_HSZCLIP, VI6_WPF_SZCLIP_EN | vsp1_wpf_write(wpf, dl, VI6_WPF_HSZCLIP, VI6_WPF_SZCLIP_EN |
(0 << VI6_WPF_SZCLIP_OFST_SHIFT) | (0 << VI6_WPF_SZCLIP_OFST_SHIFT) |
...@@ -320,13 +320,13 @@ static void wpf_configure(struct vsp1_entity *entity, ...@@ -320,13 +320,13 @@ static void wpf_configure(struct vsp1_entity *entity,
* is applied horizontally or vertically accordingly. * is applied horizontally or vertically accordingly.
*/ */
if (flip & BIT(WPF_CTRL_HFLIP) && !wpf->flip.rotate) if (flip & BIT(WPF_CTRL_HFLIP) && !wpf->flip.rotate)
offset = format->width - pipe->partition.left offset = format->width - pipe->partition->left
- pipe->partition.width; - pipe->partition->width;
else if (flip & BIT(WPF_CTRL_VFLIP) && wpf->flip.rotate) else if (flip & BIT(WPF_CTRL_VFLIP) && wpf->flip.rotate)
offset = format->height - pipe->partition.left offset = format->height - pipe->partition->left
- pipe->partition.width; - pipe->partition->width;
else else
offset = pipe->partition.left; offset = pipe->partition->left;
for (i = 0; i < format->num_planes; ++i) { for (i = 0; i < format->num_planes; ++i) {
unsigned int hsub = i > 0 ? fmtinfo->hsub : 1; unsigned int hsub = i > 0 ? fmtinfo->hsub : 1;
...@@ -348,7 +348,7 @@ static void wpf_configure(struct vsp1_entity *entity, ...@@ -348,7 +348,7 @@ static void wpf_configure(struct vsp1_entity *entity,
* image height. * image height.
*/ */
if (wpf->flip.rotate) if (wpf->flip.rotate)
height = pipe->partition.width; height = pipe->partition->width;
else else
height = format->height; height = format->height;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment