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