• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) STMicroelectronics SA 2015
3  * Authors: Yannick Fertre <yannick.fertre@st.com>
4  *          Hugues Fruchet <hugues.fruchet@st.com>
5  * License terms:  GNU General Public License (GPL), version 2
6  */
7 
8 #ifndef HVA_H
9 #define HVA_H
10 
11 #include <media/v4l2-ctrls.h>
12 #include <media/v4l2-device.h>
13 #include <media/videobuf2-v4l2.h>
14 #include <media/v4l2-mem2mem.h>
15 
16 #define fh_to_ctx(f)    (container_of(f, struct hva_ctx, fh))
17 
18 #define hva_to_dev(h)   (h->dev)
19 
20 #define ctx_to_dev(c)   (c->hva_dev->dev)
21 
22 #define ctx_to_hdev(c)  (c->hva_dev)
23 
24 #define HVA_PREFIX "[---:----]"
25 
26 extern const struct hva_enc nv12h264enc;
27 extern const struct hva_enc nv21h264enc;
28 
29 /**
30  * struct hva_frameinfo - information about hva frame
31  *
32  * @pixelformat:    fourcc code for uncompressed video format
33  * @width:          width of frame
34  * @height:         height of frame
35  * @aligned_width:  width of frame (with encoder alignment constraint)
36  * @aligned_height: height of frame (with encoder alignment constraint)
37  * @size:           maximum size in bytes required for data
38 */
39 struct hva_frameinfo {
40 	u32	pixelformat;
41 	u32	width;
42 	u32	height;
43 	u32	aligned_width;
44 	u32	aligned_height;
45 	u32	size;
46 };
47 
48 /**
49  * struct hva_streaminfo - information about hva stream
50  *
51  * @streamformat: fourcc code of compressed video format (H.264...)
52  * @width:        width of stream
53  * @height:       height of stream
54  * @profile:      profile string
55  * @level:        level string
56  */
57 struct hva_streaminfo {
58 	u32	streamformat;
59 	u32	width;
60 	u32	height;
61 	u8	profile[32];
62 	u8	level[32];
63 };
64 
65 /**
66  * struct hva_controls - hva controls set
67  *
68  * @time_per_frame: time per frame in seconds
69  * @bitrate_mode:   bitrate mode (constant bitrate or variable bitrate)
70  * @gop_size:       groupe of picture size
71  * @bitrate:        bitrate (in bps)
72  * @aspect:         video aspect
73  * @profile:        H.264 profile
74  * @level:          H.264 level
75  * @entropy_mode:   H.264 entropy mode (CABAC or CVLC)
76  * @cpb_size:       coded picture buffer size (in kB)
77  * @dct8x8:         transform mode 8x8 enable
78  * @qpmin:          minimum quantizer
79  * @qpmax:          maximum quantizer
80  * @vui_sar:        pixel aspect ratio enable
81  * @vui_sar_idc:    pixel aspect ratio identifier
82  * @sei_fp:         sei frame packing arrangement enable
83  * @sei_fp_type:    sei frame packing arrangement type
84  */
85 struct hva_controls {
86 	struct v4l2_fract					time_per_frame;
87 	enum v4l2_mpeg_video_bitrate_mode			bitrate_mode;
88 	u32							gop_size;
89 	u32							bitrate;
90 	enum v4l2_mpeg_video_aspect				aspect;
91 	enum v4l2_mpeg_video_h264_profile			profile;
92 	enum v4l2_mpeg_video_h264_level				level;
93 	enum v4l2_mpeg_video_h264_entropy_mode			entropy_mode;
94 	u32							cpb_size;
95 	bool							dct8x8;
96 	u32							qpmin;
97 	u32							qpmax;
98 	bool							vui_sar;
99 	enum v4l2_mpeg_video_h264_vui_sar_idc			vui_sar_idc;
100 	bool							sei_fp;
101 	enum v4l2_mpeg_video_h264_sei_fp_arrangement_type	sei_fp_type;
102 };
103 
104 /**
105  * struct hva_frame - hva frame buffer (output)
106  *
107  * @vbuf:     video buffer information for V4L2
108  * @list:     V4L2 m2m list that the frame belongs to
109  * @info:     frame information (width, height, format, alignment...)
110  * @paddr:    physical address (for hardware)
111  * @vaddr:    virtual address (kernel can read/write)
112  * @prepared: true if vaddr/paddr are resolved
113  */
114 struct hva_frame {
115 	struct vb2_v4l2_buffer	vbuf;
116 	struct list_head	list;
117 	struct hva_frameinfo	info;
118 	dma_addr_t		paddr;
119 	void			*vaddr;
120 	bool			prepared;
121 };
122 
123 /*
124  * to_hva_frame() - cast struct vb2_v4l2_buffer * to struct hva_frame *
125  */
126 #define to_hva_frame(vb) \
127 	container_of(vb, struct hva_frame, vbuf)
128 
129 /**
130  * struct hva_stream - hva stream buffer (capture)
131  *
132  * @v4l2:       video buffer information for V4L2
133  * @list:       V4L2 m2m list that the frame belongs to
134  * @paddr:      physical address (for hardware)
135  * @vaddr:      virtual address (kernel can read/write)
136  * @prepared:   true if vaddr/paddr are resolved
137  * @size:       size of the buffer in bytes
138  * @bytesused:  number of bytes occupied by data in the buffer
139  */
140 struct hva_stream {
141 	struct vb2_v4l2_buffer	vbuf;
142 	struct list_head	list;
143 	dma_addr_t		paddr;
144 	void			*vaddr;
145 	bool			prepared;
146 	unsigned int		size;
147 	unsigned int		bytesused;
148 };
149 
150 /*
151  * to_hva_stream() - cast struct vb2_v4l2_buffer * to struct hva_stream *
152  */
153 #define to_hva_stream(vb) \
154 	container_of(vb, struct hva_stream, vbuf)
155 
156 struct hva_dev;
157 struct hva_enc;
158 
159 /**
160  * struct hva_ctx - context of hva instance
161  *
162  * @hva_dev:         the device that this instance is associated with
163  * @fh:              V4L2 file handle
164  * @ctrl_handler:    V4L2 controls handler
165  * @ctrls:           hva controls set
166  * @id:              instance identifier
167  * @aborting:        true if current job aborted
168  * @name:            instance name (debug purpose)
169  * @run_work:        encode work
170  * @lock:            mutex used to lock access of this context
171  * @flags:           validity of streaminfo and frameinfo fields
172  * @frame_num:       frame number
173  * @stream_num:      stream number
174  * @max_stream_size: maximum size in bytes required for stream data
175  * @colorspace:      colorspace identifier
176  * @xfer_func:       transfer function identifier
177  * @ycbcr_enc:       Y'CbCr encoding identifier
178  * @quantization:    quantization identifier
179  * @streaminfo:      stream properties
180  * @frameinfo:       frame properties
181  * @enc:             current encoder
182  * @priv:            private codec data for this instance, allocated
183  *                   by encoder @open time
184  * @hw_err:          true if hardware error detected
185  */
186 struct hva_ctx {
187 	struct hva_dev		        *hva_dev;
188 	struct v4l2_fh			fh;
189 	struct v4l2_ctrl_handler	ctrl_handler;
190 	struct hva_controls		ctrls;
191 	u8				id;
192 	bool				aborting;
193 	char				name[100];
194 	struct work_struct		run_work;
195 	/* mutex protecting this data structure */
196 	struct mutex			lock;
197 	u32				flags;
198 	u32				frame_num;
199 	u32				stream_num;
200 	u32				max_stream_size;
201 	enum v4l2_colorspace		colorspace;
202 	enum v4l2_xfer_func		xfer_func;
203 	enum v4l2_ycbcr_encoding	ycbcr_enc;
204 	enum v4l2_quantization		quantization;
205 	struct hva_streaminfo		streaminfo;
206 	struct hva_frameinfo		frameinfo;
207 	struct hva_enc			*enc;
208 	void				*priv;
209 	bool				hw_err;
210 };
211 
212 #define HVA_FLAG_STREAMINFO	0x0001
213 #define HVA_FLAG_FRAMEINFO	0x0002
214 
215 #define HVA_MAX_INSTANCES	16
216 #define HVA_MAX_ENCODERS	10
217 #define HVA_MAX_FORMATS		HVA_MAX_ENCODERS
218 
219 /**
220  * struct hva_dev - abstraction for hva entity
221  *
222  * @v4l2_dev:            V4L2 device
223  * @vdev:                video device
224  * @pdev:                platform device
225  * @dev:                 device
226  * @lock:                mutex used for critical sections & V4L2 ops
227  *                       serialization
228  * @m2m_dev:             memory-to-memory V4L2 device information
229  * @instances:           opened instances
230  * @nb_of_instances:     number of opened instances
231  * @instance_id:         rolling counter identifying an instance (debug purpose)
232  * @regs:                register io memory access
233  * @esram_addr:          esram address
234  * @esram_size:          esram size
235  * @clk:                 hva clock
236  * @irq_its:             status interruption
237  * @irq_err:             error interruption
238  * @work_queue:          work queue to handle the encode jobs
239  * @protect_mutex:       mutex used to lock access of hardware
240  * @interrupt:           completion interrupt
241  * @ip_version:          IP hardware version
242  * @encoders:            registered encoders
243  * @nb_of_encoders:      number of registered encoders
244  * @pixelformats:        supported uncompressed video formats
245  * @nb_of_pixelformats:  number of supported umcompressed video formats
246  * @streamformats:       supported compressed video formats
247  * @nb_of_streamformats: number of supported compressed video formats
248  * @sfl_reg:             status fifo level register value
249  * @sts_reg:             status register value
250  * @lmi_err_reg:         local memory interface error register value
251  * @emi_err_reg:         external memory interface error register value
252  * @hec_mif_err_reg:     HEC memory interface error register value
253  */
254 struct hva_dev {
255 	struct v4l2_device	v4l2_dev;
256 	struct video_device	*vdev;
257 	struct platform_device	*pdev;
258 	struct device		*dev;
259 	/* mutex protecting vb2_queue structure */
260 	struct mutex		lock;
261 	struct v4l2_m2m_dev	*m2m_dev;
262 	struct hva_ctx		*instances[HVA_MAX_INSTANCES];
263 	unsigned int		nb_of_instances;
264 	unsigned int		instance_id;
265 	void __iomem		*regs;
266 	u32			esram_addr;
267 	u32			esram_size;
268 	struct clk		*clk;
269 	int			irq_its;
270 	int			irq_err;
271 	struct workqueue_struct *work_queue;
272 	/* mutex protecting hardware access */
273 	struct mutex		protect_mutex;
274 	struct completion	interrupt;
275 	unsigned long int	ip_version;
276 	const struct hva_enc	*encoders[HVA_MAX_ENCODERS];
277 	u32			nb_of_encoders;
278 	u32			pixelformats[HVA_MAX_FORMATS];
279 	u32			nb_of_pixelformats;
280 	u32			streamformats[HVA_MAX_FORMATS];
281 	u32			nb_of_streamformats;
282 	u32			sfl_reg;
283 	u32			sts_reg;
284 	u32			lmi_err_reg;
285 	u32			emi_err_reg;
286 	u32			hec_mif_err_reg;
287 };
288 
289 /**
290  * struct hva_enc - hva encoder
291  *
292  * @name:         encoder name
293  * @streamformat: fourcc code for compressed video format (H.264...)
294  * @pixelformat:  fourcc code for uncompressed video format
295  * @max_width:    maximum width of frame for this encoder
296  * @max_height:   maximum height of frame for this encoder
297  * @open:         open encoder
298  * @close:        close encoder
299  * @encode:       encode a frame (struct hva_frame) in a stream
300  *                (struct hva_stream)
301  */
302 
303 struct hva_enc {
304 	const char	*name;
305 	u32		streamformat;
306 	u32		pixelformat;
307 	u32		max_width;
308 	u32		max_height;
309 	int		(*open)(struct hva_ctx *ctx);
310 	int		(*close)(struct hva_ctx *ctx);
311 	int		(*encode)(struct hva_ctx *ctx, struct hva_frame *frame,
312 				  struct hva_stream *stream);
313 };
314 
315 #endif /* HVA_H */
316