197fb5e8dSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
225fdd593SJeykumar Sankaran /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
325fdd593SJeykumar Sankaran  */
425fdd593SJeykumar Sankaran 
525fdd593SJeykumar Sankaran #define pr_fmt(fmt)	"[drm:%s:%d] " fmt, __func__, __LINE__
625fdd593SJeykumar Sankaran #include <linux/slab.h>
725fdd593SJeykumar Sankaran #include <linux/of_address.h>
825fdd593SJeykumar Sankaran #include <linux/platform_device.h>
925fdd593SJeykumar Sankaran #include "dpu_hw_mdss.h"
1025fdd593SJeykumar Sankaran #include "dpu_hw_catalog.h"
1125fdd593SJeykumar Sankaran #include "dpu_hw_catalog_format.h"
1225fdd593SJeykumar Sankaran #include "dpu_kms.h"
1325fdd593SJeykumar Sankaran 
147bdc0c4bSKalyan Thota #define VIG_MASK \
157bdc0c4bSKalyan Thota 	(BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_QOS) |\
1625fdd593SJeykumar Sankaran 	BIT(DPU_SSPP_CSC_10BIT) | BIT(DPU_SSPP_CDP) | BIT(DPU_SSPP_QOS_8LVL) |\
1725fdd593SJeykumar Sankaran 	BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_EXCL_RECT))
1825fdd593SJeykumar Sankaran 
197bdc0c4bSKalyan Thota #define VIG_SDM845_MASK \
207bdc0c4bSKalyan Thota 	(VIG_MASK | BIT(DPU_SSPP_SCALER_QSEED3))
217bdc0c4bSKalyan Thota 
227bdc0c4bSKalyan Thota #define VIG_SC7180_MASK \
237bdc0c4bSKalyan Thota 	(VIG_MASK | BIT(DPU_SSPP_SCALER_QSEED4))
247bdc0c4bSKalyan Thota 
2525fdd593SJeykumar Sankaran #define DMA_SDM845_MASK \
2625fdd593SJeykumar Sankaran 	(BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_QOS_8LVL) |\
2725fdd593SJeykumar Sankaran 	BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_TS_PREFILL_REC1) |\
2825fdd593SJeykumar Sankaran 	BIT(DPU_SSPP_CDP) | BIT(DPU_SSPP_EXCL_RECT))
2925fdd593SJeykumar Sankaran 
3007ca1fc0SSravanthi Kollukuduru #define DMA_CURSOR_SDM845_MASK \
3107ca1fc0SSravanthi Kollukuduru 	(DMA_SDM845_MASK | BIT(DPU_SSPP_CURSOR))
3207ca1fc0SSravanthi Kollukuduru 
3325fdd593SJeykumar Sankaran #define MIXER_SDM845_MASK \
3425fdd593SJeykumar Sankaran 	(BIT(DPU_MIXER_SOURCESPLIT) | BIT(DPU_DIM_LAYER))
3525fdd593SJeykumar Sankaran 
367bdc0c4bSKalyan Thota #define MIXER_SC7180_MASK \
377bdc0c4bSKalyan Thota 	(BIT(DPU_DIM_LAYER))
387bdc0c4bSKalyan Thota 
3925fdd593SJeykumar Sankaran #define PINGPONG_SDM845_MASK BIT(DPU_PINGPONG_DITHER)
4025fdd593SJeykumar Sankaran 
4125fdd593SJeykumar Sankaran #define PINGPONG_SDM845_SPLIT_MASK \
4225fdd593SJeykumar Sankaran 	(PINGPONG_SDM845_MASK | BIT(DPU_PINGPONG_TE2))
4325fdd593SJeykumar Sankaran 
444259ff7aSKalyan Thota #define DSPP_SC7180_MASK BIT(DPU_DSPP_PCC)
45e47616dfSKalyan Thota 
4625fdd593SJeykumar Sankaran #define DEFAULT_PIXEL_RAM_SIZE		(50 * 1024)
4725fdd593SJeykumar Sankaran #define DEFAULT_DPU_LINE_WIDTH		2048
4825fdd593SJeykumar Sankaran #define DEFAULT_DPU_OUTPUT_LINE_WIDTH	2560
4925fdd593SJeykumar Sankaran 
5025fdd593SJeykumar Sankaran #define MAX_HORZ_DECIMATION	4
5125fdd593SJeykumar Sankaran #define MAX_VERT_DECIMATION	4
5225fdd593SJeykumar Sankaran 
5325fdd593SJeykumar Sankaran #define MAX_UPSCALE_RATIO	20
5425fdd593SJeykumar Sankaran #define MAX_DOWNSCALE_RATIO	4
5525fdd593SJeykumar Sankaran #define SSPP_UNITY_SCALE	1
5625fdd593SJeykumar Sankaran 
5725fdd593SJeykumar Sankaran #define STRCAT(X, Y) (X Y)
5825fdd593SJeykumar Sankaran 
5925fdd593SJeykumar Sankaran /*************************************************************
6025fdd593SJeykumar Sankaran  * DPU sub blocks config
6125fdd593SJeykumar Sankaran  *************************************************************/
6225fdd593SJeykumar Sankaran /* DPU top level caps */
6325fdd593SJeykumar Sankaran static const struct dpu_caps sdm845_dpu_caps = {
6425fdd593SJeykumar Sankaran 	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
6525fdd593SJeykumar Sankaran 	.max_mixer_blendstages = 0xb,
6625fdd593SJeykumar Sankaran 	.qseed_type = DPU_SSPP_SCALER_QSEED3,
6725fdd593SJeykumar Sankaran 	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2,
6825fdd593SJeykumar Sankaran 	.ubwc_version = DPU_HW_UBWC_VER_20,
6925fdd593SJeykumar Sankaran 	.has_src_split = true,
7025fdd593SJeykumar Sankaran 	.has_dim_layer = true,
7125fdd593SJeykumar Sankaran 	.has_idle_pc = true,
7242a558b7SKalyan Thota 	.has_3d_merge = true,
7325fdd593SJeykumar Sankaran };
7425fdd593SJeykumar Sankaran 
757bdc0c4bSKalyan Thota static const struct dpu_caps sc7180_dpu_caps = {
767bdc0c4bSKalyan Thota 	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
777bdc0c4bSKalyan Thota 	.max_mixer_blendstages = 0x9,
787bdc0c4bSKalyan Thota 	.qseed_type = DPU_SSPP_SCALER_QSEED4,
797bdc0c4bSKalyan Thota 	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2,
807bdc0c4bSKalyan Thota 	.ubwc_version = DPU_HW_UBWC_VER_20,
817bdc0c4bSKalyan Thota 	.has_dim_layer = true,
827bdc0c4bSKalyan Thota 	.has_idle_pc = true,
837bdc0c4bSKalyan Thota };
847bdc0c4bSKalyan Thota 
85abda0d92SStephen Boyd static const struct dpu_mdp_cfg sdm845_mdp[] = {
8625fdd593SJeykumar Sankaran 	{
8725fdd593SJeykumar Sankaran 	.name = "top_0", .id = MDP_TOP,
8825fdd593SJeykumar Sankaran 	.base = 0x0, .len = 0x45C,
8925fdd593SJeykumar Sankaran 	.features = 0,
9025fdd593SJeykumar Sankaran 	.highest_bank_bit = 0x2,
9125fdd593SJeykumar Sankaran 	.clk_ctrls[DPU_CLK_CTRL_VIG0] = {
9225fdd593SJeykumar Sankaran 			.reg_off = 0x2AC, .bit_off = 0},
9325fdd593SJeykumar Sankaran 	.clk_ctrls[DPU_CLK_CTRL_VIG1] = {
9425fdd593SJeykumar Sankaran 			.reg_off = 0x2B4, .bit_off = 0},
9525fdd593SJeykumar Sankaran 	.clk_ctrls[DPU_CLK_CTRL_VIG2] = {
9625fdd593SJeykumar Sankaran 			.reg_off = 0x2BC, .bit_off = 0},
9725fdd593SJeykumar Sankaran 	.clk_ctrls[DPU_CLK_CTRL_VIG3] = {
9825fdd593SJeykumar Sankaran 			.reg_off = 0x2C4, .bit_off = 0},
9925fdd593SJeykumar Sankaran 	.clk_ctrls[DPU_CLK_CTRL_DMA0] = {
10025fdd593SJeykumar Sankaran 			.reg_off = 0x2AC, .bit_off = 8},
10125fdd593SJeykumar Sankaran 	.clk_ctrls[DPU_CLK_CTRL_DMA1] = {
10225fdd593SJeykumar Sankaran 			.reg_off = 0x2B4, .bit_off = 8},
10325fdd593SJeykumar Sankaran 	.clk_ctrls[DPU_CLK_CTRL_CURSOR0] = {
10425fdd593SJeykumar Sankaran 			.reg_off = 0x2BC, .bit_off = 8},
10525fdd593SJeykumar Sankaran 	.clk_ctrls[DPU_CLK_CTRL_CURSOR1] = {
10625fdd593SJeykumar Sankaran 			.reg_off = 0x2C4, .bit_off = 8},
10725fdd593SJeykumar Sankaran 	},
10825fdd593SJeykumar Sankaran };
10925fdd593SJeykumar Sankaran 
1107bdc0c4bSKalyan Thota static const struct dpu_mdp_cfg sc7180_mdp[] = {
1117bdc0c4bSKalyan Thota 	{
1127bdc0c4bSKalyan Thota 	.name = "top_0", .id = MDP_TOP,
1137bdc0c4bSKalyan Thota 	.base = 0x0, .len = 0x494,
1147bdc0c4bSKalyan Thota 	.features = 0,
1157bdc0c4bSKalyan Thota 	.highest_bank_bit = 0x3,
1167bdc0c4bSKalyan Thota 	.clk_ctrls[DPU_CLK_CTRL_VIG0] = {
1177bdc0c4bSKalyan Thota 		.reg_off = 0x2AC, .bit_off = 0},
1187bdc0c4bSKalyan Thota 	.clk_ctrls[DPU_CLK_CTRL_DMA0] = {
1197bdc0c4bSKalyan Thota 		.reg_off = 0x2AC, .bit_off = 8},
1207bdc0c4bSKalyan Thota 	.clk_ctrls[DPU_CLK_CTRL_CURSOR0] = {
1217b149f2bSKalyan Thota 		.reg_off = 0x2B4, .bit_off = 8},
1227b149f2bSKalyan Thota 	.clk_ctrls[DPU_CLK_CTRL_CURSOR1] = {
1237b149f2bSKalyan Thota 		.reg_off = 0x2C4, .bit_off = 8},
1247bdc0c4bSKalyan Thota 	},
1257bdc0c4bSKalyan Thota };
1267bdc0c4bSKalyan Thota 
12725fdd593SJeykumar Sankaran /*************************************************************
12825fdd593SJeykumar Sankaran  * CTL sub blocks config
12925fdd593SJeykumar Sankaran  *************************************************************/
130abda0d92SStephen Boyd static const struct dpu_ctl_cfg sdm845_ctl[] = {
13125fdd593SJeykumar Sankaran 	{
13225fdd593SJeykumar Sankaran 	.name = "ctl_0", .id = CTL_0,
13325fdd593SJeykumar Sankaran 	.base = 0x1000, .len = 0xE4,
13425fdd593SJeykumar Sankaran 	.features = BIT(DPU_CTL_SPLIT_DISPLAY)
13525fdd593SJeykumar Sankaran 	},
13625fdd593SJeykumar Sankaran 	{
13725fdd593SJeykumar Sankaran 	.name = "ctl_1", .id = CTL_1,
13825fdd593SJeykumar Sankaran 	.base = 0x1200, .len = 0xE4,
13925fdd593SJeykumar Sankaran 	.features = BIT(DPU_CTL_SPLIT_DISPLAY)
14025fdd593SJeykumar Sankaran 	},
14125fdd593SJeykumar Sankaran 	{
14225fdd593SJeykumar Sankaran 	.name = "ctl_2", .id = CTL_2,
14325fdd593SJeykumar Sankaran 	.base = 0x1400, .len = 0xE4,
14425fdd593SJeykumar Sankaran 	.features = 0
14525fdd593SJeykumar Sankaran 	},
14625fdd593SJeykumar Sankaran 	{
14725fdd593SJeykumar Sankaran 	.name = "ctl_3", .id = CTL_3,
14825fdd593SJeykumar Sankaran 	.base = 0x1600, .len = 0xE4,
14925fdd593SJeykumar Sankaran 	.features = 0
15025fdd593SJeykumar Sankaran 	},
15125fdd593SJeykumar Sankaran 	{
15225fdd593SJeykumar Sankaran 	.name = "ctl_4", .id = CTL_4,
15325fdd593SJeykumar Sankaran 	.base = 0x1800, .len = 0xE4,
15425fdd593SJeykumar Sankaran 	.features = 0
15525fdd593SJeykumar Sankaran 	},
15625fdd593SJeykumar Sankaran };
15725fdd593SJeykumar Sankaran 
1587bdc0c4bSKalyan Thota static const struct dpu_ctl_cfg sc7180_ctl[] = {
1597bdc0c4bSKalyan Thota 	{
1607bdc0c4bSKalyan Thota 	.name = "ctl_0", .id = CTL_0,
1617bdc0c4bSKalyan Thota 	.base = 0x1000, .len = 0xE4,
1627bdc0c4bSKalyan Thota 	.features = BIT(DPU_CTL_ACTIVE_CFG)
1637bdc0c4bSKalyan Thota 	},
1647bdc0c4bSKalyan Thota 	{
1657bdc0c4bSKalyan Thota 	.name = "ctl_1", .id = CTL_1,
1667bdc0c4bSKalyan Thota 	.base = 0x1200, .len = 0xE4,
1677bdc0c4bSKalyan Thota 	.features = BIT(DPU_CTL_ACTIVE_CFG)
1687bdc0c4bSKalyan Thota 	},
1697bdc0c4bSKalyan Thota 	{
1707bdc0c4bSKalyan Thota 	.name = "ctl_2", .id = CTL_2,
1717bdc0c4bSKalyan Thota 	.base = 0x1400, .len = 0xE4,
1727bdc0c4bSKalyan Thota 	.features = BIT(DPU_CTL_ACTIVE_CFG)
1737bdc0c4bSKalyan Thota 	},
1747bdc0c4bSKalyan Thota };
1757bdc0c4bSKalyan Thota 
17625fdd593SJeykumar Sankaran /*************************************************************
17725fdd593SJeykumar Sankaran  * SSPP sub blocks config
17825fdd593SJeykumar Sankaran  *************************************************************/
17925fdd593SJeykumar Sankaran 
18025fdd593SJeykumar Sankaran /* SSPP common configuration */
18125fdd593SJeykumar Sankaran static const struct dpu_sspp_blks_common sdm845_sspp_common = {
18225fdd593SJeykumar Sankaran 	.maxlinewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
18325fdd593SJeykumar Sankaran 	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE,
18425fdd593SJeykumar Sankaran 	.maxhdeciexp = MAX_HORZ_DECIMATION,
18525fdd593SJeykumar Sankaran 	.maxvdeciexp = MAX_VERT_DECIMATION,
18625fdd593SJeykumar Sankaran };
18725fdd593SJeykumar Sankaran 
188b75ab05aSShubhashree Dhar #define _VIG_SBLK(num, sdma_pri, qseed_ver) \
18925fdd593SJeykumar Sankaran 	{ \
19025fdd593SJeykumar Sankaran 	.common = &sdm845_sspp_common, \
19125fdd593SJeykumar Sankaran 	.maxdwnscale = MAX_DOWNSCALE_RATIO, \
19225fdd593SJeykumar Sankaran 	.maxupscale = MAX_UPSCALE_RATIO, \
19325fdd593SJeykumar Sankaran 	.smart_dma_priority = sdma_pri, \
19425fdd593SJeykumar Sankaran 	.src_blk = {.name = STRCAT("sspp_src_", num), \
19525fdd593SJeykumar Sankaran 		.id = DPU_SSPP_SRC, .base = 0x00, .len = 0x150,}, \
19625fdd593SJeykumar Sankaran 	.scaler_blk = {.name = STRCAT("sspp_scaler", num), \
197b75ab05aSShubhashree Dhar 		.id = qseed_ver, \
19825fdd593SJeykumar Sankaran 		.base = 0xa00, .len = 0xa0,}, \
19925fdd593SJeykumar Sankaran 	.csc_blk = {.name = STRCAT("sspp_csc", num), \
20025fdd593SJeykumar Sankaran 		.id = DPU_SSPP_CSC_10BIT, \
20125fdd593SJeykumar Sankaran 		.base = 0x1a00, .len = 0x100,}, \
20225fdd593SJeykumar Sankaran 	.format_list = plane_formats_yuv, \
203e6b63a7bSFritz Koenig 	.num_formats = ARRAY_SIZE(plane_formats_yuv), \
20425fdd593SJeykumar Sankaran 	.virt_format_list = plane_formats, \
205e6b63a7bSFritz Koenig 	.virt_num_formats = ARRAY_SIZE(plane_formats), \
20625fdd593SJeykumar Sankaran 	}
20725fdd593SJeykumar Sankaran 
20825fdd593SJeykumar Sankaran #define _DMA_SBLK(num, sdma_pri) \
20925fdd593SJeykumar Sankaran 	{ \
21025fdd593SJeykumar Sankaran 	.common = &sdm845_sspp_common, \
21125fdd593SJeykumar Sankaran 	.maxdwnscale = SSPP_UNITY_SCALE, \
21225fdd593SJeykumar Sankaran 	.maxupscale = SSPP_UNITY_SCALE, \
21325fdd593SJeykumar Sankaran 	.smart_dma_priority = sdma_pri, \
21425fdd593SJeykumar Sankaran 	.src_blk = {.name = STRCAT("sspp_src_", num), \
21525fdd593SJeykumar Sankaran 		.id = DPU_SSPP_SRC, .base = 0x00, .len = 0x150,}, \
21625fdd593SJeykumar Sankaran 	.format_list = plane_formats, \
217e6b63a7bSFritz Koenig 	.num_formats = ARRAY_SIZE(plane_formats), \
21825fdd593SJeykumar Sankaran 	.virt_format_list = plane_formats, \
219e6b63a7bSFritz Koenig 	.virt_num_formats = ARRAY_SIZE(plane_formats), \
22025fdd593SJeykumar Sankaran 	}
22125fdd593SJeykumar Sankaran 
222b75ab05aSShubhashree Dhar static const struct dpu_sspp_sub_blks sdm845_vig_sblk_0 =
223b75ab05aSShubhashree Dhar 				_VIG_SBLK("0", 5, DPU_SSPP_SCALER_QSEED3);
224b75ab05aSShubhashree Dhar static const struct dpu_sspp_sub_blks sdm845_vig_sblk_1 =
225b75ab05aSShubhashree Dhar 				_VIG_SBLK("1", 6, DPU_SSPP_SCALER_QSEED3);
226b75ab05aSShubhashree Dhar static const struct dpu_sspp_sub_blks sdm845_vig_sblk_2 =
227b75ab05aSShubhashree Dhar 				_VIG_SBLK("2", 7, DPU_SSPP_SCALER_QSEED3);
228b75ab05aSShubhashree Dhar static const struct dpu_sspp_sub_blks sdm845_vig_sblk_3 =
229b75ab05aSShubhashree Dhar 				_VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED3);
23025fdd593SJeykumar Sankaran 
23125fdd593SJeykumar Sankaran static const struct dpu_sspp_sub_blks sdm845_dma_sblk_0 = _DMA_SBLK("8", 1);
23225fdd593SJeykumar Sankaran static const struct dpu_sspp_sub_blks sdm845_dma_sblk_1 = _DMA_SBLK("9", 2);
23325fdd593SJeykumar Sankaran static const struct dpu_sspp_sub_blks sdm845_dma_sblk_2 = _DMA_SBLK("10", 3);
23425fdd593SJeykumar Sankaran static const struct dpu_sspp_sub_blks sdm845_dma_sblk_3 = _DMA_SBLK("11", 4);
23525fdd593SJeykumar Sankaran 
23607ca1fc0SSravanthi Kollukuduru #define SSPP_BLK(_name, _id, _base, _features, \
23707ca1fc0SSravanthi Kollukuduru 		_sblk, _xinid, _type, _clkctrl) \
23825fdd593SJeykumar Sankaran 	{ \
23925fdd593SJeykumar Sankaran 	.name = _name, .id = _id, \
24025fdd593SJeykumar Sankaran 	.base = _base, .len = 0x1c8, \
24107ca1fc0SSravanthi Kollukuduru 	.features = _features, \
24225fdd593SJeykumar Sankaran 	.sblk = &_sblk, \
24325fdd593SJeykumar Sankaran 	.xin_id = _xinid, \
24407ca1fc0SSravanthi Kollukuduru 	.type = _type, \
24525fdd593SJeykumar Sankaran 	.clk_ctrl = _clkctrl \
24625fdd593SJeykumar Sankaran 	}
24725fdd593SJeykumar Sankaran 
248abda0d92SStephen Boyd static const struct dpu_sspp_cfg sdm845_sspp[] = {
24907ca1fc0SSravanthi Kollukuduru 	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SDM845_MASK,
25007ca1fc0SSravanthi Kollukuduru 		sdm845_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
25107ca1fc0SSravanthi Kollukuduru 	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SDM845_MASK,
25207ca1fc0SSravanthi Kollukuduru 		sdm845_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1),
25307ca1fc0SSravanthi Kollukuduru 	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SDM845_MASK,
25407ca1fc0SSravanthi Kollukuduru 		sdm845_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2),
25507ca1fc0SSravanthi Kollukuduru 	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SDM845_MASK,
25607ca1fc0SSravanthi Kollukuduru 		sdm845_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3),
25707ca1fc0SSravanthi Kollukuduru 	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK,
25807ca1fc0SSravanthi Kollukuduru 		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
25907ca1fc0SSravanthi Kollukuduru 	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK,
26007ca1fc0SSravanthi Kollukuduru 		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1),
26107ca1fc0SSravanthi Kollukuduru 	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK,
26207ca1fc0SSravanthi Kollukuduru 		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0),
26307ca1fc0SSravanthi Kollukuduru 	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_SDM845_MASK,
26407ca1fc0SSravanthi Kollukuduru 		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1),
26525fdd593SJeykumar Sankaran };
26625fdd593SJeykumar Sankaran 
267b75ab05aSShubhashree Dhar static const struct dpu_sspp_sub_blks sc7180_vig_sblk_0 =
268b75ab05aSShubhashree Dhar 				_VIG_SBLK("0", 4, DPU_SSPP_SCALER_QSEED4);
269b75ab05aSShubhashree Dhar 
2707bdc0c4bSKalyan Thota static const struct dpu_sspp_cfg sc7180_sspp[] = {
2717bdc0c4bSKalyan Thota 	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK,
272b75ab05aSShubhashree Dhar 		sc7180_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0),
2737bdc0c4bSKalyan Thota 	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK,
2747bdc0c4bSKalyan Thota 		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0),
2757b149f2bSKalyan Thota 	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_CURSOR_SDM845_MASK,
2767b149f2bSKalyan Thota 		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0),
2777bdc0c4bSKalyan Thota 	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK,
2787b149f2bSKalyan Thota 		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1),
2797bdc0c4bSKalyan Thota };
2807bdc0c4bSKalyan Thota 
28125fdd593SJeykumar Sankaran /*************************************************************
28225fdd593SJeykumar Sankaran  * MIXER sub blocks config
28325fdd593SJeykumar Sankaran  *************************************************************/
2847bdc0c4bSKalyan Thota 
2857bdc0c4bSKalyan Thota /* SDM845 */
2867bdc0c4bSKalyan Thota 
28725fdd593SJeykumar Sankaran static const struct dpu_lm_sub_blks sdm845_lm_sblk = {
28825fdd593SJeykumar Sankaran 	.maxwidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
28925fdd593SJeykumar Sankaran 	.maxblendstages = 11, /* excluding base layer */
29025fdd593SJeykumar Sankaran 	.blendstage_base = { /* offsets relative to mixer base */
29125fdd593SJeykumar Sankaran 		0x20, 0x38, 0x50, 0x68, 0x80, 0x98,
29225fdd593SJeykumar Sankaran 		0xb0, 0xc8, 0xe0, 0xf8, 0x110
29325fdd593SJeykumar Sankaran 	},
29425fdd593SJeykumar Sankaran };
29525fdd593SJeykumar Sankaran 
296e47616dfSKalyan Thota #define LM_BLK(_name, _id, _base, _fmask, _sblk, _pp, _lmpair, _dspp) \
29725fdd593SJeykumar Sankaran 	{ \
29825fdd593SJeykumar Sankaran 	.name = _name, .id = _id, \
29925fdd593SJeykumar Sankaran 	.base = _base, .len = 0x320, \
3007bdc0c4bSKalyan Thota 	.features = _fmask, \
3017bdc0c4bSKalyan Thota 	.sblk = _sblk, \
30225fdd593SJeykumar Sankaran 	.pingpong = _pp, \
303e47616dfSKalyan Thota 	.lm_pair_mask = (1 << _lmpair), \
304e47616dfSKalyan Thota 	.dspp = _dspp \
30525fdd593SJeykumar Sankaran 	}
30625fdd593SJeykumar Sankaran 
307abda0d92SStephen Boyd static const struct dpu_lm_cfg sdm845_lm[] = {
3087bdc0c4bSKalyan Thota 	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK,
309e47616dfSKalyan Thota 		&sdm845_lm_sblk, PINGPONG_0, LM_1, 0),
3107bdc0c4bSKalyan Thota 	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK,
311e47616dfSKalyan Thota 		&sdm845_lm_sblk, PINGPONG_1, LM_0, 0),
3127bdc0c4bSKalyan Thota 	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK,
313e47616dfSKalyan Thota 		&sdm845_lm_sblk, PINGPONG_2, LM_5, 0),
3147bdc0c4bSKalyan Thota 	LM_BLK("lm_3", LM_3, 0x0, MIXER_SDM845_MASK,
315e47616dfSKalyan Thota 		&sdm845_lm_sblk, PINGPONG_MAX, 0, 0),
3167bdc0c4bSKalyan Thota 	LM_BLK("lm_4", LM_4, 0x0, MIXER_SDM845_MASK,
317e47616dfSKalyan Thota 		&sdm845_lm_sblk, PINGPONG_MAX, 0, 0),
3187bdc0c4bSKalyan Thota 	LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK,
319e47616dfSKalyan Thota 		&sdm845_lm_sblk, PINGPONG_3, LM_2, 0),
3207bdc0c4bSKalyan Thota };
3217bdc0c4bSKalyan Thota 
3227bdc0c4bSKalyan Thota /* SC7180 */
3237bdc0c4bSKalyan Thota 
3247bdc0c4bSKalyan Thota static const struct dpu_lm_sub_blks sc7180_lm_sblk = {
3257bdc0c4bSKalyan Thota 	.maxwidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH,
3267bdc0c4bSKalyan Thota 	.maxblendstages = 7, /* excluding base layer */
3277bdc0c4bSKalyan Thota 	.blendstage_base = { /* offsets relative to mixer base */
3287bdc0c4bSKalyan Thota 		0x20, 0x38, 0x50, 0x68, 0x80, 0x98, 0xb0
3297bdc0c4bSKalyan Thota 	},
3307bdc0c4bSKalyan Thota };
3317bdc0c4bSKalyan Thota 
3327bdc0c4bSKalyan Thota static const struct dpu_lm_cfg sc7180_lm[] = {
3337bdc0c4bSKalyan Thota 	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SC7180_MASK,
334e47616dfSKalyan Thota 		&sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0),
3357bdc0c4bSKalyan Thota 	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SC7180_MASK,
336e47616dfSKalyan Thota 		&sc7180_lm_sblk, PINGPONG_1, LM_0, 0),
33725fdd593SJeykumar Sankaran };
33825fdd593SJeykumar Sankaran 
33925fdd593SJeykumar Sankaran /*************************************************************
340e47616dfSKalyan Thota  * DSPP sub blocks config
341e47616dfSKalyan Thota  *************************************************************/
3424259ff7aSKalyan Thota static const struct dpu_dspp_sub_blks sc7180_dspp_sblk = {
3434259ff7aSKalyan Thota 	.pcc = {.id = DPU_DSPP_PCC, .base = 0x1700,
3444259ff7aSKalyan Thota 		.len = 0x90, .version = 0x10000},
3454259ff7aSKalyan Thota };
3464259ff7aSKalyan Thota 
347e47616dfSKalyan Thota #define DSPP_BLK(_name, _id, _base) \
348e47616dfSKalyan Thota 		{\
349e47616dfSKalyan Thota 		.name = _name, .id = _id, \
350e47616dfSKalyan Thota 		.base = _base, .len = 0x1800, \
351e47616dfSKalyan Thota 		.features = DSPP_SC7180_MASK, \
3524259ff7aSKalyan Thota 		.sblk = &sc7180_dspp_sblk \
353e47616dfSKalyan Thota 		}
354e47616dfSKalyan Thota 
355e47616dfSKalyan Thota static const struct dpu_dspp_cfg sc7180_dspp[] = {
356e47616dfSKalyan Thota 	DSPP_BLK("dspp_0", DSPP_0, 0x54000),
357e47616dfSKalyan Thota };
358e47616dfSKalyan Thota /*************************************************************
35925fdd593SJeykumar Sankaran  * PINGPONG sub blocks config
36025fdd593SJeykumar Sankaran  *************************************************************/
36125fdd593SJeykumar Sankaran static const struct dpu_pingpong_sub_blks sdm845_pp_sblk_te = {
36225fdd593SJeykumar Sankaran 	.te2 = {.id = DPU_PINGPONG_TE2, .base = 0x2000, .len = 0x0,
36325fdd593SJeykumar Sankaran 		.version = 0x1},
36425fdd593SJeykumar Sankaran 	.dither = {.id = DPU_PINGPONG_DITHER, .base = 0x30e0,
36525fdd593SJeykumar Sankaran 		.len = 0x20, .version = 0x10000},
36625fdd593SJeykumar Sankaran };
36725fdd593SJeykumar Sankaran 
36825fdd593SJeykumar Sankaran static const struct dpu_pingpong_sub_blks sdm845_pp_sblk = {
36925fdd593SJeykumar Sankaran 	.dither = {.id = DPU_PINGPONG_DITHER, .base = 0x30e0,
37025fdd593SJeykumar Sankaran 		.len = 0x20, .version = 0x10000},
37125fdd593SJeykumar Sankaran };
37225fdd593SJeykumar Sankaran 
37325fdd593SJeykumar Sankaran #define PP_BLK_TE(_name, _id, _base) \
37425fdd593SJeykumar Sankaran 	{\
37525fdd593SJeykumar Sankaran 	.name = _name, .id = _id, \
37625fdd593SJeykumar Sankaran 	.base = _base, .len = 0xd4, \
37725fdd593SJeykumar Sankaran 	.features = PINGPONG_SDM845_SPLIT_MASK, \
37825fdd593SJeykumar Sankaran 	.sblk = &sdm845_pp_sblk_te \
37925fdd593SJeykumar Sankaran 	}
38025fdd593SJeykumar Sankaran #define PP_BLK(_name, _id, _base) \
38125fdd593SJeykumar Sankaran 	{\
38225fdd593SJeykumar Sankaran 	.name = _name, .id = _id, \
38325fdd593SJeykumar Sankaran 	.base = _base, .len = 0xd4, \
38425fdd593SJeykumar Sankaran 	.features = PINGPONG_SDM845_MASK, \
38525fdd593SJeykumar Sankaran 	.sblk = &sdm845_pp_sblk \
38625fdd593SJeykumar Sankaran 	}
38725fdd593SJeykumar Sankaran 
388abda0d92SStephen Boyd static const struct dpu_pingpong_cfg sdm845_pp[] = {
38925fdd593SJeykumar Sankaran 	PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000),
39025fdd593SJeykumar Sankaran 	PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800),
39125fdd593SJeykumar Sankaran 	PP_BLK("pingpong_2", PINGPONG_2, 0x71000),
39225fdd593SJeykumar Sankaran 	PP_BLK("pingpong_3", PINGPONG_3, 0x71800),
39325fdd593SJeykumar Sankaran };
39425fdd593SJeykumar Sankaran 
3957bdc0c4bSKalyan Thota static struct dpu_pingpong_cfg sc7180_pp[] = {
3967bdc0c4bSKalyan Thota 	PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000),
3977bdc0c4bSKalyan Thota 	PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800),
3987bdc0c4bSKalyan Thota };
3997bdc0c4bSKalyan Thota 
40025fdd593SJeykumar Sankaran /*************************************************************
40125fdd593SJeykumar Sankaran  * INTF sub blocks config
40225fdd593SJeykumar Sankaran  *************************************************************/
40325fdd593SJeykumar Sankaran #define INTF_BLK(_name, _id, _base, _type, _ctrl_id) \
40425fdd593SJeykumar Sankaran 	{\
40525fdd593SJeykumar Sankaran 	.name = _name, .id = _id, \
40625fdd593SJeykumar Sankaran 	.base = _base, .len = 0x280, \
40773bfb790SKalyan Thota 	.features = BIT(DPU_CTL_ACTIVE_CFG), \
40825fdd593SJeykumar Sankaran 	.type = _type, \
40925fdd593SJeykumar Sankaran 	.controller_id = _ctrl_id, \
41025fdd593SJeykumar Sankaran 	.prog_fetch_lines_worst_case = 24 \
41125fdd593SJeykumar Sankaran 	}
41225fdd593SJeykumar Sankaran 
413abda0d92SStephen Boyd static const struct dpu_intf_cfg sdm845_intf[] = {
41425fdd593SJeykumar Sankaran 	INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0),
41525fdd593SJeykumar Sankaran 	INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0),
41625fdd593SJeykumar Sankaran 	INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1),
41725fdd593SJeykumar Sankaran 	INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 1),
41825fdd593SJeykumar Sankaran };
41925fdd593SJeykumar Sankaran 
4207bdc0c4bSKalyan Thota static const struct dpu_intf_cfg sc7180_intf[] = {
4217bdc0c4bSKalyan Thota 	INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0),
4227bdc0c4bSKalyan Thota 	INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0),
4237bdc0c4bSKalyan Thota };
4247bdc0c4bSKalyan Thota 
42525fdd593SJeykumar Sankaran /*************************************************************
42625fdd593SJeykumar Sankaran  * VBIF sub blocks config
42725fdd593SJeykumar Sankaran  *************************************************************/
42825fdd593SJeykumar Sankaran /* VBIF QOS remap */
429abda0d92SStephen Boyd static const u32 sdm845_rt_pri_lvl[] = {3, 3, 4, 4, 5, 5, 6, 6};
430abda0d92SStephen Boyd static const u32 sdm845_nrt_pri_lvl[] = {3, 3, 3, 3, 3, 3, 3, 3};
43125fdd593SJeykumar Sankaran 
432abda0d92SStephen Boyd static const struct dpu_vbif_cfg sdm845_vbif[] = {
43325fdd593SJeykumar Sankaran 	{
43425fdd593SJeykumar Sankaran 	.name = "vbif_0", .id = VBIF_0,
43525fdd593SJeykumar Sankaran 	.base = 0, .len = 0x1040,
43625fdd593SJeykumar Sankaran 	.features = BIT(DPU_VBIF_QOS_REMAP),
43725fdd593SJeykumar Sankaran 	.xin_halt_timeout = 0x4000,
43825fdd593SJeykumar Sankaran 	.qos_rt_tbl = {
43925fdd593SJeykumar Sankaran 		.npriority_lvl = ARRAY_SIZE(sdm845_rt_pri_lvl),
44025fdd593SJeykumar Sankaran 		.priority_lvl = sdm845_rt_pri_lvl,
44125fdd593SJeykumar Sankaran 		},
44225fdd593SJeykumar Sankaran 	.qos_nrt_tbl = {
44325fdd593SJeykumar Sankaran 		.npriority_lvl = ARRAY_SIZE(sdm845_nrt_pri_lvl),
44425fdd593SJeykumar Sankaran 		.priority_lvl = sdm845_nrt_pri_lvl,
44525fdd593SJeykumar Sankaran 		},
44625fdd593SJeykumar Sankaran 	.memtype_count = 14,
44725fdd593SJeykumar Sankaran 	.memtype = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
44825fdd593SJeykumar Sankaran 	},
44925fdd593SJeykumar Sankaran };
45025fdd593SJeykumar Sankaran 
451abda0d92SStephen Boyd static const struct dpu_reg_dma_cfg sdm845_regdma = {
45225fdd593SJeykumar Sankaran 	.base = 0x0, .version = 0x1, .trigger_sel_off = 0x119c
45325fdd593SJeykumar Sankaran };
45425fdd593SJeykumar Sankaran 
45525fdd593SJeykumar Sankaran /*************************************************************
45625fdd593SJeykumar Sankaran  * PERF data config
45725fdd593SJeykumar Sankaran  *************************************************************/
45825fdd593SJeykumar Sankaran 
45925fdd593SJeykumar Sankaran /* SSPP QOS LUTs */
460abda0d92SStephen Boyd static const struct dpu_qos_lut_entry sdm845_qos_linear[] = {
46125fdd593SJeykumar Sankaran 	{.fl = 4, .lut = 0x357},
46225fdd593SJeykumar Sankaran 	{.fl = 5, .lut = 0x3357},
46325fdd593SJeykumar Sankaran 	{.fl = 6, .lut = 0x23357},
46425fdd593SJeykumar Sankaran 	{.fl = 7, .lut = 0x223357},
46525fdd593SJeykumar Sankaran 	{.fl = 8, .lut = 0x2223357},
46625fdd593SJeykumar Sankaran 	{.fl = 9, .lut = 0x22223357},
46725fdd593SJeykumar Sankaran 	{.fl = 10, .lut = 0x222223357},
46825fdd593SJeykumar Sankaran 	{.fl = 11, .lut = 0x2222223357},
46925fdd593SJeykumar Sankaran 	{.fl = 12, .lut = 0x22222223357},
47025fdd593SJeykumar Sankaran 	{.fl = 13, .lut = 0x222222223357},
47125fdd593SJeykumar Sankaran 	{.fl = 14, .lut = 0x1222222223357},
47225fdd593SJeykumar Sankaran 	{.fl = 0, .lut = 0x11222222223357}
47325fdd593SJeykumar Sankaran };
47425fdd593SJeykumar Sankaran 
4757bdc0c4bSKalyan Thota static const struct dpu_qos_lut_entry sc7180_qos_linear[] = {
4767bdc0c4bSKalyan Thota 	{.fl = 0, .lut = 0x0011222222335777},
4777bdc0c4bSKalyan Thota };
4787bdc0c4bSKalyan Thota 
479abda0d92SStephen Boyd static const struct dpu_qos_lut_entry sdm845_qos_macrotile[] = {
48025fdd593SJeykumar Sankaran 	{.fl = 10, .lut = 0x344556677},
48125fdd593SJeykumar Sankaran 	{.fl = 11, .lut = 0x3344556677},
48225fdd593SJeykumar Sankaran 	{.fl = 12, .lut = 0x23344556677},
48325fdd593SJeykumar Sankaran 	{.fl = 13, .lut = 0x223344556677},
48425fdd593SJeykumar Sankaran 	{.fl = 14, .lut = 0x1223344556677},
48525fdd593SJeykumar Sankaran 	{.fl = 0, .lut = 0x112233344556677},
48625fdd593SJeykumar Sankaran };
48725fdd593SJeykumar Sankaran 
4887bdc0c4bSKalyan Thota static const struct dpu_qos_lut_entry sc7180_qos_macrotile[] = {
4897bdc0c4bSKalyan Thota 	{.fl = 0, .lut = 0x0011223344556677},
4907bdc0c4bSKalyan Thota };
4917bdc0c4bSKalyan Thota 
492abda0d92SStephen Boyd static const struct dpu_qos_lut_entry sdm845_qos_nrt[] = {
49325fdd593SJeykumar Sankaran 	{.fl = 0, .lut = 0x0},
49425fdd593SJeykumar Sankaran };
49525fdd593SJeykumar Sankaran 
4967bdc0c4bSKalyan Thota static const struct dpu_qos_lut_entry sc7180_qos_nrt[] = {
4977bdc0c4bSKalyan Thota 	{.fl = 0, .lut = 0x0},
4987bdc0c4bSKalyan Thota };
4997bdc0c4bSKalyan Thota 
500abda0d92SStephen Boyd static const struct dpu_perf_cfg sdm845_perf_data = {
50125fdd593SJeykumar Sankaran 	.max_bw_low = 6800000,
50225fdd593SJeykumar Sankaran 	.max_bw_high = 6800000,
50325fdd593SJeykumar Sankaran 	.min_core_ib = 2400000,
50425fdd593SJeykumar Sankaran 	.min_llcc_ib = 800000,
50525fdd593SJeykumar Sankaran 	.min_dram_ib = 800000,
50625fdd593SJeykumar Sankaran 	.core_ib_ff = "6.0",
50725fdd593SJeykumar Sankaran 	.core_clk_ff = "1.0",
50825fdd593SJeykumar Sankaran 	.comp_ratio_rt =
50925fdd593SJeykumar Sankaran 	"NV12/5/1/1.23 AB24/5/1/1.23 XB24/5/1/1.23",
51025fdd593SJeykumar Sankaran 	.comp_ratio_nrt =
51125fdd593SJeykumar Sankaran 	"NV12/5/1/1.25 AB24/5/1/1.25 XB24/5/1/1.25",
51225fdd593SJeykumar Sankaran 	.undersized_prefill_lines = 2,
51325fdd593SJeykumar Sankaran 	.xtra_prefill_lines = 2,
51425fdd593SJeykumar Sankaran 	.dest_scale_prefill_lines = 3,
51525fdd593SJeykumar Sankaran 	.macrotile_prefill_lines = 4,
51625fdd593SJeykumar Sankaran 	.yuv_nv12_prefill_lines = 8,
51725fdd593SJeykumar Sankaran 	.linear_prefill_lines = 1,
51825fdd593SJeykumar Sankaran 	.downscaling_prefill_lines = 1,
51925fdd593SJeykumar Sankaran 	.amortizable_threshold = 25,
52025fdd593SJeykumar Sankaran 	.min_prefill_lines = 24,
52125fdd593SJeykumar Sankaran 	.danger_lut_tbl = {0xf, 0xffff, 0x0},
52225fdd593SJeykumar Sankaran 	.qos_lut_tbl = {
52325fdd593SJeykumar Sankaran 		{.nentry = ARRAY_SIZE(sdm845_qos_linear),
52425fdd593SJeykumar Sankaran 		.entries = sdm845_qos_linear
52525fdd593SJeykumar Sankaran 		},
52625fdd593SJeykumar Sankaran 		{.nentry = ARRAY_SIZE(sdm845_qos_macrotile),
52725fdd593SJeykumar Sankaran 		.entries = sdm845_qos_macrotile
52825fdd593SJeykumar Sankaran 		},
52925fdd593SJeykumar Sankaran 		{.nentry = ARRAY_SIZE(sdm845_qos_nrt),
53025fdd593SJeykumar Sankaran 		.entries = sdm845_qos_nrt
53125fdd593SJeykumar Sankaran 		},
53225fdd593SJeykumar Sankaran 	},
53325fdd593SJeykumar Sankaran 	.cdp_cfg = {
53425fdd593SJeykumar Sankaran 		{.rd_enable = 1, .wr_enable = 1},
53525fdd593SJeykumar Sankaran 		{.rd_enable = 1, .wr_enable = 0}
53625fdd593SJeykumar Sankaran 	},
53725fdd593SJeykumar Sankaran };
53825fdd593SJeykumar Sankaran 
5397bdc0c4bSKalyan Thota static const struct dpu_perf_cfg sc7180_perf_data = {
54071dc6c08SKrishna Manikandan 	.max_bw_low = 6800000,
54171dc6c08SKrishna Manikandan 	.max_bw_high = 6800000,
5427bdc0c4bSKalyan Thota 	.min_core_ib = 2400000,
5437bdc0c4bSKalyan Thota 	.min_llcc_ib = 800000,
5441cb2c4a2SRob Clark 	.min_dram_ib = 800000,
5457bdc0c4bSKalyan Thota 	.danger_lut_tbl = {0xff, 0xffff, 0x0},
5467bdc0c4bSKalyan Thota 	.qos_lut_tbl = {
5477bdc0c4bSKalyan Thota 		{.nentry = ARRAY_SIZE(sc7180_qos_linear),
5487bdc0c4bSKalyan Thota 		.entries = sc7180_qos_linear
5497bdc0c4bSKalyan Thota 		},
5507bdc0c4bSKalyan Thota 		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile),
5517bdc0c4bSKalyan Thota 		.entries = sc7180_qos_macrotile
5527bdc0c4bSKalyan Thota 		},
5537bdc0c4bSKalyan Thota 		{.nentry = ARRAY_SIZE(sc7180_qos_nrt),
5547bdc0c4bSKalyan Thota 		.entries = sc7180_qos_nrt
5557bdc0c4bSKalyan Thota 		},
5567bdc0c4bSKalyan Thota 	},
5577bdc0c4bSKalyan Thota 	.cdp_cfg = {
5587bdc0c4bSKalyan Thota 		{.rd_enable = 1, .wr_enable = 1},
5597bdc0c4bSKalyan Thota 		{.rd_enable = 1, .wr_enable = 0}
5607bdc0c4bSKalyan Thota 	},
5617bdc0c4bSKalyan Thota };
5627bdc0c4bSKalyan Thota 
56325fdd593SJeykumar Sankaran /*************************************************************
56425fdd593SJeykumar Sankaran  * Hardware catalog init
56525fdd593SJeykumar Sankaran  *************************************************************/
56625fdd593SJeykumar Sankaran 
56725fdd593SJeykumar Sankaran /*
56825fdd593SJeykumar Sankaran  * sdm845_cfg_init(): populate sdm845 dpu sub-blocks reg offsets
56925fdd593SJeykumar Sankaran  * and instance counts.
57025fdd593SJeykumar Sankaran  */
571fba33caeSJordan Crouse static void sdm845_cfg_init(struct dpu_mdss_cfg *dpu_cfg)
57225fdd593SJeykumar Sankaran {
57325fdd593SJeykumar Sankaran 	*dpu_cfg = (struct dpu_mdss_cfg){
57425fdd593SJeykumar Sankaran 		.caps = &sdm845_dpu_caps,
57525fdd593SJeykumar Sankaran 		.mdp_count = ARRAY_SIZE(sdm845_mdp),
57625fdd593SJeykumar Sankaran 		.mdp = sdm845_mdp,
57725fdd593SJeykumar Sankaran 		.ctl_count = ARRAY_SIZE(sdm845_ctl),
57825fdd593SJeykumar Sankaran 		.ctl = sdm845_ctl,
57925fdd593SJeykumar Sankaran 		.sspp_count = ARRAY_SIZE(sdm845_sspp),
58025fdd593SJeykumar Sankaran 		.sspp = sdm845_sspp,
58125fdd593SJeykumar Sankaran 		.mixer_count = ARRAY_SIZE(sdm845_lm),
58225fdd593SJeykumar Sankaran 		.mixer = sdm845_lm,
58325fdd593SJeykumar Sankaran 		.pingpong_count = ARRAY_SIZE(sdm845_pp),
58425fdd593SJeykumar Sankaran 		.pingpong = sdm845_pp,
58525fdd593SJeykumar Sankaran 		.intf_count = ARRAY_SIZE(sdm845_intf),
58625fdd593SJeykumar Sankaran 		.intf = sdm845_intf,
58725fdd593SJeykumar Sankaran 		.vbif_count = ARRAY_SIZE(sdm845_vbif),
58825fdd593SJeykumar Sankaran 		.vbif = sdm845_vbif,
58925fdd593SJeykumar Sankaran 		.reg_dma_count = 1,
59025fdd593SJeykumar Sankaran 		.dma_cfg = sdm845_regdma,
59125fdd593SJeykumar Sankaran 		.perf = sdm845_perf_data,
5920846cca3SShubhashree Dhar 		.mdss_irqs = 0x3ff,
59325fdd593SJeykumar Sankaran 	};
59425fdd593SJeykumar Sankaran }
59525fdd593SJeykumar Sankaran 
5967bdc0c4bSKalyan Thota /*
5977bdc0c4bSKalyan Thota  * sc7180_cfg_init(): populate sc7180 dpu sub-blocks reg offsets
5987bdc0c4bSKalyan Thota  * and instance counts.
5997bdc0c4bSKalyan Thota  */
6007bdc0c4bSKalyan Thota static void sc7180_cfg_init(struct dpu_mdss_cfg *dpu_cfg)
6017bdc0c4bSKalyan Thota {
6027bdc0c4bSKalyan Thota 	*dpu_cfg = (struct dpu_mdss_cfg){
6037bdc0c4bSKalyan Thota 		.caps = &sc7180_dpu_caps,
6047bdc0c4bSKalyan Thota 		.mdp_count = ARRAY_SIZE(sc7180_mdp),
6057bdc0c4bSKalyan Thota 		.mdp = sc7180_mdp,
6067bdc0c4bSKalyan Thota 		.ctl_count = ARRAY_SIZE(sc7180_ctl),
6077bdc0c4bSKalyan Thota 		.ctl = sc7180_ctl,
6087bdc0c4bSKalyan Thota 		.sspp_count = ARRAY_SIZE(sc7180_sspp),
6097bdc0c4bSKalyan Thota 		.sspp = sc7180_sspp,
6107bdc0c4bSKalyan Thota 		.mixer_count = ARRAY_SIZE(sc7180_lm),
6117bdc0c4bSKalyan Thota 		.mixer = sc7180_lm,
612e47616dfSKalyan Thota 		.dspp_count = ARRAY_SIZE(sc7180_dspp),
613e47616dfSKalyan Thota 		.dspp = sc7180_dspp,
6147bdc0c4bSKalyan Thota 		.pingpong_count = ARRAY_SIZE(sc7180_pp),
6157bdc0c4bSKalyan Thota 		.pingpong = sc7180_pp,
6167bdc0c4bSKalyan Thota 		.intf_count = ARRAY_SIZE(sc7180_intf),
6177bdc0c4bSKalyan Thota 		.intf = sc7180_intf,
6187bdc0c4bSKalyan Thota 		.vbif_count = ARRAY_SIZE(sdm845_vbif),
6197bdc0c4bSKalyan Thota 		.vbif = sdm845_vbif,
6207bdc0c4bSKalyan Thota 		.reg_dma_count = 1,
6217bdc0c4bSKalyan Thota 		.dma_cfg = sdm845_regdma,
6227bdc0c4bSKalyan Thota 		.perf = sc7180_perf_data,
6237bdc0c4bSKalyan Thota 		.mdss_irqs = 0x3f,
6247bdc0c4bSKalyan Thota 	};
6257bdc0c4bSKalyan Thota }
6267bdc0c4bSKalyan Thota 
627abda0d92SStephen Boyd static const struct dpu_mdss_hw_cfg_handler cfg_handler[] = {
62825fdd593SJeykumar Sankaran 	{ .hw_rev = DPU_HW_VER_400, .cfg_init = sdm845_cfg_init},
62925fdd593SJeykumar Sankaran 	{ .hw_rev = DPU_HW_VER_401, .cfg_init = sdm845_cfg_init},
6307bdc0c4bSKalyan Thota 	{ .hw_rev = DPU_HW_VER_620, .cfg_init = sc7180_cfg_init},
63125fdd593SJeykumar Sankaran };
63225fdd593SJeykumar Sankaran 
63325fdd593SJeykumar Sankaran void dpu_hw_catalog_deinit(struct dpu_mdss_cfg *dpu_cfg)
63425fdd593SJeykumar Sankaran {
63525fdd593SJeykumar Sankaran 	kfree(dpu_cfg);
63625fdd593SJeykumar Sankaran }
63725fdd593SJeykumar Sankaran 
63825fdd593SJeykumar Sankaran struct dpu_mdss_cfg *dpu_hw_catalog_init(u32 hw_rev)
63925fdd593SJeykumar Sankaran {
64025fdd593SJeykumar Sankaran 	int i;
64125fdd593SJeykumar Sankaran 	struct dpu_mdss_cfg *dpu_cfg;
64225fdd593SJeykumar Sankaran 
64325fdd593SJeykumar Sankaran 	dpu_cfg = kzalloc(sizeof(*dpu_cfg), GFP_KERNEL);
64425fdd593SJeykumar Sankaran 	if (!dpu_cfg)
64525fdd593SJeykumar Sankaran 		return ERR_PTR(-ENOMEM);
64625fdd593SJeykumar Sankaran 
64725fdd593SJeykumar Sankaran 	for (i = 0; i < ARRAY_SIZE(cfg_handler); i++) {
64825fdd593SJeykumar Sankaran 		if (cfg_handler[i].hw_rev == hw_rev) {
64925fdd593SJeykumar Sankaran 			cfg_handler[i].cfg_init(dpu_cfg);
65025fdd593SJeykumar Sankaran 			dpu_cfg->hwversion = hw_rev;
65125fdd593SJeykumar Sankaran 			return dpu_cfg;
65225fdd593SJeykumar Sankaran 		}
65325fdd593SJeykumar Sankaran 	}
65425fdd593SJeykumar Sankaran 
65525fdd593SJeykumar Sankaran 	DPU_ERROR("unsupported chipset id:%X\n", hw_rev);
65625fdd593SJeykumar Sankaran 	dpu_hw_catalog_deinit(dpu_cfg);
65725fdd593SJeykumar Sankaran 	return ERR_PTR(-ENODEV);
65825fdd593SJeykumar Sankaran }
65925fdd593SJeykumar Sankaran 
660