treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / drivers / gpu / drm / msm / disp / mdp5 / mdp5_cfg.c
blobe3c4c250238b70c63d153e432cfa3c10b8b1ef5b
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
4 */
6 #include "mdp5_kms.h"
7 #include "mdp5_cfg.h"
9 struct mdp5_cfg_handler {
10 int revision;
11 struct mdp5_cfg config;
14 /* mdp5_cfg must be exposed (used in mdp5.xml.h) */
15 const struct mdp5_cfg_hw *mdp5_cfg = NULL;
17 static const struct mdp5_cfg_hw msm8x74v1_config = {
18 .name = "msm8x74v1",
19 .mdp = {
20 .count = 1,
21 .caps = MDP_CAP_SMP |
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,
33 .ctl = {
34 .count = 5,
35 .base = { 0x00500, 0x00600, 0x00700, 0x00800, 0x00900 },
36 .flush_hw_mask = 0x0003ffff,
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 |
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 |
55 .pipe_dma = {
56 .count = 2,
57 .base = { 0x02900, 0x02d00 },
58 .caps = MDP_PIPE_CAP_HFLIP |
59 MDP_PIPE_CAP_VFLIP |
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 },
77 .nb_stages = 5,
78 .max_width = 2048,
79 .max_height = 0xFFFF,
81 .dspp = {
82 .count = 3,
83 .base = { 0x04500, 0x04900, 0x04d00 },
85 .pp = {
86 .count = 3,
87 .base = { 0x21a00, 0x21b00, 0x21c00 },
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,
98 .max_clk = 200000000,
101 static const struct mdp5_cfg_hw msm8x74v2_config = {
102 .name = "msm8x74",
103 .mdp = {
104 .count = 1,
105 .caps = MDP_CAP_SMP |
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,
117 .ctl = {
118 .count = 5,
119 .base = { 0x00500, 0x00600, 0x00700, 0x00800, 0x00900 },
120 .flush_hw_mask = 0x0003ffff,
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,
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,
135 .pipe_dma = {
136 .count = 2,
137 .base = { 0x02900, 0x02d00 },
138 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
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, },
155 .nb_stages = 5,
156 .max_width = 2048,
157 .max_height = 0xFFFF,
159 .dspp = {
160 .count = 3,
161 .base = { 0x04500, 0x04900, 0x04d00 },
163 .ad = {
164 .count = 2,
165 .base = { 0x13000, 0x13200 },
167 .pp = {
168 .count = 3,
169 .base = { 0x12c00, 0x12d00, 0x12e00 },
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,
180 .max_clk = 200000000,
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 |
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,
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,
207 .ctl = {
208 .count = 5,
209 .base = { 0x00500, 0x00600, 0x00700, 0x00800, 0x00900 },
210 .flush_hw_mask = 0x003fffff,
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,
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,
225 .pipe_dma = {
226 .count = 2,
227 .base = { 0x03100, 0x03500 },
228 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
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, },
249 .nb_stages = 5,
250 .max_width = 2048,
251 .max_height = 0xFFFF,
253 .dspp = {
254 .count = 4,
255 .base = { 0x05100, 0x05500, 0x05900, 0x05d00 },
258 .ad = {
259 .count = 3,
260 .base = { 0x13400, 0x13600, 0x13800 },
262 .pp = {
263 .count = 4,
264 .base = { 0x12e00, 0x12f00, 0x13000, 0x13100 },
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,
275 .max_clk = 320000000,
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 |
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,
294 .ctl = {
295 .count = 5,
296 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
297 .flush_hw_mask = 0x4003ffff,
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,
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,
312 .pipe_dma = {
313 .count = 1,
314 .base = { 0x24000 },
315 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
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 },
326 .nb_stages = 8,
327 .max_width = 2048,
328 .max_height = 0xFFFF,
330 .dspp = {
331 .count = 1,
332 .base = { 0x54000 },
335 .intf = {
336 .base = { 0x00000, 0x6a800 },
337 .connect = {
338 [0] = INTF_DISABLED,
339 [1] = INTF_DSI,
342 .max_clk = 320000000,
345 static const struct mdp5_cfg_hw msm8x94_config = {
346 .name = "msm8x94",
347 .mdp = {
348 .count = 1,
349 .caps = MDP_CAP_SMP |
350 MDP_CAP_SRC_SPLIT |
353 .smp = {
354 .mmb_count = 44,
355 .mmb_size = 8192,
356 .clients = {
357 [SSPP_VIG0] = 1, [SSPP_VIG1] = 4,
358 [SSPP_VIG2] = 7, [SSPP_VIG3] = 19,
359 [SSPP_DMA0] = 10, [SSPP_DMA1] = 13,
360 [SSPP_RGB0] = 16, [SSPP_RGB1] = 17,
361 [SSPP_RGB2] = 18, [SSPP_RGB3] = 22,
363 .reserved_state[0] = GENMASK(23, 0), /* first 24 MMBs */
364 .reserved = {
365 [1] = 1, [4] = 1, [7] = 1, [19] = 1,
366 [16] = 5, [17] = 5, [18] = 5, [22] = 5,
369 .ctl = {
370 .count = 5,
371 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
372 .flush_hw_mask = 0xf0ffffff,
374 .pipe_vig = {
375 .count = 4,
376 .base = { 0x04000, 0x06000, 0x08000, 0x0a000 },
377 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
378 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
379 MDP_PIPE_CAP_DECIMATION,
381 .pipe_rgb = {
382 .count = 4,
383 .base = { 0x14000, 0x16000, 0x18000, 0x1a000 },
384 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
385 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_DECIMATION,
387 .pipe_dma = {
388 .count = 2,
389 .base = { 0x24000, 0x26000 },
390 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
392 .lm = {
393 .count = 6,
394 .base = { 0x44000, 0x45000, 0x46000, 0x47000, 0x48000, 0x49000 },
395 .instances = {
396 { .id = 0, .pp = 0, .dspp = 0,
397 .caps = MDP_LM_CAP_DISPLAY |
398 MDP_LM_CAP_PAIR, },
399 { .id = 1, .pp = 1, .dspp = 1,
400 .caps = MDP_LM_CAP_DISPLAY, },
401 { .id = 2, .pp = 2, .dspp = 2,
402 .caps = MDP_LM_CAP_DISPLAY |
403 MDP_LM_CAP_PAIR, },
404 { .id = 3, .pp = -1, .dspp = -1,
405 .caps = MDP_LM_CAP_WB, },
406 { .id = 4, .pp = -1, .dspp = -1,
407 .caps = MDP_LM_CAP_WB, },
408 { .id = 5, .pp = 3, .dspp = 3,
409 .caps = MDP_LM_CAP_DISPLAY, },
411 .nb_stages = 8,
412 .max_width = 2048,
413 .max_height = 0xFFFF,
415 .dspp = {
416 .count = 4,
417 .base = { 0x54000, 0x56000, 0x58000, 0x5a000 },
420 .ad = {
421 .count = 3,
422 .base = { 0x78000, 0x78800, 0x79000 },
424 .pp = {
425 .count = 4,
426 .base = { 0x70000, 0x70800, 0x71000, 0x71800 },
428 .intf = {
429 .base = { 0x6a000, 0x6a800, 0x6b000, 0x6b800, 0x6c000 },
430 .connect = {
431 [0] = INTF_DISABLED,
432 [1] = INTF_DSI,
433 [2] = INTF_DSI,
434 [3] = INTF_HDMI,
437 .max_clk = 400000000,
440 static const struct mdp5_cfg_hw msm8x96_config = {
441 .name = "msm8x96",
442 .mdp = {
443 .count = 1,
444 .caps = MDP_CAP_DSC |
445 MDP_CAP_CDM |
446 MDP_CAP_SRC_SPLIT |
449 .ctl = {
450 .count = 5,
451 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
452 .flush_hw_mask = 0xf4ffffff,
454 .pipe_vig = {
455 .count = 4,
456 .base = { 0x04000, 0x06000, 0x08000, 0x0a000 },
457 .caps = MDP_PIPE_CAP_HFLIP |
458 MDP_PIPE_CAP_VFLIP |
459 MDP_PIPE_CAP_SCALE |
460 MDP_PIPE_CAP_CSC |
461 MDP_PIPE_CAP_DECIMATION |
462 MDP_PIPE_CAP_SW_PIX_EXT |
465 .pipe_rgb = {
466 .count = 4,
467 .base = { 0x14000, 0x16000, 0x18000, 0x1a000 },
468 .caps = MDP_PIPE_CAP_HFLIP |
469 MDP_PIPE_CAP_VFLIP |
470 MDP_PIPE_CAP_SCALE |
471 MDP_PIPE_CAP_DECIMATION |
472 MDP_PIPE_CAP_SW_PIX_EXT |
475 .pipe_dma = {
476 .count = 2,
477 .base = { 0x24000, 0x26000 },
478 .caps = MDP_PIPE_CAP_HFLIP |
479 MDP_PIPE_CAP_VFLIP |
480 MDP_PIPE_CAP_SW_PIX_EXT |
483 .pipe_cursor = {
484 .count = 2,
485 .base = { 0x34000, 0x36000 },
486 .caps = MDP_PIPE_CAP_HFLIP |
487 MDP_PIPE_CAP_VFLIP |
488 MDP_PIPE_CAP_SW_PIX_EXT |
489 MDP_PIPE_CAP_CURSOR |
493 .lm = {
494 .count = 6,
495 .base = { 0x44000, 0x45000, 0x46000, 0x47000, 0x48000, 0x49000 },
496 .instances = {
497 { .id = 0, .pp = 0, .dspp = 0,
498 .caps = MDP_LM_CAP_DISPLAY |
499 MDP_LM_CAP_PAIR, },
500 { .id = 1, .pp = 1, .dspp = 1,
501 .caps = MDP_LM_CAP_DISPLAY, },
502 { .id = 2, .pp = 2, .dspp = -1,
503 .caps = MDP_LM_CAP_DISPLAY |
504 MDP_LM_CAP_PAIR, },
505 { .id = 3, .pp = -1, .dspp = -1,
506 .caps = MDP_LM_CAP_WB, },
507 { .id = 4, .pp = -1, .dspp = -1,
508 .caps = MDP_LM_CAP_WB, },
509 { .id = 5, .pp = 3, .dspp = -1,
510 .caps = MDP_LM_CAP_DISPLAY, },
512 .nb_stages = 8,
513 .max_width = 2560,
514 .max_height = 0xFFFF,
516 .dspp = {
517 .count = 2,
518 .base = { 0x54000, 0x56000 },
520 .ad = {
521 .count = 3,
522 .base = { 0x78000, 0x78800, 0x79000 },
524 .pp = {
525 .count = 4,
526 .base = { 0x70000, 0x70800, 0x71000, 0x71800 },
528 .cdm = {
529 .count = 1,
530 .base = { 0x79200 },
532 .dsc = {
533 .count = 2,
534 .base = { 0x80000, 0x80400 },
536 .intf = {
537 .base = { 0x6a000, 0x6a800, 0x6b000, 0x6b800, 0x6c000 },
538 .connect = {
539 [0] = INTF_DISABLED,
540 [1] = INTF_DSI,
541 [2] = INTF_DSI,
542 [3] = INTF_HDMI,
545 .max_clk = 412500000,
548 const struct mdp5_cfg_hw msm8x76_config = {
549 .name = "msm8x76",
550 .mdp = {
551 .count = 1,
552 .caps = MDP_CAP_SMP |
553 MDP_CAP_DSC |
554 MDP_CAP_SRC_SPLIT |
557 .ctl = {
558 .count = 3,
559 .base = { 0x01000, 0x01200, 0x01400 },
560 .flush_hw_mask = 0xffffffff,
562 .smp = {
563 .mmb_count = 10,
564 .mmb_size = 10240,
565 .clients = {
566 [SSPP_VIG0] = 1, [SSPP_VIG1] = 9,
567 [SSPP_DMA0] = 4,
568 [SSPP_RGB0] = 7, [SSPP_RGB1] = 8,
571 .pipe_vig = {
572 .count = 2,
573 .base = { 0x04000, 0x06000 },
574 .caps = MDP_PIPE_CAP_HFLIP |
575 MDP_PIPE_CAP_VFLIP |
576 MDP_PIPE_CAP_SCALE |
577 MDP_PIPE_CAP_CSC |
578 MDP_PIPE_CAP_DECIMATION |
579 MDP_PIPE_CAP_SW_PIX_EXT |
582 .pipe_rgb = {
583 .count = 2,
584 .base = { 0x14000, 0x16000 },
585 .caps = MDP_PIPE_CAP_HFLIP |
586 MDP_PIPE_CAP_VFLIP |
587 MDP_PIPE_CAP_DECIMATION |
588 MDP_PIPE_CAP_SW_PIX_EXT |
591 .pipe_dma = {
592 .count = 1,
593 .base = { 0x24000 },
594 .caps = MDP_PIPE_CAP_HFLIP |
595 MDP_PIPE_CAP_VFLIP |
596 MDP_PIPE_CAP_SW_PIX_EXT |
599 .pipe_cursor = {
600 .count = 1,
601 .base = { 0x440DC },
602 .caps = MDP_PIPE_CAP_HFLIP |
603 MDP_PIPE_CAP_VFLIP |
604 MDP_PIPE_CAP_SW_PIX_EXT |
605 MDP_PIPE_CAP_CURSOR |
608 .lm = {
609 .count = 2,
610 .base = { 0x44000, 0x45000 },
611 .instances = {
612 { .id = 0, .pp = 0, .dspp = 0,
613 .caps = MDP_LM_CAP_DISPLAY, },
614 { .id = 1, .pp = -1, .dspp = -1,
615 .caps = MDP_LM_CAP_WB },
617 .nb_stages = 8,
618 .max_width = 2560,
619 .max_height = 0xFFFF,
621 .dspp = {
622 .count = 1,
623 .base = { 0x54000 },
626 .pp = {
627 .count = 3,
628 .base = { 0x70000, 0x70800, 0x72000 },
630 .dsc = {
631 .count = 2,
632 .base = { 0x80000, 0x80400 },
634 .intf = {
635 .base = { 0x6a000, 0x6a800, 0x6b000 },
636 .connect = {
637 [0] = INTF_DISABLED,
638 [1] = INTF_DSI,
639 [2] = INTF_DSI,
642 .max_clk = 360000000,
645 static const struct mdp5_cfg_hw msm8917_config = {
646 .name = "msm8917",
647 .mdp = {
648 .count = 1,
649 .caps = MDP_CAP_CDM,
651 .ctl = {
652 .count = 3,
653 .base = { 0x01000, 0x01200, 0x01400 },
654 .flush_hw_mask = 0xffffffff,
656 .pipe_vig = {
657 .count = 1,
658 .base = { 0x04000 },
659 .caps = MDP_PIPE_CAP_HFLIP |
660 MDP_PIPE_CAP_VFLIP |
661 MDP_PIPE_CAP_SCALE |
662 MDP_PIPE_CAP_CSC |
663 MDP_PIPE_CAP_DECIMATION |
664 MDP_PIPE_CAP_SW_PIX_EXT |
667 .pipe_rgb = {
668 .count = 2,
669 .base = { 0x14000, 0x16000 },
670 .caps = MDP_PIPE_CAP_HFLIP |
671 MDP_PIPE_CAP_VFLIP |
672 MDP_PIPE_CAP_DECIMATION |
673 MDP_PIPE_CAP_SW_PIX_EXT |
676 .pipe_dma = {
677 .count = 1,
678 .base = { 0x24000 },
679 .caps = MDP_PIPE_CAP_HFLIP |
680 MDP_PIPE_CAP_VFLIP |
681 MDP_PIPE_CAP_SW_PIX_EXT |
684 .pipe_cursor = {
685 .count = 1,
686 .base = { 0x34000 },
687 .caps = MDP_PIPE_CAP_HFLIP |
688 MDP_PIPE_CAP_VFLIP |
689 MDP_PIPE_CAP_SW_PIX_EXT |
690 MDP_PIPE_CAP_CURSOR |
694 .lm = {
695 .count = 2,
696 .base = { 0x44000, 0x45000 },
697 .instances = {
698 { .id = 0, .pp = 0, .dspp = 0,
699 .caps = MDP_LM_CAP_DISPLAY, },
700 { .id = 1, .pp = -1, .dspp = -1,
701 .caps = MDP_LM_CAP_WB },
703 .nb_stages = 8,
704 .max_width = 2048,
705 .max_height = 0xFFFF,
707 .dspp = {
708 .count = 1,
709 .base = { 0x54000 },
712 .pp = {
713 .count = 1,
714 .base = { 0x70000 },
716 .cdm = {
717 .count = 1,
718 .base = { 0x79200 },
720 .intf = {
721 .base = { 0x6a000, 0x6a800 },
722 .connect = {
723 [0] = INTF_DISABLED,
724 [1] = INTF_DSI,
727 .max_clk = 320000000,
730 static const struct mdp5_cfg_hw msm8998_config = {
731 .name = "msm8998",
732 .mdp = {
733 .count = 1,
734 .caps = MDP_CAP_DSC |
735 MDP_CAP_CDM |
736 MDP_CAP_SRC_SPLIT |
739 .ctl = {
740 .count = 5,
741 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
742 .flush_hw_mask = 0xf7ffffff,
744 .pipe_vig = {
745 .count = 4,
746 .base = { 0x04000, 0x06000, 0x08000, 0x0a000 },
747 .caps = MDP_PIPE_CAP_HFLIP |
748 MDP_PIPE_CAP_VFLIP |
749 MDP_PIPE_CAP_SCALE |
750 MDP_PIPE_CAP_CSC |
751 MDP_PIPE_CAP_DECIMATION |
752 MDP_PIPE_CAP_SW_PIX_EXT |
755 .pipe_rgb = {
756 .count = 4,
757 .base = { 0x14000, 0x16000, 0x18000, 0x1a000 },
758 .caps = MDP_PIPE_CAP_HFLIP |
759 MDP_PIPE_CAP_VFLIP |
760 MDP_PIPE_CAP_SCALE |
761 MDP_PIPE_CAP_DECIMATION |
762 MDP_PIPE_CAP_SW_PIX_EXT |
765 .pipe_dma = {
766 .count = 2, /* driver supports max of 2 currently */
767 .base = { 0x24000, 0x26000, 0x28000, 0x2a000 },
768 .caps = MDP_PIPE_CAP_HFLIP |
769 MDP_PIPE_CAP_VFLIP |
770 MDP_PIPE_CAP_SW_PIX_EXT |
773 .pipe_cursor = {
774 .count = 2,
775 .base = { 0x34000, 0x36000 },
776 .caps = MDP_PIPE_CAP_HFLIP |
777 MDP_PIPE_CAP_VFLIP |
778 MDP_PIPE_CAP_SW_PIX_EXT |
779 MDP_PIPE_CAP_CURSOR |
783 .lm = {
784 .count = 6,
785 .base = { 0x44000, 0x45000, 0x46000, 0x47000, 0x48000, 0x49000 },
786 .instances = {
787 { .id = 0, .pp = 0, .dspp = 0,
788 .caps = MDP_LM_CAP_DISPLAY |
789 MDP_LM_CAP_PAIR, },
790 { .id = 1, .pp = 1, .dspp = 1,
791 .caps = MDP_LM_CAP_DISPLAY, },
792 { .id = 2, .pp = 2, .dspp = -1,
793 .caps = MDP_LM_CAP_DISPLAY |
794 MDP_LM_CAP_PAIR, },
795 { .id = 3, .pp = -1, .dspp = -1,
796 .caps = MDP_LM_CAP_WB, },
797 { .id = 4, .pp = -1, .dspp = -1,
798 .caps = MDP_LM_CAP_WB, },
799 { .id = 5, .pp = 3, .dspp = -1,
800 .caps = MDP_LM_CAP_DISPLAY, },
802 .nb_stages = 8,
803 .max_width = 2560,
804 .max_height = 0xFFFF,
806 .dspp = {
807 .count = 2,
808 .base = { 0x54000, 0x56000 },
810 .ad = {
811 .count = 3,
812 .base = { 0x78000, 0x78800, 0x79000 },
814 .pp = {
815 .count = 4,
816 .base = { 0x70000, 0x70800, 0x71000, 0x71800 },
818 .cdm = {
819 .count = 1,
820 .base = { 0x79200 },
822 .dsc = {
823 .count = 2,
824 .base = { 0x80000, 0x80400 },
826 .intf = {
827 .base = { 0x6a000, 0x6a800, 0x6b000, 0x6b800, 0x6c000 },
828 .connect = {
829 [0] = INTF_eDP,
830 [1] = INTF_DSI,
831 [2] = INTF_DSI,
832 [3] = INTF_HDMI,
835 .max_clk = 412500000,
838 static const struct mdp5_cfg_handler cfg_handlers_v1[] = {
839 { .revision = 0, .config = { .hw = &msm8x74v1_config } },
840 { .revision = 2, .config = { .hw = &msm8x74v2_config } },
841 { .revision = 3, .config = { .hw = &apq8084_config } },
842 { .revision = 6, .config = { .hw = &msm8x16_config } },
843 { .revision = 9, .config = { .hw = &msm8x94_config } },
844 { .revision = 7, .config = { .hw = &msm8x96_config } },
845 { .revision = 11, .config = { .hw = &msm8x76_config } },
846 { .revision = 15, .config = { .hw = &msm8917_config } },
849 static const struct mdp5_cfg_handler cfg_handlers_v3[] = {
850 { .revision = 0, .config = { .hw = &msm8998_config } },
853 static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev);
855 const struct mdp5_cfg_hw *mdp5_cfg_get_hw_config(struct mdp5_cfg_handler *cfg_handler)
857 return cfg_handler->config.hw;
860 struct mdp5_cfg *mdp5_cfg_get_config(struct mdp5_cfg_handler *cfg_handler)
862 return &cfg_handler->config;
865 int mdp5_cfg_get_hw_rev(struct mdp5_cfg_handler *cfg_handler)
867 return cfg_handler->revision;
870 void mdp5_cfg_destroy(struct mdp5_cfg_handler *cfg_handler)
872 kfree(cfg_handler);
875 struct mdp5_cfg_handler *mdp5_cfg_init(struct mdp5_kms *mdp5_kms,
876 uint32_t major, uint32_t minor)
878 struct drm_device *dev = mdp5_kms->dev;
879 struct platform_device *pdev = to_platform_device(dev->dev);
880 struct mdp5_cfg_handler *cfg_handler;
881 const struct mdp5_cfg_handler *cfg_handlers;
882 struct mdp5_cfg_platform *pconfig;
883 int i, ret = 0, num_handlers;
885 cfg_handler = kzalloc(sizeof(*cfg_handler), GFP_KERNEL);
886 if (unlikely(!cfg_handler)) {
887 ret = -ENOMEM;
888 goto fail;
891 switch (major) {
892 case 1:
893 cfg_handlers = cfg_handlers_v1;
894 num_handlers = ARRAY_SIZE(cfg_handlers_v1);
895 break;
896 case 3:
897 cfg_handlers = cfg_handlers_v3;
898 num_handlers = ARRAY_SIZE(cfg_handlers_v3);
899 break;
900 default:
901 DRM_DEV_ERROR(dev->dev, "unexpected MDP major version: v%d.%d\n",
902 major, minor);
903 ret = -ENXIO;
904 goto fail;
907 /* only after mdp5_cfg global pointer's init can we access the hw */
908 for (i = 0; i < num_handlers; i++) {
909 if (cfg_handlers[i].revision != minor)
910 continue;
911 mdp5_cfg = cfg_handlers[i].config.hw;
913 break;
915 if (unlikely(!mdp5_cfg)) {
916 DRM_DEV_ERROR(dev->dev, "unexpected MDP minor revision: v%d.%d\n",
917 major, minor);
918 ret = -ENXIO;
919 goto fail;
922 cfg_handler->revision = minor;
923 cfg_handler->config.hw = mdp5_cfg;
925 pconfig = mdp5_get_config(pdev);
926 memcpy(&cfg_handler->config.platform, pconfig, sizeof(*pconfig));
928 DBG("MDP5: %s hw config selected", mdp5_cfg->name);
930 return cfg_handler;
932 fail:
933 if (cfg_handler)
934 mdp5_cfg_destroy(cfg_handler);
936 return ERR_PTR(ret);
939 static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev)
941 static struct mdp5_cfg_platform config = {};
943 config.iommu = iommu_domain_alloc(&platform_bus_type);
944 if (config.iommu) {
945 config.iommu->geometry.aperture_start = 0x1000;
946 config.iommu->geometry.aperture_end = 0xffffffff;
949 return &config;