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