1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2023 MediaTek Inc.
4  * Author: Ping-Hsun Wu <ping-hsun.wu@mediatek.com>
5  */
6 
7 #include "mtk-img-ipi.h"
8 #include "mtk-mdp3-cfg.h"
9 #include "mtk-mdp3-core.h"
10 #include "mtk-mdp3-comp.h"
11 #include "mtk-mdp3-regs.h"
12 
13 enum mt8183_mdp_comp_id {
14 	/* ISP */
15 	MT8183_MDP_COMP_WPEI = 0,
16 	MT8183_MDP_COMP_WPEO,           /* 1 */
17 	MT8183_MDP_COMP_WPEI2,          /* 2 */
18 	MT8183_MDP_COMP_WPEO2,          /* 3 */
19 	MT8183_MDP_COMP_ISP_IMGI,       /* 4 */
20 	MT8183_MDP_COMP_ISP_IMGO,       /* 5 */
21 	MT8183_MDP_COMP_ISP_IMG2O,      /* 6 */
22 
23 	/* IPU */
24 	MT8183_MDP_COMP_IPUI,           /* 7 */
25 	MT8183_MDP_COMP_IPUO,           /* 8 */
26 
27 	/* MDP */
28 	MT8183_MDP_COMP_CAMIN,          /* 9 */
29 	MT8183_MDP_COMP_CAMIN2,         /* 10 */
30 	MT8183_MDP_COMP_RDMA0,          /* 11 */
31 	MT8183_MDP_COMP_AAL0,           /* 12 */
32 	MT8183_MDP_COMP_CCORR0,         /* 13 */
33 	MT8183_MDP_COMP_RSZ0,           /* 14 */
34 	MT8183_MDP_COMP_RSZ1,           /* 15 */
35 	MT8183_MDP_COMP_TDSHP0,         /* 16 */
36 	MT8183_MDP_COMP_COLOR0,         /* 17 */
37 	MT8183_MDP_COMP_PATH0_SOUT,     /* 18 */
38 	MT8183_MDP_COMP_PATH1_SOUT,     /* 19 */
39 	MT8183_MDP_COMP_WROT0,          /* 20 */
40 	MT8183_MDP_COMP_WDMA,           /* 21 */
41 
42 	/* Dummy Engine */
43 	MT8183_MDP_COMP_RDMA1,          /* 22 */
44 	MT8183_MDP_COMP_RSZ2,           /* 23 */
45 	MT8183_MDP_COMP_TDSHP1,         /* 24 */
46 	MT8183_MDP_COMP_WROT1,          /* 25 */
47 };
48 
49 static const struct of_device_id mt8183_mdp_probe_infra[MDP_INFRA_MAX] = {
50 	[MDP_INFRA_MMSYS] = { .compatible = "mediatek,mt8183-mmsys" },
51 	[MDP_INFRA_MUTEX] = { .compatible = "mediatek,mt8183-disp-mutex" },
52 	[MDP_INFRA_SCP] = { .compatible = "mediatek,mt8183-scp" }
53 };
54 
55 static const struct mdp_platform_config mt8183_plat_cfg = {
56 	.rdma_support_10bit		= true,
57 	.rdma_rsz1_sram_sharing		= true,
58 	.rdma_upsample_repeat_only	= true,
59 	.rsz_disable_dcm_small_sample	= false,
60 	.wrot_filter_constraint		= false,
61 };
62 
63 static const u32 mt8183_mutex_idx[MDP_MAX_COMP_COUNT] = {
64 	[MDP_COMP_RDMA0] = MUTEX_MOD_IDX_MDP_RDMA0,
65 	[MDP_COMP_RSZ0] = MUTEX_MOD_IDX_MDP_RSZ0,
66 	[MDP_COMP_RSZ1] = MUTEX_MOD_IDX_MDP_RSZ1,
67 	[MDP_COMP_TDSHP0] = MUTEX_MOD_IDX_MDP_TDSHP0,
68 	[MDP_COMP_WROT0] = MUTEX_MOD_IDX_MDP_WROT0,
69 	[MDP_COMP_WDMA] = MUTEX_MOD_IDX_MDP_WDMA,
70 	[MDP_COMP_AAL0] = MUTEX_MOD_IDX_MDP_AAL0,
71 	[MDP_COMP_CCORR0] = MUTEX_MOD_IDX_MDP_CCORR0,
72 };
73 
74 static const struct mdp_comp_data mt8183_mdp_comp_data[MDP_MAX_COMP_COUNT] = {
75 	[MDP_COMP_WPEI] = {
76 		{MDP_COMP_TYPE_WPEI, 0, MT8183_MDP_COMP_WPEI},
77 		{0, 0, 0}
78 	},
79 	[MDP_COMP_WPEO] = {
80 		{MDP_COMP_TYPE_EXTO, 2, MT8183_MDP_COMP_WPEO},
81 		{0, 0, 0}
82 	},
83 	[MDP_COMP_WPEI2] = {
84 		{MDP_COMP_TYPE_WPEI, 1, MT8183_MDP_COMP_WPEI2},
85 		{0, 0, 0}
86 	},
87 	[MDP_COMP_WPEO2] = {
88 		{MDP_COMP_TYPE_EXTO, 3, MT8183_MDP_COMP_WPEO2},
89 		{0, 0, 0}
90 	},
91 	[MDP_COMP_ISP_IMGI] = {
92 		{MDP_COMP_TYPE_IMGI, 0, MT8183_MDP_COMP_ISP_IMGI},
93 		{0, 0, 4}
94 	},
95 	[MDP_COMP_ISP_IMGO] = {
96 		{MDP_COMP_TYPE_EXTO, 0, MT8183_MDP_COMP_ISP_IMGO},
97 		{0, 0, 4}
98 	},
99 	[MDP_COMP_ISP_IMG2O] = {
100 		{MDP_COMP_TYPE_EXTO, 1, MT8183_MDP_COMP_ISP_IMG2O},
101 		{0, 0, 0}
102 	},
103 	[MDP_COMP_CAMIN] = {
104 		{MDP_COMP_TYPE_DL_PATH, 0, MT8183_MDP_COMP_CAMIN},
105 		{2, 2, 1}
106 	},
107 	[MDP_COMP_CAMIN2] = {
108 		{MDP_COMP_TYPE_DL_PATH, 1, MT8183_MDP_COMP_CAMIN2},
109 		{2, 4, 1}
110 	},
111 	[MDP_COMP_RDMA0] = {
112 		{MDP_COMP_TYPE_RDMA, 0, MT8183_MDP_COMP_RDMA0},
113 		{2, 0, 0}
114 	},
115 	[MDP_COMP_CCORR0] = {
116 		{MDP_COMP_TYPE_CCORR, 0, MT8183_MDP_COMP_CCORR0},
117 		{1, 0, 0}
118 	},
119 	[MDP_COMP_RSZ0] = {
120 		{MDP_COMP_TYPE_RSZ, 0, MT8183_MDP_COMP_RSZ0},
121 		{1, 0, 0}
122 	},
123 	[MDP_COMP_RSZ1] = {
124 		{MDP_COMP_TYPE_RSZ, 1, MT8183_MDP_COMP_RSZ1},
125 		{1, 0, 0}
126 	},
127 	[MDP_COMP_TDSHP0] = {
128 		{MDP_COMP_TYPE_TDSHP, 0, MT8183_MDP_COMP_TDSHP0},
129 		{0, 0, 0}
130 	},
131 	[MDP_COMP_PATH0_SOUT] = {
132 		{MDP_COMP_TYPE_PATH, 0, MT8183_MDP_COMP_PATH0_SOUT},
133 		{0, 0, 0}
134 	},
135 	[MDP_COMP_PATH1_SOUT] = {
136 		{MDP_COMP_TYPE_PATH, 1, MT8183_MDP_COMP_PATH1_SOUT},
137 		{0, 0, 0}
138 	},
139 	[MDP_COMP_WROT0] = {
140 		{MDP_COMP_TYPE_WROT, 0, MT8183_MDP_COMP_WROT0},
141 		{1, 0, 0}
142 	},
143 	[MDP_COMP_WDMA] = {
144 		{MDP_COMP_TYPE_WDMA, 0, MT8183_MDP_COMP_WDMA},
145 		{1, 0, 0}
146 	},
147 };
148 
149 static const struct of_device_id mt8183_sub_comp_dt_ids[] = {
150 	{
151 		.compatible = "mediatek,mt8183-mdp3-wdma",
152 		.data = (void *)MDP_COMP_TYPE_PATH,
153 	}, {
154 		.compatible = "mediatek,mt8183-mdp3-wrot",
155 		.data = (void *)MDP_COMP_TYPE_PATH,
156 	},
157 	{}
158 };
159 
160 /*
161  * All 10-bit related formats are not added in the basic format list,
162  * please add the corresponding format settings before use.
163  */
164 static const struct mdp_format mt8183_formats[] = {
165 	{
166 		.pixelformat	= V4L2_PIX_FMT_GREY,
167 		.mdp_color	= MDP_COLOR_GREY,
168 		.depth		= { 8 },
169 		.row_depth	= { 8 },
170 		.num_planes	= 1,
171 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
172 	}, {
173 		.pixelformat	= V4L2_PIX_FMT_RGB565X,
174 		.mdp_color	= MDP_COLOR_BGR565,
175 		.depth		= { 16 },
176 		.row_depth	= { 16 },
177 		.num_planes	= 1,
178 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
179 	}, {
180 		.pixelformat	= V4L2_PIX_FMT_RGB565,
181 		.mdp_color	= MDP_COLOR_RGB565,
182 		.depth		= { 16 },
183 		.row_depth	= { 16 },
184 		.num_planes	= 1,
185 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
186 	}, {
187 		.pixelformat	= V4L2_PIX_FMT_RGB24,
188 		.mdp_color	= MDP_COLOR_RGB888,
189 		.depth		= { 24 },
190 		.row_depth	= { 24 },
191 		.num_planes	= 1,
192 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
193 	}, {
194 		.pixelformat	= V4L2_PIX_FMT_BGR24,
195 		.mdp_color	= MDP_COLOR_BGR888,
196 		.depth		= { 24 },
197 		.row_depth	= { 24 },
198 		.num_planes	= 1,
199 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
200 	}, {
201 		.pixelformat	= V4L2_PIX_FMT_ABGR32,
202 		.mdp_color	= MDP_COLOR_BGRA8888,
203 		.depth		= { 32 },
204 		.row_depth	= { 32 },
205 		.num_planes	= 1,
206 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
207 	}, {
208 		.pixelformat	= V4L2_PIX_FMT_ARGB32,
209 		.mdp_color	= MDP_COLOR_ARGB8888,
210 		.depth		= { 32 },
211 		.row_depth	= { 32 },
212 		.num_planes	= 1,
213 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
214 	}, {
215 		.pixelformat	= V4L2_PIX_FMT_UYVY,
216 		.mdp_color	= MDP_COLOR_UYVY,
217 		.depth		= { 16 },
218 		.row_depth	= { 16 },
219 		.num_planes	= 1,
220 		.walign		= 1,
221 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
222 	}, {
223 		.pixelformat	= V4L2_PIX_FMT_VYUY,
224 		.mdp_color	= MDP_COLOR_VYUY,
225 		.depth		= { 16 },
226 		.row_depth	= { 16 },
227 		.num_planes	= 1,
228 		.walign		= 1,
229 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
230 	}, {
231 		.pixelformat	= V4L2_PIX_FMT_YUYV,
232 		.mdp_color	= MDP_COLOR_YUYV,
233 		.depth		= { 16 },
234 		.row_depth	= { 16 },
235 		.num_planes	= 1,
236 		.walign		= 1,
237 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
238 	}, {
239 		.pixelformat	= V4L2_PIX_FMT_YVYU,
240 		.mdp_color	= MDP_COLOR_YVYU,
241 		.depth		= { 16 },
242 		.row_depth	= { 16 },
243 		.num_planes	= 1,
244 		.walign		= 1,
245 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
246 	}, {
247 		.pixelformat	= V4L2_PIX_FMT_YUV420,
248 		.mdp_color	= MDP_COLOR_I420,
249 		.depth		= { 12 },
250 		.row_depth	= { 8 },
251 		.num_planes	= 1,
252 		.walign		= 1,
253 		.halign		= 1,
254 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
255 	}, {
256 		.pixelformat	= V4L2_PIX_FMT_YVU420,
257 		.mdp_color	= MDP_COLOR_YV12,
258 		.depth		= { 12 },
259 		.row_depth	= { 8 },
260 		.num_planes	= 1,
261 		.walign		= 1,
262 		.halign		= 1,
263 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
264 	}, {
265 		.pixelformat	= V4L2_PIX_FMT_NV12,
266 		.mdp_color	= MDP_COLOR_NV12,
267 		.depth		= { 12 },
268 		.row_depth	= { 8 },
269 		.num_planes	= 1,
270 		.walign		= 1,
271 		.halign		= 1,
272 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
273 	}, {
274 		.pixelformat	= V4L2_PIX_FMT_NV21,
275 		.mdp_color	= MDP_COLOR_NV21,
276 		.depth		= { 12 },
277 		.row_depth	= { 8 },
278 		.num_planes	= 1,
279 		.walign		= 1,
280 		.halign		= 1,
281 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
282 	}, {
283 		.pixelformat	= V4L2_PIX_FMT_NV16,
284 		.mdp_color	= MDP_COLOR_NV16,
285 		.depth		= { 16 },
286 		.row_depth	= { 8 },
287 		.num_planes	= 1,
288 		.walign		= 1,
289 		.flags		= MDP_FMT_FLAG_OUTPUT,
290 	}, {
291 		.pixelformat	= V4L2_PIX_FMT_NV61,
292 		.mdp_color	= MDP_COLOR_NV61,
293 		.depth		= { 16 },
294 		.row_depth	= { 8 },
295 		.num_planes	= 1,
296 		.walign		= 1,
297 		.flags		= MDP_FMT_FLAG_OUTPUT,
298 	}, {
299 		.pixelformat	= V4L2_PIX_FMT_NV24,
300 		.mdp_color	= MDP_COLOR_NV24,
301 		.depth		= { 24 },
302 		.row_depth	= { 8 },
303 		.num_planes	= 1,
304 		.flags		= MDP_FMT_FLAG_OUTPUT,
305 	}, {
306 		.pixelformat	= V4L2_PIX_FMT_NV42,
307 		.mdp_color	= MDP_COLOR_NV42,
308 		.depth		= { 24 },
309 		.row_depth	= { 8 },
310 		.num_planes	= 1,
311 		.flags		= MDP_FMT_FLAG_OUTPUT,
312 	}, {
313 		.pixelformat	= V4L2_PIX_FMT_MT21C,
314 		.mdp_color	= MDP_COLOR_420_BLK_UFO,
315 		.depth		= { 8, 4 },
316 		.row_depth	= { 8, 8 },
317 		.num_planes	= 2,
318 		.walign		= 4,
319 		.halign		= 5,
320 		.flags		= MDP_FMT_FLAG_OUTPUT,
321 	}, {
322 		.pixelformat	= V4L2_PIX_FMT_MM21,
323 		.mdp_color	= MDP_COLOR_420_BLK,
324 		.depth		= { 8, 4 },
325 		.row_depth	= { 8, 8 },
326 		.num_planes	= 2,
327 		.walign		= 4,
328 		.halign		= 5,
329 		.flags		= MDP_FMT_FLAG_OUTPUT,
330 	}, {
331 		.pixelformat	= V4L2_PIX_FMT_NV12M,
332 		.mdp_color	= MDP_COLOR_NV12,
333 		.depth		= { 8, 4 },
334 		.row_depth	= { 8, 8 },
335 		.num_planes	= 2,
336 		.walign		= 1,
337 		.halign		= 1,
338 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
339 	}, {
340 		.pixelformat	= V4L2_PIX_FMT_NV21M,
341 		.mdp_color	= MDP_COLOR_NV21,
342 		.depth		= { 8, 4 },
343 		.row_depth	= { 8, 8 },
344 		.num_planes	= 2,
345 		.walign		= 1,
346 		.halign		= 1,
347 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
348 	}, {
349 		.pixelformat	= V4L2_PIX_FMT_NV16M,
350 		.mdp_color	= MDP_COLOR_NV16,
351 		.depth		= { 8, 8 },
352 		.row_depth	= { 8, 8 },
353 		.num_planes	= 2,
354 		.walign		= 1,
355 		.flags		= MDP_FMT_FLAG_OUTPUT,
356 	}, {
357 		.pixelformat	= V4L2_PIX_FMT_NV61M,
358 		.mdp_color	= MDP_COLOR_NV61,
359 		.depth		= { 8, 8 },
360 		.row_depth	= { 8, 8 },
361 		.num_planes	= 2,
362 		.walign		= 1,
363 		.flags		= MDP_FMT_FLAG_OUTPUT,
364 	}, {
365 		.pixelformat	= V4L2_PIX_FMT_YUV420M,
366 		.mdp_color	= MDP_COLOR_I420,
367 		.depth		= { 8, 2, 2 },
368 		.row_depth	= { 8, 4, 4 },
369 		.num_planes	= 3,
370 		.walign		= 1,
371 		.halign		= 1,
372 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
373 	}, {
374 		.pixelformat	= V4L2_PIX_FMT_YVU420M,
375 		.mdp_color	= MDP_COLOR_YV12,
376 		.depth		= { 8, 2, 2 },
377 		.row_depth	= { 8, 4, 4 },
378 		.num_planes	= 3,
379 		.walign		= 1,
380 		.halign		= 1,
381 		.flags		= MDP_FMT_FLAG_OUTPUT | MDP_FMT_FLAG_CAPTURE,
382 	}
383 };
384 
385 static const struct mdp_limit mt8183_mdp_def_limit = {
386 	.out_limit = {
387 		.wmin	= 16,
388 		.hmin	= 16,
389 		.wmax	= 8176,
390 		.hmax	= 8176,
391 	},
392 	.cap_limit = {
393 		.wmin	= 2,
394 		.hmin	= 2,
395 		.wmax	= 8176,
396 		.hmax	= 8176,
397 	},
398 	.h_scale_up_max = 32,
399 	.v_scale_up_max = 32,
400 	.h_scale_down_max = 20,
401 	.v_scale_down_max = 128,
402 };
403 
404 static const struct mdp_pipe_info mt8183_pipe_info[] = {
405 	[MDP_PIPE_WPEI] = {MDP_PIPE_WPEI, 0},
406 	[MDP_PIPE_WPEI2] = {MDP_PIPE_WPEI2, 1},
407 	[MDP_PIPE_IMGI] = {MDP_PIPE_IMGI, 2},
408 	[MDP_PIPE_RDMA0] = {MDP_PIPE_RDMA0, 3}
409 };
410 
411 const struct mtk_mdp_driver_data mt8183_mdp_driver_data = {
412 	.mdp_plat_id = MT8183,
413 	.mdp_probe_infra = mt8183_mdp_probe_infra,
414 	.mdp_cfg = &mt8183_plat_cfg,
415 	.mdp_mutex_table_idx = mt8183_mutex_idx,
416 	.comp_data = mt8183_mdp_comp_data,
417 	.comp_data_len = ARRAY_SIZE(mt8183_mdp_comp_data),
418 	.mdp_sub_comp_dt_ids = mt8183_sub_comp_dt_ids,
419 	.format = mt8183_formats,
420 	.format_len = ARRAY_SIZE(mt8183_formats),
421 	.def_limit = &mt8183_mdp_def_limit,
422 	.pipe_info = mt8183_pipe_info,
423 	.pipe_info_len = ARRAY_SIZE(mt8183_pipe_info),
424 };
425 
mdp_cfg_get_id_inner(struct mdp_dev * mdp_dev,enum mtk_mdp_comp_id id)426 s32 mdp_cfg_get_id_inner(struct mdp_dev *mdp_dev, enum mtk_mdp_comp_id id)
427 {
428 	if (!mdp_dev)
429 		return MDP_COMP_NONE;
430 	if (id <= MDP_COMP_NONE || id >= MDP_MAX_COMP_COUNT)
431 		return MDP_COMP_NONE;
432 
433 	return mdp_dev->mdp_data->comp_data[id].match.inner_id;
434 }
435 
mdp_cfg_get_id_public(struct mdp_dev * mdp_dev,s32 inner_id)436 enum mtk_mdp_comp_id mdp_cfg_get_id_public(struct mdp_dev *mdp_dev, s32 inner_id)
437 {
438 	enum mtk_mdp_comp_id public_id = MDP_COMP_NONE;
439 	u32 i;
440 
441 	if (IS_ERR(mdp_dev) || !inner_id)
442 		goto err_public_id;
443 
444 	for (i = 0; i < MDP_MAX_COMP_COUNT; i++) {
445 		if (mdp_dev->mdp_data->comp_data[i].match.inner_id == inner_id) {
446 			public_id = i;
447 			return public_id;
448 		}
449 	}
450 
451 err_public_id:
452 	return public_id;
453 }
454