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