1f48f64539a2a54894c37843bfd216a44016e2a1
[linux-2.6-microblaze.git] / drivers / gpu / drm / msm / disp / mdp5 / mdp5_cfg.c
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 msm8x94_config = {
346         .name = "msm8x94",
347         .mdp = {
348                 .count = 1,
349                 .caps = MDP_CAP_SMP |
350                         MDP_CAP_SRC_SPLIT |
351                         0,
352         },
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,
362                 },
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,
367                 },
368         },
369         .ctl = {
370                 .count = 5,
371                 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
372                 .flush_hw_mask = 0xf0ffffff,
373         },
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,
380         },
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,
386         },
387         .pipe_dma = {
388                 .count = 2,
389                 .base = { 0x24000, 0x26000 },
390                 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
391         },
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, },
410                              },
411                 .nb_stages = 8,
412                 .max_width = 2048,
413                 .max_height = 0xFFFF,
414         },
415         .dspp = {
416                 .count = 4,
417                 .base = { 0x54000, 0x56000, 0x58000, 0x5a000 },
418
419         },
420         .ad = {
421                 .count = 3,
422                 .base = { 0x78000, 0x78800, 0x79000 },
423         },
424         .pp = {
425                 .count = 4,
426                 .base = { 0x70000, 0x70800, 0x71000, 0x71800 },
427         },
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,
435                 },
436         },
437         .max_clk = 400000000,
438 };
439
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 |
447                         0,
448         },
449         .ctl = {
450                 .count = 5,
451                 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
452                 .flush_hw_mask = 0xf4ffffff,
453         },
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 |
463                         0,
464         },
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 |
473                         0,
474         },
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 |
481                         0,
482         },
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     |
490                         0,
491         },
492
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, },
511                              },
512                 .nb_stages = 8,
513                 .max_width = 2560,
514                 .max_height = 0xFFFF,
515         },
516         .dspp = {
517                 .count = 2,
518                 .base = { 0x54000, 0x56000 },
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         .cdm = {
529                 .count = 1,
530                 .base = { 0x79200 },
531         },
532         .dsc = {
533                 .count = 2,
534                 .base = { 0x80000, 0x80400 },
535         },
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,
543                 },
544         },
545         .max_clk = 412500000,
546 };
547
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 |
555                         0,
556         },
557         .ctl = {
558                 .count = 3,
559                 .base = { 0x01000, 0x01200, 0x01400 },
560                 .flush_hw_mask = 0xffffffff,
561         },
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,
569                 },
570         },
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 |
580                         0,
581         },
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 |
589                         0,
590         },
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 |
597                         0,
598         },
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     |
606                         0,
607         },
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 },
616                              },
617                 .nb_stages = 8,
618                 .max_width = 2560,
619                 .max_height = 0xFFFF,
620         },
621         .dspp = {
622                 .count = 1,
623                 .base = { 0x54000 },
624
625         },
626         .pp = {
627                 .count = 3,
628                 .base = { 0x70000, 0x70800, 0x72000 },
629         },
630         .dsc = {
631                 .count = 2,
632                 .base = { 0x80000, 0x80400 },
633         },
634         .intf = {
635                 .base = { 0x6a000, 0x6a800, 0x6b000 },
636                 .connect = {
637                         [0] = INTF_DISABLED,
638                         [1] = INTF_DSI,
639                         [2] = INTF_DSI,
640                 },
641         },
642         .max_clk = 360000000,
643 };
644
645 static const struct mdp5_cfg_hw msm8917_config = {
646         .name = "msm8917",
647         .mdp = {
648                 .count = 1,
649                 .caps = MDP_CAP_CDM,
650         },
651         .ctl = {
652                 .count = 3,
653                 .base = { 0x01000, 0x01200, 0x01400 },
654                 .flush_hw_mask = 0xffffffff,
655         },
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 |
665                         0,
666         },
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 |
674                         0,
675         },
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 |
682                         0,
683         },
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     |
691                         0,
692         },
693
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 },
702                              },
703                 .nb_stages = 8,
704                 .max_width = 2048,
705                 .max_height = 0xFFFF,
706         },
707         .dspp = {
708                 .count = 1,
709                 .base = { 0x54000 },
710
711         },
712         .pp = {
713                 .count = 1,
714                 .base = { 0x70000 },
715         },
716         .cdm = {
717                 .count = 1,
718                 .base = { 0x79200 },
719         },
720         .intf = {
721                 .base = { 0x6a000, 0x6a800 },
722                 .connect = {
723                         [0] = INTF_DISABLED,
724                         [1] = INTF_DSI,
725                 },
726         },
727         .max_clk = 320000000,
728 };
729
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 |
737                         0,
738         },
739         .ctl = {
740                 .count = 5,
741                 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
742                 .flush_hw_mask = 0xf7ffffff,
743         },
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 |
753                         0,
754         },
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 |
763                         0,
764         },
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 |
771                         0,
772         },
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     |
780                         0,
781         },
782
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, },
801                              },
802                 .nb_stages = 8,
803                 .max_width = 2560,
804                 .max_height = 0xFFFF,
805         },
806         .dspp = {
807                 .count = 2,
808                 .base = { 0x54000, 0x56000 },
809         },
810         .ad = {
811                 .count = 3,
812                 .base = { 0x78000, 0x78800, 0x79000 },
813         },
814         .pp = {
815                 .count = 4,
816                 .base = { 0x70000, 0x70800, 0x71000, 0x71800 },
817         },
818         .cdm = {
819                 .count = 1,
820                 .base = { 0x79200 },
821         },
822         .dsc = {
823                 .count = 2,
824                 .base = { 0x80000, 0x80400 },
825         },
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,
833                 },
834         },
835         .max_clk = 412500000,
836 };
837
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 } },
847 };
848
849 static const struct mdp5_cfg_handler cfg_handlers_v3[] = {
850         { .revision = 0, .config = { .hw = &msm8998_config } },
851 };
852
853 static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev);
854
855 const struct mdp5_cfg_hw *mdp5_cfg_get_hw_config(struct mdp5_cfg_handler *cfg_handler)
856 {
857         return cfg_handler->config.hw;
858 }
859
860 struct mdp5_cfg *mdp5_cfg_get_config(struct mdp5_cfg_handler *cfg_handler)
861 {
862         return &cfg_handler->config;
863 }
864
865 int mdp5_cfg_get_hw_rev(struct mdp5_cfg_handler *cfg_handler)
866 {
867         return cfg_handler->revision;
868 }
869
870 void mdp5_cfg_destroy(struct mdp5_cfg_handler *cfg_handler)
871 {
872         kfree(cfg_handler);
873 }
874
875 struct mdp5_cfg_handler *mdp5_cfg_init(struct mdp5_kms *mdp5_kms,
876                 uint32_t major, uint32_t minor)
877 {
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;
884
885         cfg_handler = kzalloc(sizeof(*cfg_handler), GFP_KERNEL);
886         if (unlikely(!cfg_handler)) {
887                 ret = -ENOMEM;
888                 goto fail;
889         }
890
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;
905         };
906
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;
912
913                 break;
914         }
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;
920         }
921
922         cfg_handler->revision = minor;
923         cfg_handler->config.hw = mdp5_cfg;
924
925         pconfig = mdp5_get_config(pdev);
926         memcpy(&cfg_handler->config.platform, pconfig, sizeof(*pconfig));
927
928         DBG("MDP5: %s hw config selected", mdp5_cfg->name);
929
930         return cfg_handler;
931
932 fail:
933         if (cfg_handler)
934                 mdp5_cfg_destroy(cfg_handler);
935
936         return ERR_PTR(ret);
937 }
938
939 static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev)
940 {
941         static struct mdp5_cfg_platform config = {};
942
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;
947         }
948
949         return &config;
950 }