125fdd593SJeykumar Sankaran /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. 225fdd593SJeykumar Sankaran * 325fdd593SJeykumar Sankaran * This program is free software; you can redistribute it and/or modify 425fdd593SJeykumar Sankaran * it under the terms of the GNU General Public License version 2 and 525fdd593SJeykumar Sankaran * only version 2 as published by the Free Software Foundation. 625fdd593SJeykumar Sankaran * 725fdd593SJeykumar Sankaran * This program is distributed in the hope that it will be useful, 825fdd593SJeykumar Sankaran * but WITHOUT ANY WARRANTY; without even the implied warranty of 925fdd593SJeykumar Sankaran * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1025fdd593SJeykumar Sankaran * GNU General Public License for more details. 1125fdd593SJeykumar Sankaran */ 1225fdd593SJeykumar Sankaran 1325fdd593SJeykumar Sankaran #define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__ 1425fdd593SJeykumar Sankaran #include <linux/slab.h> 1525fdd593SJeykumar Sankaran #include <linux/of_address.h> 1625fdd593SJeykumar Sankaran #include <linux/platform_device.h> 1725fdd593SJeykumar Sankaran #include "dpu_hw_mdss.h" 1825fdd593SJeykumar Sankaran #include "dpu_hw_catalog.h" 1925fdd593SJeykumar Sankaran #include "dpu_hw_catalog_format.h" 2025fdd593SJeykumar Sankaran #include "dpu_kms.h" 2125fdd593SJeykumar Sankaran 2225fdd593SJeykumar Sankaran #define VIG_SDM845_MASK \ 2325fdd593SJeykumar Sankaran (BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_SCALER_QSEED3) | BIT(DPU_SSPP_QOS) |\ 2425fdd593SJeykumar Sankaran BIT(DPU_SSPP_CSC_10BIT) | BIT(DPU_SSPP_CDP) | BIT(DPU_SSPP_QOS_8LVL) |\ 2525fdd593SJeykumar Sankaran BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_EXCL_RECT)) 2625fdd593SJeykumar Sankaran 2725fdd593SJeykumar Sankaran #define DMA_SDM845_MASK \ 2825fdd593SJeykumar Sankaran (BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_QOS_8LVL) |\ 2925fdd593SJeykumar Sankaran BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_TS_PREFILL_REC1) |\ 3025fdd593SJeykumar Sankaran BIT(DPU_SSPP_CDP) | BIT(DPU_SSPP_EXCL_RECT)) 3125fdd593SJeykumar Sankaran 3207ca1fc0SSravanthi Kollukuduru #define DMA_CURSOR_SDM845_MASK \ 3307ca1fc0SSravanthi Kollukuduru (DMA_SDM845_MASK | BIT(DPU_SSPP_CURSOR)) 3407ca1fc0SSravanthi Kollukuduru 3525fdd593SJeykumar Sankaran #define MIXER_SDM845_MASK \ 3625fdd593SJeykumar Sankaran (BIT(DPU_MIXER_SOURCESPLIT) | BIT(DPU_DIM_LAYER)) 3725fdd593SJeykumar Sankaran 3825fdd593SJeykumar Sankaran #define PINGPONG_SDM845_MASK BIT(DPU_PINGPONG_DITHER) 3925fdd593SJeykumar Sankaran 4025fdd593SJeykumar Sankaran #define PINGPONG_SDM845_SPLIT_MASK \ 4125fdd593SJeykumar Sankaran (PINGPONG_SDM845_MASK | BIT(DPU_PINGPONG_TE2)) 4225fdd593SJeykumar Sankaran 4325fdd593SJeykumar Sankaran #define DEFAULT_PIXEL_RAM_SIZE (50 * 1024) 4425fdd593SJeykumar Sankaran #define DEFAULT_DPU_LINE_WIDTH 2048 4525fdd593SJeykumar Sankaran #define DEFAULT_DPU_OUTPUT_LINE_WIDTH 2560 4625fdd593SJeykumar Sankaran 4725fdd593SJeykumar Sankaran #define MAX_HORZ_DECIMATION 4 4825fdd593SJeykumar Sankaran #define MAX_VERT_DECIMATION 4 4925fdd593SJeykumar Sankaran 5025fdd593SJeykumar Sankaran #define MAX_UPSCALE_RATIO 20 5125fdd593SJeykumar Sankaran #define MAX_DOWNSCALE_RATIO 4 5225fdd593SJeykumar Sankaran #define SSPP_UNITY_SCALE 1 5325fdd593SJeykumar Sankaran 5425fdd593SJeykumar Sankaran #define STRCAT(X, Y) (X Y) 5525fdd593SJeykumar Sankaran 5625fdd593SJeykumar Sankaran /************************************************************* 5725fdd593SJeykumar Sankaran * DPU sub blocks config 5825fdd593SJeykumar Sankaran *************************************************************/ 5925fdd593SJeykumar Sankaran /* DPU top level caps */ 6025fdd593SJeykumar Sankaran static const struct dpu_caps sdm845_dpu_caps = { 6125fdd593SJeykumar Sankaran .max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 6225fdd593SJeykumar Sankaran .max_mixer_blendstages = 0xb, 6325fdd593SJeykumar Sankaran .qseed_type = DPU_SSPP_SCALER_QSEED3, 6425fdd593SJeykumar Sankaran .smart_dma_rev = DPU_SSPP_SMART_DMA_V2, 6525fdd593SJeykumar Sankaran .ubwc_version = DPU_HW_UBWC_VER_20, 6625fdd593SJeykumar Sankaran .has_src_split = true, 6725fdd593SJeykumar Sankaran .has_dim_layer = true, 6825fdd593SJeykumar Sankaran .has_idle_pc = true, 6925fdd593SJeykumar Sankaran }; 7025fdd593SJeykumar Sankaran 7125fdd593SJeykumar Sankaran static struct dpu_mdp_cfg sdm845_mdp[] = { 7225fdd593SJeykumar Sankaran { 7325fdd593SJeykumar Sankaran .name = "top_0", .id = MDP_TOP, 7425fdd593SJeykumar Sankaran .base = 0x0, .len = 0x45C, 7525fdd593SJeykumar Sankaran .features = 0, 7625fdd593SJeykumar Sankaran .highest_bank_bit = 0x2, 7725fdd593SJeykumar Sankaran .has_dest_scaler = true, 7825fdd593SJeykumar Sankaran .clk_ctrls[DPU_CLK_CTRL_VIG0] = { 7925fdd593SJeykumar Sankaran .reg_off = 0x2AC, .bit_off = 0}, 8025fdd593SJeykumar Sankaran .clk_ctrls[DPU_CLK_CTRL_VIG1] = { 8125fdd593SJeykumar Sankaran .reg_off = 0x2B4, .bit_off = 0}, 8225fdd593SJeykumar Sankaran .clk_ctrls[DPU_CLK_CTRL_VIG2] = { 8325fdd593SJeykumar Sankaran .reg_off = 0x2BC, .bit_off = 0}, 8425fdd593SJeykumar Sankaran .clk_ctrls[DPU_CLK_CTRL_VIG3] = { 8525fdd593SJeykumar Sankaran .reg_off = 0x2C4, .bit_off = 0}, 8625fdd593SJeykumar Sankaran .clk_ctrls[DPU_CLK_CTRL_DMA0] = { 8725fdd593SJeykumar Sankaran .reg_off = 0x2AC, .bit_off = 8}, 8825fdd593SJeykumar Sankaran .clk_ctrls[DPU_CLK_CTRL_DMA1] = { 8925fdd593SJeykumar Sankaran .reg_off = 0x2B4, .bit_off = 8}, 9025fdd593SJeykumar Sankaran .clk_ctrls[DPU_CLK_CTRL_CURSOR0] = { 9125fdd593SJeykumar Sankaran .reg_off = 0x2BC, .bit_off = 8}, 9225fdd593SJeykumar Sankaran .clk_ctrls[DPU_CLK_CTRL_CURSOR1] = { 9325fdd593SJeykumar Sankaran .reg_off = 0x2C4, .bit_off = 8}, 9425fdd593SJeykumar Sankaran }, 9525fdd593SJeykumar Sankaran }; 9625fdd593SJeykumar Sankaran 9725fdd593SJeykumar Sankaran /************************************************************* 9825fdd593SJeykumar Sankaran * CTL sub blocks config 9925fdd593SJeykumar Sankaran *************************************************************/ 10025fdd593SJeykumar Sankaran static struct dpu_ctl_cfg sdm845_ctl[] = { 10125fdd593SJeykumar Sankaran { 10225fdd593SJeykumar Sankaran .name = "ctl_0", .id = CTL_0, 10325fdd593SJeykumar Sankaran .base = 0x1000, .len = 0xE4, 10425fdd593SJeykumar Sankaran .features = BIT(DPU_CTL_SPLIT_DISPLAY) 10525fdd593SJeykumar Sankaran }, 10625fdd593SJeykumar Sankaran { 10725fdd593SJeykumar Sankaran .name = "ctl_1", .id = CTL_1, 10825fdd593SJeykumar Sankaran .base = 0x1200, .len = 0xE4, 10925fdd593SJeykumar Sankaran .features = BIT(DPU_CTL_SPLIT_DISPLAY) 11025fdd593SJeykumar Sankaran }, 11125fdd593SJeykumar Sankaran { 11225fdd593SJeykumar Sankaran .name = "ctl_2", .id = CTL_2, 11325fdd593SJeykumar Sankaran .base = 0x1400, .len = 0xE4, 11425fdd593SJeykumar Sankaran .features = 0 11525fdd593SJeykumar Sankaran }, 11625fdd593SJeykumar Sankaran { 11725fdd593SJeykumar Sankaran .name = "ctl_3", .id = CTL_3, 11825fdd593SJeykumar Sankaran .base = 0x1600, .len = 0xE4, 11925fdd593SJeykumar Sankaran .features = 0 12025fdd593SJeykumar Sankaran }, 12125fdd593SJeykumar Sankaran { 12225fdd593SJeykumar Sankaran .name = "ctl_4", .id = CTL_4, 12325fdd593SJeykumar Sankaran .base = 0x1800, .len = 0xE4, 12425fdd593SJeykumar Sankaran .features = 0 12525fdd593SJeykumar Sankaran }, 12625fdd593SJeykumar Sankaran }; 12725fdd593SJeykumar Sankaran 12825fdd593SJeykumar Sankaran /************************************************************* 12925fdd593SJeykumar Sankaran * SSPP sub blocks config 13025fdd593SJeykumar Sankaran *************************************************************/ 13125fdd593SJeykumar Sankaran 13225fdd593SJeykumar Sankaran /* SSPP common configuration */ 13325fdd593SJeykumar Sankaran static const struct dpu_sspp_blks_common sdm845_sspp_common = { 13425fdd593SJeykumar Sankaran .maxlinewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 13525fdd593SJeykumar Sankaran .pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, 13625fdd593SJeykumar Sankaran .maxhdeciexp = MAX_HORZ_DECIMATION, 13725fdd593SJeykumar Sankaran .maxvdeciexp = MAX_VERT_DECIMATION, 13825fdd593SJeykumar Sankaran }; 13925fdd593SJeykumar Sankaran 14025fdd593SJeykumar Sankaran #define _VIG_SBLK(num, sdma_pri) \ 14125fdd593SJeykumar Sankaran { \ 14225fdd593SJeykumar Sankaran .common = &sdm845_sspp_common, \ 14325fdd593SJeykumar Sankaran .maxdwnscale = MAX_DOWNSCALE_RATIO, \ 14425fdd593SJeykumar Sankaran .maxupscale = MAX_UPSCALE_RATIO, \ 14525fdd593SJeykumar Sankaran .smart_dma_priority = sdma_pri, \ 14625fdd593SJeykumar Sankaran .src_blk = {.name = STRCAT("sspp_src_", num), \ 14725fdd593SJeykumar Sankaran .id = DPU_SSPP_SRC, .base = 0x00, .len = 0x150,}, \ 14825fdd593SJeykumar Sankaran .scaler_blk = {.name = STRCAT("sspp_scaler", num), \ 14925fdd593SJeykumar Sankaran .id = DPU_SSPP_SCALER_QSEED3, \ 15025fdd593SJeykumar Sankaran .base = 0xa00, .len = 0xa0,}, \ 15125fdd593SJeykumar Sankaran .csc_blk = {.name = STRCAT("sspp_csc", num), \ 15225fdd593SJeykumar Sankaran .id = DPU_SSPP_CSC_10BIT, \ 15325fdd593SJeykumar Sankaran .base = 0x1a00, .len = 0x100,}, \ 15425fdd593SJeykumar Sankaran .format_list = plane_formats_yuv, \ 15525fdd593SJeykumar Sankaran .virt_format_list = plane_formats, \ 15625fdd593SJeykumar Sankaran } 15725fdd593SJeykumar Sankaran 15825fdd593SJeykumar Sankaran #define _DMA_SBLK(num, sdma_pri) \ 15925fdd593SJeykumar Sankaran { \ 16025fdd593SJeykumar Sankaran .common = &sdm845_sspp_common, \ 16125fdd593SJeykumar Sankaran .maxdwnscale = SSPP_UNITY_SCALE, \ 16225fdd593SJeykumar Sankaran .maxupscale = SSPP_UNITY_SCALE, \ 16325fdd593SJeykumar Sankaran .smart_dma_priority = sdma_pri, \ 16425fdd593SJeykumar Sankaran .src_blk = {.name = STRCAT("sspp_src_", num), \ 16525fdd593SJeykumar Sankaran .id = DPU_SSPP_SRC, .base = 0x00, .len = 0x150,}, \ 16625fdd593SJeykumar Sankaran .format_list = plane_formats, \ 16725fdd593SJeykumar Sankaran .virt_format_list = plane_formats, \ 16825fdd593SJeykumar Sankaran } 16925fdd593SJeykumar Sankaran 17025fdd593SJeykumar Sankaran static const struct dpu_sspp_sub_blks sdm845_vig_sblk_0 = _VIG_SBLK("0", 5); 17125fdd593SJeykumar Sankaran static const struct dpu_sspp_sub_blks sdm845_vig_sblk_1 = _VIG_SBLK("1", 6); 17225fdd593SJeykumar Sankaran static const struct dpu_sspp_sub_blks sdm845_vig_sblk_2 = _VIG_SBLK("2", 7); 17325fdd593SJeykumar Sankaran static const struct dpu_sspp_sub_blks sdm845_vig_sblk_3 = _VIG_SBLK("3", 8); 17425fdd593SJeykumar Sankaran 17525fdd593SJeykumar Sankaran static const struct dpu_sspp_sub_blks sdm845_dma_sblk_0 = _DMA_SBLK("8", 1); 17625fdd593SJeykumar Sankaran static const struct dpu_sspp_sub_blks sdm845_dma_sblk_1 = _DMA_SBLK("9", 2); 17725fdd593SJeykumar Sankaran static const struct dpu_sspp_sub_blks sdm845_dma_sblk_2 = _DMA_SBLK("10", 3); 17825fdd593SJeykumar Sankaran static const struct dpu_sspp_sub_blks sdm845_dma_sblk_3 = _DMA_SBLK("11", 4); 17925fdd593SJeykumar Sankaran 18007ca1fc0SSravanthi Kollukuduru #define SSPP_BLK(_name, _id, _base, _features, \ 18107ca1fc0SSravanthi Kollukuduru _sblk, _xinid, _type, _clkctrl) \ 18225fdd593SJeykumar Sankaran { \ 18325fdd593SJeykumar Sankaran .name = _name, .id = _id, \ 18425fdd593SJeykumar Sankaran .base = _base, .len = 0x1c8, \ 18507ca1fc0SSravanthi Kollukuduru .features = _features, \ 18625fdd593SJeykumar Sankaran .sblk = &_sblk, \ 18725fdd593SJeykumar Sankaran .xin_id = _xinid, \ 18807ca1fc0SSravanthi Kollukuduru .type = _type, \ 18925fdd593SJeykumar Sankaran .clk_ctrl = _clkctrl \ 19025fdd593SJeykumar Sankaran } 19125fdd593SJeykumar Sankaran 19225fdd593SJeykumar Sankaran static struct dpu_sspp_cfg sdm845_sspp[] = { 19307ca1fc0SSravanthi Kollukuduru SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SDM845_MASK, 19407ca1fc0SSravanthi Kollukuduru sdm845_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), 19507ca1fc0SSravanthi Kollukuduru SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SDM845_MASK, 19607ca1fc0SSravanthi Kollukuduru sdm845_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), 19707ca1fc0SSravanthi Kollukuduru SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SDM845_MASK, 19807ca1fc0SSravanthi Kollukuduru sdm845_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), 19907ca1fc0SSravanthi Kollukuduru SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SDM845_MASK, 20007ca1fc0SSravanthi Kollukuduru sdm845_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), 20107ca1fc0SSravanthi Kollukuduru SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK, 20207ca1fc0SSravanthi Kollukuduru sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), 20307ca1fc0SSravanthi Kollukuduru SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, DMA_SDM845_MASK, 20407ca1fc0SSravanthi Kollukuduru sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), 20507ca1fc0SSravanthi Kollukuduru SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, DMA_CURSOR_SDM845_MASK, 20607ca1fc0SSravanthi Kollukuduru sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR0), 20707ca1fc0SSravanthi Kollukuduru SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, DMA_CURSOR_SDM845_MASK, 20807ca1fc0SSravanthi Kollukuduru sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_CURSOR1), 20925fdd593SJeykumar Sankaran }; 21025fdd593SJeykumar Sankaran 21125fdd593SJeykumar Sankaran /************************************************************* 21225fdd593SJeykumar Sankaran * MIXER sub blocks config 21325fdd593SJeykumar Sankaran *************************************************************/ 21425fdd593SJeykumar Sankaran static const struct dpu_lm_sub_blks sdm845_lm_sblk = { 21525fdd593SJeykumar Sankaran .maxwidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 21625fdd593SJeykumar Sankaran .maxblendstages = 11, /* excluding base layer */ 21725fdd593SJeykumar Sankaran .blendstage_base = { /* offsets relative to mixer base */ 21825fdd593SJeykumar Sankaran 0x20, 0x38, 0x50, 0x68, 0x80, 0x98, 21925fdd593SJeykumar Sankaran 0xb0, 0xc8, 0xe0, 0xf8, 0x110 22025fdd593SJeykumar Sankaran }, 22125fdd593SJeykumar Sankaran }; 22225fdd593SJeykumar Sankaran 22325fdd593SJeykumar Sankaran #define LM_BLK(_name, _id, _base, _ds, _pp, _lmpair) \ 22425fdd593SJeykumar Sankaran { \ 22525fdd593SJeykumar Sankaran .name = _name, .id = _id, \ 22625fdd593SJeykumar Sankaran .base = _base, .len = 0x320, \ 22725fdd593SJeykumar Sankaran .features = MIXER_SDM845_MASK, \ 22825fdd593SJeykumar Sankaran .sblk = &sdm845_lm_sblk, \ 22925fdd593SJeykumar Sankaran .ds = _ds, \ 23025fdd593SJeykumar Sankaran .pingpong = _pp, \ 23125fdd593SJeykumar Sankaran .lm_pair_mask = (1 << _lmpair) \ 23225fdd593SJeykumar Sankaran } 23325fdd593SJeykumar Sankaran 23425fdd593SJeykumar Sankaran static struct dpu_lm_cfg sdm845_lm[] = { 23525fdd593SJeykumar Sankaran LM_BLK("lm_0", LM_0, 0x44000, DS_0, PINGPONG_0, LM_1), 23625fdd593SJeykumar Sankaran LM_BLK("lm_1", LM_1, 0x45000, DS_1, PINGPONG_1, LM_0), 23725fdd593SJeykumar Sankaran LM_BLK("lm_2", LM_2, 0x46000, DS_MAX, PINGPONG_2, LM_5), 23825fdd593SJeykumar Sankaran LM_BLK("lm_3", LM_3, 0x0, DS_MAX, PINGPONG_MAX, 0), 23925fdd593SJeykumar Sankaran LM_BLK("lm_4", LM_4, 0x0, DS_MAX, PINGPONG_MAX, 0), 24025fdd593SJeykumar Sankaran LM_BLK("lm_5", LM_5, 0x49000, DS_MAX, PINGPONG_3, LM_2), 24125fdd593SJeykumar Sankaran }; 24225fdd593SJeykumar Sankaran 24325fdd593SJeykumar Sankaran /************************************************************* 24425fdd593SJeykumar Sankaran * DS sub blocks config 24525fdd593SJeykumar Sankaran *************************************************************/ 24625fdd593SJeykumar Sankaran static const struct dpu_ds_top_cfg sdm845_ds_top = { 24725fdd593SJeykumar Sankaran .name = "ds_top_0", .id = DS_TOP, 24825fdd593SJeykumar Sankaran .base = 0x60000, .len = 0xc, 24925fdd593SJeykumar Sankaran .maxinputwidth = DEFAULT_DPU_LINE_WIDTH, 25025fdd593SJeykumar Sankaran .maxoutputwidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, 25125fdd593SJeykumar Sankaran .maxupscale = MAX_UPSCALE_RATIO, 25225fdd593SJeykumar Sankaran }; 25325fdd593SJeykumar Sankaran 25425fdd593SJeykumar Sankaran #define DS_BLK(_name, _id, _base) \ 25525fdd593SJeykumar Sankaran {\ 25625fdd593SJeykumar Sankaran .name = _name, .id = _id, \ 25725fdd593SJeykumar Sankaran .base = _base, .len = 0x800, \ 25825fdd593SJeykumar Sankaran .features = DPU_SSPP_SCALER_QSEED3, \ 25925fdd593SJeykumar Sankaran .top = &sdm845_ds_top \ 26025fdd593SJeykumar Sankaran } 26125fdd593SJeykumar Sankaran 26225fdd593SJeykumar Sankaran static struct dpu_ds_cfg sdm845_ds[] = { 26325fdd593SJeykumar Sankaran DS_BLK("ds_0", DS_0, 0x800), 26425fdd593SJeykumar Sankaran DS_BLK("ds_1", DS_1, 0x1000), 26525fdd593SJeykumar Sankaran }; 26625fdd593SJeykumar Sankaran 26725fdd593SJeykumar Sankaran /************************************************************* 26825fdd593SJeykumar Sankaran * PINGPONG sub blocks config 26925fdd593SJeykumar Sankaran *************************************************************/ 27025fdd593SJeykumar Sankaran static const struct dpu_pingpong_sub_blks sdm845_pp_sblk_te = { 27125fdd593SJeykumar Sankaran .te2 = {.id = DPU_PINGPONG_TE2, .base = 0x2000, .len = 0x0, 27225fdd593SJeykumar Sankaran .version = 0x1}, 27325fdd593SJeykumar Sankaran .dither = {.id = DPU_PINGPONG_DITHER, .base = 0x30e0, 27425fdd593SJeykumar Sankaran .len = 0x20, .version = 0x10000}, 27525fdd593SJeykumar Sankaran }; 27625fdd593SJeykumar Sankaran 27725fdd593SJeykumar Sankaran static const struct dpu_pingpong_sub_blks sdm845_pp_sblk = { 27825fdd593SJeykumar Sankaran .dither = {.id = DPU_PINGPONG_DITHER, .base = 0x30e0, 27925fdd593SJeykumar Sankaran .len = 0x20, .version = 0x10000}, 28025fdd593SJeykumar Sankaran }; 28125fdd593SJeykumar Sankaran 28225fdd593SJeykumar Sankaran #define PP_BLK_TE(_name, _id, _base) \ 28325fdd593SJeykumar Sankaran {\ 28425fdd593SJeykumar Sankaran .name = _name, .id = _id, \ 28525fdd593SJeykumar Sankaran .base = _base, .len = 0xd4, \ 28625fdd593SJeykumar Sankaran .features = PINGPONG_SDM845_SPLIT_MASK, \ 28725fdd593SJeykumar Sankaran .sblk = &sdm845_pp_sblk_te \ 28825fdd593SJeykumar Sankaran } 28925fdd593SJeykumar Sankaran #define PP_BLK(_name, _id, _base) \ 29025fdd593SJeykumar Sankaran {\ 29125fdd593SJeykumar Sankaran .name = _name, .id = _id, \ 29225fdd593SJeykumar Sankaran .base = _base, .len = 0xd4, \ 29325fdd593SJeykumar Sankaran .features = PINGPONG_SDM845_MASK, \ 29425fdd593SJeykumar Sankaran .sblk = &sdm845_pp_sblk \ 29525fdd593SJeykumar Sankaran } 29625fdd593SJeykumar Sankaran 29725fdd593SJeykumar Sankaran static struct dpu_pingpong_cfg sdm845_pp[] = { 29825fdd593SJeykumar Sankaran PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000), 29925fdd593SJeykumar Sankaran PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800), 30025fdd593SJeykumar Sankaran PP_BLK("pingpong_2", PINGPONG_2, 0x71000), 30125fdd593SJeykumar Sankaran PP_BLK("pingpong_3", PINGPONG_3, 0x71800), 30225fdd593SJeykumar Sankaran }; 30325fdd593SJeykumar Sankaran 30425fdd593SJeykumar Sankaran /************************************************************* 30525fdd593SJeykumar Sankaran * INTF sub blocks config 30625fdd593SJeykumar Sankaran *************************************************************/ 30725fdd593SJeykumar Sankaran #define INTF_BLK(_name, _id, _base, _type, _ctrl_id) \ 30825fdd593SJeykumar Sankaran {\ 30925fdd593SJeykumar Sankaran .name = _name, .id = _id, \ 31025fdd593SJeykumar Sankaran .base = _base, .len = 0x280, \ 31125fdd593SJeykumar Sankaran .type = _type, \ 31225fdd593SJeykumar Sankaran .controller_id = _ctrl_id, \ 31325fdd593SJeykumar Sankaran .prog_fetch_lines_worst_case = 24 \ 31425fdd593SJeykumar Sankaran } 31525fdd593SJeykumar Sankaran 31625fdd593SJeykumar Sankaran static struct dpu_intf_cfg sdm845_intf[] = { 31725fdd593SJeykumar Sankaran INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0), 31825fdd593SJeykumar Sankaran INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0), 31925fdd593SJeykumar Sankaran INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1), 32025fdd593SJeykumar Sankaran INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 1), 32125fdd593SJeykumar Sankaran }; 32225fdd593SJeykumar Sankaran 32325fdd593SJeykumar Sankaran /************************************************************* 32425fdd593SJeykumar Sankaran * CDM sub blocks config 32525fdd593SJeykumar Sankaran *************************************************************/ 32625fdd593SJeykumar Sankaran static struct dpu_cdm_cfg sdm845_cdm[] = { 32725fdd593SJeykumar Sankaran { 32825fdd593SJeykumar Sankaran .name = "cdm_0", .id = CDM_0, 32925fdd593SJeykumar Sankaran .base = 0x79200, .len = 0x224, 33025fdd593SJeykumar Sankaran .features = 0, 33125fdd593SJeykumar Sankaran .intf_connect = BIT(INTF_3), 33225fdd593SJeykumar Sankaran }, 33325fdd593SJeykumar Sankaran }; 33425fdd593SJeykumar Sankaran 33525fdd593SJeykumar Sankaran /************************************************************* 33625fdd593SJeykumar Sankaran * VBIF sub blocks config 33725fdd593SJeykumar Sankaran *************************************************************/ 33825fdd593SJeykumar Sankaran /* VBIF QOS remap */ 33925fdd593SJeykumar Sankaran static u32 sdm845_rt_pri_lvl[] = {3, 3, 4, 4, 5, 5, 6, 6}; 34025fdd593SJeykumar Sankaran static u32 sdm845_nrt_pri_lvl[] = {3, 3, 3, 3, 3, 3, 3, 3}; 34125fdd593SJeykumar Sankaran 34225fdd593SJeykumar Sankaran static struct dpu_vbif_cfg sdm845_vbif[] = { 34325fdd593SJeykumar Sankaran { 34425fdd593SJeykumar Sankaran .name = "vbif_0", .id = VBIF_0, 34525fdd593SJeykumar Sankaran .base = 0, .len = 0x1040, 34625fdd593SJeykumar Sankaran .features = BIT(DPU_VBIF_QOS_REMAP), 34725fdd593SJeykumar Sankaran .xin_halt_timeout = 0x4000, 34825fdd593SJeykumar Sankaran .qos_rt_tbl = { 34925fdd593SJeykumar Sankaran .npriority_lvl = ARRAY_SIZE(sdm845_rt_pri_lvl), 35025fdd593SJeykumar Sankaran .priority_lvl = sdm845_rt_pri_lvl, 35125fdd593SJeykumar Sankaran }, 35225fdd593SJeykumar Sankaran .qos_nrt_tbl = { 35325fdd593SJeykumar Sankaran .npriority_lvl = ARRAY_SIZE(sdm845_nrt_pri_lvl), 35425fdd593SJeykumar Sankaran .priority_lvl = sdm845_nrt_pri_lvl, 35525fdd593SJeykumar Sankaran }, 35625fdd593SJeykumar Sankaran .memtype_count = 14, 35725fdd593SJeykumar Sankaran .memtype = {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, 35825fdd593SJeykumar Sankaran }, 35925fdd593SJeykumar Sankaran }; 36025fdd593SJeykumar Sankaran 36125fdd593SJeykumar Sankaran static struct dpu_reg_dma_cfg sdm845_regdma = { 36225fdd593SJeykumar Sankaran .base = 0x0, .version = 0x1, .trigger_sel_off = 0x119c 36325fdd593SJeykumar Sankaran }; 36425fdd593SJeykumar Sankaran 36525fdd593SJeykumar Sankaran /************************************************************* 36625fdd593SJeykumar Sankaran * PERF data config 36725fdd593SJeykumar Sankaran *************************************************************/ 36825fdd593SJeykumar Sankaran 36925fdd593SJeykumar Sankaran /* SSPP QOS LUTs */ 37025fdd593SJeykumar Sankaran static struct dpu_qos_lut_entry sdm845_qos_linear[] = { 37125fdd593SJeykumar Sankaran {.fl = 4, .lut = 0x357}, 37225fdd593SJeykumar Sankaran {.fl = 5, .lut = 0x3357}, 37325fdd593SJeykumar Sankaran {.fl = 6, .lut = 0x23357}, 37425fdd593SJeykumar Sankaran {.fl = 7, .lut = 0x223357}, 37525fdd593SJeykumar Sankaran {.fl = 8, .lut = 0x2223357}, 37625fdd593SJeykumar Sankaran {.fl = 9, .lut = 0x22223357}, 37725fdd593SJeykumar Sankaran {.fl = 10, .lut = 0x222223357}, 37825fdd593SJeykumar Sankaran {.fl = 11, .lut = 0x2222223357}, 37925fdd593SJeykumar Sankaran {.fl = 12, .lut = 0x22222223357}, 38025fdd593SJeykumar Sankaran {.fl = 13, .lut = 0x222222223357}, 38125fdd593SJeykumar Sankaran {.fl = 14, .lut = 0x1222222223357}, 38225fdd593SJeykumar Sankaran {.fl = 0, .lut = 0x11222222223357} 38325fdd593SJeykumar Sankaran }; 38425fdd593SJeykumar Sankaran 38525fdd593SJeykumar Sankaran static struct dpu_qos_lut_entry sdm845_qos_macrotile[] = { 38625fdd593SJeykumar Sankaran {.fl = 10, .lut = 0x344556677}, 38725fdd593SJeykumar Sankaran {.fl = 11, .lut = 0x3344556677}, 38825fdd593SJeykumar Sankaran {.fl = 12, .lut = 0x23344556677}, 38925fdd593SJeykumar Sankaran {.fl = 13, .lut = 0x223344556677}, 39025fdd593SJeykumar Sankaran {.fl = 14, .lut = 0x1223344556677}, 39125fdd593SJeykumar Sankaran {.fl = 0, .lut = 0x112233344556677}, 39225fdd593SJeykumar Sankaran }; 39325fdd593SJeykumar Sankaran 39425fdd593SJeykumar Sankaran static struct dpu_qos_lut_entry sdm845_qos_nrt[] = { 39525fdd593SJeykumar Sankaran {.fl = 0, .lut = 0x0}, 39625fdd593SJeykumar Sankaran }; 39725fdd593SJeykumar Sankaran 39825fdd593SJeykumar Sankaran static struct dpu_perf_cfg sdm845_perf_data = { 39925fdd593SJeykumar Sankaran .max_bw_low = 6800000, 40025fdd593SJeykumar Sankaran .max_bw_high = 6800000, 40125fdd593SJeykumar Sankaran .min_core_ib = 2400000, 40225fdd593SJeykumar Sankaran .min_llcc_ib = 800000, 40325fdd593SJeykumar Sankaran .min_dram_ib = 800000, 40425fdd593SJeykumar Sankaran .core_ib_ff = "6.0", 40525fdd593SJeykumar Sankaran .core_clk_ff = "1.0", 40625fdd593SJeykumar Sankaran .comp_ratio_rt = 40725fdd593SJeykumar Sankaran "NV12/5/1/1.23 AB24/5/1/1.23 XB24/5/1/1.23", 40825fdd593SJeykumar Sankaran .comp_ratio_nrt = 40925fdd593SJeykumar Sankaran "NV12/5/1/1.25 AB24/5/1/1.25 XB24/5/1/1.25", 41025fdd593SJeykumar Sankaran .undersized_prefill_lines = 2, 41125fdd593SJeykumar Sankaran .xtra_prefill_lines = 2, 41225fdd593SJeykumar Sankaran .dest_scale_prefill_lines = 3, 41325fdd593SJeykumar Sankaran .macrotile_prefill_lines = 4, 41425fdd593SJeykumar Sankaran .yuv_nv12_prefill_lines = 8, 41525fdd593SJeykumar Sankaran .linear_prefill_lines = 1, 41625fdd593SJeykumar Sankaran .downscaling_prefill_lines = 1, 41725fdd593SJeykumar Sankaran .amortizable_threshold = 25, 41825fdd593SJeykumar Sankaran .min_prefill_lines = 24, 41925fdd593SJeykumar Sankaran .danger_lut_tbl = {0xf, 0xffff, 0x0}, 42025fdd593SJeykumar Sankaran .qos_lut_tbl = { 42125fdd593SJeykumar Sankaran {.nentry = ARRAY_SIZE(sdm845_qos_linear), 42225fdd593SJeykumar Sankaran .entries = sdm845_qos_linear 42325fdd593SJeykumar Sankaran }, 42425fdd593SJeykumar Sankaran {.nentry = ARRAY_SIZE(sdm845_qos_macrotile), 42525fdd593SJeykumar Sankaran .entries = sdm845_qos_macrotile 42625fdd593SJeykumar Sankaran }, 42725fdd593SJeykumar Sankaran {.nentry = ARRAY_SIZE(sdm845_qos_nrt), 42825fdd593SJeykumar Sankaran .entries = sdm845_qos_nrt 42925fdd593SJeykumar Sankaran }, 43025fdd593SJeykumar Sankaran }, 43125fdd593SJeykumar Sankaran .cdp_cfg = { 43225fdd593SJeykumar Sankaran {.rd_enable = 1, .wr_enable = 1}, 43325fdd593SJeykumar Sankaran {.rd_enable = 1, .wr_enable = 0} 43425fdd593SJeykumar Sankaran }, 43525fdd593SJeykumar Sankaran }; 43625fdd593SJeykumar Sankaran 43725fdd593SJeykumar Sankaran /************************************************************* 43825fdd593SJeykumar Sankaran * Hardware catalog init 43925fdd593SJeykumar Sankaran *************************************************************/ 44025fdd593SJeykumar Sankaran 44125fdd593SJeykumar Sankaran /* 44225fdd593SJeykumar Sankaran * sdm845_cfg_init(): populate sdm845 dpu sub-blocks reg offsets 44325fdd593SJeykumar Sankaran * and instance counts. 44425fdd593SJeykumar Sankaran */ 445fba33caeSJordan Crouse static void sdm845_cfg_init(struct dpu_mdss_cfg *dpu_cfg) 44625fdd593SJeykumar Sankaran { 44725fdd593SJeykumar Sankaran *dpu_cfg = (struct dpu_mdss_cfg){ 44825fdd593SJeykumar Sankaran .caps = &sdm845_dpu_caps, 44925fdd593SJeykumar Sankaran .mdp_count = ARRAY_SIZE(sdm845_mdp), 45025fdd593SJeykumar Sankaran .mdp = sdm845_mdp, 45125fdd593SJeykumar Sankaran .ctl_count = ARRAY_SIZE(sdm845_ctl), 45225fdd593SJeykumar Sankaran .ctl = sdm845_ctl, 45325fdd593SJeykumar Sankaran .sspp_count = ARRAY_SIZE(sdm845_sspp), 45425fdd593SJeykumar Sankaran .sspp = sdm845_sspp, 45525fdd593SJeykumar Sankaran .mixer_count = ARRAY_SIZE(sdm845_lm), 45625fdd593SJeykumar Sankaran .mixer = sdm845_lm, 45725fdd593SJeykumar Sankaran .ds_count = ARRAY_SIZE(sdm845_ds), 45825fdd593SJeykumar Sankaran .ds = sdm845_ds, 45925fdd593SJeykumar Sankaran .pingpong_count = ARRAY_SIZE(sdm845_pp), 46025fdd593SJeykumar Sankaran .pingpong = sdm845_pp, 46125fdd593SJeykumar Sankaran .cdm_count = ARRAY_SIZE(sdm845_cdm), 46225fdd593SJeykumar Sankaran .cdm = sdm845_cdm, 46325fdd593SJeykumar Sankaran .intf_count = ARRAY_SIZE(sdm845_intf), 46425fdd593SJeykumar Sankaran .intf = sdm845_intf, 46525fdd593SJeykumar Sankaran .vbif_count = ARRAY_SIZE(sdm845_vbif), 46625fdd593SJeykumar Sankaran .vbif = sdm845_vbif, 46725fdd593SJeykumar Sankaran .reg_dma_count = 1, 46825fdd593SJeykumar Sankaran .dma_cfg = sdm845_regdma, 46925fdd593SJeykumar Sankaran .perf = sdm845_perf_data, 47025fdd593SJeykumar Sankaran }; 47125fdd593SJeykumar Sankaran } 47225fdd593SJeykumar Sankaran 47325fdd593SJeykumar Sankaran static struct dpu_mdss_hw_cfg_handler cfg_handler[] = { 47425fdd593SJeykumar Sankaran { .hw_rev = DPU_HW_VER_400, .cfg_init = sdm845_cfg_init}, 47525fdd593SJeykumar Sankaran { .hw_rev = DPU_HW_VER_401, .cfg_init = sdm845_cfg_init}, 47625fdd593SJeykumar Sankaran }; 47725fdd593SJeykumar Sankaran 47825fdd593SJeykumar Sankaran void dpu_hw_catalog_deinit(struct dpu_mdss_cfg *dpu_cfg) 47925fdd593SJeykumar Sankaran { 48025fdd593SJeykumar Sankaran kfree(dpu_cfg); 48125fdd593SJeykumar Sankaran } 48225fdd593SJeykumar Sankaran 48325fdd593SJeykumar Sankaran struct dpu_mdss_cfg *dpu_hw_catalog_init(u32 hw_rev) 48425fdd593SJeykumar Sankaran { 48525fdd593SJeykumar Sankaran int i; 48625fdd593SJeykumar Sankaran struct dpu_mdss_cfg *dpu_cfg; 48725fdd593SJeykumar Sankaran 48825fdd593SJeykumar Sankaran dpu_cfg = kzalloc(sizeof(*dpu_cfg), GFP_KERNEL); 48925fdd593SJeykumar Sankaran if (!dpu_cfg) 49025fdd593SJeykumar Sankaran return ERR_PTR(-ENOMEM); 49125fdd593SJeykumar Sankaran 49225fdd593SJeykumar Sankaran for (i = 0; i < ARRAY_SIZE(cfg_handler); i++) { 49325fdd593SJeykumar Sankaran if (cfg_handler[i].hw_rev == hw_rev) { 49425fdd593SJeykumar Sankaran cfg_handler[i].cfg_init(dpu_cfg); 49525fdd593SJeykumar Sankaran dpu_cfg->hwversion = hw_rev; 49625fdd593SJeykumar Sankaran return dpu_cfg; 49725fdd593SJeykumar Sankaran } 49825fdd593SJeykumar Sankaran } 49925fdd593SJeykumar Sankaran 50025fdd593SJeykumar Sankaran DPU_ERROR("unsupported chipset id:%X\n", hw_rev); 50125fdd593SJeykumar Sankaran dpu_hw_catalog_deinit(dpu_cfg); 50225fdd593SJeykumar Sankaran return ERR_PTR(-ENODEV); 50325fdd593SJeykumar Sankaran } 50425fdd593SJeykumar Sankaran 505