xref: /linux/drivers/media/platform/rockchip/rkvdec/rkvdec.h (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
1*d968e50bSDetlev Casanova /* SPDX-License-Identifier: GPL-2.0 */
2*d968e50bSDetlev Casanova /*
3*d968e50bSDetlev Casanova  * Rockchip Video Decoder driver
4*d968e50bSDetlev Casanova  *
5*d968e50bSDetlev Casanova  * Copyright (C) 2019 Collabora, Ltd.
6*d968e50bSDetlev Casanova  *
7*d968e50bSDetlev Casanova  * Based on rkvdec driver by Google LLC. (Tomasz Figa <tfiga@chromium.org>)
8*d968e50bSDetlev Casanova  * Based on s5p-mfc driver by Samsung Electronics Co., Ltd.
9*d968e50bSDetlev Casanova  * Copyright (C) 2011 Samsung Electronics Co., Ltd.
10*d968e50bSDetlev Casanova  */
11*d968e50bSDetlev Casanova #ifndef RKVDEC_H_
12*d968e50bSDetlev Casanova #define RKVDEC_H_
13*d968e50bSDetlev Casanova 
14*d968e50bSDetlev Casanova #include <linux/platform_device.h>
15*d968e50bSDetlev Casanova #include <linux/videodev2.h>
16*d968e50bSDetlev Casanova #include <linux/wait.h>
17*d968e50bSDetlev Casanova #include <linux/clk.h>
18*d968e50bSDetlev Casanova 
19*d968e50bSDetlev Casanova #include <media/v4l2-ctrls.h>
20*d968e50bSDetlev Casanova #include <media/v4l2-device.h>
21*d968e50bSDetlev Casanova #include <media/v4l2-ioctl.h>
22*d968e50bSDetlev Casanova #include <media/videobuf2-core.h>
23*d968e50bSDetlev Casanova #include <media/videobuf2-dma-contig.h>
24*d968e50bSDetlev Casanova 
25*d968e50bSDetlev Casanova struct rkvdec_ctx;
26*d968e50bSDetlev Casanova 
27*d968e50bSDetlev Casanova struct rkvdec_ctrl_desc {
28*d968e50bSDetlev Casanova 	struct v4l2_ctrl_config cfg;
29*d968e50bSDetlev Casanova };
30*d968e50bSDetlev Casanova 
31*d968e50bSDetlev Casanova struct rkvdec_ctrls {
32*d968e50bSDetlev Casanova 	const struct rkvdec_ctrl_desc *ctrls;
33*d968e50bSDetlev Casanova 	unsigned int num_ctrls;
34*d968e50bSDetlev Casanova };
35*d968e50bSDetlev Casanova 
36*d968e50bSDetlev Casanova struct rkvdec_run {
37*d968e50bSDetlev Casanova 	struct {
38*d968e50bSDetlev Casanova 		struct vb2_v4l2_buffer *src;
39*d968e50bSDetlev Casanova 		struct vb2_v4l2_buffer *dst;
40*d968e50bSDetlev Casanova 	} bufs;
41*d968e50bSDetlev Casanova };
42*d968e50bSDetlev Casanova 
43*d968e50bSDetlev Casanova struct rkvdec_vp9_decoded_buffer_info {
44*d968e50bSDetlev Casanova 	/* Info needed when the decoded frame serves as a reference frame. */
45*d968e50bSDetlev Casanova 	unsigned short width;
46*d968e50bSDetlev Casanova 	unsigned short height;
47*d968e50bSDetlev Casanova 	unsigned int bit_depth : 4;
48*d968e50bSDetlev Casanova };
49*d968e50bSDetlev Casanova 
50*d968e50bSDetlev Casanova struct rkvdec_decoded_buffer {
51*d968e50bSDetlev Casanova 	/* Must be the first field in this struct. */
52*d968e50bSDetlev Casanova 	struct v4l2_m2m_buffer base;
53*d968e50bSDetlev Casanova 
54*d968e50bSDetlev Casanova 	union {
55*d968e50bSDetlev Casanova 		struct rkvdec_vp9_decoded_buffer_info vp9;
56*d968e50bSDetlev Casanova 	};
57*d968e50bSDetlev Casanova };
58*d968e50bSDetlev Casanova 
59*d968e50bSDetlev Casanova static inline struct rkvdec_decoded_buffer *
60*d968e50bSDetlev Casanova vb2_to_rkvdec_decoded_buf(struct vb2_buffer *buf)
61*d968e50bSDetlev Casanova {
62*d968e50bSDetlev Casanova 	return container_of(buf, struct rkvdec_decoded_buffer,
63*d968e50bSDetlev Casanova 			    base.vb.vb2_buf);
64*d968e50bSDetlev Casanova }
65*d968e50bSDetlev Casanova 
66*d968e50bSDetlev Casanova struct rkvdec_coded_fmt_ops {
67*d968e50bSDetlev Casanova 	int (*adjust_fmt)(struct rkvdec_ctx *ctx,
68*d968e50bSDetlev Casanova 			  struct v4l2_format *f);
69*d968e50bSDetlev Casanova 	int (*start)(struct rkvdec_ctx *ctx);
70*d968e50bSDetlev Casanova 	void (*stop)(struct rkvdec_ctx *ctx);
71*d968e50bSDetlev Casanova 	int (*run)(struct rkvdec_ctx *ctx);
72*d968e50bSDetlev Casanova 	void (*done)(struct rkvdec_ctx *ctx, struct vb2_v4l2_buffer *src_buf,
73*d968e50bSDetlev Casanova 		     struct vb2_v4l2_buffer *dst_buf,
74*d968e50bSDetlev Casanova 		     enum vb2_buffer_state result);
75*d968e50bSDetlev Casanova 	int (*try_ctrl)(struct rkvdec_ctx *ctx, struct v4l2_ctrl *ctrl);
76*d968e50bSDetlev Casanova 	enum rkvdec_image_fmt (*get_image_fmt)(struct rkvdec_ctx *ctx,
77*d968e50bSDetlev Casanova 					       struct v4l2_ctrl *ctrl);
78*d968e50bSDetlev Casanova };
79*d968e50bSDetlev Casanova 
80*d968e50bSDetlev Casanova enum rkvdec_image_fmt {
81*d968e50bSDetlev Casanova 	RKVDEC_IMG_FMT_ANY = 0,
82*d968e50bSDetlev Casanova 	RKVDEC_IMG_FMT_420_8BIT,
83*d968e50bSDetlev Casanova 	RKVDEC_IMG_FMT_420_10BIT,
84*d968e50bSDetlev Casanova 	RKVDEC_IMG_FMT_422_8BIT,
85*d968e50bSDetlev Casanova 	RKVDEC_IMG_FMT_422_10BIT,
86*d968e50bSDetlev Casanova };
87*d968e50bSDetlev Casanova 
88*d968e50bSDetlev Casanova struct rkvdec_decoded_fmt_desc {
89*d968e50bSDetlev Casanova 	u32 fourcc;
90*d968e50bSDetlev Casanova 	enum rkvdec_image_fmt image_fmt;
91*d968e50bSDetlev Casanova };
92*d968e50bSDetlev Casanova 
93*d968e50bSDetlev Casanova struct rkvdec_coded_fmt_desc {
94*d968e50bSDetlev Casanova 	u32 fourcc;
95*d968e50bSDetlev Casanova 	struct v4l2_frmsize_stepwise frmsize;
96*d968e50bSDetlev Casanova 	const struct rkvdec_ctrls *ctrls;
97*d968e50bSDetlev Casanova 	const struct rkvdec_coded_fmt_ops *ops;
98*d968e50bSDetlev Casanova 	unsigned int num_decoded_fmts;
99*d968e50bSDetlev Casanova 	const struct rkvdec_decoded_fmt_desc *decoded_fmts;
100*d968e50bSDetlev Casanova 	u32 subsystem_flags;
101*d968e50bSDetlev Casanova };
102*d968e50bSDetlev Casanova 
103*d968e50bSDetlev Casanova struct rkvdec_dev {
104*d968e50bSDetlev Casanova 	struct v4l2_device v4l2_dev;
105*d968e50bSDetlev Casanova 	struct media_device mdev;
106*d968e50bSDetlev Casanova 	struct video_device vdev;
107*d968e50bSDetlev Casanova 	struct v4l2_m2m_dev *m2m_dev;
108*d968e50bSDetlev Casanova 	struct device *dev;
109*d968e50bSDetlev Casanova 	struct clk_bulk_data *clocks;
110*d968e50bSDetlev Casanova 	void __iomem *regs;
111*d968e50bSDetlev Casanova 	struct mutex vdev_lock; /* serializes ioctls */
112*d968e50bSDetlev Casanova 	struct delayed_work watchdog_work;
113*d968e50bSDetlev Casanova 	struct iommu_domain *empty_domain;
114*d968e50bSDetlev Casanova };
115*d968e50bSDetlev Casanova 
116*d968e50bSDetlev Casanova struct rkvdec_ctx {
117*d968e50bSDetlev Casanova 	struct v4l2_fh fh;
118*d968e50bSDetlev Casanova 	struct v4l2_format coded_fmt;
119*d968e50bSDetlev Casanova 	struct v4l2_format decoded_fmt;
120*d968e50bSDetlev Casanova 	const struct rkvdec_coded_fmt_desc *coded_fmt_desc;
121*d968e50bSDetlev Casanova 	struct v4l2_ctrl_handler ctrl_hdl;
122*d968e50bSDetlev Casanova 	struct rkvdec_dev *dev;
123*d968e50bSDetlev Casanova 	enum rkvdec_image_fmt image_fmt;
124*d968e50bSDetlev Casanova 	void *priv;
125*d968e50bSDetlev Casanova };
126*d968e50bSDetlev Casanova 
127*d968e50bSDetlev Casanova static inline struct rkvdec_ctx *fh_to_rkvdec_ctx(struct v4l2_fh *fh)
128*d968e50bSDetlev Casanova {
129*d968e50bSDetlev Casanova 	return container_of(fh, struct rkvdec_ctx, fh);
130*d968e50bSDetlev Casanova }
131*d968e50bSDetlev Casanova 
132*d968e50bSDetlev Casanova struct rkvdec_aux_buf {
133*d968e50bSDetlev Casanova 	void *cpu;
134*d968e50bSDetlev Casanova 	dma_addr_t dma;
135*d968e50bSDetlev Casanova 	size_t size;
136*d968e50bSDetlev Casanova };
137*d968e50bSDetlev Casanova 
138*d968e50bSDetlev Casanova void rkvdec_run_preamble(struct rkvdec_ctx *ctx, struct rkvdec_run *run);
139*d968e50bSDetlev Casanova void rkvdec_run_postamble(struct rkvdec_ctx *ctx, struct rkvdec_run *run);
140*d968e50bSDetlev Casanova 
141*d968e50bSDetlev Casanova extern const struct rkvdec_coded_fmt_ops rkvdec_h264_fmt_ops;
142*d968e50bSDetlev Casanova extern const struct rkvdec_coded_fmt_ops rkvdec_vp9_fmt_ops;
143*d968e50bSDetlev Casanova 
144*d968e50bSDetlev Casanova #endif /* RKVDEC_H_ */
145