blob: 1cc63ffde1a5907de9341bbcd6d9e82269038139 [file] [log] [blame]
/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include "sde_hw_catalog.h"
#include "sde_hw_mdss.h"
#include "sde_hwio.h"
/* VIG layer capability */
#define VIG_17X_MASK \
(BIT(SDE_SSPP_SRC) | BIT(SDE_SSPP_SCALER_QSEED2) |\
BIT(SDE_SSPP_CSC) | BIT(SDE_SSPP_HSIC) |\
BIT(SDE_SSPP_PCC) | BIT(SDE_SSPP_IGC) |\
BIT(SDE_SSPP_MEMCOLOR) | BIT(SDE_SSPP_QOS))
/* RGB layer capability */
#define RGB_17X_MASK \
(BIT(SDE_SSPP_SRC) | BIT(SDE_SSPP_SCALER_RGB) |\
BIT(SDE_SSPP_PCC) | BIT(SDE_SSPP_IGC) | BIT(SDE_SSPP_QOS))
/* DMA layer capability */
#define DMA_17X_MASK \
(BIT(SDE_SSPP_SRC) | BIT(SDE_SSPP_PCC) | BIT(SDE_SSPP_IGC) |\
BIT(SDE_SSPP_QOS))
/* Cursor layer capability */
#define CURSOR_17X_MASK (BIT(SDE_SSPP_SRC) | BIT(SDE_SSPP_CURSOR))
#define MIXER_17X_MASK (BIT(SDE_MIXER_SOURCESPLIT) |\
BIT(SDE_MIXER_GC))
#define DSPP_17X_MASK \
(BIT(SDE_DSPP_IGC) | BIT(SDE_DSPP_PCC) |\
BIT(SDE_DSPP_GC) | BIT(SDE_DSPP_HSIC) | BIT(SDE_DSPP_GAMUT) |\
BIT(SDE_DSPP_DITHER) | BIT(SDE_DSPP_HIST) | BIT(SDE_DSPP_MEMCOLOR) |\
BIT(SDE_DSPP_SIXZONE) | BIT(SDE_DSPP_AD) | BIT(SDE_DSPP_VLUT))
#define PINGPONG_17X_MASK \
(BIT(SDE_PINGPONG_TE) | BIT(SDE_PINGPONG_DSC))
#define PINGPONG_17X_SPLIT_MASK \
(PINGPONG_17X_MASK | BIT(SDE_PINGPONG_SPLIT) |\
BIT(SDE_PINGPONG_TE2))
#define WB01_17X_MASK \
(BIT(SDE_WB_LINE_MODE) | BIT(SDE_WB_BLOCK_MODE) |\
BIT(SDE_WB_CSC) | BIT(SDE_WB_CHROMA_DOWN) | BIT(SDE_WB_DOWNSCALE) |\
BIT(SDE_WB_DITHER) | BIT(SDE_WB_TRAFFIC_SHAPER) |\
BIT(SDE_WB_UBWC_1_0) | BIT(SDE_WB_YUV_CONFIG))
#define WB2_17X_MASK \
(BIT(SDE_WB_LINE_MODE) | BIT(SDE_WB_TRAFFIC_SHAPER) |\
BIT(SDE_WB_YUV_CONFIG))
#define DECIMATION_17X_MAX_H 4
#define DECIMATION_17X_MAX_V 4
#define RES_1080p ((u64)(1088*1920))
#define RES_UHD ((u64)(3840*2160))
static const struct sde_format_extended plane_formats[] = {
{DRM_FORMAT_ARGB8888, 0},
{DRM_FORMAT_ABGR8888, 0},
{DRM_FORMAT_RGBA8888, 0},
{DRM_FORMAT_RGBA8888, DRM_FORMAT_MOD_QCOM_COMPRESSED},
{DRM_FORMAT_BGRA8888, 0},
{DRM_FORMAT_XRGB8888, 0},
{DRM_FORMAT_RGBX8888, 0},
{DRM_FORMAT_RGBX8888, DRM_FORMAT_MOD_QCOM_COMPRESSED},
{DRM_FORMAT_RGB888, 0},
{DRM_FORMAT_BGR888, 0},
{DRM_FORMAT_RGB565, 0},
{DRM_FORMAT_RGB565, DRM_FORMAT_MOD_QCOM_COMPRESSED},
{DRM_FORMAT_BGR565, 0},
{DRM_FORMAT_ARGB1555, 0},
{DRM_FORMAT_ABGR1555, 0},
{DRM_FORMAT_RGBA5551, 0},
{DRM_FORMAT_BGRA5551, 0},
{DRM_FORMAT_XRGB1555, 0},
{DRM_FORMAT_XBGR1555, 0},
{DRM_FORMAT_RGBX5551, 0},
{DRM_FORMAT_BGRX5551, 0},
{DRM_FORMAT_ARGB4444, 0},
{DRM_FORMAT_ABGR4444, 0},
{DRM_FORMAT_RGBA4444, 0},
{DRM_FORMAT_BGRA4444, 0},
{DRM_FORMAT_XRGB4444, 0},
{DRM_FORMAT_XBGR4444, 0},
{DRM_FORMAT_RGBX4444, 0},
{DRM_FORMAT_BGRX4444, 0},
{0, 0},
};
static const struct sde_format_extended plane_formats_yuv[] = {
{DRM_FORMAT_ARGB8888, 0},
{DRM_FORMAT_ABGR8888, 0},
{DRM_FORMAT_RGBA8888, 0},
{DRM_FORMAT_RGBA8888, DRM_FORMAT_MOD_QCOM_COMPRESSED},
{DRM_FORMAT_BGRA8888, 0},
{DRM_FORMAT_XRGB8888, 0},
{DRM_FORMAT_RGBX8888, 0},
{DRM_FORMAT_RGBX8888, DRM_FORMAT_MOD_QCOM_COMPRESSED},
{DRM_FORMAT_RGB888, 0},
{DRM_FORMAT_BGR888, 0},
{DRM_FORMAT_RGB565, 0},
{DRM_FORMAT_RGB565, DRM_FORMAT_MOD_QCOM_COMPRESSED},
{DRM_FORMAT_BGR565, 0},
{DRM_FORMAT_ARGB1555, 0},
{DRM_FORMAT_ABGR1555, 0},
{DRM_FORMAT_RGBA5551, 0},
{DRM_FORMAT_BGRA5551, 0},
{DRM_FORMAT_XRGB1555, 0},
{DRM_FORMAT_XBGR1555, 0},
{DRM_FORMAT_RGBX5551, 0},
{DRM_FORMAT_BGRX5551, 0},
{DRM_FORMAT_ARGB4444, 0},
{DRM_FORMAT_ABGR4444, 0},
{DRM_FORMAT_RGBA4444, 0},
{DRM_FORMAT_BGRA4444, 0},
{DRM_FORMAT_XRGB4444, 0},
{DRM_FORMAT_XBGR4444, 0},
{DRM_FORMAT_RGBX4444, 0},
{DRM_FORMAT_BGRX4444, 0},
{DRM_FORMAT_NV12, 0},
{DRM_FORMAT_NV12, DRM_FORMAT_MOD_QCOM_COMPRESSED},
{DRM_FORMAT_NV21, 0},
{DRM_FORMAT_NV16, 0},
{DRM_FORMAT_NV61, 0},
{DRM_FORMAT_VYUY, 0},
{DRM_FORMAT_UYVY, 0},
{DRM_FORMAT_YUYV, 0},
{DRM_FORMAT_YVYU, 0},
{DRM_FORMAT_YUV420, 0},
{DRM_FORMAT_YVU420, 0},
{0, 0},
};
static const struct sde_format_extended wb0_formats[] = {
{DRM_FORMAT_RGB565, 0},
{DRM_FORMAT_RGB888, 0},
{DRM_FORMAT_ARGB8888, 0},
{DRM_FORMAT_RGBA8888, 0},
{DRM_FORMAT_XRGB8888, 0},
{DRM_FORMAT_RGBX8888, 0},
{DRM_FORMAT_ARGB1555, 0},
{DRM_FORMAT_RGBA5551, 0},
{DRM_FORMAT_XRGB1555, 0},
{DRM_FORMAT_RGBX5551, 0},
{DRM_FORMAT_ARGB4444, 0},
{DRM_FORMAT_RGBA4444, 0},
{DRM_FORMAT_RGBX4444, 0},
{DRM_FORMAT_XRGB4444, 0},
{DRM_FORMAT_BGR565, 0},
{DRM_FORMAT_BGR888, 0},
{DRM_FORMAT_ABGR8888, 0},
{DRM_FORMAT_BGRA8888, 0},
{DRM_FORMAT_BGRX8888, 0},
{DRM_FORMAT_ABGR1555, 0},
{DRM_FORMAT_BGRA5551, 0},
{DRM_FORMAT_XBGR1555, 0},
{DRM_FORMAT_BGRX5551, 0},
{DRM_FORMAT_ABGR4444, 0},
{DRM_FORMAT_BGRA4444, 0},
{DRM_FORMAT_BGRX4444, 0},
{DRM_FORMAT_XBGR4444, 0},
{DRM_FORMAT_RGBX8888, DRM_FORMAT_MOD_QCOM_COMPRESSED},
{DRM_FORMAT_RGBA8888, DRM_FORMAT_MOD_QCOM_COMPRESSED},
{DRM_FORMAT_RGB565, DRM_FORMAT_MOD_QCOM_COMPRESSED},
{DRM_FORMAT_YUV420, 0},
{DRM_FORMAT_NV12, 0},
{DRM_FORMAT_NV16, 0},
{DRM_FORMAT_YUYV, 0},
{DRM_FORMAT_NV12, DRM_FORMAT_MOD_QCOM_COMPRESSED},
{DRM_FORMAT_AYUV, DRM_FORMAT_MOD_QCOM_COMPRESSED},
{0, 0},
};
static const struct sde_format_extended wb2_formats[] = {
{DRM_FORMAT_RGB565, 0},
{DRM_FORMAT_RGB888, 0},
{DRM_FORMAT_ARGB8888, 0},
{DRM_FORMAT_RGBA8888, 0},
{DRM_FORMAT_XRGB8888, 0},
{DRM_FORMAT_RGBX8888, 0},
{DRM_FORMAT_ARGB1555, 0},
{DRM_FORMAT_RGBA5551, 0},
{DRM_FORMAT_XRGB1555, 0},
{DRM_FORMAT_RGBX5551, 0},
{DRM_FORMAT_ARGB4444, 0},
{DRM_FORMAT_RGBA4444, 0},
{DRM_FORMAT_RGBX4444, 0},
{DRM_FORMAT_XRGB4444, 0},
{DRM_FORMAT_BGR565, 0},
{DRM_FORMAT_BGR888, 0},
{DRM_FORMAT_ABGR8888, 0},
{DRM_FORMAT_BGRA8888, 0},
{DRM_FORMAT_BGRX8888, 0},
{DRM_FORMAT_ABGR1555, 0},
{DRM_FORMAT_BGRA5551, 0},
{DRM_FORMAT_XBGR1555, 0},
{DRM_FORMAT_BGRX5551, 0},
{DRM_FORMAT_ABGR4444, 0},
{DRM_FORMAT_BGRA4444, 0},
{DRM_FORMAT_BGRX4444, 0},
{DRM_FORMAT_XBGR4444, 0},
{DRM_FORMAT_YUV420, 0},
{DRM_FORMAT_NV12, 0},
{DRM_FORMAT_NV16, 0},
{DRM_FORMAT_YUYV, 0},
{0, 0},
};
/**
* set_cfg_1xx_init(): populate sde sub-blocks reg offsets and instance counts
*/
static inline int set_cfg_1xx_init(struct sde_mdss_cfg *cfg)
{
/* Layer capability */
static const struct sde_sspp_sub_blks vig_layer = {
.maxlinewidth = 2560,
.danger_lut_linear = 0x000f,
.safe_lut_linear = 0xfffc,
.danger_lut_tile = 0xffff,
.safe_lut_tile = 0xff00,
.danger_lut_nrt = 0x0,
.safe_lut_nrt = 0xffff,
.creq_lut_nrt = 0x0,
.creq_vblank = 0x2,
.danger_vblank = 0,
.pixel_ram_size = 50 * 1024,
.maxdwnscale = 4, .maxupscale = 20,
.maxhdeciexp = DECIMATION_17X_MAX_H,
.maxvdeciexp = DECIMATION_17X_MAX_V,
.src_blk = {.id = SDE_SSPP_SRC,
.base = 0x00, .len = 0x150,},
.scaler_blk = {.id = SDE_SSPP_SCALER_QSEED2,
.base = 0x200, .len = 0x70,},
.csc_blk = {.id = SDE_SSPP_CSC,
.base = 0x320, .len = 0x44,},
.format_list = plane_formats_yuv,
.igc_blk = {.id = SDE_SSPP_IGC, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.pcc_blk = {.id = SDE_SSPP_PCC, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.hsic = {.id = SDE_SSPP_HSIC, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.memcolor = {.id = SDE_SSPP_MEMCOLOR, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
};
static const struct sde_sspp_sub_blks layer = {
.maxlinewidth = 2560,
.danger_lut_linear = 0x000f,
.safe_lut_linear = 0xfffc,
.danger_lut_tile = 0xffff,
.safe_lut_tile = 0xff00,
.danger_lut_nrt = 0x0,
.safe_lut_nrt = 0xffff,
.creq_lut_nrt = 0x0,
.creq_vblank = 0x2,
.danger_vblank = 0,
.pixel_ram_size = 50 * 1024,
.maxdwnscale = 4, .maxupscale = 20,
.maxhdeciexp = DECIMATION_17X_MAX_H,
.maxvdeciexp = DECIMATION_17X_MAX_V,
.src_blk = {.id = SDE_SSPP_SRC,
.base = 0x00, .len = 0x150,},
.scaler_blk = {.id = SDE_SSPP_SCALER_QSEED2,
.base = 0x200, .len = 0x70,},
.csc_blk = {.id = SDE_SSPP_CSC,
.base = 0x320, .len = 0x44,},
.format_list = plane_formats,
.igc_blk = {.id = SDE_SSPP_IGC, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.pcc_blk = {.id = SDE_SSPP_PCC, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
};
static const struct sde_sspp_sub_blks dma = {
.maxlinewidth = 2560,
.danger_lut_linear = 0x000f,
.safe_lut_linear = 0xfffc,
.danger_lut_tile = 0xffff,
.safe_lut_tile = 0xff00,
.danger_lut_nrt = 0x0,
.safe_lut_nrt = 0xffff,
.creq_lut_nrt = 0x0,
.creq_vblank = 0x2,
.danger_vblank = 0,
.pixel_ram_size = 50 * 1024,
.maxdwnscale = 1, .maxupscale = 1,
.maxhdeciexp = DECIMATION_17X_MAX_H,
.maxvdeciexp = DECIMATION_17X_MAX_V,
.src_blk = {.id = SDE_SSPP_SRC, .base = 0x00, .len = 0x150,},
.scaler_blk = {.id = 0, .base = 0x00, .len = 0x0,},
.csc_blk = {.id = 0, .base = 0x00, .len = 0x0,},
.format_list = plane_formats,
.igc_blk = {.id = SDE_SSPP_IGC, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.pcc_blk = {.id = SDE_SSPP_PCC, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
};
static const struct sde_sspp_sub_blks cursor = {
.maxlinewidth = 128,
.maxdwnscale = 1, .maxupscale = 1,
.maxhdeciexp = 0,
.maxvdeciexp = 0,
.src_blk = {.id = SDE_SSPP_SRC, .base = 0x00, .len = 0x150,},
.scaler_blk = {.id = 0, .base = 0x00, .len = 0x0,},
.csc_blk = {.id = 0, .base = 0x00, .len = 0x0,},
.format_list = plane_formats,
};
/* MIXER capability */
static const struct sde_lm_sub_blks lm = {
.maxwidth = 2560,
.maxblendstages = 7, /* excluding base layer */
.blendstage_base = { /* offsets relative to mixer base */
0x20, 0x50, 0x80, 0xB0, 0x230, 0x260, 0x290 },
.gc = {.id = SDE_DSPP_GC, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
};
/* DSPP capability */
static const struct sde_dspp_sub_blks dspp = {
.igc = {.id = SDE_DSPP_IGC, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.pcc = {.id = SDE_DSPP_PCC, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.gamut = {.id = SDE_DSPP_GAMUT, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.dither = {.id = SDE_DSPP_DITHER, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.hsic = {.id = SDE_DSPP_HSIC, .base = 0x00, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.memcolor = {.id = SDE_DSPP_MEMCOLOR, .base = 0x00, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.sixzone = {.id = SDE_DSPP_SIXZONE, .base = 0x00, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.hist = {.id = SDE_DSPP_HIST, .base = 0x00, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.gc = {.id = SDE_DSPP_GC, .base = 0x0, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
.ad = {.id = SDE_DSPP_AD, .base = 0x00, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x3, 0x0)},
.vlut = {.id = SDE_DSPP_VLUT, .base = 0x1400, .len = 0x0,
.version = SDE_COLOR_PROCESS_VER(0x1, 0x0)},
};
/* PINGPONG capability */
static const struct sde_pingpong_sub_blks pingpong = {
.te = {.id = SDE_PINGPONG_TE, .base = 0x0000, .len = 0x0,
.version = 0x1},
.te2 = {.id = SDE_PINGPONG_TE2, .base = 0x2000, .len = 0x0,
.version = 0x1},
.dsc = {.id = SDE_PINGPONG_DSC, .base = 0x10000, .len = 0x0,
.version = 0x1},
};
/* Writeback 0/1 capability */
static const struct sde_wb_sub_blocks wb0 = {
.maxlinewidth = 2048,
};
/* Writeback 2 capability */
static const struct sde_wb_sub_blocks wb2 = {
.maxlinewidth = 4096,
};
static const struct sde_vbif_dynamic_ot_cfg dynamic_ot_cfg[] = {
{RES_1080p * 30, 2},
{RES_1080p * 60, 4},
{RES_UHD * 30, 16},
};
/* Setup Register maps and defaults */
*cfg = (struct sde_mdss_cfg){
.mdss_count = 1,
.mdss = {
{.id = MDP_TOP, .base = 0x00000000, .features = 0}
},
.mdp_count = 1,
.mdp = {
{.id = MDP_TOP, .base = 0x00001000, .features = 0,
.highest_bank_bit = 0x2,
.clk_ctrls[SDE_CLK_CTRL_VIG0] = {
.reg_off = 0x2AC, .bit_off = 0},
.clk_ctrls[SDE_CLK_CTRL_VIG1] = {
.reg_off = 0x2B4, .bit_off = 0},
.clk_ctrls[SDE_CLK_CTRL_VIG2] = {
.reg_off = 0x2BC, .bit_off = 0},
.clk_ctrls[SDE_CLK_CTRL_VIG3] = {
.reg_off = 0x2C4, .bit_off = 0},
.clk_ctrls[SDE_CLK_CTRL_RGB0] = {
.reg_off = 0x2AC, .bit_off = 4},
.clk_ctrls[SDE_CLK_CTRL_RGB1] = {
.reg_off = 0x2B4, .bit_off = 4},
.clk_ctrls[SDE_CLK_CTRL_RGB2] = {
.reg_off = 0x2BC, .bit_off = 4},
.clk_ctrls[SDE_CLK_CTRL_RGB3] = {
.reg_off = 0x2C4, .bit_off = 4},
.clk_ctrls[SDE_CLK_CTRL_DMA0] = {
.reg_off = 0x2AC, .bit_off = 8},
.clk_ctrls[SDE_CLK_CTRL_DMA1] = {
.reg_off = 0x2B4, .bit_off = 8},
.clk_ctrls[SDE_CLK_CTRL_CURSOR0] = {
.reg_off = 0x3A8, .bit_off = 16},
.clk_ctrls[SDE_CLK_CTRL_CURSOR1] = {
.reg_off = 0x3B0, .bit_off = 16},
.clk_ctrls[SDE_CLK_CTRL_WB0] = {
.reg_off = 0x2BC, .bit_off = 8},
.clk_ctrls[SDE_CLK_CTRL_WB1] = {
.reg_off = 0x2BC, .bit_off = 12},
.clk_ctrls[SDE_CLK_CTRL_WB2] = {
.reg_off = 0x2BC, .bit_off = 16},
},
},
.ctl_count = 5,
.ctl = {
{.id = CTL_0,
.base = 0x00002000,
.features = BIT(SDE_CTL_SPLIT_DISPLAY) |
BIT(SDE_CTL_PINGPONG_SPLIT) },
{.id = CTL_1,
.base = 0x00002200,
.features = BIT(SDE_CTL_SPLIT_DISPLAY) },
{.id = CTL_2,
.base = 0x00002400},
{.id = CTL_3,
.base = 0x00002600},
{.id = CTL_4,
.base = 0x00002800},
},
/* 4 VIG, + 4 RGB + 2 DMA + 2 CURSOR */
.sspp_count = 12,
.sspp = {
{.id = SSPP_VIG0, .base = 0x00005000,
.features = VIG_17X_MASK, .sblk = &vig_layer,
.xin_id = 0,
.clk_ctrl = SDE_CLK_CTRL_VIG0},
{.id = SSPP_VIG1, .base = 0x00007000,
.features = VIG_17X_MASK, .sblk = &vig_layer,
.xin_id = 4,
.clk_ctrl = SDE_CLK_CTRL_VIG1},
{.id = SSPP_VIG2, .base = 0x00009000,
.features = VIG_17X_MASK, .sblk = &vig_layer,
.xin_id = 8,
.clk_ctrl = SDE_CLK_CTRL_VIG2},
{.id = SSPP_VIG3, .base = 0x0000b000,
.features = VIG_17X_MASK, .sblk = &vig_layer,
.xin_id = 12,
.clk_ctrl = SDE_CLK_CTRL_VIG3},
{.id = SSPP_RGB0, .base = 0x00015000,
.features = RGB_17X_MASK, .sblk = &layer,
.xin_id = 1,
.clk_ctrl = SDE_CLK_CTRL_RGB0},
{.id = SSPP_RGB1, .base = 0x00017000,
.features = RGB_17X_MASK, .sblk = &layer,
.xin_id = 5,
.clk_ctrl = SDE_CLK_CTRL_RGB1},
{.id = SSPP_RGB2, .base = 0x00019000,
.features = RGB_17X_MASK, .sblk = &layer,
.xin_id = 9,
.clk_ctrl = SDE_CLK_CTRL_RGB2},
{.id = SSPP_RGB3, .base = 0x0001B000,
.features = RGB_17X_MASK, .sblk = &layer,
.xin_id = 13,
.clk_ctrl = SDE_CLK_CTRL_RGB3},
{.id = SSPP_DMA0, .base = 0x00025000,
.features = DMA_17X_MASK, .sblk = &dma,
.xin_id = 2,
.clk_ctrl = SDE_CLK_CTRL_DMA0},
{.id = SSPP_DMA1, .base = 0x00027000,
.features = DMA_17X_MASK, .sblk = &dma,
.xin_id = 10,
.clk_ctrl = SDE_CLK_CTRL_DMA1},
{.id = SSPP_CURSOR0, .base = 0x00035000,
.features = CURSOR_17X_MASK, .sblk = &cursor,
.xin_id = 7,
.clk_ctrl = SDE_CLK_CTRL_CURSOR0},
{.id = SSPP_CURSOR1, .base = 0x00037000,
.features = CURSOR_17X_MASK, .sblk = &cursor,
.xin_id = 7,
.clk_ctrl = SDE_CLK_CTRL_CURSOR1},
},
.mixer_count = 6,
.mixer = {
{.id = LM_0, .base = 0x00045000,
.features = MIXER_17X_MASK,
.sblk = &lm,
.dspp = DSPP_0,
.pingpong = PINGPONG_0,
.lm_pair_mask = (1 << LM_1) },
{.id = LM_1, .base = 0x00046000,
.features = MIXER_17X_MASK,
.sblk = &lm,
.dspp = DSPP_1,
.pingpong = PINGPONG_1,
.lm_pair_mask = (1 << LM_0) },
{.id = LM_2, .base = 0x00047000,
.features = MIXER_17X_MASK,
.sblk = &lm,
.dspp = DSPP_MAX,
.pingpong = PINGPONG_2,
.lm_pair_mask = (1 << LM_5) },
{.id = LM_3, .base = 0x00048000,
.features = MIXER_17X_MASK,
.sblk = &lm,
.dspp = DSPP_MAX,
.pingpong = PINGPONG_MAX},
{.id = LM_4, .base = 0x00049000,
.features = MIXER_17X_MASK,
.sblk = &lm,
.dspp = DSPP_MAX,
.pingpong = PINGPONG_MAX},
{.id = LM_5, .base = 0x0004a000,
.features = MIXER_17X_MASK,
.sblk = &lm,
.dspp = DSPP_MAX,
.pingpong = PINGPONG_3,
.lm_pair_mask = (1 << LM_2) },
},
.dspp_count = 2,
.dspp = {
{.id = DSPP_0, .base = 0x00055000,
.features = DSPP_17X_MASK,
.sblk = &dspp},
{.id = DSPP_1, .base = 0x00057000,
.features = DSPP_17X_MASK,
.sblk = &dspp},
},
.pingpong_count = 4,
.pingpong = {
{.id = PINGPONG_0, .base = 0x00071000,
.features = PINGPONG_17X_SPLIT_MASK,
.sblk = &pingpong},
{.id = PINGPONG_1, .base = 0x00071800,
.features = PINGPONG_17X_SPLIT_MASK,
.sblk = &pingpong},
{.id = PINGPONG_2, .base = 0x00072000,
.features = PINGPONG_17X_MASK,
.sblk = &pingpong},
{.id = PINGPONG_3, .base = 0x00072800,
.features = PINGPONG_17X_MASK,
.sblk = &pingpong},
},
.cdm_count = 1,
.cdm = {
{.id = CDM_0, .base = 0x0007A200, .features = 0,
.intf_connect = BIT(INTF_3),
.wb_connect = BIT(WB_2),}
},
.intf_count = 4,
.intf = {
{.id = INTF_0, .base = 0x0006B000,
.type = INTF_NONE, .controller_id = 0,
.prog_fetch_lines_worst_case = 21},
{.id = INTF_1, .base = 0x0006B800,
.type = INTF_DSI, .controller_id = 0,
.prog_fetch_lines_worst_case = 21},
{.id = INTF_2, .base = 0x0006C000,
.type = INTF_DSI, .controller_id = 1,
.prog_fetch_lines_worst_case = 21},
{.id = INTF_3, .base = 0x0006C800,
.type = INTF_HDMI, .controller_id = 0,
.prog_fetch_lines_worst_case = 21},
},
.wb_count = 3,
.wb = {
{.id = WB_0, .base = 0x00065000,
.features = WB01_17X_MASK,
.sblk = &wb0,
.format_list = wb0_formats,
.vbif_idx = VBIF_NRT,
.xin_id = 3,
.clk_ctrl = SDE_CLK_CTRL_WB0},
{.id = WB_1, .base = 0x00065800,
.features = WB01_17X_MASK,
.sblk = &wb0,
.format_list = wb0_formats,
.vbif_idx = VBIF_NRT,
.xin_id = 11,
.clk_ctrl = SDE_CLK_CTRL_WB1},
{.id = WB_2, .base = 0x00066000,
.features = WB2_17X_MASK,
.sblk = &wb2,
.format_list = wb2_formats,
.vbif_idx = VBIF_NRT,
.xin_id = 6,
.clk_ctrl = SDE_CLK_CTRL_WB2},
},
.vbif_count = 2,
.vbif = {
{.id = VBIF_0,
.base = 0, /* 0x000B0000 */
.features = BIT(SDE_VBIF_QOS_OTLIM),
.default_ot_rd_limit = 32,
.default_ot_wr_limit = 16,
.xin_halt_timeout = 0x4000,
.dynamic_ot_rd_tbl = {
.count = ARRAY_SIZE(dynamic_ot_cfg),
.cfg = dynamic_ot_cfg},
.dynamic_ot_wr_tbl = {
.count = ARRAY_SIZE(dynamic_ot_cfg),
.cfg = dynamic_ot_cfg},
},
{.id = VBIF_1,
.base = 0, /* 0x000B8000 */
.features = BIT(SDE_VBIF_QOS_OTLIM),
.default_ot_rd_limit = 32,
.default_ot_wr_limit = 16,
.xin_halt_timeout = 0x4000,
.dynamic_ot_rd_tbl = {
.count = ARRAY_SIZE(dynamic_ot_cfg),
.cfg = dynamic_ot_cfg},
.dynamic_ot_wr_tbl = {
.count = ARRAY_SIZE(dynamic_ot_cfg),
.cfg = dynamic_ot_cfg},
},
},
};
return 0;
}
/**
* sde_mdp_cfg_170_init(): Populate the sde sub-blocks catalog information
*/
struct sde_mdss_cfg *sde_mdss_cfg_170_init(u32 step)
{
struct sde_mdss_cfg *m = NULL;
/*
* This function, for each sub-block sets,
* instance count, IO regions,
* default capabilities and this version capabilities,
* Additional catalog items
*/
m = kzalloc(sizeof(*m), GFP_KERNEL);
if (!m)
return NULL;
set_cfg_1xx_init(m);
m->hwversion = SDE_HW_VER(1, 7, step);
return m;
}