xref: /linux/drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c (revision 6fdcba32711044c35c0e1b094cbd8f3f0b4472c9)
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 }
951