]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/media/platform/qcom/venus/core.h
Merge tag 'for-linus-20170825' of git://git.infradead.org/linux-mtd
[mirror_ubuntu-artful-kernel.git] / drivers / media / platform / qcom / venus / core.h
CommitLineData
af2c3834
SV
1/*
2 * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
3 * Copyright (C) 2017 Linaro Ltd.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 and
7 * only version 2 as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 */
15
16#ifndef __VENUS_CORE_H_
17#define __VENUS_CORE_H_
18
19#include <linux/list.h>
20#include <media/videobuf2-v4l2.h>
21#include <media/v4l2-ctrls.h>
22#include <media/v4l2-device.h>
23
24#include "hfi.h"
25
26#define VIDC_CLKS_NUM_MAX 4
27
28struct freq_tbl {
29 unsigned int load;
30 unsigned long freq;
31};
32
33struct reg_val {
34 u32 reg;
35 u32 value;
36};
37
38struct venus_resources {
39 u64 dma_mask;
40 const struct freq_tbl *freq_tbl;
41 unsigned int freq_tbl_size;
42 const struct reg_val *reg_tbl;
43 unsigned int reg_tbl_size;
44 const char * const clks[VIDC_CLKS_NUM_MAX];
45 unsigned int clks_num;
46 enum hfi_version hfi_version;
47 u32 max_load;
48 unsigned int vmem_id;
49 u32 vmem_size;
50 u32 vmem_addr;
50058a9a 51 const char *fwname;
af2c3834
SV
52};
53
54struct venus_format {
55 u32 pixfmt;
56 unsigned int num_planes;
57 u32 type;
58};
59
60/**
61 * struct venus_core - holds core parameters valid for all instances
62 *
63 * @base: IO memory base address
64 * @irq: Venus irq
65 * @clks: an array of struct clk pointers
66 * @core0_clk: a struct clk pointer for core0
67 * @core1_clk: a struct clk pointer for core1
68 * @vdev_dec: a reference to video device structure for decoder instances
69 * @vdev_enc: a reference to video device structure for encoder instances
70 * @v4l2_dev: a holder for v4l2 device structure
71 * @res: a reference to venus resources structure
72 * @dev: convenience struct device pointer
73 * @dev_dec: convenience struct device pointer for decoder device
74 * @dev_enc: convenience struct device pointer for encoder device
75 * @lock: a lock for this strucure
76 * @instances: a list_head of all instances
77 * @insts_count: num of instances
78 * @state: the state of the venus core
79 * @done: a completion for sync HFI operations
80 * @error: an error returned during last HFI sync operations
81 * @sys_error: an error flag that signal system error event
82 * @core_ops: the core operations
83 * @enc_codecs: encoders supported by this core
84 * @dec_codecs: decoders supported by this core
85 * @max_sessions_supported: holds the maximum number of sessions
86 * @core_caps: core capabilities
87 * @priv: a private filed for HFI operations
88 * @ops: the core HFI operations
89 * @work: a delayed work for handling system fatal error
90 */
91struct venus_core {
92 void __iomem *base;
93 int irq;
94 struct clk *clks[VIDC_CLKS_NUM_MAX];
95 struct clk *core0_clk;
96 struct clk *core1_clk;
97 struct video_device *vdev_dec;
98 struct video_device *vdev_enc;
99 struct v4l2_device v4l2_dev;
100 const struct venus_resources *res;
101 struct device *dev;
102 struct device *dev_dec;
103 struct device *dev_enc;
af2c3834
SV
104 struct mutex lock;
105 struct list_head instances;
106 atomic_t insts_count;
107 unsigned int state;
108 struct completion done;
109 unsigned int error;
110 bool sys_error;
111 const struct hfi_core_ops *core_ops;
112 u32 enc_codecs;
113 u32 dec_codecs;
114 unsigned int max_sessions_supported;
115#define ENC_ROTATION_CAPABILITY 0x1
116#define ENC_SCALING_CAPABILITY 0x2
117#define ENC_DEINTERLACE_CAPABILITY 0x4
118#define DEC_MULTI_STREAM_CAPABILITY 0x8
119 unsigned int core_caps;
120 void *priv;
121 const struct hfi_ops *ops;
122 struct delayed_work work;
123};
124
125struct vdec_controls {
126 u32 post_loop_deb_mode;
127 u32 profile;
128 u32 level;
129};
130
131struct venc_controls {
132 u16 gop_size;
133 u32 num_p_frames;
134 u32 num_b_frames;
135 u32 bitrate_mode;
136 u32 bitrate;
137 u32 bitrate_peak;
138
139 u32 h264_i_period;
140 u32 h264_entropy_mode;
141 u32 h264_i_qp;
142 u32 h264_p_qp;
143 u32 h264_b_qp;
144 u32 h264_min_qp;
145 u32 h264_max_qp;
146 u32 h264_loop_filter_mode;
147 u32 h264_loop_filter_alpha;
148 u32 h264_loop_filter_beta;
149
150 u32 vp8_min_qp;
151 u32 vp8_max_qp;
152
153 u32 multi_slice_mode;
154 u32 multi_slice_max_bytes;
155 u32 multi_slice_max_mb;
156
157 u32 header_mode;
158
159 struct {
160 u32 mpeg4;
161 u32 h264;
162 u32 vpx;
163 } profile;
164 struct {
165 u32 mpeg4;
166 u32 h264;
167 } level;
168};
169
170struct venus_buffer {
171 struct vb2_v4l2_buffer vb;
172 struct list_head list;
173 dma_addr_t dma_addr;
174 u32 size;
175 struct list_head reg_list;
176 u32 flags;
177 struct list_head ref_list;
178};
179
180#define to_venus_buffer(ptr) container_of(ptr, struct venus_buffer, vb)
181
182/**
183 * struct venus_inst - holds per instance paramerters
184 *
185 * @list: used for attach an instance to the core
186 * @lock: instance lock
187 * @core: a reference to the core struct
188 * @internalbufs: a list of internal bufferes
189 * @registeredbufs: a list of registered capture bufferes
190 * @delayed_process a list of delayed buffers
191 * @delayed_process_work: a work_struct for process delayed buffers
192 * @ctrl_handler: v4l control handler
193 * @controls: a union of decoder and encoder control parameters
194 * @fh: a holder of v4l file handle structure
195 * @streamon_cap: stream on flag for capture queue
196 * @streamon_out: stream on flag for output queue
197 * @cmd_stop: a flag to signal encoder/decoder commands
198 * @width: current capture width
199 * @height: current capture height
200 * @out_width: current output width
201 * @out_height: current output height
202 * @colorspace: current color space
203 * @quantization: current quantization
204 * @xfer_func: current xfer function
205 * @fps: holds current FPS
206 * @timeperframe: holds current time per frame structure
207 * @fmt_out: a reference to output format structure
208 * @fmt_cap: a reference to capture format structure
209 * @num_input_bufs: holds number of input buffers
210 * @num_output_bufs: holds number of output buffers
211 * @input_buf_size holds input buffer size
212 * @output_buf_size: holds output buffer size
213 * @reconfig: a flag raised by decoder when the stream resolution changed
214 * @reconfig_width: holds the new width
215 * @reconfig_height: holds the new height
216 * @sequence_cap: a sequence counter for capture queue
217 * @sequence_out: a sequence counter for output queue
218 * @m2m_dev: a reference to m2m device structure
219 * @m2m_ctx: a reference to m2m context structure
220 * @state: current state of the instance
221 * @done: a completion for sync HFI operation
222 * @error: an error returned during last HFI sync operation
223 * @session_error: a flag rised by HFI interface in case of session error
224 * @ops: HFI operations
225 * @priv: a private for HFI operations callbacks
226 * @session_type: the type of the session (decoder or encoder)
227 * @hprop: a union used as a holder by get property
228 * @cap_width: width capability
229 * @cap_height: height capability
230 * @cap_mbs_per_frame: macroblocks per frame capability
231 * @cap_mbs_per_sec: macroblocks per second capability
232 * @cap_framerate: framerate capability
233 * @cap_scale_x: horizontal scaling capability
234 * @cap_scale_y: vertical scaling capability
235 * @cap_bitrate: bitrate capability
236 * @cap_hier_p: hier capability
237 * @cap_ltr_count: LTR count capability
238 * @cap_secure_output2_threshold: secure OUTPUT2 threshold capability
239 * @cap_bufs_mode_static: buffers allocation mode capability
240 * @cap_bufs_mode_dynamic: buffers allocation mode capability
241 * @pl_count: count of supported profiles/levels
242 * @pl: supported profiles/levels
243 * @bufreq: holds buffer requirements
244 */
245struct venus_inst {
246 struct list_head list;
247 struct mutex lock;
248 struct venus_core *core;
249 struct list_head internalbufs;
250 struct list_head registeredbufs;
251 struct list_head delayed_process;
252 struct work_struct delayed_process_work;
253
254 struct v4l2_ctrl_handler ctrl_handler;
255 union {
256 struct vdec_controls dec;
257 struct venc_controls enc;
258 } controls;
259 struct v4l2_fh fh;
260 unsigned int streamon_cap, streamon_out;
261 bool cmd_stop;
262 u32 width;
263 u32 height;
264 u32 out_width;
265 u32 out_height;
266 u32 colorspace;
267 u8 ycbcr_enc;
268 u8 quantization;
269 u8 xfer_func;
270 u64 fps;
271 struct v4l2_fract timeperframe;
272 const struct venus_format *fmt_out;
273 const struct venus_format *fmt_cap;
274 unsigned int num_input_bufs;
275 unsigned int num_output_bufs;
276 unsigned int input_buf_size;
277 unsigned int output_buf_size;
278 bool reconfig;
279 u32 reconfig_width;
280 u32 reconfig_height;
281 u32 sequence_cap;
282 u32 sequence_out;
283 struct v4l2_m2m_dev *m2m_dev;
284 struct v4l2_m2m_ctx *m2m_ctx;
285 unsigned int state;
286 struct completion done;
287 unsigned int error;
288 bool session_error;
289 const struct hfi_inst_ops *ops;
290 u32 session_type;
291 union hfi_get_property hprop;
292 struct hfi_capability cap_width;
293 struct hfi_capability cap_height;
294 struct hfi_capability cap_mbs_per_frame;
295 struct hfi_capability cap_mbs_per_sec;
296 struct hfi_capability cap_framerate;
297 struct hfi_capability cap_scale_x;
298 struct hfi_capability cap_scale_y;
299 struct hfi_capability cap_bitrate;
300 struct hfi_capability cap_hier_p;
301 struct hfi_capability cap_ltr_count;
302 struct hfi_capability cap_secure_output2_threshold;
303 bool cap_bufs_mode_static;
304 bool cap_bufs_mode_dynamic;
305 unsigned int pl_count;
306 struct hfi_profile_level pl[HFI_MAX_PROFILE_COUNT];
307 struct hfi_buffer_requirements bufreq[HFI_BUFFER_TYPE_MAX];
308};
309
310#define ctrl_to_inst(ctrl) \
311 container_of((ctrl)->handler, struct venus_inst, ctrl_handler)
312
313static inline struct venus_inst *to_inst(struct file *filp)
314{
315 return container_of(filp->private_data, struct venus_inst, fh);
316}
317
318static inline void *to_hfi_priv(struct venus_core *core)
319{
320 return core->priv;
321}
322
323#endif