xref: /openbmc/linux/drivers/media/platform/renesas/vsp1/vsp1_pipe.h (revision 7e24a55b2122746c2eef192296fc84624354f895)
1ee4a77a3SMauro Carvalho Chehab /* SPDX-License-Identifier: GPL-2.0+ */
2ee4a77a3SMauro Carvalho Chehab /*
3ee4a77a3SMauro Carvalho Chehab  * vsp1_pipe.h  --  R-Car VSP1 Pipeline
4ee4a77a3SMauro Carvalho Chehab  *
5ee4a77a3SMauro Carvalho Chehab  * Copyright (C) 2013-2015 Renesas Electronics Corporation
6ee4a77a3SMauro Carvalho Chehab  *
7ee4a77a3SMauro Carvalho Chehab  * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
8ee4a77a3SMauro Carvalho Chehab  */
9ee4a77a3SMauro Carvalho Chehab #ifndef __VSP1_PIPE_H__
10ee4a77a3SMauro Carvalho Chehab #define __VSP1_PIPE_H__
11ee4a77a3SMauro Carvalho Chehab 
12ee4a77a3SMauro Carvalho Chehab #include <linux/kref.h>
13ee4a77a3SMauro Carvalho Chehab #include <linux/list.h>
14ee4a77a3SMauro Carvalho Chehab #include <linux/spinlock.h>
15ee4a77a3SMauro Carvalho Chehab #include <linux/wait.h>
16ee4a77a3SMauro Carvalho Chehab 
17ee4a77a3SMauro Carvalho Chehab #include <media/media-entity.h>
18ee4a77a3SMauro Carvalho Chehab 
19ee4a77a3SMauro Carvalho Chehab struct vsp1_dl_list;
20ee4a77a3SMauro Carvalho Chehab struct vsp1_rwpf;
21ee4a77a3SMauro Carvalho Chehab 
22ee4a77a3SMauro Carvalho Chehab /*
23ee4a77a3SMauro Carvalho Chehab  * struct vsp1_format_info - VSP1 video format description
24ee4a77a3SMauro Carvalho Chehab  * @fourcc: V4L2 pixel format FCC identifier
25ee4a77a3SMauro Carvalho Chehab  * @mbus: media bus format code
26ee4a77a3SMauro Carvalho Chehab  * @hwfmt: VSP1 hardware format
27ee4a77a3SMauro Carvalho Chehab  * @swap: swap register control
28ee4a77a3SMauro Carvalho Chehab  * @planes: number of planes
29ee4a77a3SMauro Carvalho Chehab  * @bpp: bits per pixel
30ee4a77a3SMauro Carvalho Chehab  * @swap_yc: the Y and C components are swapped (Y comes before C)
31ee4a77a3SMauro Carvalho Chehab  * @swap_uv: the U and V components are swapped (V comes before U)
32ee4a77a3SMauro Carvalho Chehab  * @hsub: horizontal subsampling factor
33ee4a77a3SMauro Carvalho Chehab  * @vsub: vertical subsampling factor
34ee4a77a3SMauro Carvalho Chehab  * @alpha: has an alpha channel
35ee4a77a3SMauro Carvalho Chehab  */
36ee4a77a3SMauro Carvalho Chehab struct vsp1_format_info {
37ee4a77a3SMauro Carvalho Chehab 	u32 fourcc;
38ee4a77a3SMauro Carvalho Chehab 	unsigned int mbus;
39ee4a77a3SMauro Carvalho Chehab 	unsigned int hwfmt;
40ee4a77a3SMauro Carvalho Chehab 	unsigned int swap;
41ee4a77a3SMauro Carvalho Chehab 	unsigned int planes;
42ee4a77a3SMauro Carvalho Chehab 	unsigned int bpp[3];
43ee4a77a3SMauro Carvalho Chehab 	bool swap_yc;
44ee4a77a3SMauro Carvalho Chehab 	bool swap_uv;
45ee4a77a3SMauro Carvalho Chehab 	unsigned int hsub;
46ee4a77a3SMauro Carvalho Chehab 	unsigned int vsub;
47ee4a77a3SMauro Carvalho Chehab 	bool alpha;
48ee4a77a3SMauro Carvalho Chehab };
49ee4a77a3SMauro Carvalho Chehab 
50ee4a77a3SMauro Carvalho Chehab enum vsp1_pipeline_state {
51ee4a77a3SMauro Carvalho Chehab 	VSP1_PIPELINE_STOPPED,
52ee4a77a3SMauro Carvalho Chehab 	VSP1_PIPELINE_RUNNING,
53ee4a77a3SMauro Carvalho Chehab 	VSP1_PIPELINE_STOPPING,
54ee4a77a3SMauro Carvalho Chehab };
55ee4a77a3SMauro Carvalho Chehab 
56ee4a77a3SMauro Carvalho Chehab /*
57ee4a77a3SMauro Carvalho Chehab  * struct vsp1_partition_window - Partition window coordinates
58ee4a77a3SMauro Carvalho Chehab  * @left: horizontal coordinate of the partition start in pixels relative to the
59ee4a77a3SMauro Carvalho Chehab  *	  left edge of the image
60ee4a77a3SMauro Carvalho Chehab  * @width: partition width in pixels
61ee4a77a3SMauro Carvalho Chehab  */
62ee4a77a3SMauro Carvalho Chehab struct vsp1_partition_window {
63ee4a77a3SMauro Carvalho Chehab 	unsigned int left;
64ee4a77a3SMauro Carvalho Chehab 	unsigned int width;
65ee4a77a3SMauro Carvalho Chehab };
66ee4a77a3SMauro Carvalho Chehab 
67ee4a77a3SMauro Carvalho Chehab /*
68ee4a77a3SMauro Carvalho Chehab  * struct vsp1_partition - A description of a slice for the partition algorithm
69ee4a77a3SMauro Carvalho Chehab  * @rpf: The RPF partition window configuration
70ee4a77a3SMauro Carvalho Chehab  * @uds_sink: The UDS input partition window configuration
71ee4a77a3SMauro Carvalho Chehab  * @uds_source: The UDS output partition window configuration
72ee4a77a3SMauro Carvalho Chehab  * @sru: The SRU partition window configuration
73ee4a77a3SMauro Carvalho Chehab  * @wpf: The WPF partition window configuration
74ee4a77a3SMauro Carvalho Chehab  */
75ee4a77a3SMauro Carvalho Chehab struct vsp1_partition {
76*74e622f3SLaurent Pinchart 	struct vsp1_partition_window rpf[VSP1_MAX_RPF];
77ee4a77a3SMauro Carvalho Chehab 	struct vsp1_partition_window uds_sink;
78ee4a77a3SMauro Carvalho Chehab 	struct vsp1_partition_window uds_source;
79ee4a77a3SMauro Carvalho Chehab 	struct vsp1_partition_window sru;
80ee4a77a3SMauro Carvalho Chehab 	struct vsp1_partition_window wpf;
81ee4a77a3SMauro Carvalho Chehab };
82ee4a77a3SMauro Carvalho Chehab 
83ee4a77a3SMauro Carvalho Chehab /*
84ee4a77a3SMauro Carvalho Chehab  * struct vsp1_pipeline - A VSP1 hardware pipeline
85ee4a77a3SMauro Carvalho Chehab  * @pipe: the media pipeline
86ee4a77a3SMauro Carvalho Chehab  * @irqlock: protects the pipeline state
87ee4a77a3SMauro Carvalho Chehab  * @state: current state
88ee4a77a3SMauro Carvalho Chehab  * @wq: wait queue to wait for state change completion
89ee4a77a3SMauro Carvalho Chehab  * @frame_end: frame end interrupt handler
90ee4a77a3SMauro Carvalho Chehab  * @lock: protects the pipeline use count and stream count
91ee4a77a3SMauro Carvalho Chehab  * @kref: pipeline reference count
92ee4a77a3SMauro Carvalho Chehab  * @stream_count: number of streaming video nodes
93ee4a77a3SMauro Carvalho Chehab  * @buffers_ready: bitmask of RPFs and WPFs with at least one buffer available
94ee4a77a3SMauro Carvalho Chehab  * @sequence: frame sequence number
95ee4a77a3SMauro Carvalho Chehab  * @num_inputs: number of RPFs
96ee4a77a3SMauro Carvalho Chehab  * @inputs: array of RPFs in the pipeline (indexed by RPF index)
97ee4a77a3SMauro Carvalho Chehab  * @output: WPF at the output of the pipeline
98ee4a77a3SMauro Carvalho Chehab  * @brx: BRx entity, if present
99ee4a77a3SMauro Carvalho Chehab  * @hgo: HGO entity, if present
100ee4a77a3SMauro Carvalho Chehab  * @hgt: HGT entity, if present
101ee4a77a3SMauro Carvalho Chehab  * @lif: LIF entity, if present
102ee4a77a3SMauro Carvalho Chehab  * @uds: UDS entity, if present
103ee4a77a3SMauro Carvalho Chehab  * @uds_input: entity at the input of the UDS, if the UDS is present
104ee4a77a3SMauro Carvalho Chehab  * @entities: list of entities in the pipeline
105ee4a77a3SMauro Carvalho Chehab  * @stream_config: cached stream configuration for video pipelines
106ee4a77a3SMauro Carvalho Chehab  * @configured: when false the @stream_config shall be written to the hardware
107ee4a77a3SMauro Carvalho Chehab  * @interlaced: True when the pipeline is configured in interlaced mode
108ee4a77a3SMauro Carvalho Chehab  * @partitions: The number of partitions used to process one frame
109ee4a77a3SMauro Carvalho Chehab  * @partition: The current partition for configuration to process
110ee4a77a3SMauro Carvalho Chehab  * @part_table: The pre-calculated partitions used by the pipeline
111ee4a77a3SMauro Carvalho Chehab  */
112ee4a77a3SMauro Carvalho Chehab struct vsp1_pipeline {
113ee4a77a3SMauro Carvalho Chehab 	struct media_pipeline pipe;
114ee4a77a3SMauro Carvalho Chehab 
115ee4a77a3SMauro Carvalho Chehab 	spinlock_t irqlock;
116ee4a77a3SMauro Carvalho Chehab 	enum vsp1_pipeline_state state;
117ee4a77a3SMauro Carvalho Chehab 	wait_queue_head_t wq;
118ee4a77a3SMauro Carvalho Chehab 
119ee4a77a3SMauro Carvalho Chehab 	void (*frame_end)(struct vsp1_pipeline *pipe, unsigned int completion);
120ee4a77a3SMauro Carvalho Chehab 
121ee4a77a3SMauro Carvalho Chehab 	struct mutex lock;
122ee4a77a3SMauro Carvalho Chehab 	struct kref kref;
123ee4a77a3SMauro Carvalho Chehab 	unsigned int stream_count;
124ee4a77a3SMauro Carvalho Chehab 	unsigned int buffers_ready;
125ee4a77a3SMauro Carvalho Chehab 	unsigned int sequence;
126ee4a77a3SMauro Carvalho Chehab 
127ee4a77a3SMauro Carvalho Chehab 	unsigned int num_inputs;
128ee4a77a3SMauro Carvalho Chehab 	struct vsp1_rwpf *inputs[VSP1_MAX_RPF];
129ee4a77a3SMauro Carvalho Chehab 	struct vsp1_rwpf *output;
130ee4a77a3SMauro Carvalho Chehab 	struct vsp1_entity *brx;
131ee4a77a3SMauro Carvalho Chehab 	struct vsp1_entity *hgo;
132ee4a77a3SMauro Carvalho Chehab 	struct vsp1_entity *hgt;
133ee4a77a3SMauro Carvalho Chehab 	struct vsp1_entity *lif;
134ee4a77a3SMauro Carvalho Chehab 	struct vsp1_entity *uds;
135ee4a77a3SMauro Carvalho Chehab 	struct vsp1_entity *uds_input;
136ee4a77a3SMauro Carvalho Chehab 
137ee4a77a3SMauro Carvalho Chehab 	/*
138ee4a77a3SMauro Carvalho Chehab 	 * The order of this list must be identical to the order of the entities
139ee4a77a3SMauro Carvalho Chehab 	 * in the pipeline, as it is assumed by the partition algorithm that we
140ee4a77a3SMauro Carvalho Chehab 	 * can walk this list in sequence.
141ee4a77a3SMauro Carvalho Chehab 	 */
142ee4a77a3SMauro Carvalho Chehab 	struct list_head entities;
143ee4a77a3SMauro Carvalho Chehab 
144ee4a77a3SMauro Carvalho Chehab 	struct vsp1_dl_body *stream_config;
145ee4a77a3SMauro Carvalho Chehab 	bool configured;
146ee4a77a3SMauro Carvalho Chehab 	bool interlaced;
147ee4a77a3SMauro Carvalho Chehab 
148ee4a77a3SMauro Carvalho Chehab 	unsigned int partitions;
149ee4a77a3SMauro Carvalho Chehab 	struct vsp1_partition *partition;
150ee4a77a3SMauro Carvalho Chehab 	struct vsp1_partition *part_table;
1511dc30075STomi Valkeinen 
1521dc30075STomi Valkeinen 	u32 underrun_count;
153ee4a77a3SMauro Carvalho Chehab };
154ee4a77a3SMauro Carvalho Chehab 
155ee4a77a3SMauro Carvalho Chehab void vsp1_pipeline_reset(struct vsp1_pipeline *pipe);
156ee4a77a3SMauro Carvalho Chehab void vsp1_pipeline_init(struct vsp1_pipeline *pipe);
157ee4a77a3SMauro Carvalho Chehab 
158ee4a77a3SMauro Carvalho Chehab void vsp1_pipeline_run(struct vsp1_pipeline *pipe);
159ee4a77a3SMauro Carvalho Chehab bool vsp1_pipeline_stopped(struct vsp1_pipeline *pipe);
160ee4a77a3SMauro Carvalho Chehab int vsp1_pipeline_stop(struct vsp1_pipeline *pipe);
161ee4a77a3SMauro Carvalho Chehab bool vsp1_pipeline_ready(struct vsp1_pipeline *pipe);
162ee4a77a3SMauro Carvalho Chehab 
163ee4a77a3SMauro Carvalho Chehab void vsp1_pipeline_frame_end(struct vsp1_pipeline *pipe);
164ee4a77a3SMauro Carvalho Chehab 
165ee4a77a3SMauro Carvalho Chehab void vsp1_pipeline_propagate_alpha(struct vsp1_pipeline *pipe,
166ee4a77a3SMauro Carvalho Chehab 				   struct vsp1_dl_body *dlb,
167ee4a77a3SMauro Carvalho Chehab 				   unsigned int alpha);
168ee4a77a3SMauro Carvalho Chehab 
169ee4a77a3SMauro Carvalho Chehab void vsp1_pipeline_propagate_partition(struct vsp1_pipeline *pipe,
170ee4a77a3SMauro Carvalho Chehab 				       struct vsp1_partition *partition,
171ee4a77a3SMauro Carvalho Chehab 				       unsigned int index,
172ee4a77a3SMauro Carvalho Chehab 				       struct vsp1_partition_window *window);
173ee4a77a3SMauro Carvalho Chehab 
174ee4a77a3SMauro Carvalho Chehab const struct vsp1_format_info *vsp1_get_format_info(struct vsp1_device *vsp1,
175ee4a77a3SMauro Carvalho Chehab 						    u32 fourcc);
176ee4a77a3SMauro Carvalho Chehab 
177ee4a77a3SMauro Carvalho Chehab #endif /* __VSP1_PIPE_H__ */
178