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 | struct v4l2_ctrl_config cfg; |
29 | }; |
30 | |
31 | struct rkvdec_ctrls { |
32 | const struct rkvdec_ctrl_desc *ctrls; |
33 | unsigned int num_ctrls; |
34 | }; |
35 | |
36 | struct rkvdec_run { |
37 | struct { |
38 | struct vb2_v4l2_buffer *src; |
39 | struct vb2_v4l2_buffer *dst; |
40 | } bufs; |
41 | }; |
42 | |
43 | struct rkvdec_vp9_decoded_buffer_info { |
44 | /* Info needed when the decoded frame serves as a reference frame. */ |
45 | unsigned short width; |
46 | unsigned short height; |
47 | unsigned int bit_depth : 4; |
48 | }; |
49 | |
50 | struct rkvdec_decoded_buffer { |
51 | /* Must be the first field in this struct. */ |
52 | struct v4l2_m2m_buffer base; |
53 | |
54 | union { |
55 | struct rkvdec_vp9_decoded_buffer_info vp9; |
56 | }; |
57 | }; |
58 | |
59 | static inline struct rkvdec_decoded_buffer * |
60 | vb2_to_rkvdec_decoded_buf(struct vb2_buffer *buf) |
61 | { |
62 | return container_of(buf, struct rkvdec_decoded_buffer, |
63 | base.vb.vb2_buf); |
64 | } |
65 | |
66 | struct rkvdec_coded_fmt_ops { |
67 | int (*adjust_fmt)(struct rkvdec_ctx *ctx, |
68 | struct v4l2_format *f); |
69 | int (*start)(struct rkvdec_ctx *ctx); |
70 | void (*stop)(struct rkvdec_ctx *ctx); |
71 | int (*run)(struct rkvdec_ctx *ctx); |
72 | void (*done)(struct rkvdec_ctx *ctx, struct vb2_v4l2_buffer *src_buf, |
73 | struct vb2_v4l2_buffer *dst_buf, |
74 | enum vb2_buffer_state result); |
75 | int (*try_ctrl)(struct rkvdec_ctx *ctx, struct v4l2_ctrl *ctrl); |
76 | }; |
77 | |
78 | struct rkvdec_coded_fmt_desc { |
79 | u32 fourcc; |
80 | struct v4l2_frmsize_stepwise frmsize; |
81 | const struct rkvdec_ctrls *ctrls; |
82 | const struct rkvdec_coded_fmt_ops *ops; |
83 | unsigned int num_decoded_fmts; |
84 | const u32 *decoded_fmts; |
85 | u32 subsystem_flags; |
86 | }; |
87 | |
88 | struct rkvdec_dev { |
89 | struct v4l2_device v4l2_dev; |
90 | struct media_device mdev; |
91 | struct video_device vdev; |
92 | struct v4l2_m2m_dev *m2m_dev; |
93 | struct device *dev; |
94 | struct clk_bulk_data *clocks; |
95 | void __iomem *regs; |
96 | struct mutex vdev_lock; /* serializes ioctls */ |
97 | struct delayed_work watchdog_work; |
98 | }; |
99 | |
100 | struct rkvdec_ctx { |
101 | struct v4l2_fh fh; |
102 | struct v4l2_format coded_fmt; |
103 | struct v4l2_format decoded_fmt; |
104 | const struct rkvdec_coded_fmt_desc *coded_fmt_desc; |
105 | struct v4l2_ctrl_handler ctrl_hdl; |
106 | struct rkvdec_dev *dev; |
107 | void *priv; |
108 | }; |
109 | |
110 | static inline struct rkvdec_ctx *fh_to_rkvdec_ctx(struct v4l2_fh *fh) |
111 | { |
112 | return container_of(fh, struct rkvdec_ctx, fh); |
113 | } |
114 | |
115 | struct rkvdec_aux_buf { |
116 | void *cpu; |
117 | dma_addr_t dma; |
118 | size_t size; |
119 | }; |
120 | |
121 | void rkvdec_run_preamble(struct rkvdec_ctx *ctx, struct rkvdec_run *run); |
122 | void rkvdec_run_postamble(struct rkvdec_ctx *ctx, struct rkvdec_run *run); |
123 | |
124 | extern const struct rkvdec_coded_fmt_ops rkvdec_h264_fmt_ops; |
125 | extern const struct rkvdec_coded_fmt_ops rkvdec_vp9_fmt_ops; |
126 | |
127 | #endif /* RKVDEC_H_ */ |
128 | |