]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c
Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[mirror_ubuntu-jammy-kernel.git] / drivers / gpu / drm / msm / disp / mdp5 / mdp5_cfg.c
CommitLineData
97fb5e8d 1// SPDX-License-Identifier: GPL-2.0-only
2e362e17 2/*
02dfd9d2 3 * Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
2e362e17
SV
4 */
5
6#include "mdp5_kms.h"
7#include "mdp5_cfg.h"
8
9struct mdp5_cfg_handler {
10 int revision;
11 struct mdp5_cfg config;
12};
13
14/* mdp5_cfg must be exposed (used in mdp5.xml.h) */
15const struct mdp5_cfg_hw *mdp5_cfg = NULL;
16
8a94b0aa 17const struct mdp5_cfg_hw msm8x74v1_config = {
18 .name = "msm8x74v1",
19 .mdp = {
20 .count = 1,
d879eb5a
SV
21 .caps = MDP_CAP_SMP |
22 0,
8a94b0aa 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,
031d63dd 35 .base = { 0x00500, 0x00600, 0x00700, 0x00800, 0x00900 },
8a94b0aa 36 .flush_hw_mask = 0x0003ffff,
37 },
38 .pipe_vig = {
39 .count = 3,
031d63dd 40 .base = { 0x01100, 0x01500, 0x01900 },
8a94b0aa 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,
031d63dd 49 .base = { 0x01d00, 0x02100, 0x02500 },
8a94b0aa 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,
031d63dd 57 .base = { 0x02900, 0x02d00 },
8a94b0aa 58 .caps = MDP_PIPE_CAP_HFLIP |
59 MDP_PIPE_CAP_VFLIP |
60 0,
61 },
62 .lm = {
63 .count = 5,
031d63dd 64 .base = { 0x03100, 0x03500, 0x03900, 0x03d00, 0x04100 },
384dbd8c
AT
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 },
8a94b0aa 77 .nb_stages = 5,
aa3c2ba1
RC
78 .max_width = 2048,
79 .max_height = 0xFFFF,
8a94b0aa 80 },
81 .dspp = {
82 .count = 3,
031d63dd 83 .base = { 0x04500, 0x04900, 0x04d00 },
8a94b0aa 84 },
85 .pp = {
86 .count = 3,
031d63dd 87 .base = { 0x21a00, 0x21b00, 0x21c00 },
8a94b0aa 88 },
89 .intf = {
031d63dd 90 .base = { 0x21000, 0x21200, 0x21400, 0x21600 },
8a94b0aa 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
101const struct mdp5_cfg_hw msm8x74v2_config = {
2e362e17 102 .name = "msm8x74",
f5253812
SV
103 .mdp = {
104 .count = 1,
d879eb5a
SV
105 .caps = MDP_CAP_SMP |
106 0,
f5253812 107 },
2e362e17
SV
108 .smp = {
109 .mmb_count = 22,
110 .mmb_size = 4096,
6fa6acdf
SV
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 },
2e362e17
SV
116 },
117 .ctl = {
118 .count = 5,
031d63dd 119 .base = { 0x00500, 0x00600, 0x00700, 0x00800, 0x00900 },
389b09a1 120 .flush_hw_mask = 0x0003ffff,
2e362e17
SV
121 },
122 .pipe_vig = {
123 .count = 3,
031d63dd 124 .base = { 0x01100, 0x01500, 0x01900 },
3498409f 125 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
126 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
127 MDP_PIPE_CAP_DECIMATION,
2e362e17
SV
128 },
129 .pipe_rgb = {
130 .count = 3,
031d63dd 131 .base = { 0x01d00, 0x02100, 0x02500 },
3498409f 132 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
133 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_DECIMATION,
2e362e17
SV
134 },
135 .pipe_dma = {
136 .count = 2,
031d63dd 137 .base = { 0x02900, 0x02d00 },
3498409f 138 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
2e362e17
SV
139 },
140 .lm = {
141 .count = 5,
031d63dd 142 .base = { 0x03100, 0x03500, 0x03900, 0x03d00, 0x04100 },
384dbd8c
AT
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 },
2e362e17 155 .nb_stages = 5,
9b7a9fc2
HL
156 .max_width = 2048,
157 .max_height = 0xFFFF,
2e362e17
SV
158 },
159 .dspp = {
160 .count = 3,
031d63dd 161 .base = { 0x04500, 0x04900, 0x04d00 },
2e362e17
SV
162 },
163 .ad = {
164 .count = 2,
031d63dd 165 .base = { 0x13000, 0x13200 },
2e362e17 166 },
38305907
HL
167 .pp = {
168 .count = 3,
031d63dd 169 .base = { 0x12c00, 0x12d00, 0x12e00 },
38305907 170 },
2e362e17 171 .intf = {
031d63dd 172 .base = { 0x12400, 0x12600, 0x12800, 0x12a00 },
fe34464d
SV
173 .connect = {
174 [0] = INTF_eDP,
175 [1] = INTF_DSI,
176 [2] = INTF_DSI,
177 [3] = INTF_HDMI,
178 },
67ac0a2d 179 },
2e362e17
SV
180 .max_clk = 200000000,
181};
182
183const struct mdp5_cfg_hw apq8084_config = {
184 .name = "apq8084",
f5253812
SV
185 .mdp = {
186 .count = 1,
d879eb5a 187 .caps = MDP_CAP_SMP |
621da7d9 188 MDP_CAP_SRC_SPLIT |
d879eb5a 189 0,
f5253812 190 },
2e362e17
SV
191 .smp = {
192 .mmb_count = 44,
193 .mmb_size = 8192,
6fa6acdf
SV
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 },
2e362e17 201 .reserved_state[0] = GENMASK(7, 0), /* first 8 MMBs */
6fa6acdf
SV
202 .reserved = {
203 /* Two SMP blocks are statically tied to RGB pipes: */
204 [16] = 2, [17] = 2, [18] = 2, [22] = 2,
205 },
2e362e17
SV
206 },
207 .ctl = {
208 .count = 5,
031d63dd 209 .base = { 0x00500, 0x00600, 0x00700, 0x00800, 0x00900 },
389b09a1 210 .flush_hw_mask = 0x003fffff,
2e362e17
SV
211 },
212 .pipe_vig = {
213 .count = 4,
031d63dd 214 .base = { 0x01100, 0x01500, 0x01900, 0x01d00 },
3498409f 215 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
216 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
217 MDP_PIPE_CAP_DECIMATION,
2e362e17
SV
218 },
219 .pipe_rgb = {
220 .count = 4,
031d63dd 221 .base = { 0x02100, 0x02500, 0x02900, 0x02d00 },
3498409f 222 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
223 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_DECIMATION,
2e362e17
SV
224 },
225 .pipe_dma = {
226 .count = 2,
031d63dd 227 .base = { 0x03100, 0x03500 },
3498409f 228 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
2e362e17
SV
229 },
230 .lm = {
231 .count = 6,
031d63dd 232 .base = { 0x03900, 0x03d00, 0x04100, 0x04500, 0x04900, 0x04d00 },
384dbd8c
AT
233 .instances = {
234 { .id = 0, .pp = 0, .dspp = 0,
621da7d9
AT
235 .caps = MDP_LM_CAP_DISPLAY |
236 MDP_LM_CAP_PAIR, },
384dbd8c
AT
237 { .id = 1, .pp = 1, .dspp = 1,
238 .caps = MDP_LM_CAP_DISPLAY, },
239 { .id = 2, .pp = 2, .dspp = 2,
621da7d9
AT
240 .caps = MDP_LM_CAP_DISPLAY |
241 MDP_LM_CAP_PAIR, },
384dbd8c
AT
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 },
2e362e17 249 .nb_stages = 5,
9b7a9fc2
HL
250 .max_width = 2048,
251 .max_height = 0xFFFF,
2e362e17
SV
252 },
253 .dspp = {
254 .count = 4,
031d63dd 255 .base = { 0x05100, 0x05500, 0x05900, 0x05d00 },
2e362e17
SV
256
257 },
258 .ad = {
259 .count = 3,
031d63dd 260 .base = { 0x13400, 0x13600, 0x13800 },
2e362e17 261 },
38305907
HL
262 .pp = {
263 .count = 4,
031d63dd 264 .base = { 0x12e00, 0x12f00, 0x13000, 0x13100 },
38305907 265 },
2e362e17 266 .intf = {
031d63dd 267 .base = { 0x12400, 0x12600, 0x12800, 0x12a00, 0x12c00 },
fe34464d
SV
268 .connect = {
269 [0] = INTF_eDP,
270 [1] = INTF_DSI,
271 [2] = INTF_DSI,
272 [3] = INTF_HDMI,
273 },
67ac0a2d 274 },
2e362e17
SV
275 .max_clk = 320000000,
276};
277
02dfd9d2
SV
278const struct mdp5_cfg_hw msm8x16_config = {
279 .name = "msm8x16",
280 .mdp = {
281 .count = 1,
031d63dd 282 .base = { 0x0 },
d879eb5a
SV
283 .caps = MDP_CAP_SMP |
284 0,
02dfd9d2
SV
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,
031d63dd 296 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
02dfd9d2
SV
297 .flush_hw_mask = 0x4003ffff,
298 },
299 .pipe_vig = {
300 .count = 1,
031d63dd 301 .base = { 0x04000 },
3498409f 302 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
303 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
304 MDP_PIPE_CAP_DECIMATION,
02dfd9d2
SV
305 },
306 .pipe_rgb = {
307 .count = 2,
031d63dd 308 .base = { 0x14000, 0x16000 },
3498409f 309 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
2c381848 310 MDP_PIPE_CAP_DECIMATION,
02dfd9d2
SV
311 },
312 .pipe_dma = {
313 .count = 1,
031d63dd 314 .base = { 0x24000 },
3498409f 315 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
02dfd9d2
SV
316 },
317 .lm = {
318 .count = 2, /* LM0 and LM3 */
031d63dd 319 .base = { 0x44000, 0x47000 },
384dbd8c
AT
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 },
702673f6 326 .nb_stages = 8,
9b7a9fc2
HL
327 .max_width = 2048,
328 .max_height = 0xFFFF,
02dfd9d2
SV
329 },
330 .dspp = {
331 .count = 1,
031d63dd 332 .base = { 0x54000 },
02dfd9d2
SV
333
334 },
335 .intf = {
031d63dd 336 .base = { 0x00000, 0x6a800 },
fe34464d
SV
337 .connect = {
338 [0] = INTF_DISABLED,
339 [1] = INTF_DSI,
340 },
02dfd9d2 341 },
02dfd9d2
SV
342 .max_clk = 320000000,
343};
344
3a84f846
SV
345const struct mdp5_cfg_hw msm8x94_config = {
346 .name = "msm8x94",
347 .mdp = {
348 .count = 1,
d879eb5a 349 .caps = MDP_CAP_SMP |
621da7d9 350 MDP_CAP_SRC_SPLIT |
d879eb5a 351 0,
3a84f846
SV
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,
031d63dd 371 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
3a84f846
SV
372 .flush_hw_mask = 0xf0ffffff,
373 },
374 .pipe_vig = {
375 .count = 4,
031d63dd 376 .base = { 0x04000, 0x06000, 0x08000, 0x0a000 },
3498409f 377 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
378 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_CSC |
379 MDP_PIPE_CAP_DECIMATION,
3a84f846
SV
380 },
381 .pipe_rgb = {
382 .count = 4,
031d63dd 383 .base = { 0x14000, 0x16000, 0x18000, 0x1a000 },
3498409f 384 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
385 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_DECIMATION,
3a84f846
SV
386 },
387 .pipe_dma = {
388 .count = 2,
031d63dd 389 .base = { 0x24000, 0x26000 },
3498409f 390 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP,
3a84f846
SV
391 },
392 .lm = {
393 .count = 6,
031d63dd 394 .base = { 0x44000, 0x45000, 0x46000, 0x47000, 0x48000, 0x49000 },
384dbd8c
AT
395 .instances = {
396 { .id = 0, .pp = 0, .dspp = 0,
621da7d9
AT
397 .caps = MDP_LM_CAP_DISPLAY |
398 MDP_LM_CAP_PAIR, },
384dbd8c
AT
399 { .id = 1, .pp = 1, .dspp = 1,
400 .caps = MDP_LM_CAP_DISPLAY, },
401 { .id = 2, .pp = 2, .dspp = 2,
621da7d9
AT
402 .caps = MDP_LM_CAP_DISPLAY |
403 MDP_LM_CAP_PAIR, },
384dbd8c
AT
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 },
3a84f846 411 .nb_stages = 8,
9b7a9fc2
HL
412 .max_width = 2048,
413 .max_height = 0xFFFF,
3a84f846
SV
414 },
415 .dspp = {
416 .count = 4,
031d63dd 417 .base = { 0x54000, 0x56000, 0x58000, 0x5a000 },
3a84f846
SV
418
419 },
420 .ad = {
421 .count = 3,
031d63dd 422 .base = { 0x78000, 0x78800, 0x79000 },
3a84f846
SV
423 },
424 .pp = {
425 .count = 4,
031d63dd 426 .base = { 0x70000, 0x70800, 0x71000, 0x71800 },
3a84f846
SV
427 },
428 .intf = {
031d63dd 429 .base = { 0x6a000, 0x6a800, 0x6b000, 0x6b800, 0x6c000 },
3a84f846
SV
430 .connect = {
431 [0] = INTF_DISABLED,
432 [1] = INTF_DSI,
433 [2] = INTF_DSI,
434 [3] = INTF_HDMI,
435 },
436 },
d879eb5a
SV
437 .max_clk = 400000000,
438};
439
440const struct mdp5_cfg_hw msm8x96_config = {
441 .name = "msm8x96",
442 .mdp = {
443 .count = 1,
d879eb5a
SV
444 .caps = MDP_CAP_DSC |
445 MDP_CAP_CDM |
621da7d9 446 MDP_CAP_SRC_SPLIT |
d879eb5a
SV
447 0,
448 },
449 .ctl = {
450 .count = 5,
031d63dd 451 .base = { 0x01000, 0x01200, 0x01400, 0x01600, 0x01800 },
d879eb5a
SV
452 .flush_hw_mask = 0xf4ffffff,
453 },
454 .pipe_vig = {
455 .count = 4,
031d63dd 456 .base = { 0x04000, 0x06000, 0x08000, 0x0a000 },
d879eb5a
SV
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,
031d63dd 467 .base = { 0x14000, 0x16000, 0x18000, 0x1a000 },
d879eb5a
SV
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,
031d63dd 477 .base = { 0x24000, 0x26000 },
d879eb5a
SV
478 .caps = MDP_PIPE_CAP_HFLIP |
479 MDP_PIPE_CAP_VFLIP |
480 MDP_PIPE_CAP_SW_PIX_EXT |
481 0,
482 },
5798c8e0
AT
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
d879eb5a
SV
493 .lm = {
494 .count = 6,
031d63dd 495 .base = { 0x44000, 0x45000, 0x46000, 0x47000, 0x48000, 0x49000 },
384dbd8c
AT
496 .instances = {
497 { .id = 0, .pp = 0, .dspp = 0,
621da7d9
AT
498 .caps = MDP_LM_CAP_DISPLAY |
499 MDP_LM_CAP_PAIR, },
384dbd8c
AT
500 { .id = 1, .pp = 1, .dspp = 1,
501 .caps = MDP_LM_CAP_DISPLAY, },
502 { .id = 2, .pp = 2, .dspp = -1,
621da7d9
AT
503 .caps = MDP_LM_CAP_DISPLAY |
504 MDP_LM_CAP_PAIR, },
384dbd8c
AT
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 },
d879eb5a
SV
512 .nb_stages = 8,
513 .max_width = 2560,
514 .max_height = 0xFFFF,
515 },
516 .dspp = {
517 .count = 2,
031d63dd 518 .base = { 0x54000, 0x56000 },
d879eb5a
SV
519 },
520 .ad = {
521 .count = 3,
031d63dd 522 .base = { 0x78000, 0x78800, 0x79000 },
d879eb5a
SV
523 },
524 .pp = {
525 .count = 4,
031d63dd 526 .base = { 0x70000, 0x70800, 0x71000, 0x71800 },
d879eb5a
SV
527 },
528 .cdm = {
529 .count = 1,
031d63dd 530 .base = { 0x79200 },
d879eb5a
SV
531 },
532 .dsc = {
533 .count = 2,
031d63dd 534 .base = { 0x80000, 0x80400 },
d879eb5a
SV
535 },
536 .intf = {
031d63dd 537 .base = { 0x6a000, 0x6a800, 0x6b000, 0x6b800, 0x6c000 },
d879eb5a
SV
538 .connect = {
539 [0] = INTF_DISABLED,
540 [1] = INTF_DSI,
541 [2] = INTF_DSI,
542 [3] = INTF_HDMI,
543 },
544 },
545 .max_clk = 412500000,
3a84f846
SV
546};
547
a5cd7b55
JM
548const struct mdp5_cfg_hw msm8917_config = {
549 .name = "msm8917",
550 .mdp = {
551 .count = 1,
552 .caps = MDP_CAP_CDM,
553 },
554 .ctl = {
555 .count = 3,
556 .base = { 0x01000, 0x01200, 0x01400 },
557 .flush_hw_mask = 0xffffffff,
558 },
559 .pipe_vig = {
560 .count = 1,
561 .base = { 0x04000 },
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 = 2,
572 .base = { 0x14000, 0x16000 },
573 .caps = MDP_PIPE_CAP_HFLIP |
574 MDP_PIPE_CAP_VFLIP |
575 MDP_PIPE_CAP_DECIMATION |
576 MDP_PIPE_CAP_SW_PIX_EXT |
577 0,
578 },
579 .pipe_dma = {
580 .count = 1,
581 .base = { 0x24000 },
582 .caps = MDP_PIPE_CAP_HFLIP |
583 MDP_PIPE_CAP_VFLIP |
584 MDP_PIPE_CAP_SW_PIX_EXT |
585 0,
586 },
587 .pipe_cursor = {
588 .count = 1,
589 .base = { 0x34000 },
590 .caps = MDP_PIPE_CAP_HFLIP |
591 MDP_PIPE_CAP_VFLIP |
592 MDP_PIPE_CAP_SW_PIX_EXT |
593 MDP_PIPE_CAP_CURSOR |
594 0,
595 },
596
597 .lm = {
598 .count = 2,
599 .base = { 0x44000, 0x45000 },
600 .instances = {
601 { .id = 0, .pp = 0, .dspp = 0,
602 .caps = MDP_LM_CAP_DISPLAY, },
603 { .id = 1, .pp = -1, .dspp = -1,
604 .caps = MDP_LM_CAP_WB },
605 },
606 .nb_stages = 8,
607 .max_width = 2048,
608 .max_height = 0xFFFF,
609 },
610 .dspp = {
611 .count = 1,
612 .base = { 0x54000 },
613
614 },
615 .pp = {
616 .count = 1,
617 .base = { 0x70000 },
618 },
619 .cdm = {
620 .count = 1,
621 .base = { 0x79200 },
622 },
623 .intf = {
624 .base = { 0x6a000, 0x6a800 },
625 .connect = {
626 [0] = INTF_DISABLED,
627 [1] = INTF_DSI,
628 },
629 },
630 .max_clk = 320000000,
631};
632
2e362e17 633static const struct mdp5_cfg_handler cfg_handlers[] = {
8a94b0aa 634 { .revision = 0, .config = { .hw = &msm8x74v1_config } },
635 { .revision = 2, .config = { .hw = &msm8x74v2_config } },
2e362e17 636 { .revision = 3, .config = { .hw = &apq8084_config } },
02dfd9d2 637 { .revision = 6, .config = { .hw = &msm8x16_config } },
3a84f846 638 { .revision = 9, .config = { .hw = &msm8x94_config } },
d879eb5a 639 { .revision = 7, .config = { .hw = &msm8x96_config } },
a5cd7b55 640 { .revision = 15, .config = { .hw = &msm8917_config } },
2e362e17
SV
641};
642
2e362e17
SV
643static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev);
644
42238da8 645const struct mdp5_cfg_hw *mdp5_cfg_get_hw_config(struct mdp5_cfg_handler *cfg_handler)
2e362e17 646{
2e362e17
SV
647 return cfg_handler->config.hw;
648}
649
42238da8 650struct mdp5_cfg *mdp5_cfg_get_config(struct mdp5_cfg_handler *cfg_handler)
2e362e17 651{
2e362e17
SV
652 return &cfg_handler->config;
653}
654
42238da8 655int mdp5_cfg_get_hw_rev(struct mdp5_cfg_handler *cfg_handler)
2e362e17 656{
2e362e17
SV
657 return cfg_handler->revision;
658}
659
42238da8 660void mdp5_cfg_destroy(struct mdp5_cfg_handler *cfg_handler)
2e362e17 661{
2e362e17
SV
662 kfree(cfg_handler);
663}
664
42238da8 665struct mdp5_cfg_handler *mdp5_cfg_init(struct mdp5_kms *mdp5_kms,
2e362e17
SV
666 uint32_t major, uint32_t minor)
667{
668 struct drm_device *dev = mdp5_kms->dev;
76adb460 669 struct platform_device *pdev = to_platform_device(dev->dev);
2e362e17
SV
670 struct mdp5_cfg_handler *cfg_handler;
671 struct mdp5_cfg_platform *pconfig;
672 int i, ret = 0;
673
674 cfg_handler = kzalloc(sizeof(*cfg_handler), GFP_KERNEL);
675 if (unlikely(!cfg_handler)) {
676 ret = -ENOMEM;
677 goto fail;
678 }
679
680 if (major != 1) {
6a41da17 681 DRM_DEV_ERROR(dev->dev, "unexpected MDP major version: v%d.%d\n",
2e362e17
SV
682 major, minor);
683 ret = -ENXIO;
684 goto fail;
685 }
686
687 /* only after mdp5_cfg global pointer's init can we access the hw */
688 for (i = 0; i < ARRAY_SIZE(cfg_handlers); i++) {
689 if (cfg_handlers[i].revision != minor)
690 continue;
691 mdp5_cfg = cfg_handlers[i].config.hw;
692
693 break;
694 }
695 if (unlikely(!mdp5_cfg)) {
6a41da17 696 DRM_DEV_ERROR(dev->dev, "unexpected MDP minor revision: v%d.%d\n",
2e362e17
SV
697 major, minor);
698 ret = -ENXIO;
699 goto fail;
700 }
701
702 cfg_handler->revision = minor;
703 cfg_handler->config.hw = mdp5_cfg;
704
705 pconfig = mdp5_get_config(pdev);
706 memcpy(&cfg_handler->config.platform, pconfig, sizeof(*pconfig));
707
708 DBG("MDP5: %s hw config selected", mdp5_cfg->name);
709
710 return cfg_handler;
711
712fail:
713 if (cfg_handler)
714 mdp5_cfg_destroy(cfg_handler);
715
716 return NULL;
717}
718
719static struct mdp5_cfg_platform *mdp5_get_config(struct platform_device *dev)
720{
721 static struct mdp5_cfg_platform config = {};
d50c192a 722
2e362e17 723 config.iommu = iommu_domain_alloc(&platform_bus_type);
667ce33e
RC
724 if (config.iommu) {
725 config.iommu->geometry.aperture_start = 0x1000;
726 config.iommu->geometry.aperture_end = 0xffffffff;
727 }
2e362e17
SV
728
729 return &config;
730}