1// SPDX-License-Identifier: GPL-2.0-only
2/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-2023, Qualcomm Innovation Center, Inc. All rights reserved.
4 */
5
6#define pr_fmt(fmt)	"[drm:%s:%d] " fmt, __func__, __LINE__
7#include <linux/slab.h>
8#include <linux/of_address.h>
9#include <linux/platform_device.h>
10#include "dpu_hw_mdss.h"
11#include "dpu_hw_interrupts.h"
12#include "dpu_hw_catalog.h"
13#include "dpu_kms.h"
14
15#define VIG_BASE_MASK \
16	(BIT(DPU_SSPP_QOS) |\
17	BIT(DPU_SSPP_CDP) |\
18	BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_EXCL_RECT))
19
20#define VIG_MASK \
21	(VIG_BASE_MASK | \
22	BIT(DPU_SSPP_CSC_10BIT))
23
24#define VIG_MSM8998_MASK \
25	(VIG_MASK | BIT(DPU_SSPP_SCALER_QSEED3_COMPATIBLE))
26
27#define VIG_SDM845_MASK \
28	(VIG_MASK | BIT(DPU_SSPP_QOS_8LVL) | BIT(DPU_SSPP_SCALER_QSEED3_COMPATIBLE))
29
30#define VIG_SDM845_MASK_SDMA \
31	(VIG_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2))
32
33#define VIG_QCM2290_MASK (VIG_BASE_MASK | BIT(DPU_SSPP_QOS_8LVL))
34
35#define DMA_MSM8998_MASK \
36	(BIT(DPU_SSPP_QOS) |\
37	BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_TS_PREFILL_REC1) |\
38	BIT(DPU_SSPP_CDP) | BIT(DPU_SSPP_EXCL_RECT))
39
40#define VIG_SC7280_MASK \
41	(VIG_SDM845_MASK | BIT(DPU_SSPP_INLINE_ROTATION))
42
43#define VIG_SC7280_MASK_SDMA \
44	(VIG_SC7280_MASK | BIT(DPU_SSPP_SMART_DMA_V2))
45
46#define DMA_SDM845_MASK \
47	(BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_QOS_8LVL) |\
48	BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_TS_PREFILL_REC1) |\
49	BIT(DPU_SSPP_CDP) | BIT(DPU_SSPP_EXCL_RECT))
50
51#define DMA_CURSOR_SDM845_MASK \
52	(DMA_SDM845_MASK | BIT(DPU_SSPP_CURSOR))
53
54#define DMA_SDM845_MASK_SDMA \
55	(DMA_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2))
56
57#define DMA_CURSOR_SDM845_MASK_SDMA \
58	(DMA_CURSOR_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2))
59
60#define DMA_CURSOR_MSM8998_MASK \
61	(DMA_MSM8998_MASK | BIT(DPU_SSPP_CURSOR))
62
63#define MIXER_MSM8998_MASK \
64	(BIT(DPU_MIXER_SOURCESPLIT))
65
66#define MIXER_SDM845_MASK \
67	(BIT(DPU_MIXER_SOURCESPLIT) | BIT(DPU_DIM_LAYER) | BIT(DPU_MIXER_COMBINED_ALPHA))
68
69#define MIXER_QCM2290_MASK \
70	(BIT(DPU_DIM_LAYER) | BIT(DPU_MIXER_COMBINED_ALPHA))
71
72#define PINGPONG_SDM845_MASK \
73	(BIT(DPU_PINGPONG_DITHER) | BIT(DPU_PINGPONG_DSC))
74
75#define PINGPONG_SDM845_TE2_MASK \
76	(PINGPONG_SDM845_MASK | BIT(DPU_PINGPONG_TE2))
77
78#define PINGPONG_SM8150_MASK \
79	(BIT(DPU_PINGPONG_DITHER) | BIT(DPU_PINGPONG_DSC))
80
81#define CTL_SC7280_MASK \
82	(BIT(DPU_CTL_ACTIVE_CFG) | \
83	 BIT(DPU_CTL_FETCH_ACTIVE) | \
84	 BIT(DPU_CTL_VM_CFG) | \
85	 BIT(DPU_CTL_DSPP_SUB_BLOCK_FLUSH))
86
87#define CTL_SM8550_MASK \
88	(CTL_SC7280_MASK | BIT(DPU_CTL_HAS_LAYER_EXT4))
89
90#define DSPP_SC7180_MASK BIT(DPU_DSPP_PCC)
91
92#define INTF_SC7180_MASK \
93	(BIT(DPU_INTF_INPUT_CTRL) | \
94	 BIT(DPU_INTF_STATUS_SUPPORTED) | \
95	 BIT(DPU_DATA_HCTL_EN))
96
97#define INTF_SC7280_MASK (INTF_SC7180_MASK)
98
99#define WB_SM8250_MASK (BIT(DPU_WB_LINE_MODE) | \
100			 BIT(DPU_WB_UBWC) | \
101			 BIT(DPU_WB_YUV_CONFIG) | \
102			 BIT(DPU_WB_PIPE_ALPHA) | \
103			 BIT(DPU_WB_XY_ROI_OFFSET) | \
104			 BIT(DPU_WB_QOS) | \
105			 BIT(DPU_WB_QOS_8LVL) | \
106			 BIT(DPU_WB_CDP) | \
107			 BIT(DPU_WB_INPUT_CTRL))
108
109#define DEFAULT_PIXEL_RAM_SIZE		(50 * 1024)
110#define DEFAULT_DPU_LINE_WIDTH		2048
111#define DEFAULT_DPU_OUTPUT_LINE_WIDTH	2560
112
113#define MAX_HORZ_DECIMATION	4
114#define MAX_VERT_DECIMATION	4
115
116#define MAX_UPSCALE_RATIO	20
117#define MAX_DOWNSCALE_RATIO	4
118#define SSPP_UNITY_SCALE	1
119
120#define STRCAT(X, Y) (X Y)
121
122static const uint32_t plane_formats[] = {
123	DRM_FORMAT_ARGB8888,
124	DRM_FORMAT_ABGR8888,
125	DRM_FORMAT_RGBA8888,
126	DRM_FORMAT_BGRA8888,
127	DRM_FORMAT_XRGB8888,
128	DRM_FORMAT_RGBX8888,
129	DRM_FORMAT_BGRX8888,
130	DRM_FORMAT_XBGR8888,
131	DRM_FORMAT_ARGB2101010,
132	DRM_FORMAT_XRGB2101010,
133	DRM_FORMAT_RGB888,
134	DRM_FORMAT_BGR888,
135	DRM_FORMAT_RGB565,
136	DRM_FORMAT_BGR565,
137	DRM_FORMAT_ARGB1555,
138	DRM_FORMAT_ABGR1555,
139	DRM_FORMAT_RGBA5551,
140	DRM_FORMAT_BGRA5551,
141	DRM_FORMAT_XRGB1555,
142	DRM_FORMAT_XBGR1555,
143	DRM_FORMAT_RGBX5551,
144	DRM_FORMAT_BGRX5551,
145	DRM_FORMAT_ARGB4444,
146	DRM_FORMAT_ABGR4444,
147	DRM_FORMAT_RGBA4444,
148	DRM_FORMAT_BGRA4444,
149	DRM_FORMAT_XRGB4444,
150	DRM_FORMAT_XBGR4444,
151	DRM_FORMAT_RGBX4444,
152	DRM_FORMAT_BGRX4444,
153};
154
155static const uint32_t plane_formats_yuv[] = {
156	DRM_FORMAT_ARGB8888,
157	DRM_FORMAT_ABGR8888,
158	DRM_FORMAT_RGBA8888,
159	DRM_FORMAT_BGRX8888,
160	DRM_FORMAT_BGRA8888,
161	DRM_FORMAT_ARGB2101010,
162	DRM_FORMAT_XRGB2101010,
163	DRM_FORMAT_XRGB8888,
164	DRM_FORMAT_XBGR8888,
165	DRM_FORMAT_RGBX8888,
166	DRM_FORMAT_RGB888,
167	DRM_FORMAT_BGR888,
168	DRM_FORMAT_RGB565,
169	DRM_FORMAT_BGR565,
170	DRM_FORMAT_ARGB1555,
171	DRM_FORMAT_ABGR1555,
172	DRM_FORMAT_RGBA5551,
173	DRM_FORMAT_BGRA5551,
174	DRM_FORMAT_XRGB1555,
175	DRM_FORMAT_XBGR1555,
176	DRM_FORMAT_RGBX5551,
177	DRM_FORMAT_BGRX5551,
178	DRM_FORMAT_ARGB4444,
179	DRM_FORMAT_ABGR4444,
180	DRM_FORMAT_RGBA4444,
181	DRM_FORMAT_BGRA4444,
182	DRM_FORMAT_XRGB4444,
183	DRM_FORMAT_XBGR4444,
184	DRM_FORMAT_RGBX4444,
185	DRM_FORMAT_BGRX4444,
186
187	DRM_FORMAT_P010,
188	DRM_FORMAT_NV12,
189	DRM_FORMAT_NV21,
190	DRM_FORMAT_NV16,
191	DRM_FORMAT_NV61,
192	DRM_FORMAT_VYUY,
193	DRM_FORMAT_UYVY,
194	DRM_FORMAT_YUYV,
195	DRM_FORMAT_YVYU,
196	DRM_FORMAT_YUV420,
197	DRM_FORMAT_YVU420,
198};
199
200static const u32 rotation_v2_formats[] = {
201	DRM_FORMAT_NV12,
202	/* TODO add formats after validation */
203};
204
205static const u32 wb2_formats_rgb[] = {
206	DRM_FORMAT_RGB565,
207	DRM_FORMAT_BGR565,
208	DRM_FORMAT_RGB888,
209	DRM_FORMAT_ARGB8888,
210	DRM_FORMAT_RGBA8888,
211	DRM_FORMAT_ABGR8888,
212	DRM_FORMAT_XRGB8888,
213	DRM_FORMAT_RGBX8888,
214	DRM_FORMAT_XBGR8888,
215	DRM_FORMAT_ARGB1555,
216	DRM_FORMAT_RGBA5551,
217	DRM_FORMAT_XRGB1555,
218	DRM_FORMAT_RGBX5551,
219	DRM_FORMAT_ARGB4444,
220	DRM_FORMAT_RGBA4444,
221	DRM_FORMAT_RGBX4444,
222	DRM_FORMAT_XRGB4444,
223	DRM_FORMAT_BGR565,
224	DRM_FORMAT_BGR888,
225	DRM_FORMAT_ABGR8888,
226	DRM_FORMAT_BGRA8888,
227	DRM_FORMAT_BGRX8888,
228	DRM_FORMAT_XBGR8888,
229	DRM_FORMAT_ABGR1555,
230	DRM_FORMAT_BGRA5551,
231	DRM_FORMAT_XBGR1555,
232	DRM_FORMAT_BGRX5551,
233	DRM_FORMAT_ABGR4444,
234	DRM_FORMAT_BGRA4444,
235	DRM_FORMAT_BGRX4444,
236	DRM_FORMAT_XBGR4444,
237};
238
239static const u32 wb2_formats_rgb_yuv[] = {
240	DRM_FORMAT_RGB565,
241	DRM_FORMAT_BGR565,
242	DRM_FORMAT_RGB888,
243	DRM_FORMAT_ARGB8888,
244	DRM_FORMAT_RGBA8888,
245	DRM_FORMAT_ABGR8888,
246	DRM_FORMAT_XRGB8888,
247	DRM_FORMAT_RGBX8888,
248	DRM_FORMAT_XBGR8888,
249	DRM_FORMAT_ARGB1555,
250	DRM_FORMAT_RGBA5551,
251	DRM_FORMAT_XRGB1555,
252	DRM_FORMAT_RGBX5551,
253	DRM_FORMAT_ARGB4444,
254	DRM_FORMAT_RGBA4444,
255	DRM_FORMAT_RGBX4444,
256	DRM_FORMAT_XRGB4444,
257	DRM_FORMAT_BGR565,
258	DRM_FORMAT_BGR888,
259	DRM_FORMAT_ABGR8888,
260	DRM_FORMAT_BGRA8888,
261	DRM_FORMAT_BGRX8888,
262	DRM_FORMAT_XBGR8888,
263	DRM_FORMAT_ABGR1555,
264	DRM_FORMAT_BGRA5551,
265	DRM_FORMAT_XBGR1555,
266	DRM_FORMAT_BGRX5551,
267	DRM_FORMAT_ABGR4444,
268	DRM_FORMAT_BGRA4444,
269	DRM_FORMAT_BGRX4444,
270	DRM_FORMAT_XBGR4444,
271	DRM_FORMAT_NV12,
272};
273
274/*************************************************************
275 * SSPP sub blocks config
276 *************************************************************/
277
278#define SSPP_SCALER_VER(maj, min) (((maj) << 16) | (min))
279
280/* SSPP common configuration */
281#define _VIG_SBLK(scaler_ver) \
282	{ \
283	.maxdwnscale = MAX_DOWNSCALE_RATIO, \
284	.maxupscale = MAX_UPSCALE_RATIO, \
285	.scaler_blk = {.name = "scaler", \
286		.version = scaler_ver, \
287		.base = 0xa00, .len = 0xa0,}, \
288	.csc_blk = {.name = "csc", \
289		.base = 0x1a00, .len = 0x100,}, \
290	.format_list = plane_formats_yuv, \
291	.num_formats = ARRAY_SIZE(plane_formats_yuv), \
292	.virt_format_list = plane_formats, \
293	.virt_num_formats = ARRAY_SIZE(plane_formats), \
294	.rotation_cfg = NULL, \
295	}
296
297#define _VIG_SBLK_ROT(scaler_ver, rot_cfg) \
298	{ \
299	.maxdwnscale = MAX_DOWNSCALE_RATIO, \
300	.maxupscale = MAX_UPSCALE_RATIO, \
301	.scaler_blk = {.name = "scaler", \
302		.version = scaler_ver, \
303		.base = 0xa00, .len = 0xa0,}, \
304	.csc_blk = {.name = "csc", \
305		.base = 0x1a00, .len = 0x100,}, \
306	.format_list = plane_formats_yuv, \
307	.num_formats = ARRAY_SIZE(plane_formats_yuv), \
308	.virt_format_list = plane_formats, \
309	.virt_num_formats = ARRAY_SIZE(plane_formats), \
310	.rotation_cfg = rot_cfg, \
311	}
312
313#define _VIG_SBLK_NOSCALE() \
314	{ \
315	.maxdwnscale = SSPP_UNITY_SCALE, \
316	.maxupscale = SSPP_UNITY_SCALE, \
317	.format_list = plane_formats_yuv, \
318	.num_formats = ARRAY_SIZE(plane_formats_yuv), \
319	.virt_format_list = plane_formats, \
320	.virt_num_formats = ARRAY_SIZE(plane_formats), \
321	}
322
323#define _DMA_SBLK() \
324	{ \
325	.maxdwnscale = SSPP_UNITY_SCALE, \
326	.maxupscale = SSPP_UNITY_SCALE, \
327	.format_list = plane_formats, \
328	.num_formats = ARRAY_SIZE(plane_formats), \
329	.virt_format_list = plane_formats, \
330	.virt_num_formats = ARRAY_SIZE(plane_formats), \
331	}
332
333static const struct dpu_rotation_cfg dpu_rot_sc7280_cfg_v2 = {
334	.rot_maxheight = 1088,
335	.rot_num_formats = ARRAY_SIZE(rotation_v2_formats),
336	.rot_format_list = rotation_v2_formats,
337};
338
339static const struct dpu_sspp_sub_blks dpu_vig_sblk_noscale =
340				_VIG_SBLK_NOSCALE();
341
342static const struct dpu_sspp_sub_blks dpu_vig_sblk_qseed3_1_2 =
343				_VIG_SBLK(SSPP_SCALER_VER(1, 2));
344
345static const struct dpu_sspp_sub_blks dpu_vig_sblk_qseed3_1_3 =
346				_VIG_SBLK(SSPP_SCALER_VER(1, 3));
347
348static const struct dpu_sspp_sub_blks dpu_vig_sblk_qseed3_1_4 =
349				_VIG_SBLK(SSPP_SCALER_VER(1, 4));
350
351static const struct dpu_sspp_sub_blks dpu_vig_sblk_qseed3_2_4 =
352				_VIG_SBLK(SSPP_SCALER_VER(2, 4));
353
354static const struct dpu_sspp_sub_blks dpu_vig_sblk_qseed3_3_0 =
355				_VIG_SBLK(SSPP_SCALER_VER(3, 0));
356
357static const struct dpu_sspp_sub_blks dpu_vig_sblk_qseed3_3_0_rot_v2 =
358			_VIG_SBLK_ROT(SSPP_SCALER_VER(3, 0),
359				      &dpu_rot_sc7280_cfg_v2);
360
361static const struct dpu_sspp_sub_blks dpu_vig_sblk_qseed3_3_1 =
362				_VIG_SBLK(SSPP_SCALER_VER(3, 1));
363
364static const struct dpu_sspp_sub_blks dpu_vig_sblk_qseed3_3_2 =
365				_VIG_SBLK(SSPP_SCALER_VER(3, 2));
366
367static const struct dpu_sspp_sub_blks dpu_vig_sblk_qseed3_3_3 =
368				_VIG_SBLK(SSPP_SCALER_VER(3, 3));
369
370static const struct dpu_sspp_sub_blks dpu_dma_sblk = _DMA_SBLK();
371
372/*************************************************************
373 * MIXER sub blocks config
374 *************************************************************/
375
376/* MSM8998 */
377
378static const struct dpu_lm_sub_blks msm8998_lm_sblk = {
379	.maxwidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
380	.maxblendstages = 7, /* excluding base layer */
381	.blendstage_base = { /* offsets relative to mixer base */
382		0x20, 0x50, 0x80, 0xb0, 0x230,
383		0x260, 0x290
384	},
385};
386
387/* SDM845 */
388
389static const struct dpu_lm_sub_blks sdm845_lm_sblk = {
390	.maxwidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
391	.maxblendstages = 11, /* excluding base layer */
392	.blendstage_base = { /* offsets relative to mixer base */
393		0x20, 0x38, 0x50, 0x68, 0x80, 0x98,
394		0xb0, 0xc8, 0xe0, 0xf8, 0x110
395	},
396};
397
398/* SC7180 */
399
400static const struct dpu_lm_sub_blks sc7180_lm_sblk = {
401	.maxwidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
402	.maxblendstages = 7, /* excluding base layer */
403	.blendstage_base = { /* offsets relative to mixer base */
404		0x20, 0x38, 0x50, 0x68, 0x80, 0x98, 0xb0
405	},
406};
407
408/* QCM2290 */
409
410static const struct dpu_lm_sub_blks qcm2290_lm_sblk = {
411	.maxwidth = DEFAULT_DPU_LINE_WIDTH,
412	.maxblendstages = 4, /* excluding base layer */
413	.blendstage_base = { /* offsets relative to mixer base */
414		0x20, 0x38, 0x50, 0x68
415	},
416};
417
418/*************************************************************
419 * DSPP sub blocks config
420 *************************************************************/
421static const struct dpu_dspp_sub_blks msm8998_dspp_sblk = {
422	.pcc = {.name = "pcc", .base = 0x1700,
423		.len = 0x90, .version = 0x10007},
424};
425
426static const struct dpu_dspp_sub_blks sdm845_dspp_sblk = {
427	.pcc = {.name = "pcc", .base = 0x1700,
428		.len = 0x90, .version = 0x40000},
429};
430
431/*************************************************************
432 * PINGPONG sub blocks config
433 *************************************************************/
434static const struct dpu_pingpong_sub_blks sdm845_pp_sblk_te = {
435	.te2 = {.name = "te2", .base = 0x2000, .len = 0x0,
436		.version = 0x1},
437	.dither = {.name = "dither", .base = 0x30e0,
438		.len = 0x20, .version = 0x10000},
439};
440
441static const struct dpu_pingpong_sub_blks sdm845_pp_sblk = {
442	.dither = {.name = "dither", .base = 0x30e0,
443		.len = 0x20, .version = 0x10000},
444};
445
446static const struct dpu_pingpong_sub_blks sc7280_pp_sblk = {
447	.dither = {.name = "dither", .base = 0xe0,
448	.len = 0x20, .version = 0x20000},
449};
450
451/*************************************************************
452 * DSC sub blocks config
453 *************************************************************/
454static const struct dpu_dsc_sub_blks dsc_sblk_0 = {
455	.enc = {.name = "enc", .base = 0x100, .len = 0x9c},
456	.ctl = {.name = "ctl", .base = 0xF00, .len = 0x10},
457};
458
459static const struct dpu_dsc_sub_blks dsc_sblk_1 = {
460	.enc = {.name = "enc", .base = 0x200, .len = 0x9c},
461	.ctl = {.name = "ctl", .base = 0xF80, .len = 0x10},
462};
463
464/*************************************************************
465 * CDM block config
466 *************************************************************/
467static const struct dpu_cdm_cfg sc7280_cdm = {
468	.name = "cdm_0",
469	.id = CDM_0,
470	.len = 0x228,
471	.base = 0x79200,
472};
473
474/*************************************************************
475 * VBIF sub blocks config
476 *************************************************************/
477/* VBIF QOS remap */
478static const u32 msm8998_rt_pri_lvl[] = {1, 2, 2, 2};
479static const u32 msm8998_nrt_pri_lvl[] = {1, 1, 1, 1};
480static const u32 sdm845_rt_pri_lvl[] = {3, 3, 4, 4, 5, 5, 6, 6};
481static const u32 sdm845_nrt_pri_lvl[] = {3, 3, 3, 3, 3, 3, 3, 3};
482static const u32 sm8650_rt_pri_lvl[] = {4, 4, 5, 5, 5, 5, 5, 6};
483
484static const struct dpu_vbif_dynamic_ot_cfg msm8998_ot_rdwr_cfg[] = {
485	{
486		.pps = 1920 * 1080 * 30,
487		.ot_limit = 2,
488	},
489	{
490		.pps = 1920 * 1080 * 60,
491		.ot_limit = 4,
492	},
493	{
494		.pps = 3840 * 2160 * 30,
495		.ot_limit = 16,
496	},
497};
498
499static const struct dpu_vbif_cfg msm8998_vbif[] = {
500	{
501	.name = "vbif_rt", .id = VBIF_RT,
502	.base = 0, .len = 0x1040,
503	.default_ot_rd_limit = 32,
504	.default_ot_wr_limit = 32,
505	.features = BIT(DPU_VBIF_QOS_REMAP) | BIT(DPU_VBIF_QOS_OTLIM),
506	.xin_halt_timeout = 0x4000,
507	.qos_rp_remap_size = 0x20,
508	.dynamic_ot_rd_tbl = {
509		.count = ARRAY_SIZE(msm8998_ot_rdwr_cfg),
510		.cfg = msm8998_ot_rdwr_cfg,
511		},
512	.dynamic_ot_wr_tbl = {
513		.count = ARRAY_SIZE(msm8998_ot_rdwr_cfg),
514		.cfg = msm8998_ot_rdwr_cfg,
515		},
516	.qos_rt_tbl = {
517		.npriority_lvl = ARRAY_SIZE(msm8998_rt_pri_lvl),
518		.priority_lvl = msm8998_rt_pri_lvl,
519		},
520	.qos_nrt_tbl = {
521		.npriority_lvl = ARRAY_SIZE(msm8998_nrt_pri_lvl),
522		.priority_lvl = msm8998_nrt_pri_lvl,
523		},
524	.memtype_count = 14,
525	.memtype = {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
526	},
527};
528
529static const struct dpu_vbif_cfg sdm845_vbif[] = {
530	{
531	.name = "vbif_rt", .id = VBIF_RT,
532	.base = 0, .len = 0x1040,
533	.features = BIT(DPU_VBIF_QOS_REMAP),
534	.xin_halt_timeout = 0x4000,
535	.qos_rp_remap_size = 0x40,
536	.qos_rt_tbl = {
537		.npriority_lvl = ARRAY_SIZE(sdm845_rt_pri_lvl),
538		.priority_lvl = sdm845_rt_pri_lvl,
539		},
540	.qos_nrt_tbl = {
541		.npriority_lvl = ARRAY_SIZE(sdm845_nrt_pri_lvl),
542		.priority_lvl = sdm845_nrt_pri_lvl,
543		},
544	.memtype_count = 14,
545	.memtype = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
546	},
547};
548
549static const struct dpu_vbif_cfg sm8550_vbif[] = {
550	{
551	.name = "vbif_rt", .id = VBIF_RT,
552	.base = 0, .len = 0x1040,
553	.features = BIT(DPU_VBIF_QOS_REMAP),
554	.xin_halt_timeout = 0x4000,
555	.qos_rp_remap_size = 0x40,
556	.qos_rt_tbl = {
557		.npriority_lvl = ARRAY_SIZE(sdm845_rt_pri_lvl),
558		.priority_lvl = sdm845_rt_pri_lvl,
559		},
560	.qos_nrt_tbl = {
561		.npriority_lvl = ARRAY_SIZE(sdm845_nrt_pri_lvl),
562		.priority_lvl = sdm845_nrt_pri_lvl,
563		},
564	.memtype_count = 16,
565	.memtype = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
566	},
567};
568
569static const struct dpu_vbif_cfg sm8650_vbif[] = {
570	{
571	.name = "vbif_rt", .id = VBIF_RT,
572	.base = 0, .len = 0x1074,
573	.features = BIT(DPU_VBIF_QOS_REMAP),
574	.xin_halt_timeout = 0x4000,
575	.qos_rp_remap_size = 0x40,
576	.qos_rt_tbl = {
577		.npriority_lvl = ARRAY_SIZE(sm8650_rt_pri_lvl),
578		.priority_lvl = sm8650_rt_pri_lvl,
579		},
580	.qos_nrt_tbl = {
581		.npriority_lvl = ARRAY_SIZE(sdm845_nrt_pri_lvl),
582		.priority_lvl = sdm845_nrt_pri_lvl,
583		},
584	.memtype_count = 16,
585	.memtype = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
586	},
587};
588
589/*************************************************************
590 * PERF data config
591 *************************************************************/
592
593/* SSPP QOS LUTs */
594static const struct dpu_qos_lut_entry msm8998_qos_linear[] = {
595	{.fl = 4,  .lut = 0x1b},
596	{.fl = 5,  .lut = 0x5b},
597	{.fl = 6,  .lut = 0x15b},
598	{.fl = 7,  .lut = 0x55b},
599	{.fl = 8,  .lut = 0x155b},
600	{.fl = 9,  .lut = 0x555b},
601	{.fl = 10, .lut = 0x1555b},
602	{.fl = 11, .lut = 0x5555b},
603	{.fl = 12, .lut = 0x15555b},
604	{.fl = 0,  .lut = 0x55555b}
605};
606
607static const struct dpu_qos_lut_entry sdm845_qos_linear[] = {
608	{.fl = 4, .lut = 0x357},
609	{.fl = 5, .lut = 0x3357},
610	{.fl = 6, .lut = 0x23357},
611	{.fl = 7, .lut = 0x223357},
612	{.fl = 8, .lut = 0x2223357},
613	{.fl = 9, .lut = 0x22223357},
614	{.fl = 10, .lut = 0x222223357},
615	{.fl = 11, .lut = 0x2222223357},
616	{.fl = 12, .lut = 0x22222223357},
617	{.fl = 13, .lut = 0x222222223357},
618	{.fl = 14, .lut = 0x1222222223357},
619	{.fl = 0, .lut = 0x11222222223357}
620};
621
622static const struct dpu_qos_lut_entry msm8998_qos_macrotile[] = {
623	{.fl = 10, .lut = 0x1aaff},
624	{.fl = 11, .lut = 0x5aaff},
625	{.fl = 12, .lut = 0x15aaff},
626	{.fl = 0,  .lut = 0x55aaff},
627};
628
629static const struct dpu_qos_lut_entry sc7180_qos_linear[] = {
630	{.fl = 0, .lut = 0x0011222222335777},
631};
632
633static const struct dpu_qos_lut_entry sm6350_qos_linear_macrotile[] = {
634	{.fl = 0, .lut = 0x0011223445566777 },
635};
636
637static const struct dpu_qos_lut_entry sm8150_qos_linear[] = {
638	{.fl = 0, .lut = 0x0011222222223357 },
639};
640
641static const struct dpu_qos_lut_entry sc8180x_qos_linear[] = {
642	{.fl = 4, .lut = 0x0000000000000357 },
643};
644
645static const struct dpu_qos_lut_entry qcm2290_qos_linear[] = {
646	{.fl = 0, .lut = 0x0011222222335777},
647};
648
649static const struct dpu_qos_lut_entry sdm845_qos_macrotile[] = {
650	{.fl = 10, .lut = 0x344556677},
651	{.fl = 11, .lut = 0x3344556677},
652	{.fl = 12, .lut = 0x23344556677},
653	{.fl = 13, .lut = 0x223344556677},
654	{.fl = 14, .lut = 0x1223344556677},
655	{.fl = 0, .lut = 0x112233344556677},
656};
657
658static const struct dpu_qos_lut_entry sc7180_qos_macrotile[] = {
659	{.fl = 0, .lut = 0x0011223344556677},
660};
661
662static const struct dpu_qos_lut_entry sc8180x_qos_macrotile[] = {
663	{.fl = 10, .lut = 0x0000000344556677},
664};
665
666static const struct dpu_qos_lut_entry msm8998_qos_nrt[] = {
667	{.fl = 0, .lut = 0x0},
668};
669
670static const struct dpu_qos_lut_entry sdm845_qos_nrt[] = {
671	{.fl = 0, .lut = 0x0},
672};
673
674static const struct dpu_qos_lut_entry sc7180_qos_nrt[] = {
675	{.fl = 0, .lut = 0x0},
676};
677
678/*************************************************************
679 * Hardware catalog
680 *************************************************************/
681
682#include "catalog/dpu_3_0_msm8998.h"
683#include "catalog/dpu_3_2_sdm660.h"
684#include "catalog/dpu_3_3_sdm630.h"
685
686#include "catalog/dpu_4_0_sdm845.h"
687#include "catalog/dpu_4_1_sdm670.h"
688
689#include "catalog/dpu_5_0_sm8150.h"
690#include "catalog/dpu_5_1_sc8180x.h"
691#include "catalog/dpu_5_4_sm6125.h"
692
693#include "catalog/dpu_6_0_sm8250.h"
694#include "catalog/dpu_6_2_sc7180.h"
695#include "catalog/dpu_6_3_sm6115.h"
696#include "catalog/dpu_6_4_sm6350.h"
697#include "catalog/dpu_6_5_qcm2290.h"
698#include "catalog/dpu_6_9_sm6375.h"
699
700#include "catalog/dpu_7_0_sm8350.h"
701#include "catalog/dpu_7_2_sc7280.h"
702
703#include "catalog/dpu_8_0_sc8280xp.h"
704#include "catalog/dpu_8_1_sm8450.h"
705
706#include "catalog/dpu_9_0_sm8550.h"
707
708#include "catalog/dpu_9_2_x1e80100.h"
709
710#include "catalog/dpu_10_0_sm8650.h"
711