Merge remote-tracking branch 'battery/for-next'
[deliverable/linux.git] / drivers / media / platform / sti / hva / hva.h
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 */
This page took 0.044755 seconds and 5 git commands to generate.