1
2
3
4
5
6
7
8#ifndef __MTK_MDP_CORE_H__
9#define __MTK_MDP_CORE_H__
10
11#include <linux/videodev2.h>
12#include <media/v4l2-ctrls.h>
13#include <media/v4l2-device.h>
14#include <media/v4l2-mem2mem.h>
15#include <media/videobuf2-core.h>
16#include <media/videobuf2-dma-contig.h>
17
18#include "mtk_mdp_vpu.h"
19#include "mtk_mdp_comp.h"
20
21
22#define MTK_MDP_MODULE_NAME "mtk-mdp"
23
24#define MTK_MDP_SHUTDOWN_TIMEOUT ((100*HZ)/1000)
25#define MTK_MDP_MAX_CTRL_NUM 10
26
27#define MTK_MDP_FMT_FLAG_OUTPUT BIT(0)
28#define MTK_MDP_FMT_FLAG_CAPTURE BIT(1)
29
30#define MTK_MDP_VPU_INIT BIT(0)
31#define MTK_MDP_CTX_ERROR BIT(5)
32
33
34
35
36
37
38
39
40struct mtk_mdp_pix_align {
41 u16 org_w;
42 u16 org_h;
43 u16 target_w;
44 u16 target_h;
45};
46
47
48
49
50
51
52
53
54
55
56
57
58
59struct mtk_mdp_fmt {
60 u32 pixelformat;
61 u16 num_planes;
62 u16 num_comp;
63 u8 depth[VIDEO_MAX_PLANES];
64 u8 row_depth[VIDEO_MAX_PLANES];
65 u32 flags;
66 struct mtk_mdp_pix_align *align;
67};
68
69
70
71
72
73struct mtk_mdp_addr {
74 dma_addr_t addr[MTK_MDP_MAX_NUM_PLANE];
75};
76
77
78
79
80
81
82
83struct mtk_mdp_ctrls {
84 struct v4l2_ctrl *rotate;
85 struct v4l2_ctrl *hflip;
86 struct v4l2_ctrl *vflip;
87 struct v4l2_ctrl *global_alpha;
88};
89
90
91
92
93
94
95
96
97
98
99
100
101struct mtk_mdp_frame {
102 u32 width;
103 u32 height;
104 struct v4l2_rect crop;
105 unsigned long payload[VIDEO_MAX_PLANES];
106 unsigned int pitch[VIDEO_MAX_PLANES];
107 struct mtk_mdp_addr addr;
108 const struct mtk_mdp_fmt *fmt;
109 u8 alpha;
110};
111
112
113
114
115
116
117
118
119
120
121
122struct mtk_mdp_variant {
123 struct mtk_mdp_pix_limit *pix_max;
124 struct mtk_mdp_pix_limit *pix_min;
125 struct mtk_mdp_pix_align *pix_align;
126 u16 h_scale_up_max;
127 u16 v_scale_up_max;
128 u16 h_scale_down_max;
129 u16 v_scale_down_max;
130};
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151struct mtk_mdp_dev {
152 struct mutex lock;
153 struct mutex vpulock;
154 struct platform_device *pdev;
155 struct mtk_mdp_variant *variant;
156 u16 id;
157 struct list_head comp_list;
158 struct v4l2_m2m_dev *m2m_dev;
159 struct list_head ctx_list;
160 struct video_device *vdev;
161 struct v4l2_device v4l2_dev;
162 struct workqueue_struct *job_wq;
163 struct platform_device *vpu_dev;
164 int ctx_num;
165 unsigned long id_counter;
166 struct workqueue_struct *wdt_wq;
167 struct work_struct wdt_work;
168};
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196struct mtk_mdp_ctx {
197 struct list_head list;
198 struct mtk_mdp_frame s_frame;
199 struct mtk_mdp_frame d_frame;
200 u32 flags;
201 u32 state;
202 int id;
203 int rotation;
204 u32 hflip:1;
205 u32 vflip:1;
206 struct mtk_mdp_dev *mdp_dev;
207 struct v4l2_m2m_ctx *m2m_ctx;
208 struct v4l2_fh fh;
209 struct v4l2_ctrl_handler ctrl_handler;
210 struct mtk_mdp_ctrls ctrls;
211 bool ctrls_rdy;
212 enum v4l2_colorspace colorspace;
213 enum v4l2_ycbcr_encoding ycbcr_enc;
214 enum v4l2_xfer_func xfer_func;
215 enum v4l2_quantization quant;
216
217 struct mtk_mdp_vpu vpu;
218 struct mutex slock;
219 struct work_struct work;
220};
221
222extern int mtk_mdp_dbg_level;
223
224void mtk_mdp_register_component(struct mtk_mdp_dev *mdp,
225 struct mtk_mdp_comp *comp);
226
227void mtk_mdp_unregister_component(struct mtk_mdp_dev *mdp,
228 struct mtk_mdp_comp *comp);
229
230#if defined(DEBUG)
231
232#define mtk_mdp_dbg(level, fmt, args...) \
233 do { \
234 if (mtk_mdp_dbg_level >= level) \
235 pr_info("[MTK_MDP] level=%d %s(),%d: " fmt "\n", \
236 level, __func__, __LINE__, ##args); \
237 } while (0)
238
239#define mtk_mdp_err(fmt, args...) \
240 pr_err("[MTK_MDP][ERROR] %s:%d: " fmt "\n", __func__, __LINE__, \
241 ##args)
242
243
244#define mtk_mdp_dbg_enter() mtk_mdp_dbg(3, "+")
245#define mtk_mdp_dbg_leave() mtk_mdp_dbg(3, "-")
246
247#else
248
249#define mtk_mdp_dbg(level, fmt, args...) {}
250#define mtk_mdp_err(fmt, args...)
251#define mtk_mdp_dbg_enter()
252#define mtk_mdp_dbg_leave()
253
254#endif
255
256#endif
257