1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
4 * Copyright (C) 2017 Linaro Ltd.
5 */
6
7 #ifndef __VENUS_CORE_H_
8 #define __VENUS_CORE_H_
9
10 #include <linux/list.h>
11 #include <media/videobuf2-v4l2.h>
12 #include <media/v4l2-ctrls.h>
13 #include <media/v4l2-device.h>
14
15 #include "hfi.h"
16
17 #define VIDC_CLKS_NUM_MAX 4
18
19 struct freq_tbl {
20 unsigned int load;
21 unsigned long freq;
22 };
23
24 struct reg_val {
25 u32 reg;
26 u32 value;
27 };
28
29 struct venus_resources {
30 u64 dma_mask;
31 const struct freq_tbl *freq_tbl;
32 unsigned int freq_tbl_size;
33 const struct reg_val *reg_tbl;
34 unsigned int reg_tbl_size;
35 const char * const clks[VIDC_CLKS_NUM_MAX];
36 unsigned int clks_num;
37 enum hfi_version hfi_version;
38 u32 max_load;
39 unsigned int vmem_id;
40 u32 vmem_size;
41 u32 vmem_addr;
42 const char *fwname;
43 };
44
45 struct venus_format {
46 u32 pixfmt;
47 unsigned int num_planes;
48 u32 type;
49 u32 flags;
50 };
51
52 #define MAX_PLANES 4
53 #define MAX_FMT_ENTRIES 32
54 #define MAX_CAP_ENTRIES 32
55 #define MAX_ALLOC_MODE_ENTRIES 16
56 #define MAX_CODEC_NUM 32
57
58 struct raw_formats {
59 u32 buftype;
60 u32 fmt;
61 };
62
63 struct venus_caps {
64 u32 codec;
65 u32 domain;
66 bool cap_bufs_mode_dynamic;
67 unsigned int num_caps;
68 struct hfi_capability caps[MAX_CAP_ENTRIES];
69 unsigned int num_pl;
70 struct hfi_profile_level pl[HFI_MAX_PROFILE_COUNT];
71 unsigned int num_fmts;
72 struct raw_formats fmts[MAX_FMT_ENTRIES];
73 bool valid; /* used only for Venus v1xx */
74 };
75
76 /**
77 * struct venus_core - holds core parameters valid for all instances
78 *
79 * @base: IO memory base address
80 * @irq: Venus irq
81 * @clks: an array of struct clk pointers
82 * @core0_clk: a struct clk pointer for core0
83 * @core1_clk: a struct clk pointer for core1
84 * @core0_bus_clk: a struct clk pointer for core0 bus clock
85 * @core1_bus_clk: a struct clk pointer for core1 bus clock
86 * @vdev_dec: a reference to video device structure for decoder instances
87 * @vdev_enc: a reference to video device structure for encoder instances
88 * @v4l2_dev: a holder for v4l2 device structure
89 * @res: a reference to venus resources structure
90 * @dev: convenience struct device pointer
91 * @dev_dec: convenience struct device pointer for decoder device
92 * @dev_enc: convenience struct device pointer for encoder device
93 * @use_tz: a flag that suggests presence of trustzone
94 * @lock: a lock for this strucure
95 * @instances: a list_head of all instances
96 * @insts_count: num of instances
97 * @state: the state of the venus core
98 * @done: a completion for sync HFI operations
99 * @error: an error returned during last HFI sync operations
100 * @sys_error: an error flag that signal system error event
101 * @core_ops: the core operations
102 * @enc_codecs: encoders supported by this core
103 * @dec_codecs: decoders supported by this core
104 * @max_sessions_supported: holds the maximum number of sessions
105 * @core_caps: core capabilities
106 * @priv: a private filed for HFI operations
107 * @ops: the core HFI operations
108 * @work: a delayed work for handling system fatal error
109 */
110 struct venus_core {
111 void __iomem *base;
112 int irq;
113 struct clk *clks[VIDC_CLKS_NUM_MAX];
114 struct clk *core0_clk;
115 struct clk *core1_clk;
116 struct clk *core0_bus_clk;
117 struct clk *core1_bus_clk;
118 struct video_device *vdev_dec;
119 struct video_device *vdev_enc;
120 struct v4l2_device v4l2_dev;
121 const struct venus_resources *res;
122 struct device *dev;
123 struct device *dev_dec;
124 struct device *dev_enc;
125 unsigned int use_tz;
126 struct video_firmware {
127 struct device *dev;
128 struct iommu_domain *iommu_domain;
129 size_t mapped_mem_size;
130 } fw;
131 struct mutex lock;
132 struct list_head instances;
133 atomic_t insts_count;
134 unsigned int state;
135 struct completion done;
136 unsigned int error;
137 bool sys_error;
138 const struct hfi_core_ops *core_ops;
139 unsigned long enc_codecs;
140 unsigned long dec_codecs;
141 unsigned int max_sessions_supported;
142 #define ENC_ROTATION_CAPABILITY 0x1
143 #define ENC_SCALING_CAPABILITY 0x2
144 #define ENC_DEINTERLACE_CAPABILITY 0x4
145 #define DEC_MULTI_STREAM_CAPABILITY 0x8
146 unsigned int core_caps;
147 void *priv;
148 const struct hfi_ops *ops;
149 struct delayed_work work;
150 struct venus_caps caps[MAX_CODEC_NUM];
151 unsigned int codecs_count;
152 };
153
154 struct vdec_controls {
155 u32 post_loop_deb_mode;
156 u32 profile;
157 u32 level;
158 };
159
160 struct venc_controls {
161 u16 gop_size;
162 u32 num_p_frames;
163 u32 num_b_frames;
164 u32 bitrate_mode;
165 u32 bitrate;
166 u32 bitrate_peak;
167
168 u32 h264_i_period;
169 u32 h264_entropy_mode;
170 u32 h264_i_qp;
171 u32 h264_p_qp;
172 u32 h264_b_qp;
173 u32 h264_min_qp;
174 u32 h264_max_qp;
175 u32 h264_loop_filter_mode;
176 s32 h264_loop_filter_alpha;
177 s32 h264_loop_filter_beta;
178
179 u32 vp8_min_qp;
180 u32 vp8_max_qp;
181
182 u32 multi_slice_mode;
183 u32 multi_slice_max_bytes;
184 u32 multi_slice_max_mb;
185
186 u32 header_mode;
187
188 struct {
189 u32 mpeg4;
190 u32 h264;
191 u32 vpx;
192 u32 hevc;
193 } profile;
194 struct {
195 u32 mpeg4;
196 u32 h264;
197 u32 hevc;
198 } level;
199 };
200
201 struct venus_buffer {
202 struct vb2_v4l2_buffer vb;
203 struct list_head list;
204 dma_addr_t dma_addr;
205 u32 size;
206 struct list_head reg_list;
207 u32 flags;
208 struct list_head ref_list;
209 };
210
211 #define to_venus_buffer(ptr) container_of(ptr, struct venus_buffer, vb)
212
213 enum venus_dec_state {
214 VENUS_DEC_STATE_DEINIT = 0,
215 VENUS_DEC_STATE_INIT = 1,
216 VENUS_DEC_STATE_CAPTURE_SETUP = 2,
217 VENUS_DEC_STATE_STOPPED = 3,
218 VENUS_DEC_STATE_SEEK = 4,
219 VENUS_DEC_STATE_DRAIN = 5,
220 VENUS_DEC_STATE_DECODING = 6,
221 VENUS_DEC_STATE_DRC = 7
222 };
223
224 struct venus_ts_metadata {
225 bool used;
226 u64 ts_ns;
227 u64 ts_us;
228 u32 flags;
229 struct v4l2_timecode tc;
230 };
231
232 /**
233 * struct venus_inst - holds per instance parameters
234 *
235 * @list: used for attach an instance to the core
236 * @lock: instance lock
237 * @core: a reference to the core struct
238 * @dpbbufs: a list of decoded picture buffers
239 * @internalbufs: a list of internal bufferes
240 * @registeredbufs: a list of registered capture bufferes
241 * @delayed_process a list of delayed buffers
242 * @delayed_process_work: a work_struct for process delayed buffers
243 * @ctrl_handler: v4l control handler
244 * @controls: a union of decoder and encoder control parameters
245 * @fh: a holder of v4l file handle structure
246 * @streamon_cap: stream on flag for capture queue
247 * @streamon_out: stream on flag for output queue
248 * @width: current capture width
249 * @height: current capture height
250 * @out_width: current output width
251 * @out_height: current output height
252 * @colorspace: current color space
253 * @quantization: current quantization
254 * @xfer_func: current xfer function
255 * @codec_state: current codec API state (see DEC/ENC_STATE_)
256 * @reconf_wait: wait queue for resolution change event
257 * @subscriptions: used to hold current events subscriptions
258 * @buf_count: used to count number of buffers (reqbuf(0))
259 * @fps: holds current FPS
260 * @timeperframe: holds current time per frame structure
261 * @fmt_out: a reference to output format structure
262 * @fmt_cap: a reference to capture format structure
263 * @num_input_bufs: holds number of input buffers
264 * @num_output_bufs: holds number of output buffers
265 * @input_buf_size holds input buffer size
266 * @output_buf_size: holds output buffer size
267 * @output2_buf_size: holds secondary decoder output buffer size
268 * @dpb_buftype: decoded picture buffer type
269 * @dpb_fmt: decoded picture buffer raw format
270 * @opb_buftype: output picture buffer type
271 * @opb_fmt: output picture buffer raw format
272 * @reconfig: a flag raised by decoder when the stream resolution changed
273 * @hfi_codec: current codec for this instance in HFI space
274 * @sequence_cap: a sequence counter for capture queue
275 * @sequence_out: a sequence counter for output queue
276 * @m2m_dev: a reference to m2m device structure
277 * @m2m_ctx: a reference to m2m context structure
278 * @state: current state of the instance
279 * @done: a completion for sync HFI operation
280 * @error: an error returned during last HFI sync operation
281 * @session_error: a flag rised by HFI interface in case of session error
282 * @ops: HFI operations
283 * @priv: a private for HFI operations callbacks
284 * @session_type: the type of the session (decoder or encoder)
285 * @hprop: a union used as a holder by get property
286 */
287 struct venus_inst {
288 struct list_head list;
289 struct mutex lock;
290 struct venus_core *core;
291 struct list_head dpbbufs;
292 struct list_head internalbufs;
293 struct list_head registeredbufs;
294 struct list_head delayed_process;
295 struct work_struct delayed_process_work;
296
297 struct v4l2_ctrl_handler ctrl_handler;
298 union {
299 struct vdec_controls dec;
300 struct venc_controls enc;
301 } controls;
302 struct v4l2_fh fh;
303 unsigned int streamon_cap, streamon_out;
304 u32 width;
305 u32 height;
306 u32 out_width;
307 u32 out_height;
308 u32 colorspace;
309 u8 ycbcr_enc;
310 u8 quantization;
311 u8 xfer_func;
312 enum venus_dec_state codec_state;
313 wait_queue_head_t reconf_wait;
314 unsigned int subscriptions;
315 int buf_count;
316 struct venus_ts_metadata tss[VIDEO_MAX_FRAME];
317 u64 fps;
318 struct v4l2_fract timeperframe;
319 const struct venus_format *fmt_out;
320 const struct venus_format *fmt_cap;
321 unsigned int num_input_bufs;
322 unsigned int num_output_bufs;
323 unsigned int input_buf_size;
324 unsigned int output_buf_size;
325 unsigned int output2_buf_size;
326 u32 dpb_buftype;
327 u32 dpb_fmt;
328 u32 opb_buftype;
329 u32 opb_fmt;
330 bool reconfig;
331 u32 hfi_codec;
332 u32 sequence_cap;
333 u32 sequence_out;
334 struct v4l2_m2m_dev *m2m_dev;
335 struct v4l2_m2m_ctx *m2m_ctx;
336 unsigned int state;
337 struct completion done;
338 unsigned int error;
339 bool session_error;
340 const struct hfi_inst_ops *ops;
341 u32 session_type;
342 union hfi_get_property hprop;
343 };
344
345 #define IS_V1(core) ((core)->res->hfi_version == HFI_VERSION_1XX)
346 #define IS_V3(core) ((core)->res->hfi_version == HFI_VERSION_3XX)
347 #define IS_V4(core) ((core)->res->hfi_version == HFI_VERSION_4XX)
348
349 #define ctrl_to_inst(ctrl) \
350 container_of((ctrl)->handler, struct venus_inst, ctrl_handler)
351
to_inst(struct file * filp)352 static inline struct venus_inst *to_inst(struct file *filp)
353 {
354 return container_of(filp->private_data, struct venus_inst, fh);
355 }
356
to_hfi_priv(struct venus_core * core)357 static inline void *to_hfi_priv(struct venus_core *core)
358 {
359 return core->priv;
360 }
361
362 static inline struct venus_caps *
venus_caps_by_codec(struct venus_core * core,u32 codec,u32 domain)363 venus_caps_by_codec(struct venus_core *core, u32 codec, u32 domain)
364 {
365 unsigned int c;
366
367 for (c = 0; c < core->codecs_count; c++) {
368 if (core->caps[c].codec == codec &&
369 core->caps[c].domain == domain)
370 return &core->caps[c];
371 }
372
373 return NULL;
374 }
375
376 #endif
377