diff --git a/msm/sde/sde_hw_catalog.c b/msm/sde/sde_hw_catalog.c index 6bb3bc0059..472de9d211 100644 --- a/msm/sde/sde_hw_catalog.c +++ b/msm/sde/sde_hw_catalog.c @@ -1210,6 +1210,9 @@ static void _sde_sspp_setup_vig(struct sde_mdss_cfg *sde_cfg, sblk->llcc_slice_size = sde_cfg->sc_cfg.llcc_slice_size; } + + if (sde_cfg->inline_disable_const_clr) + set_bit(SDE_SSPP_INLINE_CONST_CLR, &sspp->features); } static void _sde_sspp_setup_rgb(struct sde_mdss_cfg *sde_cfg, @@ -1850,6 +1853,8 @@ static int sde_mixer_parse_dt(struct device_node *np, set_bit(SDE_MIXER_SOURCESPLIT, &mixer->features); if (sde_cfg->has_dim_layer) set_bit(SDE_DIM_LAYER, &mixer->features); + if (sde_cfg->has_mixer_combined_alpha) + set_bit(SDE_MIXER_COMBINED_ALPHA, &mixer->features); of_property_read_string_index(np, mixer_prop[MIXER_DISP].prop_name, i, &disp_pref); @@ -1968,10 +1973,7 @@ static int sde_intf_parse_dt(struct device_node *np, if (IS_SDE_CTL_REV_100(sde_cfg->ctl_rev)) set_bit(SDE_INTF_INPUT_CTRL, &intf->features); - if (IS_SDE_MAJOR_SAME((sde_cfg->hwversion), - SDE_HW_VER_500) || - IS_SDE_MAJOR_SAME((sde_cfg->hwversion), - SDE_HW_VER_600)) + if (sde_cfg->has_intf_te) set_bit(SDE_INTF_TE, &intf->features); } @@ -2902,6 +2904,8 @@ static int _sde_vbif_populate(struct sde_mdss_cfg *sde_cfg, for (j = 0; j < prop_count[VBIF_MEMTYPE_1]; j++) vbif->memtype[k++] = PROP_VALUE_ACCESS( prop_value, VBIF_MEMTYPE_1, j); + if (sde_cfg->vbif_disable_inner_outer_shareable) + set_bit(SDE_VBIF_DISABLE_SHAREABLE, &vbif->features); return 0; } @@ -4050,14 +4054,18 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev) if (!sde_cfg) return -EINVAL; + /* default settings for *MOST* targets */ + sde_cfg->has_mixer_combined_alpha = true; for (i = 0; i < MDSS_INTR_MAX; i++) set_bit(i, sde_cfg->mdss_irqs); + /* target specific settings */ if (IS_MSM8996_TARGET(hw_rev)) { sde_cfg->perf.min_prefill_lines = 21; clear_bit(MDSS_INTR_LTM_0_INTR, sde_cfg->mdss_irqs); clear_bit(MDSS_INTR_LTM_1_INTR, sde_cfg->mdss_irqs); sde_cfg->has_decimation = true; + sde_cfg->has_mixer_combined_alpha = false; } else if (IS_MSM8998_TARGET(hw_rev)) { sde_cfg->has_wb_ubwc = true; sde_cfg->perf.min_prefill_lines = 25; @@ -4068,6 +4076,7 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev) sde_cfg->has_decimation = true; sde_cfg->has_cursor = true; sde_cfg->has_hdr = true; + sde_cfg->has_mixer_combined_alpha = false; } else if (IS_SDM845_TARGET(hw_rev)) { sde_cfg->has_wb_ubwc = true; sde_cfg->has_cwb_support = true; @@ -4113,6 +4122,8 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev) clear_bit(MDSS_INTR_LTM_0_INTR, sde_cfg->mdss_irqs); clear_bit(MDSS_INTR_LTM_1_INTR, sde_cfg->mdss_irqs); sde_cfg->has_decimation = true; + sde_cfg->has_intf_te = true; + sde_cfg->vbif_disable_inner_outer_shareable = true; } else if (IS_SDMSHRIKE_TARGET(hw_rev)) { sde_cfg->has_wb_ubwc = true; sde_cfg->perf.min_prefill_lines = 24; @@ -4125,6 +4136,7 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev) sde_cfg->has_decimation = true; sde_cfg->has_hdr = true; sde_cfg->has_vig_p010 = true; + sde_cfg->has_intf_te = true; } else if (IS_SM6150_TARGET(hw_rev)) { sde_cfg->has_cwb_support = true; sde_cfg->has_qsync = true; @@ -4144,6 +4156,8 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev) clear_bit(MDSS_INTR_LTM_1_INTR, sde_cfg->mdss_irqs); sde_cfg->has_hdr = true; sde_cfg->has_vig_p010 = true; + sde_cfg->has_intf_te = true; + sde_cfg->vbif_disable_inner_outer_shareable = true; } else if (IS_SDMMAGPIE_TARGET(hw_rev)) { sde_cfg->has_cwb_support = true; sde_cfg->has_wb_ubwc = true; @@ -4159,6 +4173,8 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev) sde_cfg->has_sui_blendstage = true; sde_cfg->has_qos_fl_nocalc = true; sde_cfg->has_3d_merge_reset = true; + sde_cfg->has_intf_te = true; + sde_cfg->vbif_disable_inner_outer_shareable = true; } else if (IS_KONA_TARGET(hw_rev)) { sde_cfg->has_cwb_support = true; sde_cfg->has_wb_ubwc = true; @@ -4191,6 +4207,8 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev) sde_cfg->true_inline_prefill_lines_nv12 = 32; sde_cfg->true_inline_prefill_lines = 48; sde_cfg->uidle_cfg.uidle_rev = SDE_UIDLE_VERSION_1_0_0; + sde_cfg->has_intf_te = true; + sde_cfg->inline_disable_const_clr = true; } else if (IS_SAIPAN_TARGET(hw_rev)) { sde_cfg->has_cwb_support = true; sde_cfg->has_wb_ubwc = true; @@ -4222,6 +4240,8 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev) sde_cfg->true_inline_prefill_fudge_lines = 2; sde_cfg->true_inline_prefill_lines_nv12 = 32; sde_cfg->true_inline_prefill_lines = 48; + sde_cfg->has_intf_te = true; + sde_cfg->inline_disable_const_clr = true; } else if (IS_SDMTRINKET_TARGET(hw_rev)) { sde_cfg->has_cwb_support = true; sde_cfg->has_qsync = true; @@ -4235,6 +4255,8 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev) sde_cfg->sui_block_xin_mask = 0xC61; sde_cfg->has_hdr = false; sde_cfg->has_sui_blendstage = true; + sde_cfg->has_intf_te = true; + sde_cfg->vbif_disable_inner_outer_shareable = true; } else if (IS_BENGAL_TARGET(hw_rev)) { sde_cfg->has_cwb_support = false; sde_cfg->has_qsync = true; @@ -4248,6 +4270,8 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev) sde_cfg->sui_block_xin_mask = 0xC01; sde_cfg->has_hdr = false; sde_cfg->has_sui_blendstage = true; + sde_cfg->has_intf_te = true; + sde_cfg->vbif_disable_inner_outer_shareable = true; } else { SDE_ERROR("unsupported chipset id:%X\n", hw_rev); sde_cfg->perf.min_prefill_lines = 0xffff; diff --git a/msm/sde/sde_hw_catalog.h b/msm/sde/sde_hw_catalog.h index 22d634250e..1ecb3e711e 100644 --- a/msm/sde/sde_hw_catalog.h +++ b/msm/sde/sde_hw_catalog.h @@ -31,30 +31,25 @@ #define SDE_HW_STEP(rev) ((rev) & 0xFFFF) #define SDE_HW_MAJOR_MINOR(rev) ((rev) >> 16) -#define IS_SDE_MAJOR_SAME(rev1, rev2) \ - (SDE_HW_MAJOR((rev1)) == SDE_HW_MAJOR((rev2))) - -#define IS_SDE_MAJOR_MINOR_SAME(rev1, rev2) \ - (SDE_HW_MAJOR_MINOR((rev1)) == SDE_HW_MAJOR_MINOR((rev2))) - -#define SDE_HW_VER_170 SDE_HW_VER(1, 7, 0) /* 8996 v1.0 */ -#define SDE_HW_VER_171 SDE_HW_VER(1, 7, 1) /* 8996 v2.0 */ -#define SDE_HW_VER_172 SDE_HW_VER(1, 7, 2) /* 8996 v3.0 */ -#define SDE_HW_VER_300 SDE_HW_VER(3, 0, 0) /* 8998 v1.0 */ -#define SDE_HW_VER_301 SDE_HW_VER(3, 0, 1) /* 8998 v1.1 */ -#define SDE_HW_VER_400 SDE_HW_VER(4, 0, 0) /* sdm845 v1.0 */ -#define SDE_HW_VER_401 SDE_HW_VER(4, 0, 1) /* sdm845 v2.0 */ -#define SDE_HW_VER_410 SDE_HW_VER(4, 1, 0) /* sdm670 v1.0 */ -#define SDE_HW_VER_500 SDE_HW_VER(5, 0, 0) /* sm8150 v1.0 */ -#define SDE_HW_VER_501 SDE_HW_VER(5, 0, 1) /* sm8150 v2.0 */ -#define SDE_HW_VER_510 SDE_HW_VER(5, 1, 0) /* sdmshrike v1.0 */ -#define SDE_HW_VER_520 SDE_HW_VER(5, 2, 0) /* sdmmagpie v1.0 */ -#define SDE_HW_VER_530 SDE_HW_VER(5, 3, 0) /* sm6150 v1.0 */ -#define SDE_HW_VER_540 SDE_HW_VER(5, 4, 0) /* sdmtrinket v1.0 */ +#define SDE_HW_VER_170 SDE_HW_VER(1, 7, 0) /* 8996 */ +#define SDE_HW_VER_300 SDE_HW_VER(3, 0, 0) /* 8998 */ +#define SDE_HW_VER_400 SDE_HW_VER(4, 0, 0) /* sdm845 */ +#define SDE_HW_VER_410 SDE_HW_VER(4, 1, 0) /* sdm670 */ +#define SDE_HW_VER_500 SDE_HW_VER(5, 0, 0) /* sm8150 */ +#define SDE_HW_VER_510 SDE_HW_VER(5, 1, 0) /* sdmshrike */ +#define SDE_HW_VER_520 SDE_HW_VER(5, 2, 0) /* sdmmagpie */ +#define SDE_HW_VER_530 SDE_HW_VER(5, 3, 0) /* sm6150 */ +#define SDE_HW_VER_540 SDE_HW_VER(5, 4, 0) /* sdmtrinket */ #define SDE_HW_VER_600 SDE_HW_VER(6, 0, 0) /* kona */ #define SDE_HW_VER_610 SDE_HW_VER(6, 1, 0) /* sm7250 */ #define SDE_HW_VER_630 SDE_HW_VER(6, 3, 0) /* bengal */ +/* Avoid using below IS_XXX macros outside catalog, use feature bit instead */ +#define IS_SDE_MAJOR_SAME(rev1, rev2) \ + (SDE_HW_MAJOR((rev1)) == SDE_HW_MAJOR((rev2))) +#define IS_SDE_MAJOR_MINOR_SAME(rev1, rev2) \ + (SDE_HW_MAJOR_MINOR((rev1)) == SDE_HW_MAJOR_MINOR((rev2))) + #define IS_MSM8996_TARGET(rev) IS_SDE_MAJOR_MINOR_SAME((rev), SDE_HW_VER_170) #define IS_MSM8998_TARGET(rev) IS_SDE_MAJOR_MINOR_SAME((rev), SDE_HW_VER_300) #define IS_SDM845_TARGET(rev) IS_SDE_MAJOR_MINOR_SAME((rev), SDE_HW_VER_400) @@ -212,6 +207,7 @@ enum { * @SDE_SSPP_BLOCK_SEC_UI Blocks secure-ui layers * @SDE_SSPP_SCALER_QSEED3LITE Qseed3lite algorithm support * @SDE_SSPP_TRUE_INLINE_ROT_V1, Support of SSPP true inline rotation v1 + * @SDE_SSPP_INLINE_CONST_CLR Inline rotation requires const clr disabled * @SDE_SSPP_MAX maximum value */ enum { @@ -240,6 +236,7 @@ enum { SDE_SSPP_BLOCK_SEC_UI, SDE_SSPP_SCALER_QSEED3LITE, SDE_SSPP_TRUE_INLINE_ROT_V1, + SDE_SSPP_INLINE_CONST_CLR, SDE_SSPP_MAX }; @@ -276,6 +273,7 @@ enum { * @SDE_DISP_CWB_PREF Layer mixer preferred for CWB * @SDE_DISP_PRIMARY_PREF Layer mixer preferred for primary display * @SDE_DISP_SECONDARY_PREF Layer mixer preferred for secondary display + * @SDE_MIXER_COMBINED_ALPHA Layer mixer bg and fg alpha in single register * @SDE_MIXER_MAX maximum value */ enum { @@ -286,6 +284,7 @@ enum { SDE_DISP_PRIMARY_PREF, SDE_DISP_SECONDARY_PREF, SDE_DISP_CWB_PREF, + SDE_MIXER_COMBINED_ALPHA, SDE_MIXER_MAX }; @@ -460,11 +459,13 @@ enum { * VBIF sub-blocks and features * @SDE_VBIF_QOS_OTLIM VBIF supports OT Limit * @SDE_VBIF_QOS_REMAP VBIF supports QoS priority remap + * @SDE_VBIF_DISABLE_SHAREABLE: VBIF requires inner/outer shareables disabled * @SDE_VBIF_MAX maximum value */ enum { SDE_VBIF_QOS_OTLIM = 0x1, SDE_VBIF_QOS_REMAP, + SDE_VBIF_DISABLE_SHAREABLE, SDE_VBIF_MAX }; @@ -1273,6 +1274,10 @@ struct sde_limit_cfg { * @has_3d_merge_reset Supports 3D merge reset * @has_decimation Supports decimation * @has_qos_fl_nocalc flag to indicate QoS fill level needs no calculation + * @has_mixer_combined_alpha Mixer has single register for FG & BG alpha + * @has_intf_te TE logic resides in INTF block + * @vbif_disable_inner_outer_shareable VBIF requires disabling shareables + * @inline_disable_const_clr Disable constant color during inline rotate * @sc_cfg: system cache configuration * @uidle_cfg Settings for uidle feature * @sui_misr_supported indicate if secure-ui-misr is supported @@ -1333,6 +1338,10 @@ struct sde_mdss_cfg { bool has_3d_merge_reset; bool has_decimation; bool has_qos_fl_nocalc; + bool has_mixer_combined_alpha; + bool has_intf_te; + bool vbif_disable_inner_outer_shareable; + bool inline_disable_const_clr; struct sde_sc_cfg sc_cfg; diff --git a/msm/sde/sde_hw_lm.c b/msm/sde/sde_hw_lm.c index 49974820fe..fdae00b3ec 100644 --- a/msm/sde/sde_hw_lm.c +++ b/msm/sde/sde_hw_lm.c @@ -110,8 +110,9 @@ static void sde_hw_lm_setup_border_color(struct sde_hw_mixer *ctx, } } -static void sde_hw_lm_setup_blend_config_sdm845(struct sde_hw_mixer *ctx, - u32 stage, u32 fg_alpha, u32 bg_alpha, u32 blend_op) +static void sde_hw_lm_setup_blend_config_combined_alpha( + struct sde_hw_mixer *ctx, u32 stage, + u32 fg_alpha, u32 bg_alpha, u32 blend_op) { struct sde_hw_blk_reg_map *c = &ctx->hw; int stage_off; @@ -280,16 +281,9 @@ static void _setup_mixer_ops(struct sde_mdss_cfg *m, unsigned long features) { ops->setup_mixer_out = sde_hw_lm_setup_out; - if (IS_SDM845_TARGET(m->hwversion) || IS_SDM670_TARGET(m->hwversion) || - IS_SM8150_TARGET(m->hwversion) || - IS_SDMSHRIKE_TARGET(m->hwversion) || - IS_SM6150_TARGET(m->hwversion) || - IS_SDMMAGPIE_TARGET(m->hwversion) || - IS_KONA_TARGET(m->hwversion) || - IS_SAIPAN_TARGET(m->hwversion) || - IS_SDMTRINKET_TARGET(m->hwversion) || - IS_BENGAL_TARGET(m->hwversion)) - ops->setup_blend_config = sde_hw_lm_setup_blend_config_sdm845; + if (test_bit(SDE_MIXER_COMBINED_ALPHA, &features)) + ops->setup_blend_config = + sde_hw_lm_setup_blend_config_combined_alpha; else ops->setup_blend_config = sde_hw_lm_setup_blend_config; ops->setup_alpha_out = sde_hw_lm_setup_color3; diff --git a/msm/sde/sde_hw_sspp.c b/msm/sde/sde_hw_sspp.c index dda8f9b107..e0801049ec 100644 --- a/msm/sde/sde_hw_sspp.c +++ b/msm/sde/sde_hw_sspp.c @@ -3,7 +3,6 @@ * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved. */ -#include "sde_hw_util.h" #include "sde_hwio.h" #include "sde_hw_catalog.h" #include "sde_hw_lm.h" @@ -299,7 +298,7 @@ static void sde_hw_sspp_setup_format(struct sde_hw_pipe *ctx, u32 opmode = 0; u32 alpha_en_mask = 0, color_en_mask = 0; u32 op_mode_off, unpack_pat_off, format_off; - u32 idx, core_rev; + u32 idx; bool const_color_en = true; if (_sspp_subblk_offset(ctx, SDE_SSPP_SRC, &idx) || !fmt) @@ -316,7 +315,6 @@ static void sde_hw_sspp_setup_format(struct sde_hw_pipe *ctx, } c = &ctx->hw; - core_rev = readl_relaxed(c->base_off + 0x0); opmode = SDE_REG_READ(c, op_mode_off + idx); opmode &= ~(MDSS_MDP_OP_FLIP_LR | MDSS_MDP_OP_FLIP_UD | MDSS_MDP_OP_BWC_EN | MDSS_MDP_OP_PE_OVERRIDE); @@ -354,10 +352,9 @@ static void sde_hw_sspp_setup_format(struct sde_hw_pipe *ctx, (fmt->unpack_align_msb << 18) | ((fmt->bpp - 1) << 9); - if(IS_SDE_MAJOR_SAME(core_rev, SDE_HW_VER_600)) { - if(flags & SDE_SSPP_ROT_90) - const_color_en = false; - } + if ((flags & SDE_SSPP_ROT_90) && test_bit(SDE_SSPP_INLINE_CONST_CLR, + &ctx->cap->features)) + const_color_en = false; if (fmt->fetch_mode != SDE_FETCH_LINEAR) { if (SDE_FORMAT_IS_UBWC(fmt)) diff --git a/msm/sde/sde_hw_vbif.c b/msm/sde/sde_hw_vbif.c index f4c7846493..da37f87cd0 100644 --- a/msm/sde/sde_hw_vbif.c +++ b/msm/sde/sde_hw_vbif.c @@ -234,10 +234,7 @@ static void _setup_vbif_ops(const struct sde_mdss_cfg *m, ops->get_halt_ctrl = sde_hw_get_halt_ctrl; if (test_bit(SDE_VBIF_QOS_REMAP, &cap)) ops->set_qos_remap = sde_hw_set_qos_remap; - if (IS_SM8150_TARGET(m->hwversion) || IS_SM6150_TARGET(m->hwversion) || - IS_SDMMAGPIE_TARGET(m->hwversion) || - IS_SDMTRINKET_TARGET(m->hwversion) || - IS_BENGAL_TARGET(m->hwversion)) + if (test_bit(SDE_VBIF_DISABLE_SHAREABLE, &cap)) ops->set_mem_type = sde_hw_set_mem_type_v1; else ops->set_mem_type = sde_hw_set_mem_type;