xref: /linux/drivers/media/platform/amphion/vpu.h (revision eb861c3d8298f5145c3fc3bfd2997fdf6ea25b2b)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright 2020-2021 NXP
4  */
5 
6 #ifndef _AMPHION_VPU_H
7 #define _AMPHION_VPU_H
8 
9 #include <media/v4l2-device.h>
10 #include <media/v4l2-ctrls.h>
11 #include <media/v4l2-mem2mem.h>
12 #include <linux/mailbox_client.h>
13 #include <linux/mailbox_controller.h>
14 #include <linux/kfifo.h>
15 
16 #define VPU_TIMEOUT		msecs_to_jiffies(1000)
17 #define VPU_INST_NULL_ID	(-1L)
18 #define VPU_MSG_BUFFER_SIZE	(8192)
19 
20 enum imx_plat_type {
21 	IMX8QXP = 0,
22 	IMX8QM  = 1,
23 	IMX8DM,
24 	IMX8DX,
25 	PLAT_TYPE_RESERVED
26 };
27 
28 enum vpu_core_type {
29 	VPU_CORE_TYPE_ENC = 0,
30 	VPU_CORE_TYPE_DEC = 0x10,
31 };
32 
33 struct vpu_dev;
34 struct vpu_resources {
35 	enum imx_plat_type plat_type;
36 	u32 mreg_base;
37 	int (*setup)(struct vpu_dev *vpu);
38 	int (*setup_encoder)(struct vpu_dev *vpu);
39 	int (*setup_decoder)(struct vpu_dev *vpu);
40 	int (*reset)(struct vpu_dev *vpu);
41 };
42 
43 struct vpu_buffer {
44 	void *virt;
45 	dma_addr_t phys;
46 	u32 length;
47 	u32 bytesused;
48 	struct device *dev;
49 };
50 
51 struct vpu_func {
52 	struct video_device *vfd;
53 	struct v4l2_m2m_dev *m2m_dev;
54 	enum vpu_core_type type;
55 	int function;
56 };
57 
58 struct vpu_dev {
59 	void __iomem *base;
60 	struct platform_device *pdev;
61 	struct device *dev;
62 	struct mutex lock; /* protect vpu device */
63 	const struct vpu_resources *res;
64 	struct list_head cores;
65 
66 	struct v4l2_device v4l2_dev;
67 	struct vpu_func encoder;
68 	struct vpu_func decoder;
69 	struct media_device mdev;
70 
71 	struct delayed_work watchdog_work;
72 	void (*get_vpu)(struct vpu_dev *vpu);
73 	void (*put_vpu)(struct vpu_dev *vpu);
74 	void (*get_enc)(struct vpu_dev *vpu);
75 	void (*put_enc)(struct vpu_dev *vpu);
76 	void (*get_dec)(struct vpu_dev *vpu);
77 	void (*put_dec)(struct vpu_dev *vpu);
78 	atomic_t ref_vpu;
79 	atomic_t ref_enc;
80 	atomic_t ref_dec;
81 
82 	struct dentry *debugfs;
83 };
84 
85 struct vpu_format {
86 	u32 pixfmt;
87 	u32 mem_planes;
88 	u32 comp_planes;
89 	u32 type;
90 	u32 flags;
91 	u32 width;
92 	u32 height;
93 	u32 sizeimage[VIDEO_MAX_PLANES];
94 	u32 bytesperline[VIDEO_MAX_PLANES];
95 	u32 field;
96 	u32 sibling;
97 };
98 
99 struct vpu_core_resources {
100 	enum vpu_core_type type;
101 	const char *fwname;
102 	u32 stride;
103 	u32 max_width;
104 	u32 min_width;
105 	u32 step_width;
106 	u32 max_height;
107 	u32 min_height;
108 	u32 step_height;
109 	u32 rpc_size;
110 	u32 fwlog_size;
111 	u32 act_size;
112 };
113 
114 struct vpu_mbox {
115 	char name[20];
116 	struct mbox_client cl;
117 	struct mbox_chan *ch;
118 	bool block;
119 };
120 
121 enum vpu_core_state {
122 	VPU_CORE_DEINIT = 0,
123 	VPU_CORE_ACTIVE,
124 	VPU_CORE_HANG
125 };
126 
127 struct vpu_core {
128 	void __iomem *base;
129 	struct platform_device *pdev;
130 	struct device *dev;
131 	struct device *parent;
132 	struct device *pd;
133 	struct device_link *pd_link;
134 	struct mutex lock;     /* protect vpu core */
135 	struct mutex cmd_lock; /* Lock vpu command */
136 	struct list_head list;
137 	enum vpu_core_type type;
138 	int id;
139 	const struct vpu_core_resources *res;
140 	unsigned long instance_mask;
141 	u32 supported_instance_count;
142 	unsigned long hang_mask;
143 	u32 request_count;
144 	struct list_head instances;
145 	enum vpu_core_state state;
146 	u32 fw_version;
147 
148 	struct vpu_buffer fw;
149 	struct vpu_buffer rpc;
150 	struct vpu_buffer log;
151 	struct vpu_buffer act;
152 
153 	struct vpu_mbox tx_type;
154 	struct vpu_mbox tx_data;
155 	struct vpu_mbox rx;
156 	unsigned long cmd_seq;
157 
158 	wait_queue_head_t ack_wq;
159 	struct completion cmp;
160 	struct workqueue_struct *workqueue;
161 	struct work_struct msg_work;
162 	struct delayed_work msg_delayed_work;
163 	struct kfifo msg_fifo;
164 	void *msg_buffer;
165 	unsigned int msg_buffer_size;
166 
167 	struct vpu_dev *vpu;
168 	void *iface;
169 
170 	struct dentry *debugfs;
171 	struct dentry *debugfs_fwlog;
172 };
173 
174 enum vpu_codec_state {
175 	VPU_CODEC_STATE_DEINIT = 1,
176 	VPU_CODEC_STATE_CONFIGURED,
177 	VPU_CODEC_STATE_START,
178 	VPU_CODEC_STATE_STARTED,
179 	VPU_CODEC_STATE_ACTIVE,
180 	VPU_CODEC_STATE_SEEK,
181 	VPU_CODEC_STATE_STOP,
182 	VPU_CODEC_STATE_DRAIN,
183 	VPU_CODEC_STATE_DYAMIC_RESOLUTION_CHANGE,
184 };
185 
186 struct vpu_frame_info {
187 	u32 type;
188 	u32 id;
189 	u32 sequence;
190 	u32 luma;
191 	u32 chroma_u;
192 	u32 chroma_v;
193 	u32 data_offset;
194 	u32 flags;
195 	u32 skipped;
196 	s64 timestamp;
197 };
198 
199 struct vpu_inst;
200 struct vpu_inst_ops {
201 	int (*ctrl_init)(struct vpu_inst *inst);
202 	int (*start)(struct vpu_inst *inst, u32 type);
203 	int (*stop)(struct vpu_inst *inst, u32 type);
204 	int (*abort)(struct vpu_inst *inst);
205 	bool (*check_ready)(struct vpu_inst *inst, unsigned int type);
206 	void (*buf_done)(struct vpu_inst *inst, struct vpu_frame_info *frame);
207 	void (*event_notify)(struct vpu_inst *inst, u32 event, void *data);
208 	void (*release)(struct vpu_inst *inst);
209 	void (*cleanup)(struct vpu_inst *inst);
210 	void (*mem_request)(struct vpu_inst *inst,
211 			    u32 enc_frame_size,
212 			    u32 enc_frame_num,
213 			    u32 ref_frame_size,
214 			    u32 ref_frame_num,
215 			    u32 act_frame_size,
216 			    u32 act_frame_num);
217 	void (*input_done)(struct vpu_inst *inst);
218 	void (*stop_done)(struct vpu_inst *inst);
219 	int (*process_output)(struct vpu_inst *inst, struct vb2_buffer *vb);
220 	int (*process_capture)(struct vpu_inst *inst, struct vb2_buffer *vb);
221 	int (*get_one_frame)(struct vpu_inst *inst, void *info);
222 	void (*on_queue_empty)(struct vpu_inst *inst, u32 type);
223 	int (*get_debug_info)(struct vpu_inst *inst, char *str, u32 size, u32 i);
224 	void (*wait_prepare)(struct vpu_inst *inst);
225 	void (*wait_finish)(struct vpu_inst *inst);
226 };
227 
228 struct vpu_inst {
229 	struct list_head list;
230 	struct mutex lock; /* v4l2 and videobuf2 lock */
231 	struct vpu_dev *vpu;
232 	struct vpu_core *core;
233 	struct device *dev;
234 	int id;
235 
236 	struct v4l2_fh fh;
237 	struct v4l2_ctrl_handler ctrl_handler;
238 	atomic_t ref_count;
239 	int (*release)(struct vpu_inst *inst);
240 
241 	enum vpu_codec_state state;
242 	enum vpu_core_type type;
243 
244 	struct workqueue_struct *workqueue;
245 	struct work_struct msg_work;
246 	struct kfifo msg_fifo;
247 	u8 msg_buffer[VPU_MSG_BUFFER_SIZE];
248 
249 	struct vpu_buffer stream_buffer;
250 	bool use_stream_buffer;
251 	struct vpu_buffer act;
252 
253 	struct list_head cmd_q;
254 	void *pending;
255 
256 	struct vpu_inst_ops *ops;
257 	const struct vpu_format *formats;
258 	struct vpu_format out_format;
259 	struct vpu_format cap_format;
260 	u32 min_buffer_cap;
261 	u32 min_buffer_out;
262 	u32 total_input_count;
263 
264 	struct v4l2_rect crop;
265 	u32 colorspace;
266 	u8 ycbcr_enc;
267 	u8 quantization;
268 	u8 xfer_func;
269 	u32 sequence;
270 	u32 extra_size;
271 
272 	u32 flows[16];
273 	u32 flow_idx;
274 
275 	pid_t pid;
276 	pid_t tgid;
277 	struct dentry *debugfs;
278 
279 	void *priv;
280 };
281 
282 #define call_vop(inst, op, args...)					\
283 	((inst)->ops->op ? (inst)->ops->op(inst, ##args) : 0)		\
284 
285 #define call_void_vop(inst, op, args...)				\
286 	do {								\
287 		if ((inst)->ops->op)					\
288 			(inst)->ops->op(inst, ##args);				\
289 	} while (0)
290 
291 enum {
292 	VPU_BUF_STATE_IDLE = 0,
293 	VPU_BUF_STATE_INUSE,
294 	VPU_BUF_STATE_DECODED,
295 	VPU_BUF_STATE_READY,
296 	VPU_BUF_STATE_SKIP,
297 	VPU_BUF_STATE_ERROR
298 };
299 
300 struct vpu_vb2_buffer {
301 	struct v4l2_m2m_buffer m2m_buf;
302 	dma_addr_t luma;
303 	dma_addr_t chroma_u;
304 	dma_addr_t chroma_v;
305 	unsigned int state;
306 	u32 tag;
307 };
308 
309 void vpu_writel(struct vpu_dev *vpu, u32 reg, u32 val);
310 u32 vpu_readl(struct vpu_dev *vpu, u32 reg);
311 
312 static inline struct vpu_vb2_buffer *to_vpu_vb2_buffer(struct vb2_v4l2_buffer *vbuf)
313 {
314 	struct v4l2_m2m_buffer *m2m_buf = container_of(vbuf, struct v4l2_m2m_buffer, vb);
315 
316 	return container_of(m2m_buf, struct vpu_vb2_buffer, m2m_buf);
317 }
318 
319 static inline const char *vpu_core_type_desc(enum vpu_core_type type)
320 {
321 	return type == VPU_CORE_TYPE_ENC ? "encoder" : "decoder";
322 }
323 
324 static inline struct vpu_inst *to_inst(struct file *filp)
325 {
326 	return container_of(filp->private_data, struct vpu_inst, fh);
327 }
328 
329 #define ctrl_to_inst(ctrl)	\
330 	container_of((ctrl)->handler, struct vpu_inst, ctrl_handler)
331 
332 const struct v4l2_ioctl_ops *venc_get_ioctl_ops(void);
333 const struct v4l2_file_operations *venc_get_fops(void);
334 const struct v4l2_ioctl_ops *vdec_get_ioctl_ops(void);
335 const struct v4l2_file_operations *vdec_get_fops(void);
336 
337 int vpu_add_func(struct vpu_dev *vpu, struct vpu_func *func);
338 void vpu_remove_func(struct vpu_func *func);
339 
340 struct vpu_inst *vpu_inst_get(struct vpu_inst *inst);
341 void vpu_inst_put(struct vpu_inst *inst);
342 struct vpu_core *vpu_request_core(struct vpu_dev *vpu, enum vpu_core_type type);
343 void vpu_release_core(struct vpu_core *core);
344 int vpu_inst_register(struct vpu_inst *inst);
345 int vpu_inst_unregister(struct vpu_inst *inst);
346 const struct vpu_core_resources *vpu_get_resource(struct vpu_inst *inst);
347 
348 int vpu_inst_create_dbgfs_file(struct vpu_inst *inst);
349 int vpu_inst_remove_dbgfs_file(struct vpu_inst *inst);
350 int vpu_core_create_dbgfs_file(struct vpu_core *core);
351 int vpu_core_remove_dbgfs_file(struct vpu_core *core);
352 void vpu_inst_record_flow(struct vpu_inst *inst, u32 flow);
353 
354 int vpu_core_driver_init(void);
355 void vpu_core_driver_exit(void);
356 
357 extern bool debug;
358 #define vpu_trace(dev, fmt, arg...)					\
359 	do {								\
360 		if (debug)						\
361 			dev_info(dev, "%s: " fmt, __func__, ## arg);	\
362 	} while (0)
363 
364 #endif
365