Commit 41be7fcc authored by Laurent Pinchart's avatar Laurent Pinchart

media: renesas: vsp1: Replace vsp1_partition_window with v4l2_rect

The vsp1_partition_window structure is used to store the horizontal size
of a partition window. This is all that is currently needed, as all
partitions span the whole image vertically. The horizontal window size
is retrieved in the .configure_partition() handler from the
vsp1_partition_window structure, and the vertical window size from the
subdev state.

Accessing the subdev state in the .configure_partition() handler is
problematic in the context of moving to the V4L2 subdev active state
API, as .configure_partition() is called in non-interruptable context,
and the state lock can't be taken. To avoid this, start by storing the
vertical size in the window, replacing the custom vsp1_partition_window
structure with a v4l2_rect. Retrieving the vertical size from the window
in .configure_partition() will be done in a subsequent change.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: default avatarJacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
parent 2d7e5d80
...@@ -19,7 +19,6 @@ struct vsp1_dl_body; ...@@ -19,7 +19,6 @@ struct vsp1_dl_body;
struct vsp1_dl_list; struct vsp1_dl_list;
struct vsp1_pipeline; struct vsp1_pipeline;
struct vsp1_partition; struct vsp1_partition;
struct vsp1_partition_window;
enum vsp1_entity_type { enum vsp1_entity_type {
VSP1_ENTITY_BRS, VSP1_ENTITY_BRS,
...@@ -91,7 +90,7 @@ struct vsp1_entity_operations { ...@@ -91,7 +90,7 @@ struct vsp1_entity_operations {
unsigned int (*max_width)(struct vsp1_entity *, struct vsp1_pipeline *); unsigned int (*max_width)(struct vsp1_entity *, struct vsp1_pipeline *);
void (*partition)(struct vsp1_entity *, struct vsp1_pipeline *, void (*partition)(struct vsp1_entity *, struct vsp1_pipeline *,
struct vsp1_partition *, unsigned int, struct vsp1_partition *, unsigned int,
struct vsp1_partition_window *); struct v4l2_rect *);
}; };
struct vsp1_entity { struct vsp1_entity {
......
...@@ -459,7 +459,7 @@ void vsp1_pipeline_propagate_alpha(struct vsp1_pipeline *pipe, ...@@ -459,7 +459,7 @@ void vsp1_pipeline_propagate_alpha(struct vsp1_pipeline *pipe,
static void vsp1_pipeline_propagate_partition(struct vsp1_pipeline *pipe, static void vsp1_pipeline_propagate_partition(struct vsp1_pipeline *pipe,
struct vsp1_partition *partition, struct vsp1_partition *partition,
unsigned int index, unsigned int index,
struct vsp1_partition_window *window) struct v4l2_rect *window)
{ {
struct vsp1_entity *entity; struct vsp1_entity *entity;
...@@ -485,7 +485,7 @@ void vsp1_pipeline_calculate_partition(struct vsp1_pipeline *pipe, ...@@ -485,7 +485,7 @@ void vsp1_pipeline_calculate_partition(struct vsp1_pipeline *pipe,
unsigned int index) unsigned int index)
{ {
const struct v4l2_mbus_framefmt *format; const struct v4l2_mbus_framefmt *format;
struct vsp1_partition_window window; struct v4l2_rect window;
unsigned int modulus; unsigned int modulus;
/* /*
...@@ -498,6 +498,8 @@ void vsp1_pipeline_calculate_partition(struct vsp1_pipeline *pipe, ...@@ -498,6 +498,8 @@ void vsp1_pipeline_calculate_partition(struct vsp1_pipeline *pipe,
/* Initialise the partition with sane starting conditions. */ /* Initialise the partition with sane starting conditions. */
window.left = index * div_size; window.left = index * div_size;
window.width = div_size; window.width = div_size;
window.top = 0;
window.height = format->height;
modulus = format->width % div_size; modulus = format->width % div_size;
......
...@@ -53,17 +53,6 @@ enum vsp1_pipeline_state { ...@@ -53,17 +53,6 @@ enum vsp1_pipeline_state {
VSP1_PIPELINE_STOPPING, VSP1_PIPELINE_STOPPING,
}; };
/*
* struct vsp1_partition_window - Partition window coordinates
* @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_window {
unsigned int left;
unsigned int width;
};
/* /*
* struct vsp1_partition - A description of a slice for the partition algorithm * struct vsp1_partition - A description of a slice for the partition algorithm
* @rpf: The RPF partition window configuration * @rpf: The RPF partition window configuration
...@@ -73,11 +62,11 @@ struct vsp1_partition_window { ...@@ -73,11 +62,11 @@ struct vsp1_partition_window {
* @wpf: The WPF partition window configuration * @wpf: The WPF partition window configuration
*/ */
struct vsp1_partition { struct vsp1_partition {
struct vsp1_partition_window rpf[VSP1_MAX_RPF]; struct v4l2_rect rpf[VSP1_MAX_RPF];
struct vsp1_partition_window uds_sink; struct v4l2_rect uds_sink;
struct vsp1_partition_window uds_source; struct v4l2_rect uds_source;
struct vsp1_partition_window sru; struct v4l2_rect sru;
struct vsp1_partition_window wpf; struct v4l2_rect wpf;
}; };
/* /*
......
...@@ -366,7 +366,7 @@ static void rpf_partition(struct vsp1_entity *entity, ...@@ -366,7 +366,7 @@ static void rpf_partition(struct vsp1_entity *entity,
struct vsp1_pipeline *pipe, struct vsp1_pipeline *pipe,
struct vsp1_partition *partition, struct vsp1_partition *partition,
unsigned int partition_idx, unsigned int partition_idx,
struct vsp1_partition_window *window) struct v4l2_rect *window)
{ {
struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev); struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev);
......
...@@ -323,7 +323,7 @@ static void sru_partition(struct vsp1_entity *entity, ...@@ -323,7 +323,7 @@ static void sru_partition(struct vsp1_entity *entity,
struct vsp1_pipeline *pipe, struct vsp1_pipeline *pipe,
struct vsp1_partition *partition, struct vsp1_partition *partition,
unsigned int partition_idx, unsigned int partition_idx,
struct vsp1_partition_window *window) struct v4l2_rect *window)
{ {
struct vsp1_sru *sru = to_sru(&entity->subdev); struct vsp1_sru *sru = to_sru(&entity->subdev);
struct v4l2_mbus_framefmt *input; struct v4l2_mbus_framefmt *input;
...@@ -337,6 +337,8 @@ static void sru_partition(struct vsp1_entity *entity, ...@@ -337,6 +337,8 @@ static void sru_partition(struct vsp1_entity *entity,
if (input->width != output->width) { if (input->width != output->width) {
window->width /= 2; window->width /= 2;
window->left /= 2; window->left /= 2;
window->height /= 2;
window->top /= 2;
} }
partition->sru = *window; partition->sru = *window;
......
...@@ -363,16 +363,12 @@ static void uds_partition(struct vsp1_entity *entity, ...@@ -363,16 +363,12 @@ static void uds_partition(struct vsp1_entity *entity,
struct vsp1_pipeline *pipe, struct vsp1_pipeline *pipe,
struct vsp1_partition *partition, struct vsp1_partition *partition,
unsigned int partition_idx, unsigned int partition_idx,
struct vsp1_partition_window *window) struct v4l2_rect *window)
{ {
struct vsp1_uds *uds = to_uds(&entity->subdev); struct vsp1_uds *uds = to_uds(&entity->subdev);
const struct v4l2_mbus_framefmt *output; const struct v4l2_mbus_framefmt *output;
const struct v4l2_mbus_framefmt *input; const struct v4l2_mbus_framefmt *input;
/* Initialise the partition state. */
partition->uds_sink = *window;
partition->uds_source = *window;
input = v4l2_subdev_state_get_format(uds->entity.state, UDS_PAD_SINK); input = v4l2_subdev_state_get_format(uds->entity.state, UDS_PAD_SINK);
output = v4l2_subdev_state_get_format(uds->entity.state, output = v4l2_subdev_state_get_format(uds->entity.state,
UDS_PAD_SOURCE); UDS_PAD_SOURCE);
...@@ -381,6 +377,10 @@ static void uds_partition(struct vsp1_entity *entity, ...@@ -381,6 +377,10 @@ static void uds_partition(struct vsp1_entity *entity,
/ output->width; / output->width;
partition->uds_sink.left = window->left * input->width partition->uds_sink.left = window->left * input->width
/ output->width; / output->width;
partition->uds_sink.height = input->height;
partition->uds_sink.top = 0;
partition->uds_source = *window;
*window = partition->uds_sink; *window = partition->uds_sink;
} }
......
...@@ -515,7 +515,7 @@ static void wpf_partition(struct vsp1_entity *entity, ...@@ -515,7 +515,7 @@ static void wpf_partition(struct vsp1_entity *entity,
struct vsp1_pipeline *pipe, struct vsp1_pipeline *pipe,
struct vsp1_partition *partition, struct vsp1_partition *partition,
unsigned int partition_idx, unsigned int partition_idx,
struct vsp1_partition_window *window) struct v4l2_rect *window)
{ {
partition->wpf = *window; partition->wpf = *window;
} }
......
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