1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
4 */
5
6 #include "mdp5_kms.h"
7 #include "mdp5_cfg.h"
8
9 struct mdp5_cfg_handler {
10 int revision;
11 struct mdp5_cfg config;
12 };
13
14 /* mdp5_cfg must be exposed (used in mdp5.xml.h) */
15 const struct mdp5_cfg_hw *mdp5_cfg = NULL;
16
17 static const struct mdp5_cfg_hw msm8x74v1_config = {
18 .name = "msm8x74v1",
19 .mdp = {
20 .count = 1,
21 .caps = MDP_CAP_SMP |
22 0,
23 },
24 .smp = {
25 .mmb_count = 22,
26 .mmb_size = 4096,
27 .clients = {
28 [SSPP_VIG0] = 1, [SSPP_VIG1] = 4, [SSPP_VIG2] = 7,
29 [SSPP_DMA0] = 10, [SSPP_DMA1] = 13,
30 [SSPP_RGB0] = 16, [SSPP_RGB1] = 17, [SSPP_RGB2] = 18,
31 },
32 },
33 .ctl = {
34 .count = 5,
35 .base = { 0x00500, 0x00600, 0x00700, 0x00800, 0x00900 },
36 .flush_hw_mask = 0x0003ffff,
37 },
38 .pipe_vig = {
39 .count = 3,
40 .base = { 0x01100, 0x01500, 0x01900 },
41 .caps = MDP_PIPE_CAP_HFLIP |
42 MDP_PIPE_CAP_VFLIP |
43 MDP_PIPE_CAP_SCALE |
44 MDP_PIPE_CAP_CSC |
45 0,
46 },
47 .pipe_rgb = {
48 .count = 3,
49 .base = { 0x01d00, 0x02100, 0x02500 },
50 .caps = MDP_PIPE_CAP_HFLIP |
51 MDP_PIPE_CAP_VFLIP |
52 MDP_PIPE_CAP_SCALE |
53 0,
54 },
55 .pipe_dma = {
56 .count = 2,
57 .base = { 0x02900, 0x02d00 },
58 .caps = MDP_PIPE_CAP_HFLIP |
59 MDP_PIPE_CAP_VFLIP |
60 0,
61 },
62 .lm = {
63 .count = 5,
64 .base = { 0x03100, 0x03500, 0x03900, 0x03d00, 0x04100 },
65 .instances = {
66 { .id = 0, .pp = 0, .dspp = 0,
67 .caps = MDP_LM_CAP_DISPLAY, },
68 { .id = 1, .pp = 1, .dspp = 1,
69 .caps = MDP_LM_CAP_DISPLAY, },
70 { .id = 2, .pp = 2, .dspp = 2,
71 .caps = MDP_LM_CAP_DISPLAY, },
72 { .id = 3, .pp = -1, .dspp = -1,
73 .caps = MDP_LM_CAP_WB },
74 { .id = 4, .pp = -1, .dspp = -1,
75 .caps = MDP_LM_CAP_WB },
76 },
77 .nb_stages = 5,
78 .max_width = 2048,
79 .max_height = 0xFFFF,
80 },
81 .dspp = {
82 .count = 3,
83 .base = { 0x04500, 0x04900, 0x04d00 },
84 },
85 .pp = {
86 .count = 3,
87 .base = { 0x21a00, 0x21b00, 0x21c00 },
88 },
89 .intf = {
90 .base = { 0x21000, 0x21200, 0x21400, 0x21600 },
91 .connect = {
92 [0] = INTF_eDP,
93 [1] = INTF_DSI,
94 [2] = INTF_DSI,
95 [3] = INTF_HDMI,
96 },
97 },
98 .max_clk = 200000000,
99 };
100
101 static const struct mdp5_cfg_hw msm8x74v2_config = {
102 .name = "msm8x74",
103 .mdp = {
104 .count = 1,
105 .caps = MDP_CAP_SMP |
106 0,
107 },
108 .smp = {
109 .mmb_count = 22,
110 .mmb_size = 4096,
111 .clients = {
112 [SSPP_VIG0] = 1, [SSPP_VIG1] = 4, [SSPP_VIG2] = 7,
113 [SSPP_DMA0] = 10, [SSPP_DMA1] = 13,
114 [SSPP_RGB0] = 16, [SSPP_RGB1] = 17, [SSPP_RGB2] = 18,
115 },
116 },
117 .ctl = {
118 .count = 5,
119 .base = { 0x00500, 0x00600, 0x00700, 0x00800, 0x00900 },
120 .flush_hw_mask = 0x0003ffff,
121 },
122 .pipe_vig = {
123 .count = 3,
124 .base = { 0x01100, 0x01500, 0x01900 },
125 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
126 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
127 MDP_PIPE_CAP_DECIMATION,
128 },
129 .pipe_rgb = {
130 .count = 3,
131 .base = { 0x01d00, 0x02100, 0x02500 },
132 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
133 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_DECIMATION,
134 },
135 .pipe_dma = {
136 .count = 2,
137 .base = { 0x02900, 0x02d00 },
138 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
139 },
140 .lm = {
141 .count = 5,
142 .base = { 0x03100, 0x03500, 0x03900, 0x03d00, 0x04100 },
143 .instances = {
144 { .id = 0, .pp = 0, .dspp = 0,
145 .caps = MDP_LM_CAP_DISPLAY, },
146 { .id = 1, .pp = 1, .dspp = 1,
147 .caps = MDP_LM_CAP_DISPLAY, },
148 { .id = 2, .pp = 2, .dspp = 2,
149 .caps = MDP_LM_CAP_DISPLAY, },
150 { .id = 3, .pp = -1, .dspp = -1,
151 .caps = MDP_LM_CAP_WB, },
152 { .id = 4, .pp = -1, .dspp = -1,
153 .caps = MDP_LM_CAP_WB, },
154 },
155 .nb_stages = 5,
156 .max_width = 2048,
157 .max_height = 0xFFFF,
158 },
159 .dspp = {
160 .count = 3,
161 .base = { 0x04500, 0x04900, 0x04d00 },
162 },
163 .ad = {
164 .count = 2,
165 .base = { 0x13000, 0x13200 },
166 },
167 .pp = {
168 .count = 3,
169 .base = { 0x12c00, 0x12d00, 0x12e00 },
170 },
171 .intf = {
172 .base = { 0x12400, 0x12600, 0x12800, 0x12a00 },
173 .connect = {
174 [0] = INTF_eDP,
175 [1] = INTF_DSI,
176 [2] = INTF_DSI,
177 [3] = INTF_HDMI,
178 },
179 },
180 .max_clk = 200000000,
181 };
182
183 static const struct mdp5_cfg_hw apq8084_config = {
184 .name = "apq8084",
185 .mdp = {
186 .count = 1,
187 .caps = MDP_CAP_SMP |
188 MDP_CAP_SRC_SPLIT |
189 0,
190 },
191 .smp = {
192 .mmb_count = 44,
193 .mmb_size = 8192,
194 .clients = {
195 [SSPP_VIG0] = 1, [SSPP_VIG1] = 4,
196 [SSPP_VIG2] = 7, [SSPP_VIG3] = 19,
197 [SSPP_DMA0] = 10, [SSPP_DMA1] = 13,
198 [SSPP_RGB0] = 16, [SSPP_RGB1] = 17,
199 [SSPP_RGB2] = 18, [SSPP_RGB3] = 22,
200 },
201 .reserved_state[0] = GENMASK(7, 0), /* first 8 MMBs */
202 .reserved = {
203 /* Two SMP blocks are statically tied to RGB pipes: */
204 [16] = 2, [17] = 2, [18] = 2, [22] = 2,
205 },
206 },
207 .ctl = {
208 .count = 5,
209 .base = { 0x00500, 0x00600, 0x00700, 0x00800, 0x00900 },
210 .flush_hw_mask = 0x003fffff,
211 },
212 .pipe_vig = {
213 .count = 4,
214 .base = { 0x01100, 0x01500, 0x01900, 0x01d00 },
215 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
216 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
217 MDP_PIPE_CAP_DECIMATION,
218 },
219 .pipe_rgb = {
220 .count = 4,
221 .base = { 0x02100, 0x02500, 0x02900, 0x02d00 },
222 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
223 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_DECIMATION,
224 },
225 .pipe_dma = {
226 .count = 2,
227 .base = { 0x03100, 0x03500 },
228 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
229 },
230 .lm = {
231 .count = 6,
232 .base = { 0x03900, 0x03d00, 0x04100, 0x04500, 0x04900, 0x04d00 },
233 .instances = {
234 { .id = 0, .pp = 0, .dspp = 0,
235 .caps = MDP_LM_CAP_DISPLAY |
236 MDP_LM_CAP_PAIR, },
237 { .id = 1, .pp = 1, .dspp = 1,
238 .caps = MDP_LM_CAP_DISPLAY, },
239 { .id = 2, .pp = 2, .dspp = 2,
240 .caps = MDP_LM_CAP_DISPLAY |
241 MDP_LM_CAP_PAIR, },
242 { .id = 3, .pp = -1, .dspp = -1,
243 .caps = MDP_LM_CAP_WB, },
244 { .id = 4, .pp = -1, .dspp = -1,
245 .caps = MDP_LM_CAP_WB, },
246 { .id = 5, .pp = 3, .dspp = 3,
247 .caps = MDP_LM_CAP_DISPLAY, },
248 },
249 .nb_stages = 5,
250 .max_width = 2048,
251 .max_height = 0xFFFF,
252 },
253 .dspp = {
254 .count = 4,
255 .base = { 0x05100, 0x05500, 0x05900, 0x05d00 },
256
257 },
258 .ad = {
259 .count = 3,
260 .base = { 0x13400, 0x13600, 0x13800 },
261 },
262 .pp = {
263 .count = 4,
264 .base = { 0x12e00, 0x12f00, 0x13000, 0x13100 },
265 },
266 .intf = {
267 .base = { 0x12400, 0x12600, 0x12800, 0x12a00, 0x12c00 },
268 .connect = {
269 [0] = INTF_eDP,
270 [1] = INTF_DSI,
271 [2] = INTF_DSI,
272 [3] = INTF_HDMI,
273 },
274 },
275 .max_clk = 320000000,
276 };
277
278 static const struct mdp5_cfg_hw msm8x16_config = {
279 .name = "msm8x16",
280 .mdp = {
281 .count = 1,
282 .base = { 0x0 },
283 .caps = MDP_CAP_SMP |
284 0,
285 },
286 .smp = {
287 .mmb_count = 8,
288 .mmb_size = 8192,
289 .clients = {
290 [SSPP_VIG0] = 1, [SSPP_DMA0] = 4,
291 [SSPP_RGB0] = 7, [SSPP_RGB1] = 8,
292 },
293 },
294 .ctl = {
295 .count = 5,
296 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
297 .flush_hw_mask = 0x4003ffff,
298 },
299 .pipe_vig = {
300 .count = 1,
301 .base = { 0x04000 },
302 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
303 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
304 MDP_PIPE_CAP_DECIMATION,
305 },
306 .pipe_rgb = {
307 .count = 2,
308 .base = { 0x14000, 0x16000 },
309 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
310 MDP_PIPE_CAP_DECIMATION,
311 },
312 .pipe_dma = {
313 .count = 1,
314 .base = { 0x24000 },
315 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
316 },
317 .lm = {
318 .count = 2, /* LM0 and LM3 */
319 .base = { 0x44000, 0x47000 },
320 .instances = {
321 { .id = 0, .pp = 0, .dspp = 0,
322 .caps = MDP_LM_CAP_DISPLAY, },
323 { .id = 3, .pp = -1, .dspp = -1,
324 .caps = MDP_LM_CAP_WB },
325 },
326 .nb_stages = 8,
327 .max_width = 2048,
328 .max_height = 0xFFFF,
329 },
330 .dspp = {
331 .count = 1,
332 .base = { 0x54000 },
333
334 },
335 .intf = {
336 .base = { 0x00000, 0x6a800 },
337 .connect = {
338 [0] = INTF_DISABLED,
339 [1] = INTF_DSI,
340 },
341 },
342 .max_clk = 320000000,
343 };
344
345 static const struct mdp5_cfg_hw msm8x36_config = {
346 .name = "msm8x36",
347 .mdp = {
348 .count = 1,
349 .base = { 0x0 },
350 .caps = MDP_CAP_SMP |
351 0,
352 },
353 .smp = {
354 .mmb_count = 8,
355 .mmb_size = 10240,
356 .clients = {
357 [SSPP_VIG0] = 1, [SSPP_DMA0] = 4,
358 [SSPP_RGB0] = 7, [SSPP_RGB1] = 8,
359 },
360 },
361 .ctl = {
362 .count = 3,
363 .base = { 0x01000, 0x01200, 0x01400 },
364 .flush_hw_mask = 0x4003ffff,
365 },
366 .pipe_vig = {
367 .count = 1,
368 .base = { 0x04000 },
369 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
370 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
371 MDP_PIPE_CAP_DECIMATION,
372 },
373 .pipe_rgb = {
374 .count = 2,
375 .base = { 0x14000, 0x16000 },
376 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
377 MDP_PIPE_CAP_DECIMATION,
378 },
379 .pipe_dma = {
380 .count = 1,
381 .base = { 0x24000 },
382 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
383 },
384 .lm = {
385 .count = 2,
386 .base = { 0x44000, 0x47000 },
387 .instances = {
388 { .id = 0, .pp = 0, .dspp = 0,
389 .caps = MDP_LM_CAP_DISPLAY, },
390 { .id = 1, .pp = -1, .dspp = -1,
391 .caps = MDP_LM_CAP_WB, },
392 },
393 .nb_stages = 8,
394 .max_width = 2560,
395 .max_height = 0xFFFF,
396 },
397 .pp = {
398 .count = 1,
399 .base = { 0x70000 },
400 },
401 .ad = {
402 .count = 1,
403 .base = { 0x78000 },
404 },
405 .dspp = {
406 .count = 1,
407 .base = { 0x54000 },
408 },
409 .intf = {
410 .base = { 0x00000, 0x6a800, 0x6b000 },
411 .connect = {
412 [0] = INTF_DISABLED,
413 [1] = INTF_DSI,
414 [2] = INTF_DSI,
415 },
416 },
417 .max_clk = 366670000,
418 };
419
420 static const struct mdp5_cfg_hw msm8x94_config = {
421 .name = "msm8x94",
422 .mdp = {
423 .count = 1,
424 .caps = MDP_CAP_SMP |
425 MDP_CAP_SRC_SPLIT |
426 0,
427 },
428 .smp = {
429 .mmb_count = 44,
430 .mmb_size = 8192,
431 .clients = {
432 [SSPP_VIG0] = 1, [SSPP_VIG1] = 4,
433 [SSPP_VIG2] = 7, [SSPP_VIG3] = 19,
434 [SSPP_DMA0] = 10, [SSPP_DMA1] = 13,
435 [SSPP_RGB0] = 16, [SSPP_RGB1] = 17,
436 [SSPP_RGB2] = 18, [SSPP_RGB3] = 22,
437 },
438 .reserved_state[0] = GENMASK(23, 0), /* first 24 MMBs */
439 .reserved = {
440 [1] = 1, [4] = 1, [7] = 1, [19] = 1,
441 [16] = 5, [17] = 5, [18] = 5, [22] = 5,
442 },
443 },
444 .ctl = {
445 .count = 5,
446 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
447 .flush_hw_mask = 0xf0ffffff,
448 },
449 .pipe_vig = {
450 .count = 4,
451 .base = { 0x04000, 0x06000, 0x08000, 0x0a000 },
452 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
453 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
454 MDP_PIPE_CAP_DECIMATION,
455 },
456 .pipe_rgb = {
457 .count = 4,
458 .base = { 0x14000, 0x16000, 0x18000, 0x1a000 },
459 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
460 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_DECIMATION,
461 },
462 .pipe_dma = {
463 .count = 2,
464 .base = { 0x24000, 0x26000 },
465 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
466 },
467 .lm = {
468 .count = 6,
469 .base = { 0x44000, 0x45000, 0x46000, 0x47000, 0x48000, 0x49000 },
470 .instances = {
471 { .id = 0, .pp = 0, .dspp = 0,
472 .caps = MDP_LM_CAP_DISPLAY |
473 MDP_LM_CAP_PAIR, },
474 { .id = 1, .pp = 1, .dspp = 1,
475 .caps = MDP_LM_CAP_DISPLAY, },
476 { .id = 2, .pp = 2, .dspp = 2,
477 .caps = MDP_LM_CAP_DISPLAY |
478 MDP_LM_CAP_PAIR, },
479 { .id = 3, .pp = -1, .dspp = -1,
480 .caps = MDP_LM_CAP_WB, },
481 { .id = 4, .pp = -1, .dspp = -1,
482 .caps = MDP_LM_CAP_WB, },
483 { .id = 5, .pp = 3, .dspp = 3,
484 .caps = MDP_LM_CAP_DISPLAY, },
485 },
486 .nb_stages = 8,
487 .max_width = 2048,
488 .max_height = 0xFFFF,
489 },
490 .dspp = {
491 .count = 4,
492 .base = { 0x54000, 0x56000, 0x58000, 0x5a000 },
493
494 },
495 .ad = {
496 .count = 3,
497 .base = { 0x78000, 0x78800, 0x79000 },
498 },
499 .pp = {
500 .count = 4,
501 .base = { 0x70000, 0x70800, 0x71000, 0x71800 },
502 },
503 .intf = {
504 .base = { 0x6a000, 0x6a800, 0x6b000, 0x6b800, 0x6c000 },
505 .connect = {
506 [0] = INTF_DISABLED,
507 [1] = INTF_DSI,
508 [2] = INTF_DSI,
509 [3] = INTF_HDMI,
510 },
511 },
512 .max_clk = 400000000,
513 };
514
515 static const struct mdp5_cfg_hw msm8x96_config = {
516 .name = "msm8x96",
517 .mdp = {
518 .count = 1,
519 .caps = MDP_CAP_DSC |
520 MDP_CAP_CDM |
521 MDP_CAP_SRC_SPLIT |
522 0,
523 },
524 .ctl = {
525 .count = 5,
526 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
527 .flush_hw_mask = 0xf4ffffff,
528 },
529 .pipe_vig = {
530 .count = 4,
531 .base = { 0x04000, 0x06000, 0x08000, 0x0a000 },
532 .caps = MDP_PIPE_CAP_HFLIP |
533 MDP_PIPE_CAP_VFLIP |
534 MDP_PIPE_CAP_SCALE |
535 MDP_PIPE_CAP_CSC |
536 MDP_PIPE_CAP_DECIMATION |
537 MDP_PIPE_CAP_SW_PIX_EXT |
538 0,
539 },
540 .pipe_rgb = {
541 .count = 4,
542 .base = { 0x14000, 0x16000, 0x18000, 0x1a000 },
543 .caps = MDP_PIPE_CAP_HFLIP |
544 MDP_PIPE_CAP_VFLIP |
545 MDP_PIPE_CAP_SCALE |
546 MDP_PIPE_CAP_DECIMATION |
547 MDP_PIPE_CAP_SW_PIX_EXT |
548 0,
549 },
550 .pipe_dma = {
551 .count = 2,
552 .base = { 0x24000, 0x26000 },
553 .caps = MDP_PIPE_CAP_HFLIP |
554 MDP_PIPE_CAP_VFLIP |
555 MDP_PIPE_CAP_SW_PIX_EXT |
556 0,
557 },
558 .pipe_cursor = {
559 .count = 2,
560 .base = { 0x34000, 0x36000 },
561 .caps = MDP_PIPE_CAP_HFLIP |
562 MDP_PIPE_CAP_VFLIP |
563 MDP_PIPE_CAP_SW_PIX_EXT |
564 MDP_PIPE_CAP_CURSOR |
565 0,
566 },
567
568 .lm = {
569 .count = 6,
570 .base = { 0x44000, 0x45000, 0x46000, 0x47000, 0x48000, 0x49000 },
571 .instances = {
572 { .id = 0, .pp = 0, .dspp = 0,
573 .caps = MDP_LM_CAP_DISPLAY |
574 MDP_LM_CAP_PAIR, },
575 { .id = 1, .pp = 1, .dspp = 1,
576 .caps = MDP_LM_CAP_DISPLAY, },
577 { .id = 2, .pp = 2, .dspp = -1,
578 .caps = MDP_LM_CAP_DISPLAY |
579 MDP_LM_CAP_PAIR, },
580 { .id = 3, .pp = -1, .dspp = -1,
581 .caps = MDP_LM_CAP_WB, },
582 { .id = 4, .pp = -1, .dspp = -1,
583 .caps = MDP_LM_CAP_WB, },
584 { .id = 5, .pp = 3, .dspp = -1,
585 .caps = MDP_LM_CAP_DISPLAY, },
586 },
587 .nb_stages = 8,
588 .max_width = 2560,
589 .max_height = 0xFFFF,
590 },
591 .dspp = {
592 .count = 2,
593 .base = { 0x54000, 0x56000 },
594 },
595 .ad = {
596 .count = 3,
597 .base = { 0x78000, 0x78800, 0x79000 },
598 },
599 .pp = {
600 .count = 4,
601 .base = { 0x70000, 0x70800, 0x71000, 0x71800 },
602 },
603 .cdm = {
604 .count = 1,
605 .base = { 0x79200 },
606 },
607 .dsc = {
608 .count = 2,
609 .base = { 0x80000, 0x80400 },
610 },
611 .intf = {
612 .base = { 0x6a000, 0x6a800, 0x6b000, 0x6b800, 0x6c000 },
613 .connect = {
614 [0] = INTF_DISABLED,
615 [1] = INTF_DSI,
616 [2] = INTF_DSI,
617 [3] = INTF_HDMI,
618 },
619 },
620 .max_clk = 412500000,
621 };
622
623 const struct mdp5_cfg_hw msm8x76_config = {
624 .name = "msm8x76",
625 .mdp = {
626 .count = 1,
627 .caps = MDP_CAP_SMP |
628 MDP_CAP_DSC |
629 MDP_CAP_SRC_SPLIT |
630 0,
631 },
632 .ctl = {
633 .count = 3,
634 .base = { 0x01000, 0x01200, 0x01400 },
635 .flush_hw_mask = 0xffffffff,
636 },
637 .smp = {
638 .mmb_count = 10,
639 .mmb_size = 10240,
640 .clients = {
641 [SSPP_VIG0] = 1, [SSPP_VIG1] = 9,
642 [SSPP_DMA0] = 4,
643 [SSPP_RGB0] = 7, [SSPP_RGB1] = 8,
644 },
645 },
646 .pipe_vig = {
647 .count = 2,
648 .base = { 0x04000, 0x06000 },
649 .caps = MDP_PIPE_CAP_HFLIP |
650 MDP_PIPE_CAP_VFLIP |
651 MDP_PIPE_CAP_SCALE |
652 MDP_PIPE_CAP_CSC |
653 MDP_PIPE_CAP_DECIMATION |
654 MDP_PIPE_CAP_SW_PIX_EXT |
655 0,
656 },
657 .pipe_rgb = {
658 .count = 2,
659 .base = { 0x14000, 0x16000 },
660 .caps = MDP_PIPE_CAP_HFLIP |
661 MDP_PIPE_CAP_VFLIP |
662 MDP_PIPE_CAP_DECIMATION |
663 MDP_PIPE_CAP_SW_PIX_EXT |
664 0,
665 },
666 .pipe_dma = {
667 .count = 1,
668 .base = { 0x24000 },
669 .caps = MDP_PIPE_CAP_HFLIP |
670 MDP_PIPE_CAP_VFLIP |
671 MDP_PIPE_CAP_SW_PIX_EXT |
672 0,
673 },
674 .pipe_cursor = {
675 .count = 1,
676 .base = { 0x440DC },
677 .caps = MDP_PIPE_CAP_HFLIP |
678 MDP_PIPE_CAP_VFLIP |
679 MDP_PIPE_CAP_SW_PIX_EXT |
680 MDP_PIPE_CAP_CURSOR |
681 0,
682 },
683 .lm = {
684 .count = 2,
685 .base = { 0x44000, 0x45000 },
686 .instances = {
687 { .id = 0, .pp = 0, .dspp = 0,
688 .caps = MDP_LM_CAP_DISPLAY, },
689 { .id = 1, .pp = -1, .dspp = -1,
690 .caps = MDP_LM_CAP_WB },
691 },
692 .nb_stages = 8,
693 .max_width = 2560,
694 .max_height = 0xFFFF,
695 },
696 .dspp = {
697 .count = 1,
698 .base = { 0x54000 },
699
700 },
701 .pp = {
702 .count = 3,
703 .base = { 0x70000, 0x70800, 0x72000 },
704 },
705 .dsc = {
706 .count = 2,
707 .base = { 0x80000, 0x80400 },
708 },
709 .intf = {
710 .base = { 0x6a000, 0x6a800, 0x6b000 },
711 .connect = {
712 [0] = INTF_DISABLED,
713 [1] = INTF_DSI,
714 [2] = INTF_DSI,
715 },
716 },
717 .max_clk = 360000000,
718 };
719
720 static const struct mdp5_cfg_hw msm8917_config = {
721 .name = "msm8917",
722 .mdp = {
723 .count = 1,
724 .caps = MDP_CAP_CDM,
725 },
726 .ctl = {
727 .count = 3,
728 .base = { 0x01000, 0x01200, 0x01400 },
729 .flush_hw_mask = 0xffffffff,
730 },
731 .pipe_vig = {
732 .count = 1,
733 .base = { 0x04000 },
734 .caps = MDP_PIPE_CAP_HFLIP |
735 MDP_PIPE_CAP_VFLIP |
736 MDP_PIPE_CAP_SCALE |
737 MDP_PIPE_CAP_CSC |
738 MDP_PIPE_CAP_DECIMATION |
739 MDP_PIPE_CAP_SW_PIX_EXT |
740 0,
741 },
742 .pipe_rgb = {
743 .count = 2,
744 .base = { 0x14000, 0x16000 },
745 .caps = MDP_PIPE_CAP_HFLIP |
746 MDP_PIPE_CAP_VFLIP |
747 MDP_PIPE_CAP_DECIMATION |
748 MDP_PIPE_CAP_SW_PIX_EXT |
749 0,
750 },
751 .pipe_dma = {
752 .count = 1,
753 .base = { 0x24000 },
754 .caps = MDP_PIPE_CAP_HFLIP |
755 MDP_PIPE_CAP_VFLIP |
756 MDP_PIPE_CAP_SW_PIX_EXT |
757 0,
758 },
759 .pipe_cursor = {
760 .count = 1,
761 .base = { 0x34000 },
762 .caps = MDP_PIPE_CAP_HFLIP |
763 MDP_PIPE_CAP_VFLIP |
764 MDP_PIPE_CAP_SW_PIX_EXT |
765 MDP_PIPE_CAP_CURSOR |
766 0,
767 },
768
769 .lm = {
770 .count = 2,
771 .base = { 0x44000, 0x45000 },
772 .instances = {
773 { .id = 0, .pp = 0, .dspp = 0,
774 .caps = MDP_LM_CAP_DISPLAY, },
775 { .id = 1, .pp = -1, .dspp = -1,
776 .caps = MDP_LM_CAP_WB },
777 },
778 .nb_stages = 8,
779 .max_width = 2048,
780 .max_height = 0xFFFF,
781 },
782 .dspp = {
783 .count = 1,
784 .base = { 0x54000 },
785
786 },
787 .pp = {
788 .count = 1,
789 .base = { 0x70000 },
790 },
791 .cdm = {
792 .count = 1,
793 .base = { 0x79200 },
794 },
795 .intf = {
796 .base = { 0x6a000, 0x6a800 },
797 .connect = {
798 [0] = INTF_DISABLED,
799 [1] = INTF_DSI,
800 },
801 },
802 .max_clk = 320000000,
803 };
804
805 static const struct mdp5_cfg_hw msm8998_config = {
806 .name = "msm8998",
807 .mdp = {
808 .count = 1,
809 .caps = MDP_CAP_DSC |
810 MDP_CAP_CDM |
811 MDP_CAP_SRC_SPLIT |
812 0,
813 },
814 .ctl = {
815 .count = 5,
816 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
817 .flush_hw_mask = 0xf7ffffff,
818 },
819 .pipe_vig = {
820 .count = 4,
821 .base = { 0x04000, 0x06000, 0x08000, 0x0a000 },
822 .caps = MDP_PIPE_CAP_HFLIP |
823 MDP_PIPE_CAP_VFLIP |
824 MDP_PIPE_CAP_SCALE |
825 MDP_PIPE_CAP_CSC |
826 MDP_PIPE_CAP_DECIMATION |
827 MDP_PIPE_CAP_SW_PIX_EXT |
828 0,
829 },
830 .pipe_rgb = {
831 .count = 4,
832 .base = { 0x14000, 0x16000, 0x18000, 0x1a000 },
833 .caps = MDP_PIPE_CAP_HFLIP |
834 MDP_PIPE_CAP_VFLIP |
835 MDP_PIPE_CAP_SCALE |
836 MDP_PIPE_CAP_DECIMATION |
837 MDP_PIPE_CAP_SW_PIX_EXT |
838 0,
839 },
840 .pipe_dma = {
841 .count = 2, /* driver supports max of 2 currently */
842 .base = { 0x24000, 0x26000, 0x28000, 0x2a000 },
843 .caps = MDP_PIPE_CAP_HFLIP |
844 MDP_PIPE_CAP_VFLIP |
845 MDP_PIPE_CAP_SW_PIX_EXT |
846 0,
847 },
848 .pipe_cursor = {
849 .count = 2,
850 .base = { 0x34000, 0x36000 },
851 .caps = MDP_PIPE_CAP_HFLIP |
852 MDP_PIPE_CAP_VFLIP |
853 MDP_PIPE_CAP_SW_PIX_EXT |
854 MDP_PIPE_CAP_CURSOR |
855 0,
856 },
857
858 .lm = {
859 .count = 6,
860 .base = { 0x44000, 0x45000, 0x46000, 0x47000, 0x48000, 0x49000 },
861 .instances = {
862 { .id = 0, .pp = 0, .dspp = 0,
863 .caps = MDP_LM_CAP_DISPLAY |
864 MDP_LM_CAP_PAIR, },
865 { .id = 1, .pp = 1, .dspp = 1,
866 .caps = MDP_LM_CAP_DISPLAY, },
867 { .id = 2, .pp = 2, .dspp = -1,
868 .caps = MDP_LM_CAP_DISPLAY |
869 MDP_LM_CAP_PAIR, },
870 { .id = 3, .pp = -1, .dspp = -1,
871 .caps = MDP_LM_CAP_WB, },
872 { .id = 4, .pp = -1, .dspp = -1,
873 .caps = MDP_LM_CAP_WB, },
874 { .id = 5, .pp = 3, .dspp = -1,
875 .caps = MDP_LM_CAP_DISPLAY, },
876 },
877 .nb_stages = 8,
878 .max_width = 2560,
879 .max_height = 0xFFFF,
880 },
881 .dspp = {
882 .count = 2,
883 .base = { 0x54000, 0x56000 },
884 },
885 .ad = {
886 .count = 3,
887 .base = { 0x78000, 0x78800, 0x79000 },
888 },
889 .pp = {
890 .count = 4,
891 .base = { 0x70000, 0x70800, 0x71000, 0x71800 },
892 },
893 .cdm = {
894 .count = 1,
895 .base = { 0x79200 },
896 },
897 .dsc = {
898 .count = 2,
899 .base = { 0x80000, 0x80400 },
900 },
901 .intf = {
902 .base = { 0x6a000, 0x6a800, 0x6b000, 0x6b800, 0x6c000 },
903 .connect = {
904 [0] = INTF_eDP,
905 [1] = INTF_DSI,
906 [2] = INTF_DSI,
907 [3] = INTF_HDMI,
908 },
909 },
910 .max_clk = 412500000,
911 };
912
913 static const struct mdp5_cfg_hw sdm630_config = {
914 .name = "sdm630",
915 .mdp = {
916 .count = 1,
917 .caps = MDP_CAP_CDM |
918 MDP_CAP_SRC_SPLIT |
919 0,
920 },
921 .ctl = {
922 .count = 5,
923 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
924 .flush_hw_mask = 0xf4ffffff,
925 },
926 .pipe_vig = {
927 .count = 1,
928 .base = { 0x04000 },
929 .caps = MDP_PIPE_CAP_HFLIP |
930 MDP_PIPE_CAP_VFLIP |
931 MDP_PIPE_CAP_SCALE |
932 MDP_PIPE_CAP_CSC |
933 MDP_PIPE_CAP_DECIMATION |
934 MDP_PIPE_CAP_SW_PIX_EXT |
935 0,
936 },
937 .pipe_rgb = {
938 .count = 4,
939 .base = { 0x14000, 0x16000, 0x18000, 0x1a000 },
940 .caps = MDP_PIPE_CAP_HFLIP |
941 MDP_PIPE_CAP_VFLIP |
942 MDP_PIPE_CAP_SCALE |
943 MDP_PIPE_CAP_DECIMATION |
944 MDP_PIPE_CAP_SW_PIX_EXT |
945 0,
946 },
947 .pipe_dma = {
948 .count = 2, /* driver supports max of 2 currently */
949 .base = { 0x24000, 0x26000, 0x28000 },
950 .caps = MDP_PIPE_CAP_HFLIP |
951 MDP_PIPE_CAP_VFLIP |
952 MDP_PIPE_CAP_SW_PIX_EXT |
953 0,
954 },
955 .pipe_cursor = {
956 .count = 1,
957 .base = { 0x34000 },
958 .caps = MDP_PIPE_CAP_HFLIP |
959 MDP_PIPE_CAP_VFLIP |
960 MDP_PIPE_CAP_SW_PIX_EXT |
961 MDP_PIPE_CAP_CURSOR |
962 0,
963 },
964
965 .lm = {
966 .count = 2,
967 .base = { 0x44000, 0x46000 },
968 .instances = {
969 { .id = 0, .pp = 0, .dspp = 0,
970 .caps = MDP_LM_CAP_DISPLAY |
971 MDP_LM_CAP_PAIR, },
972 { .id = 1, .pp = 1, .dspp = -1,
973 .caps = MDP_LM_CAP_WB, },
974 },
975 .nb_stages = 8,
976 .max_width = 2048,
977 .max_height = 0xFFFF,
978 },
979 .dspp = {
980 .count = 1,
981 .base = { 0x54000 },
982 },
983 .ad = {
984 .count = 2,
985 .base = { 0x78000, 0x78800 },
986 },
987 .pp = {
988 .count = 3,
989 .base = { 0x70000, 0x71000, 0x72000 },
990 },
991 .cdm = {
992 .count = 1,
993 .base = { 0x79200 },
994 },
995 .intf = {
996 .base = { 0x6a000, 0x6a800 },
997 .connect = {
998 [0] = INTF_DISABLED,
999 [1] = INTF_DSI,
1000 },
1001 },
1002 .max_clk = 412500000,
1003 };
1004
1005 static const struct mdp5_cfg_hw sdm660_config = {
1006 .name = "sdm660",
1007 .mdp = {
1008 .count = 1,
1009 .caps = MDP_CAP_DSC |
1010 MDP_CAP_CDM |
1011 MDP_CAP_SRC_SPLIT |
1012 0,
1013 },
1014 .ctl = {
1015 .count = 5,
1016 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
1017 .flush_hw_mask = 0xf4ffffff,
1018 },
1019 .pipe_vig = {
1020 .count = 2,
1021 .base = { 0x04000, 0x6000 },
1022 .caps = MDP_PIPE_CAP_HFLIP |
1023 MDP_PIPE_CAP_VFLIP |
1024 MDP_PIPE_CAP_SCALE |
1025 MDP_PIPE_CAP_CSC |
1026 MDP_PIPE_CAP_DECIMATION |
1027 MDP_PIPE_CAP_SW_PIX_EXT |
1028 0,
1029 },
1030 .pipe_rgb = {
1031 .count = 4,
1032 .base = { 0x14000, 0x16000, 0x18000, 0x1a000 },
1033 .caps = MDP_PIPE_CAP_HFLIP |
1034 MDP_PIPE_CAP_VFLIP |
1035 MDP_PIPE_CAP_SCALE |
1036 MDP_PIPE_CAP_DECIMATION |
1037 MDP_PIPE_CAP_SW_PIX_EXT |
1038 0,
1039 },
1040 .pipe_dma = {
1041 .count = 2, /* driver supports max of 2 currently */
1042 .base = { 0x24000, 0x26000, 0x28000 },
1043 .caps = MDP_PIPE_CAP_HFLIP |
1044 MDP_PIPE_CAP_VFLIP |
1045 MDP_PIPE_CAP_SW_PIX_EXT |
1046 0,
1047 },
1048 .pipe_cursor = {
1049 .count = 1,
1050 .base = { 0x34000 },
1051 .caps = MDP_PIPE_CAP_HFLIP |
1052 MDP_PIPE_CAP_VFLIP |
1053 MDP_PIPE_CAP_SW_PIX_EXT |
1054 MDP_PIPE_CAP_CURSOR |
1055 0,
1056 },
1057
1058 .lm = {
1059 .count = 4,
1060 .base = { 0x44000, 0x45000, 0x46000, 0x49000 },
1061 .instances = {
1062 { .id = 0, .pp = 0, .dspp = 0,
1063 .caps = MDP_LM_CAP_DISPLAY |
1064 MDP_LM_CAP_PAIR, },
1065 { .id = 1, .pp = 1, .dspp = 1,
1066 .caps = MDP_LM_CAP_DISPLAY, },
1067 { .id = 2, .pp = 2, .dspp = -1,
1068 .caps = MDP_LM_CAP_DISPLAY |
1069 MDP_LM_CAP_PAIR, },
1070 { .id = 3, .pp = 3, .dspp = -1,
1071 .caps = MDP_LM_CAP_WB, },
1072 },
1073 .nb_stages = 8,
1074 .max_width = 2560,
1075 .max_height = 0xFFFF,
1076 },
1077 .dspp = {
1078 .count = 2,
1079 .base = { 0x54000, 0x56000 },
1080 },
1081 .ad = {
1082 .count = 2,
1083 .base = { 0x78000, 0x78800 },
1084 },
1085 .pp = {
1086 .count = 5,
1087 .base = { 0x70000, 0x70800, 0x71000, 0x71800, 0x72000 },
1088 },
1089 .cdm = {
1090 .count = 1,
1091 .base = { 0x79200 },
1092 },
1093 .dsc = {
1094 .count = 2,
1095 .base = { 0x80000, 0x80400 },
1096 },
1097 .intf = {
1098 .base = { 0x6a000, 0x6a800, 0x6b000, 0x6b800 },
1099 .connect = {
1100 [0] = INTF_DISABLED,
1101 [1] = INTF_DSI,
1102 [2] = INTF_DSI,
1103 [3] = INTF_HDMI,
1104 },
1105 },
1106 .max_clk = 412500000,
1107 };
1108
1109 static const struct mdp5_cfg_handler cfg_handlers_v1[] = {
1110 { .revision = 0, .config = { .hw = &msm8x74v1_config } },
1111 { .revision = 2, .config = { .hw = &msm8x74v2_config } },
1112 { .revision = 3, .config = { .hw = &apq8084_config } },
1113 { .revision = 6, .config = { .hw = &msm8x16_config } },
1114 { .revision = 8, .config = { .hw = &msm8x36_config } },
1115 { .revision = 9, .config = { .hw = &msm8x94_config } },
1116 { .revision = 7, .config = { .hw = &msm8x96_config } },
1117 { .revision = 11, .config = { .hw = &msm8x76_config } },
1118 { .revision = 15, .config = { .hw = &msm8917_config } },
1119 };
1120
1121 static const struct mdp5_cfg_handler cfg_handlers_v3[] = {
1122 { .revision = 0, .config = { .hw = &msm8998_config } },
1123 { .revision = 2, .config = { .hw = &sdm660_config } },
1124 { .revision = 3, .config = { .hw = &sdm630_config } },
1125 };
1126
1127 static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev);
1128
mdp5_cfg_get_hw_config(struct mdp5_cfg_handler * cfg_handler)1129 const struct mdp5_cfg_hw *mdp5_cfg_get_hw_config(struct mdp5_cfg_handler *cfg_handler)
1130 {
1131 return cfg_handler->config.hw;
1132 }
1133
mdp5_cfg_get_config(struct mdp5_cfg_handler * cfg_handler)1134 struct mdp5_cfg *mdp5_cfg_get_config(struct mdp5_cfg_handler *cfg_handler)
1135 {
1136 return &cfg_handler->config;
1137 }
1138
mdp5_cfg_get_hw_rev(struct mdp5_cfg_handler * cfg_handler)1139 int mdp5_cfg_get_hw_rev(struct mdp5_cfg_handler *cfg_handler)
1140 {
1141 return cfg_handler->revision;
1142 }
1143
mdp5_cfg_destroy(struct mdp5_cfg_handler * cfg_handler)1144 void mdp5_cfg_destroy(struct mdp5_cfg_handler *cfg_handler)
1145 {
1146 kfree(cfg_handler);
1147 }
1148
mdp5_cfg_init(struct mdp5_kms * mdp5_kms,uint32_t major,uint32_t minor)1149 struct mdp5_cfg_handler *mdp5_cfg_init(struct mdp5_kms *mdp5_kms,
1150 uint32_t major, uint32_t minor)
1151 {
1152 struct drm_device *dev = mdp5_kms->dev;
1153 struct platform_device *pdev = to_platform_device(dev->dev);
1154 struct mdp5_cfg_handler *cfg_handler;
1155 const struct mdp5_cfg_handler *cfg_handlers;
1156 struct mdp5_cfg_platform *pconfig;
1157 int i, ret = 0, num_handlers;
1158
1159 cfg_handler = kzalloc(sizeof(*cfg_handler), GFP_KERNEL);
1160 if (unlikely(!cfg_handler)) {
1161 ret = -ENOMEM;
1162 goto fail;
1163 }
1164
1165 switch (major) {
1166 case 1:
1167 cfg_handlers = cfg_handlers_v1;
1168 num_handlers = ARRAY_SIZE(cfg_handlers_v1);
1169 break;
1170 case 3:
1171 cfg_handlers = cfg_handlers_v3;
1172 num_handlers = ARRAY_SIZE(cfg_handlers_v3);
1173 break;
1174 default:
1175 DRM_DEV_ERROR(dev->dev, "unexpected MDP major version: v%d.%d\n",
1176 major, minor);
1177 ret = -ENXIO;
1178 goto fail;
1179 }
1180
1181 /* only after mdp5_cfg global pointer's init can we access the hw */
1182 for (i = 0; i < num_handlers; i++) {
1183 if (cfg_handlers[i].revision != minor)
1184 continue;
1185 mdp5_cfg = cfg_handlers[i].config.hw;
1186
1187 break;
1188 }
1189 if (unlikely(!mdp5_cfg)) {
1190 DRM_DEV_ERROR(dev->dev, "unexpected MDP minor revision: v%d.%d\n",
1191 major, minor);
1192 ret = -ENXIO;
1193 goto fail;
1194 }
1195
1196 cfg_handler->revision = minor;
1197 cfg_handler->config.hw = mdp5_cfg;
1198
1199 pconfig = mdp5_get_config(pdev);
1200 memcpy(&cfg_handler->config.platform, pconfig, sizeof(*pconfig));
1201
1202 DBG("MDP5: %s hw config selected", mdp5_cfg->name);
1203
1204 return cfg_handler;
1205
1206 fail:
1207 if (cfg_handler)
1208 mdp5_cfg_destroy(cfg_handler);
1209
1210 return ERR_PTR(ret);
1211 }
1212
mdp5_get_config(struct platform_device * dev)1213 static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev)
1214 {
1215 static struct mdp5_cfg_platform config = {};
1216
1217 config.iommu = iommu_domain_alloc(&platform_bus_type);
1218
1219 return &config;
1220 }
1221