Hi Mauro. > Before posting the big patch series again, let me send the new > version folded into a single patch. Review 1/N Lots of small details I missed last time. A good thing is that there is an opportunity to delete som more code. Sam > diff --git a/drivers/staging/hikey9xx/gpu/Kconfig b/drivers/staging/hikey9xx/gpu/Kconfig > new file mode 100644 > index 000000000000..8578ca953785 > --- /dev/null > +++ b/drivers/staging/hikey9xx/gpu/Kconfig > @@ -0,0 +1,10 @@ > +config DRM_HISI_KIRIN9XX > + tristate "DRM Support for Hisilicon Kirin9xx series SoCs Platform" > + depends on DRM && OF && ARM64 > + select DRM_KMS_HELPER > + select DRM_GEM_CMA_HELPER > + select DRM_KMS_CMA_HELPER > + select DRM_MIPI_DSI > + help > + Choose this option if you have a HiSilicon Kirin960 or Kirin970. > + If M is selected the module will be called kirin9xx-drm. > diff --git a/drivers/staging/hikey9xx/gpu/Makefile b/drivers/staging/hikey9xx/gpu/Makefile > new file mode 100644 > index 000000000000..5f7974a95367 > --- /dev/null > +++ b/drivers/staging/hikey9xx/gpu/Makefile > @@ -0,0 +1,8 @@ > +# SPDX-License-Identifier: GPL-2.0-only > +kirin9xx-drm-y := kirin9xx_drm_drv.o \ > + kirin9xx_drm_dss.o \ > + kirin9xx_drm_dpe_utils.o \ > + kirin970_defs.o kirin960_defs.o \ > + kirin9xx_drm_overlay_utils.o > + > +obj-$(CONFIG_DRM_HISI_KIRIN9XX) += kirin9xx-drm.o kirin9xx_dw_drm_dsi.o General comment which is true for many many Makefile's I have never understood the love of '\'. Something like this works equally well: kirin9xx-drm-y := kirin9xx_drm_drv.o kirin9xx_drm_dss.o kirin9xx-drm-y += kirin9xx_drm_dpe_utils.o kirin970_defs.o kirin9xx-drm-y += kirin960_defs.o kirin9xx_drm_overlay_utils.o obj-$(CONFIG_DRM_HISI_KIRIN9XX) += kirin9xx-drm.o kirin9xx_dw_drm_dsi.o > diff --git a/drivers/staging/hikey9xx/gpu/kirin960_defs.c b/drivers/staging/hikey9xx/gpu/kirin960_defs.c > new file mode 100644 > index 000000000000..c5e1ec03c818 > --- /dev/null > +++ b/drivers/staging/hikey9xx/gpu/kirin960_defs.c > @@ -0,0 +1,346 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (c) 2008-2011, Hisilicon Tech. Co., Ltd. All rights reserved. > + * Copyright (c) 2008-2020, Huawei Technologies Co., Ltd > + */ > + > +#include <drm/drm_atomic.h> > +#include <drm/drm_atomic_helper.h> > +#include <drm/drm_crtc.h> > +#include <drm/drm_crtc_helper.h> > +#include <drm/drm_drv.h> > +#include <drm/drm_fb_cma_helper.h> > +#include <drm/drm_fourcc.h> > +#include <drm/drm_gem_cma_helper.h> > +#include <drm/drm_plane_helper.h> > + > +#include "kirin9xx_drm_dpe_utils.h" > +#include "kirin9xx_drm_drv.h" > +#include "kirin960_dpe_reg.h" All includes blocks should be sorted. The list of include files looks far too large for this simple file. Reduce to the relevant include files. > + > +static const u32 kirin960_g_dss_module_base[DSS_CHN_MAX_DEFINE][MODULE_CHN_MAX] = { > + { > + /* D0 */ > + MIF_CH0_OFFSET, > + AIF0_CH0_OFFSET, > + AIF1_CH0_OFFSET, > + MCTL_CTL_MUTEX_RCH0, > + DSS_MCTRL_SYS_OFFSET + MCTL_RCH0_FLUSH_EN, > + DSS_MCTRL_SYS_OFFSET + MCTL_RCH0_OV_OEN, > + DSS_MCTRL_SYS_OFFSET + MCTL_RCH0_STARTY, > + DSS_MCTRL_SYS_OFFSET + MCTL_MOD0_DBG, > + DSS_RCH_D0_DMA_OFFSET, > + DSS_RCH_D0_DFC_OFFSET, > + 0, > + 0, > + 0, > + 0, > + 0, > + 0, > + DSS_RCH_D0_CSC_OFFSET, > + }, { ... > + }, > +}; > + > +static const u32 kirin960_g_dss_module_ovl_base[DSS_MCTL_IDX_MAX][MODULE_OVL_MAX] = { > + { > + DSS_OVL0_OFFSET, > + DSS_MCTRL_CTL0_OFFSET > + }, { > + DSS_OVL1_OFFSET, > + DSS_MCTRL_CTL1_OFFSET > + }, { > + DSS_OVL2_OFFSET, > + DSS_MCTRL_CTL2_OFFSET, > + }, { > + DSS_OVL3_OFFSET, > + DSS_MCTRL_CTL3_OFFSET, > + }, { > + 0, > + DSS_MCTRL_CTL4_OFFSET, > + }, { > + 0, > + DSS_MCTRL_CTL5_OFFSET, > + } > +}; > + > +/* SCF_LUT_CHN coef_idx */ > +static const int kirin960_g_scf_lut_chn_coef_idx[DSS_CHN_MAX_DEFINE] = { > + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 > +}; > + > +static const u32 kirin960_g_dss_module_cap[DSS_CHN_MAX_DEFINE][MODULE_CAP_MAX] = { > + /* D2 */ > + {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1}, > + /* D3 */ > + {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, > + /* V0 */ > + {0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1}, > + /* G0 */ > + {0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0}, > + /* V1 */ > + {0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1}, > + /* G1 */ > + {0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0}, > + /* D0 */ > + {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, > + /* D1 */ > + {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, > + > + /* W0 */ > + {1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1}, > + /* W1 */ > + {1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1}, > + > + /* V2 */ > + {0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1}, > + /* W2 */ > + {1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1}, > +}; > + > +/* number of smrx idx for each channel */ > +static const u32 kirin960_g_dss_chn_sid_num[DSS_CHN_MAX_DEFINE] = { > + 4, 1, 4, 4, 4, 4, 1, 1, 3, 3, 3, 2 > +}; > + > +/* start idx of each channel */ > +/* smrx_idx = g_dss_smmu_smrx_idx[chn_idx] + (0 ~ g_dss_chn_sid_num[chn_idx]) */ > +static const u32 kirin960_g_dss_smmu_smrx_idx[DSS_CHN_MAX_DEFINE] = { > + 0, 4, 5, 9, 13, 17, 21, 22, 26, 29, 23, 32 > +}; > + > +static const u32 kirin960_g_dss_mif_sid_map[DSS_CHN_MAX] = { > + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 > +}; > + > +void kirin960_dpe_defs(struct dss_hw_ctx *ctx) > +{ > + memcpy(&ctx->g_dss_module_base, &kirin960_g_dss_module_base, > + sizeof(kirin960_g_dss_module_base)); > + memcpy(&ctx->g_dss_module_ovl_base, &kirin960_g_dss_module_ovl_base, > + sizeof(kirin960_g_dss_module_ovl_base)); > + memcpy(&ctx->g_scf_lut_chn_coef_idx, &kirin960_g_scf_lut_chn_coef_idx, > + sizeof(kirin960_g_scf_lut_chn_coef_idx)); > + memcpy(&ctx->g_dss_module_cap, &kirin960_g_dss_module_cap, > + sizeof(kirin960_g_dss_module_cap)); > + memcpy(&ctx->g_dss_chn_sid_num, &kirin960_g_dss_chn_sid_num, > + sizeof(kirin960_g_dss_chn_sid_num)); > + memcpy(&ctx->g_dss_smmu_smrx_idx, &kirin960_g_dss_smmu_smrx_idx, > + sizeof(kirin960_g_dss_smmu_smrx_idx)); > + > + ctx->smmu_offset = DSS_SMMU_OFFSET; > + ctx->afbc_header_addr_align = AFBC_HEADER_ADDR_ALIGN; > + ctx->dss_mmbuf_clk_rate_power_off = DEFAULT_DSS_MMBUF_CLK_RATE_POWER_OFF; > + ctx->rot_mem_ctrl = ROT_MEM_CTRL; > + ctx->dither_mem_ctrl = DITHER_MEM_CTRL; > + ctx->arsr2p_lb_mem_ctrl = ARSR2P_LB_MEM_CTRL; > + ctx->pxl0_clk_rate_power_off = DEFAULT_DSS_PXL0_CLK_RATE_POWER_OFF; > +} > diff --git a/drivers/staging/hikey9xx/gpu/kirin960_dpe_reg.h b/drivers/staging/hikey9xx/gpu/kirin960_dpe_reg.h > new file mode 100644 > index 000000000000..3405fb9076c1 > --- /dev/null > +++ b/drivers/staging/hikey9xx/gpu/kirin960_dpe_reg.h > @@ -0,0 +1,229 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (c) 2016 Linaro Limited. > + * Copyright (c) 2014-2016 Hisilicon Limited. > + * Copyright (c) 2014-2020, Huawei Technologies Co., Ltd > + */ > + > +#ifndef __KIRIN960_DPE_REG_H__ > +#define __KIRIN960_DPE_REG_H__ > + > +#include "kirin9xx_dpe.h" It looks strange that a register definition header file needs a higher level header file. If the include file is needed there is likely some layering that needs to be fixed? > + > +#define CRGPERI_PLL0_CLK_RATE (1600000000UL) > +#define CRGPERI_PLL2_CLK_RATE (960000000UL) > +#define CRGPERI_PLL3_CLK_RATE (1600000000UL) > + > +/* dss clk power off */ > +#define DEFAULT_DSS_PXL0_CLK_RATE_POWER_OFF (277000000UL) > +#define DEFAULT_DSS_MMBUF_CLK_RATE_POWER_OFF (238000000UL) > + > +/*****************************************************************************/ > + > +#define SCPWREN (0x0D0) > +#define SCPEREN1 (0x040) > +#define SCPERDIS1 (0x044) > +#define SCPERRSTDIS1 (0x090) > +#define SCISODIS (0x0C4) > + > +/*****************************************************************************/ Why the above block of stars - looks random. > + > +/* MODULE BASE ADDRESS */ > + > +#define DSS_SMMU_OFFSET (0x8000) > + > +#define DSS_RCH_VG0_POST_CLIP_OFFSET (0x203A0) > + > +#define DSS_RCH_VG1_POST_CLIP_OFFSET (0x283A0) > + > +#define DSS_RCH_VG2_POST_CLIP_OFFSET (0x303A0) > +#define DSS_RCH_VG2_AFBCD_OFFSET (0x30900) > + > +#define DSS_RCH_G0_POST_CLIP_OFFSET (0x383A0) > + > +#define DSS_RCH_G1_POST_CLIP_OFFSET (0x403A0) > + > +#define DSS_RCH_D2_AFBCD_OFFSET (0x50900) > + > +#define DSS_RCH_D3_AFBCD_OFFSET (0x51900) > + > +#define DSS_RCH_D1_AFBCD_OFFSET (0x53900) > + > +#define DSS_WCH0_ROT_OFFSET (0x5A500) > + > +#define DSS_WCH1_ROT_OFFSET (0x5C500) > + > +#define DSS_DPP_DEGAMA_OFFSET (0x70500) > +#define DSS_DPP_LCP_OFFSET (0x70900) > +#define DSS_DPP_ARSR1P_OFFSET (0x70A00) > +#define DSS_DPP_BITEXT0_OFFSET (0x70B00) > +#define DSS_DPP_LCP_LUT_OFFSET (0x73000) > +#define DSS_DPP_ARSR1P_LUT_OFFSET (0x7B000) > + > +#define DSS_POST_SCF_OFFSET DSS_DPP_ARSR1P_OFFSET > +#define DSS_POST_SCF_LUT_OFFSET DSS_DPP_ARSR1P_LUT_OFFSET > + > +/* AIF */ > +#define AIF0_CH0_ADD_OFFSET (DSS_VBIF0_AIF + 0x04) > +#define AIF0_CH1_ADD_OFFSET (DSS_VBIF0_AIF + 0x24) > +#define AIF0_CH2_ADD_OFFSET (DSS_VBIF0_AIF + 0x44) > +#define AIF0_CH3_ADD_OFFSET (DSS_VBIF0_AIF + 0x64) > +#define AIF0_CH4_ADD_OFFSET (DSS_VBIF0_AIF + 0x84) > +#define AIF0_CH5_ADD_OFFSET (DSS_VBIF0_AIF + 0xa4) > +#define AIF0_CH6_ADD_OFFSET (DSS_VBIF0_AIF + 0xc4) > +#define AIF0_CH7_ADD_OFFSET (DSS_VBIF0_AIF + 0xe4) > +#define AIF0_CH8_ADD_OFFSET (DSS_VBIF0_AIF + 0x104) > +#define AIF0_CH9_ADD_OFFSET (DSS_VBIF0_AIF + 0x124) > +#define AIF0_CH10_ADD_OFFSET (DSS_VBIF0_AIF + 0x144) > +#define AIF0_CH11_ADD_OFFSET (DSS_VBIF0_AIF + 0x164) > +#define AIF0_CH12_ADD_OFFSET (DSS_VBIF0_AIF + 0x184) > + > +#define AIF1_CH0_ADD_OFFSET (DSS_VBIF1_AIF + 0x04) > +#define AIF1_CH1_ADD_OFFSET (DSS_VBIF1_AIF + 0x24) > +#define AIF1_CH2_ADD_OFFSET (DSS_VBIF1_AIF + 0x44) > +#define AIF1_CH3_ADD_OFFSET (DSS_VBIF1_AIF + 0x64) > +#define AIF1_CH4_ADD_OFFSET (DSS_VBIF1_AIF + 0x84) > +#define AIF1_CH5_ADD_OFFSET (DSS_VBIF1_AIF + 0xa4) > +#define AIF1_CH6_ADD_OFFSET (DSS_VBIF1_AIF + 0xc4) > +#define AIF1_CH7_ADD_OFFSET (DSS_VBIF1_AIF + 0xe4) > +#define AIF1_CH8_ADD_OFFSET (DSS_VBIF1_AIF + 0x104) > +#define AIF1_CH9_ADD_OFFSET (DSS_VBIF1_AIF + 0x124) > +#define AIF1_CH10_ADD_OFFSET (DSS_VBIF1_AIF + 0x144) > +#define AIF1_CH11_ADD_OFFSET (DSS_VBIF1_AIF + 0x164) > +#define AIF1_CH12_ADD_OFFSET (DSS_VBIF1_AIF + 0x184) > + > +/* DFC */ > +#define DFC_GLB_ALPHA (0x0008) > + > +/* ARSR2P v0 */ > +#define ARSR2P_IHRIGHT (0x00C) > +#define ARSR2P_IVTOP (0x010) > +#define ARSR2P_IVBOTTOM (0x014) > +#define ARSR2P_IHINC (0x018) > +#define ARSR2P_IVINC (0x01C) > +#define ARSR2P_UV_OFFSET (0x020) > +#define ARSR2P_MODE (0x024) > +#define ARSR2P_SKIN_THRES_Y (0x028) > +#define ARSR2P_SKIN_THRES_U (0x02C) > +#define ARSR2P_SKIN_THRES_V (0x030) > +#define ARSR2P_SKIN_CFG0 (0x034) > +#define ARSR2P_SKIN_CFG1 (0x038) > +#define ARSR2P_SKIN_CFG2 (0x03C) > +#define ARSR2P_SHOOT_CFG1 (0x040) > +#define ARSR2P_SHOOT_CFG2 (0x044) > +#define ARSR2P_SHARP_CFG1 (0x048) > +#define ARSR2P_SHARP_CFG2 (0x04C) > +#define ARSR2P_SHARP_CFG3 (0x050) > +#define ARSR2P_SHARP_CFG4 (0x054) > +#define ARSR2P_SHARP_CFG5 (0x058) > +#define ARSR2P_SHARP_CFG6 (0x05C) > +#define ARSR2P_SHARP_CFG7 (0x060) > +#define ARSR2P_SHARP_CFG8 (0x064) > +#define ARSR2P_SHARP_CFG9 (0x068) > +#define ARSR2P_TEXTURW_ANALYSTS (0x06C) > +#define ARSR2P_INTPLSHOOTCTRL (0x070) > +#define ARSR2P_DEBUG0 (0x074) > +#define ARSR2P_DEBUG1 (0x078) > +#define ARSR2P_DEBUG2 (0x07C) > +#define ARSR2P_DEBUG3 (0x080) > +#define ARSR2P_LB_MEM_CTRL (0x084) > +#define ARSR2P_IHLEFT1 (0x088) > +#define ARSR2P_IHRIGHT1 (0x090) > +#define ARSR2P_IVBOTTOM1 (0x094) > + > +/* POST_CLIP v g */ > +#define POST_CLIP_CTL_HRZ (0x0010) > +#define POST_CLIP_CTL_VRZ (0x0014) > +#define POST_CLIP_EN (0x0018) > + > +/* CSC */ > + > +#define CSC_ICG_MODULE (0x0024) > + > +/* DMA BUF */ > + > +#define AFBCE_HREG_HDR_PTR_LO (0x908) > +#define AFBCE_HREG_PLD_PTR_LO (0x90C) > + > +#define ROT_MEM_CTRL (0x538) > +#define ROT_SIZE (0x53C) > + > +/* DMA aligned limited: 128bits aligned */ > + > +#define AFBC_HEADER_ADDR_ALIGN (64) > +#define AFBC_HEADER_STRIDE_ALIGN (64) > + > +/* DPP */ > + > +#define DITHER_PARA (0x000) > +#define DITHER_CTL (0x004) > +#define DITHER_MATRIX_PART1 (0x008) > +#define DITHER_MATRIX_PART0 (0x00C) > +#define DITHER_ERRDIFF_WEIGHT (0x010) > +#define DITHER_FRC_01_PART1 (0x014) > +#define DITHER_FRC_01_PART0 (0x018) > +#define DITHER_FRC_10_PART1 (0x01C) > +#define DITHER_FRC_10_PART0 (0x020) > +#define DITHER_FRC_11_PART1 (0x024) > +#define DITHER_FRC_11_PART0 (0x028) > +#define DITHER_MEM_CTRL (0x02C) > +#define DITHER_DBG0 (0x030) > +#define DITHER_DBG1 (0x034) > +#define DITHER_DBG2 (0x038) > + > +#define LCP_GMP_BYPASS_EN (0x030) > +#define LCP_XCC_BYPASS_EN (0x034) > +#define LCP_DEGAMA_EN (0x038) > +#define LCP_DEGAMA_MEM_CTRL (0x03C) > +#define LCP_GMP_MEM_CTRL (0x040) > + > +#define ARSR1P_IHLEFT (0x000) > +#define ARSR1P_IHRIGHT (0x004) > +#define ARSR1P_IHLEFT1 (0x008) > +#define ARSR1P_IHRIGHT1 (0x00C) > +#define ARSR1P_IVTOP (0x010) > +#define ARSR1P_IVBOTTOM (0x014) > +#define ARSR1P_UV_OFFSET (0x018) > +#define ARSR1P_IHINC (0x01C) > +#define ARSR1P_IVINC (0x020) > +#define ARSR1P_MODE (0x024) > +#define ARSR1P_FORMAT (0x028) > +#define ARSR1P_SKIN_THRES_Y (0x02C) > +#define ARSR1P_SKIN_THRES_U (0x030) > +#define ARSR1P_SKIN_THRES_V (0x034) > +#define ARSR1P_SKIN_EXPECTED (0x038) > +#define ARSR1P_SKIN_CFG (0x03C) > +#define ARSR1P_SHOOT_CFG1 (0x040) > +#define ARSR1P_SHOOT_CFG2 (0x044) > +#define ARSR1P_SHARP_CFG1 (0x048) > +#define ARSR1P_SHARP_CFG2 (0x04C) > +#define ARSR1P_SHARP_CFG3 (0x050) > +#define ARSR1P_SHARP_CFG4 (0x054) > +#define ARSR1P_SHARP_CFG5 (0x058) > +#define ARSR1P_SHARP_CFG6 (0x05C) > +#define ARSR1P_SHARP_CFG7 (0x060) > +#define ARSR1P_SHARP_CFG8 (0x064) > +#define ARSR1P_SHARP_CFG9 (0x068) > +#define ARSR1P_SHARP_CFG10 (0x06C) > +#define ARSR1P_SHARP_CFG11 (0x070) > +#define ARSR1P_DIFF_CTRL (0x074) > +#define ARSR1P_LSC_CFG1 (0x078) > +#define ARSR1P_LSC_CFG2 (0x07C) > +#define ARSR1P_LSC_CFG3 (0x080) > +#define ARSR1P_FORCE_CLK_ON_CFG (0x084) > + > +/* BIT EXT */ > + > +#define LCP_U_GMP_COEF (0x0000) > + > +#define ARSR1P_LSC_GAIN (0x084) > +#define ARSR1P_COEFF_H_Y0 (0x0F0) > +#define ARSR1P_COEFF_H_Y1 (0x114) > +#define ARSR1P_COEFF_V_Y0 (0x138) > +#define ARSR1P_COEFF_V_Y1 (0x15C) > +#define ARSR1P_COEFF_H_UV0 (0x180) > +#define ARSR1P_COEFF_H_UV1 (0x1A4) > +#define ARSR1P_COEFF_V_UV0 (0x1C8) > +#define ARSR1P_COEFF_V_UV1 (0x1EC) > + > +#endif > diff --git a/drivers/staging/hikey9xx/gpu/kirin970_defs.c b/drivers/staging/hikey9xx/gpu/kirin970_defs.c > new file mode 100644 > index 000000000000..d72d4d5712eb > --- /dev/null > +++ b/drivers/staging/hikey9xx/gpu/kirin970_defs.c > @@ -0,0 +1,373 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (c) 2008-2011, Hisilicon Tech. Co., Ltd. All rights reserved. > + * Copyright (c) 2008-2020, Huawei Technologies Co., Ltd > + */ > + > +#include <drm/drm_atomic.h> > +#include <drm/drm_atomic_helper.h> > +#include <drm/drm_crtc.h> > +#include <drm/drm_crtc_helper.h> > +#include <drm/drm_drv.h> > +#include <drm/drm_fb_cma_helper.h> > +#include <drm/drm_fourcc.h> > +#include <drm/drm_gem_cma_helper.h> > +#include <drm/drm_plane_helper.h> > + > +#include "kirin9xx_drm_dpe_utils.h" > +#include "kirin9xx_drm_drv.h" > +#include "kirin970_dpe_reg.h" Same as before. Sort and reduce to the necessary includes. > + > +static const u32 kirin970_g_dss_module_base[DSS_CHN_MAX_DEFINE][MODULE_CHN_MAX] = { > + /* D0 */ > + { > + MIF_CH0_OFFSET, /* MODULE_MIF_CHN */ > + AIF0_CH0_OFFSET, /* MODULE_AIF0_CHN */ > + AIF1_CH0_OFFSET, /* MODULE_AIF1_CHN */ > + MCTL_CTL_MUTEX_RCH0, /* MODULE_MCTL_CHN_MUTEX */ > + DSS_MCTRL_SYS_OFFSET + MCTL_RCH0_FLUSH_EN, /* MODULE_MCTL_CHN_FLUSH_EN */ > + DSS_MCTRL_SYS_OFFSET + MCTL_RCH0_OV_OEN, /* MODULE_MCTL_CHN_OV_OEN */ > + DSS_MCTRL_SYS_OFFSET + MCTL_RCH0_STARTY, /* MODULE_MCTL_CHN_STARTY */ > + DSS_MCTRL_SYS_OFFSET + MCTL_MOD0_DBG, /* MODULE_MCTL_CHN_MOD_DBG */ > + DSS_RCH_D0_DMA_OFFSET, /* MODULE_DMA */ > + DSS_RCH_D0_DFC_OFFSET, /* MODULE_DFC */ > + 0, /* MODULE_SCL */ > + 0, /* MODULE_SCL_LUT */ > + 0, /* MODULE_ARSR2P */ > + 0, /* MODULE_ARSR2P_LUT */ > + 0, /* MODULE_POST_CLIP_ES */ > + 0, /* MODULE_POST_CLIP */ > + 0, /* MODULE_PCSC */ > + DSS_RCH_D0_CSC_OFFSET, /* MODULE_CSC */ > + }, ... > + }, > +}; > + > +static const u32 kirin970_g_dss_module_ovl_base[DSS_MCTL_IDX_MAX][MODULE_OVL_MAX] = { > + {DSS_OVL0_OFFSET, > + DSS_MCTRL_CTL0_OFFSET}, > + > + {DSS_OVL1_OFFSET, > + DSS_MCTRL_CTL1_OFFSET}, > + > + {DSS_OVL2_OFFSET, > + DSS_MCTRL_CTL2_OFFSET}, > + > + {DSS_OVL3_OFFSET, > + DSS_MCTRL_CTL3_OFFSET}, > + > + {0, > + DSS_MCTRL_CTL4_OFFSET}, > + > + {0, > + DSS_MCTRL_CTL5_OFFSET}, > +}; > + > +/* SCF_LUT_CHN coef_idx */ > +static const int kirin970_g_scf_lut_chn_coef_idx[DSS_CHN_MAX_DEFINE] = { > + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 > +}; > + > +static const u32 kirin970_g_dss_module_cap[DSS_CHN_MAX_DEFINE][MODULE_CAP_MAX] = { > + /* D2 */ > + {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1}, > + /* D3 */ > + {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, > + /* V0 */ > + {0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1}, > + /* G0 */ > + {0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0}, > + /* V1 */ > + {0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1}, > + /* G1 */ > + {0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0}, > + /* D0 */ > + {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, > + /* D1 */ > + {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, > + > + /* W0 */ > + {1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1}, > + /* W1 */ > + {1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1}, > + > + /* V2 */ > + {0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1}, > + /* W2 */ > + {1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1}, > +}; > + > +/* number of smrx idx for each channel */ > +static const u32 kirin970_g_dss_chn_sid_num[DSS_CHN_MAX_DEFINE] = { > + 4, 1, 4, 4, 4, 4, 1, 1, 3, 4, 3, 3 > +}; > + > +/* start idx of each channel */ > +/* smrx_idx = g_dss_smmu_smrx_idx[chn_idx] + (0 ~ g_dss_chn_sid_num[chn_idx]) */ > +static const u32 kirin970_g_dss_smmu_smrx_idx[DSS_CHN_MAX_DEFINE] = { > + 0, 4, 5, 9, 13, 17, 21, 22, 26, 29, 23, 36 > +}; > + > +void kirin970_dpe_defs(struct dss_hw_ctx *ctx) > +{ > + memcpy(&ctx->g_dss_module_base, &kirin970_g_dss_module_base, > + sizeof(kirin970_g_dss_module_base)); > + memcpy(&ctx->g_dss_module_ovl_base, &kirin970_g_dss_module_ovl_base, > + sizeof(kirin970_g_dss_module_ovl_base)); > + memcpy(&ctx->g_scf_lut_chn_coef_idx, &kirin970_g_scf_lut_chn_coef_idx, > + sizeof(kirin970_g_scf_lut_chn_coef_idx)); > + memcpy(&ctx->g_dss_module_cap, &kirin970_g_dss_module_cap, > + sizeof(kirin970_g_dss_module_cap)); > + memcpy(&ctx->g_dss_chn_sid_num, &kirin970_g_dss_chn_sid_num, > + sizeof(kirin970_g_dss_chn_sid_num)); > + memcpy(&ctx->g_dss_smmu_smrx_idx, &kirin970_g_dss_smmu_smrx_idx, > + sizeof(kirin970_g_dss_smmu_smrx_idx)); > + > + ctx->smmu_offset = DSS_SMMU_OFFSET; > + ctx->afbc_header_addr_align = AFBC_HEADER_ADDR_ALIGN; > + ctx->dss_mmbuf_clk_rate_power_off = DEFAULT_DSS_MMBUF_CLK_RATE_POWER_OFF; > + ctx->rot_mem_ctrl = ROT_MEM_CTRL; > + ctx->dither_mem_ctrl = DITHER_MEM_CTRL; > + ctx->arsr2p_lb_mem_ctrl = ARSR2P_LB_MEM_CTRL; > + ctx->pxl0_clk_rate_power_off = DEFAULT_DSS_PXL0_CLK_RATE_POWER_OFF; > +} > diff --git a/drivers/staging/hikey9xx/gpu/kirin970_dpe_reg.h b/drivers/staging/hikey9xx/gpu/kirin970_dpe_reg.h > new file mode 100644 > index 000000000000..6cd1d6f5e8d0 > --- /dev/null > +++ b/drivers/staging/hikey9xx/gpu/kirin970_dpe_reg.h > @@ -0,0 +1,1183 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (c) 2016 Linaro Limited. > + * Copyright (c) 2014-2016 Hisilicon Limited. > + * Copyright (c) 2014-2020, Huawei Technologies Co., Ltd > + */ > + > +#ifndef __KIRIN970_DPE_REG_H__ > +#define __KIRIN970_DPE_REG_H__ > + > +#include "kirin9xx_dpe.h" Same coment as before, looks like a layering issue if this header file is needed. > + > +#define CRGPERI_PLL0_CLK_RATE (1660000000UL) > +#define CRGPERI_PLL2_CLK_RATE (1920000000UL) > +#define CRGPERI_PLL3_CLK_RATE (1200000000UL) > +#define CRGPERI_PLL7_CLK_RATE (1782000000UL) > + > +/* core_clk: 0.65v-300M, 0.75-415M, 0.8-553.33M */ > +#define DEFAULT_DSS_CORE_CLK_RATE_L3 (554000000UL) > +#define DEFAULT_DSS_CORE_CLK_RATE_L2 (415000000UL) > + > +#define DEFAULT_DSS_CORE_CLK_RATE_ES (400000000UL) > + > +/* pix0_clk: 0.65v-300M, 0.75-415M, 0.8-645M */ > +#define DEFAULT_DSS_PXL0_CLK_RATE_L3 (645000000UL) > +#define DEFAULT_DSS_PXL0_CLK_RATE_L2 (415000000UL) > +#define DEFAULT_DSS_PXL0_CLK_RATE_L1 (300000000UL) > + > +/* mmbuf_clk: 0.65v-237.14M, 0.75-332M, 0.8-480M */ > +#define DEFAULT_DSS_MMBUF_CLK_RATE_L3 (480000000UL) > +#define DEFAULT_DSS_MMBUF_CLK_RATE_L2 (332000000UL) > + > +/* pix1_clk: 0.65v-254.57M, 0.75-415M, 0.8-594M */ > +#define DEFAULT_DSS_PXL1_CLK_RATE_L3 (594000000UL) > +#define DEFAULT_DSS_PXL1_CLK_RATE_L2 (415000000UL) > +#define DEFAULT_DSS_PXL1_CLK_RATE_L1 (255000000UL) > + > +/* mdc_dvfs_clk: 0.65v-240M, 0.75-332M, 0.8-553.33M */ > +#define DEFAULT_MDC_CORE_CLK_RATE_L3 (554000000UL) > +#define DEFAULT_MDC_CORE_CLK_RATE_L2 (332000000UL) > +#define DEFAULT_MDC_CORE_CLK_RATE_L1 (240000000UL) > + > +/* dss clk power off */ > +#define DEFAULT_DSS_PXL0_CLK_RATE_POWER_OFF (238000000UL) > +#define DEFAULT_DSS_MMBUF_CLK_RATE_POWER_OFF (208000000UL) > + > +/*****************************************************************************/ > + > +#define PEREN4 (0x040) > +#define PERDIS4 (0x044) > +#define PERRSTEN0 (0x060) > +#define PERRSTDIS5 (0x0A0) > +#define PEREN6 (0x410) > +#define PERDIS6 (0x414) > + > +/* SYSCTRL */ > +#define SCISODIS (0x044) > +#define SCPWREN (0x060) > +#define SCPEREN1 (0x170) > +#define SCPERDIS1 (0x174) > +#define SCPEREN4 (0x1B0) > +#define SCPERDIS4 (0x1B4) > +#define SCPERRSTDIS1 (0x210) > + > +/* PCTRL */ > +#define PERI_CTRL33 (0x088) > + > +/*****************************************************************************/ > + > +/* MODULE BASE ADDRESS */ > + > +/* SMMU */ > +#define DSS_SMMU_OFFSET (0x80000) > + > +/* RCH_V */ > +#define DSS_RCH_VG0_POST_CLIP_OFFSET_ES (0x203A0) > +#define DSS_RCH_VG0_POST_CLIP_OFFSET (0x20480) > + > +#define DSS_RCH_VG1_POST_CLIP_OFFSET_ES (0x283A0) > +#define DSS_RCH_VG1_POST_CLIP_OFFSET (0x28480) > + > +#define DSS_RCH_VG2_POST_CLIP_OFFSET_ES (0x303A0) > +#define DSS_RCH_VG2_POST_CLIP_OFFSET (0x30480) > +#define DSS_RCH_VG2_SCL_LUT_OFFSET (0x31000) /* ES */ > + > +/* RCH_G */ > +#define DSS_RCH_G0_POST_CLIP_OFFSET_ES (0x383A0) > +#define DSS_RCH_G0_POST_CLIP_OFFSET (0x38480) > + > +#define DSS_RCH_G1_POST_CLIP_OFFSET_ES (0x403A0) > +#define DSS_RCH_G1_POST_CLIP_OFFSET (0x40480) > + > +/* RCH_D */ > + > +/* WCH */ > +#define DSS_WCH0_BITEXT_OFFSET (0x5A140) > +#define DSS_WCH0_DITHER_OFFSET (0x5A1D0) > +#define DSS_WCH0_PCSC_OFFSET (0x5A400) > +#define DSS_WCH0_ROT_OFFSET (0x5A530) > +#define DSS_WCH0_FBCE_CREG_CTRL_GATE (0x5A964) > + > +#define DSS_WCH1_BITEXT_OFFSET (0x5C140) > +#define DSS_WCH1_DITHER_OFFSET (0x5C1D0) > +#define DSS_WCH1_SCL_OFFSET (0x5C200) > +#define DSS_WCH1_PCSC_OFFSET (0x5C400) > +#define DSS_WCH1_ROT_OFFSET (0x5C530) > +#define DSS_WCH1_FBCE_CREG_CTRL_GATE (0x5C964) > + > +/* DPP */ > +#define DSS_DPP_CLIP_OFFSET (0x70180) > +#define DSS_DPP_XCC_OFFSET (0x70900) > +#define DSS_DPP_DEGAMMA_OFFSET (0x70950) > +#define DSS_DPP_GMP_OFFSET (0x709A0) > +#define DSS_DPP_ARSR_POST_OFFSET (0x70A00) > +#define DSS_DPP_GMP_LUT_OFFSET (0x73000) > +#define DSS_DPP_GAMA_PRE_LUT_OFFSET (0x75000) > +#define DSS_DPP_DEGAMMA_LUT_OFFSET (0x78000) > +#define DSS_DPP_ARSR_POST_LUT_OFFSET (0x7B000) > + > +/* for boston es */ > +#define DSS_DPP_LCP_OFFSET_ES (0x70900) > +#define DSS_DPP_LCP_LUT_OFFSET_ES (0x73000) > + > +/* POST SCF */ > +#define DSS_POST_SCF_OFFSET DSS_DPP_ARSR_POST_OFFSET > +#define DSS_POST_SCF_LUT_OFFSET DSS_DPP_ARSR_POST_LUT_OFFSET > +/* POST SCF for ES */ > +#define DSS_POST_SCF_LUT_OFFSET_ES (0x7B000) > + > +/* AIF */ > + > +/* (0x0004+0x20*n) */ > +#define AIF_CH_HS (0x0004) > +/* (0x0008+0x20*n) */ > +#define AIF_CH_LS (0x0008) > + > +/* SMMU */ > + > +#define SMMU_SMRx_P (0x10000) > +#define SMMU_RLD_EN0_P (0x101F0) > +#define SMMU_RLD_EN1_P (0x101F4) > +#define SMMU_RLD_EN2_P (0x101F8) > +#define SMMU_INTMAS_P (0x10200) > +#define SMMU_INTRAW_P (0x10204) > +#define SMMU_INTSTAT_P (0x10208) > +#define SMMU_INTCLR_P (0x1020C) > +#define SMMU_SCR_P (0x10210) > +#define SMMU_PCB_SCTRL (0x10214) > +#define SMMU_PCB_TTBR (0x10218) > +#define SMMU_PCB_TTBCR (0x1021C) > +#define SMMU_OFFSET_ADDR_P (0x10220) > + > +/* DFC */ > +#define DFC_GLB_ALPHA01 (0x0008) > +#define DFC_GLB_ALPHA23 (0x0028) > +#define DFC_BITEXT_CTL (0x0040) > +#define DFC_DITHER_CTL1 (0x00D0) > + > +/* SCF */ > + > +/* MACROS */ > +#define SCF_MIN_INPUT (16) /* SCF min input pix 16x16 */ > +#define SCF_MIN_OUTPUT (16) /* SCF min output pix 16x16 */ > + > +#define SCF_INC_FACTOR BIT(18) /* (262144) */ > + > +/* ARSR2P ES v0 */ > +#define ARSR2P_INPUT_WIDTH_HEIGHT_ES (0x000) > +#define ARSR2P_OUTPUT_WIDTH_HEIGHT_ES (0x004) > +#define ARSR2P_IHLEFT_ES (0x008) > +#define ARSR2P_IHRIGHT_ES (0x00C) > +#define ARSR2P_IVTOP_ES (0x010) > +#define ARSR2P_IVBOTTOM_ES (0x014) > +#define ARSR2P_IHINC_ES (0x018) > +#define ARSR2P_IVINC_ES (0x01C) > +#define ARSR2P_UV_OFFSET_ES (0x020) > +#define ARSR2P_MODE_ES (0x024) > +#define ARSR2P_SKIN_THRES_Y_ES (0x028) > +#define ARSR2P_SKIN_THRES_U_ES (0x02C) > +#define ARSR2P_SKIN_THRES_V_ES (0x030) > +#define ARSR2P_SKIN_CFG0_ES (0x034) > +#define ARSR2P_SKIN_CFG1_ES (0x038) > +#define ARSR2P_SKIN_CFG2_ES (0x03C) > +#define ARSR2P_SHOOT_CFG1_ES (0x040) > +#define ARSR2P_SHOOT_CFG2_ES (0x044) > +#define ARSR2P_SHARP_CFG1_ES (0x048) > +#define ARSR2P_SHARP_CFG2_ES (0x04C) > +#define ARSR2P_SHARP_CFG3_ES (0x050) > +#define ARSR2P_SHARP_CFG4_ES (0x054) > +#define ARSR2P_SHARP_CFG5_ES (0x058) > +#define ARSR2P_SHARP_CFG6_ES (0x05C) > +#define ARSR2P_SHARP_CFG7_ES (0x060) > +#define ARSR2P_SHARP_CFG8_ES (0x064) > +#define ARSR2P_SHARP_CFG9_ES (0x068) > +#define ARSR2P_TEXTURW_ANALYSTS_ES (0x06C) > +#define ARSR2P_INTPLSHOOTCTRL_ES (0x070) > +#define ARSR2P_DEBUG0_ES (0x074) > +#define ARSR2P_DEBUG1_ES (0x078) > +#define ARSR2P_DEBUG2_ES (0x07C) > +#define ARSR2P_DEBUG3_ES (0x080) > +#define ARSR2P_LB_MEM_CTRL_ES (0x084) > +#define ARSR2P_IHLEFT1_ES (0x088) > +#define ARSR2P_IHRIGHT1_ES (0x090) > +#define ARSR2P_IVBOTTOM1_ES (0x094) > + > +#define ARSR2P_LUT_COEFY_V_OFFSET_ES (0x0000) > +#define ARSR2P_LUT_COEFY_H_OFFSET_ES (0x0100) > +#define ARSR2P_LUT_COEFA_V_OFFSET_ES (0x0300) > +#define ARSR2P_LUT_COEFA_H_OFFSET_ES (0x0400) > +#define ARSR2P_LUT_COEFUV_V_OFFSET_ES (0x0600) > +#define ARSR2P_LUT_COEFUV_H_OFFSET_ES (0x0700) > + > +/* ARSR2P v0 */ > +#define ARSR2P_IHLEFT1 (0x00C) > +#define ARSR2P_IHRIGHT (0x010) > +#define ARSR2P_IHRIGHT1 (0x014) > +#define ARSR2P_IVTOP (0x018) > +#define ARSR2P_IVBOTTOM (0x01C) > +#define ARSR2P_IVBOTTOM1 (0x020) > +#define ARSR2P_IHINC (0x024) > +#define ARSR2P_IVINC (0x028) > +#define ARSR2P_OFFSET (0x02C) > +#define ARSR2P_MODE (0x030) > +#define ARSR2P_SKIN_THRES_Y (0x034) > +#define ARSR2P_SKIN_THRES_U (0x038) > +#define ARSR2P_SKIN_THRES_V (0x03C) > +#define ARSR2P_SKIN_CFG0 (0x040) > +#define ARSR2P_SKIN_CFG1 (0x044) > +#define ARSR2P_SKIN_CFG2 (0x048) > +#define ARSR2P_SHOOT_CFG1 (0x04C) > +#define ARSR2P_SHOOT_CFG2 (0x050) > +#define ARSR2P_SHOOT_CFG3 (0x054) > +#define ARSR2P_SHARP_CFG1 (0x080) > +#define ARSR2P_SHARP_CFG2 (0x084) > +#define ARSR2P_SHARP_CFG3 (0x088) > +#define ARSR2P_SHARP_CFG4 (0x08C) > +#define ARSR2P_SHARP_CFG5 (0x090) > +#define ARSR2P_SHARP_CFG6 (0x094) > +#define ARSR2P_SHARP_CFG7 (0x098) > +#define ARSR2P_SHARP_CFG8 (0x09C) > +#define ARSR2P_SHARP_CFG9 (0x0A0) > +#define ARSR2P_SHARP_CFG10 (0x0A4) > +#define ARSR2P_SHARP_CFG11 (0x0A8) > +#define ARSR2P_SHARP_CFG12 (0x0AC) > +#define ARSR2P_TEXTURW_ANALYSTS (0x0D0) > +#define ARSR2P_INTPLSHOOTCTRL (0x0D4) > +#define ARSR2P_DEBUG0 (0x0D8) > +#define ARSR2P_DEBUG1 (0x0DC) > +#define ARSR2P_DEBUG2 (0x0E0) > +#define ARSR2P_DEBUG3 (0x0E4) > +#define ARSR2P_LB_MEM_CTRL (0x0E8) > + > +/* POST_CLIP v g */ > +#define POST_CLIP_CTL_HRZ (0x0004) > +#define POST_CLIP_CTL_VRZ (0x0008) > +#define POST_CLIP_EN (0x000C) > + > +#define POST_CLIP_DISP_SIZE_ES (0x0000) > +#define POST_CLIP_CTL_HRZ_ES (0x0010) > +#define POST_CLIP_CTL_VRZ_ES (0x0014) > +#define POST_CLIP_EN_ES (0x0018) > + > +/* CSC */ > +#define CSC_ICG_MODULE_ES (0x0024) > +#define CSC_P00 (0x0010) > +#define CSC_P01 (0x0014) > +#define CSC_P02 (0x0018) > +#define CSC_P10 (0x001C) > +#define CSC_P11 (0x0020) > +#define CSC_P12 (0x0024) > +#define CSC_P20 (0x0028) > +#define CSC_P21 (0x002C) > +#define CSC_P22 (0x0030) > +#define CSC_ICG_MODULE (0x0034) > + > +/* AFBCE */ > +#define AFBCE_HREG_HDR_PTR_L0 (0x908) > +#define AFBCE_HREG_PLD_PTR_L0 (0x90C) > + > +/* ROT */ > +#define ROT_MEM_CTRL_ES (0x538) > +#define ROT_SIZE_ES (0x53C) > + > +#define ROT_MEM_CTRL (0x588) > +#define ROT_SIZE (0x58C) > +#define ROT_422_MODE (0x590) > + > +/* REG_DEFAULT */ > + > +/* MACROS */ > + > +/* DMA aligned limited: 128bits aligned */ > + > +/* 16Bytes */ > +/* 32BPP:1024, 16BPP 512 */ > + > +#define AFBC_HEADER_ADDR_ALIGN (16) > +#define AFBC_HEADER_STRIDE_ALIGN (16) > + > +/* 16Pixels */ > + > +#define MMBUF_BASE (0x40) /* (0xea800000) */ > +#define MMBUF_BLOCK0_LINE_NUM (8) > +#define MMBUF_BLOCK0_ROT_LINE_NUM (64) > +#define MMBUF_BLOCK1_LINE_NUM (16) > + > +#define HFBC_PIC_WIDTH_MIN (64) > +#define HFBC_PIC_WIDTH_ROT_MIN (16) > +#define HFBC_PIC_WIDTH_MAX (512) > +#define HFBC_PIC_WIDTH_ROT_MAX (4096) > +#define HFBC_PIC_HEIGHT_MIN (8) > +#define HFBC_PIC_HEIGHT_ROT_MIN (32) > +#define HFBC_PIC_HEIGHT_MAX (8196) > +#define HFBC_PIC_HEIGHT_ROT_MAX (2160) > +#define HFBC_BLOCK0_WIDTH_ALIGN (64) > +#define HFBC_BLOCK0_HEIGHT_ALIGN (8) > +#define HFBC_BLOCK1_WIDTH_ALIGN (32) > +#define HFBC_BLOCK1_HEIGHT_ALIGN (16) > +#define HFBC_HEADER_ADDR_ALIGN (4) > +#define HFBC_HEADER_STRIDE_ALIGN (32) > +#define HFBC_HEADER_STRIDE_BLOCK (4) > +#define HFBC_PAYLOAD0_ALIGN_8BIT (512) > +#define HFBC_PAYLOAD1_ALIGN_8BIT (256) > +#define HFBC_PAYLOAD_ALIGN_10BIT (1024) > + > +#define HFBCD_BLOCK0_CROP_MAX (7) > +#define HFBCD_BLOCK0_ROT_CROP_MAX (63) > +#define HFBCD_BLOCK1_CROP_MAX (15) > + > +/* MCTL SYS */ > +/* SECU */ > +#define MCTL_RCH0_SECU_GATE (0x0080) > +#define MCTL_RCH1_SECU_GATE (0x0084) > +#define MCTL_RCH2_SECU_GATE (0x0088) > +#define MCTL_RCH3_SECU_GATE (0x008C) > +#define MCTL_RCH4_SECU_GATE (0x0090) > +#define MCTL_RCH5_SECU_GATE (0x0094) > +#define MCTL_RCH6_SECU_GATE (0x0098) > +#define MCTL_RCH7_SECU_GATE (0x009C) > +#define MCTL_RCH8_SECU_GATE (0x00A0) > +#define MCTL_OV2_SECU_GATE (0x00B0) > +#define MCTL_OV3_SECU_GATE (0x00B4) > +#define MCTL_DSI0_SECU_CFG (0x00C0) > +#define MCTL_DSI1_SECU_CFG (0x00C4) > +#define MCTL_DP_SECU_GATE (0x00C8) > +#define MCTL_DSI_MUX_SECU_GATE (0x00CC) > +/* FLUSH EN */ > +/* SW FOR RCH */ > +#define MCTL_RCH8_OV_OEN (0x015C) > +/* SW FOR OV */ > +#define MCTL_RCH_OV0_SEL1 (0x0190) > +#define MCTL_RCH_OV1_SEL1 (0x0194) > +#define MCTL_RCH_OV2_SEL1 (0x0198) > +/* SW FOR WCH */ > +/* SW FOR OV2/3 OUTPUT */ > +/* SW */ > +/* RCH STARTY */ > +#define MCTL_RCH8_STARTY (0x01E0) > +/* LP */ > + > +/* RCH */ > +#define MCTL_MOD_DBG_ADD_CH_NUM (2) /* copybit */ > + > +/* SBL */ > +/* SBL FOR ES */ > +#define SBL_REG_FRMT_MODE_ES (0x0000) > +#define SBL_REG_FRMT_DBUF_CTRL_ES (0x0008) > +#define SBL_REG_FRMT_FRAME_WIDTH_7_TO_0_ES (0x0010) > +#define SBL_REG_FRMT_FRAME_WIDTH_15_TO_8_ES (0x0014) > +#define SBL_REG_FRMT_FRAME_HEIGHT_7_TO_0_ES (0x0018) > +#define SBL_REG_FRMT_FRAME_HEIGHT_15_TO_8_ES (0x001c) > +#define SBL_REG_FRMT_ROI_HOR_START_7_TO_0_ES (0x0080) > +#define SBL_REG_FRMT_ROI_HOR_START_15_TO_8_ES (0x0084) > +#define SBL_REG_FRMT_ROI_HOR_END_7_TO_0_ES (0x0088) > +#define SBL_REG_FRMT_ROI_HOR_END_15_TO_8_ES (0x008c) > +#define SBL_REG_FRMT_ROI_VER_START_7_TO_0_ES (0x0090) > +#define SBL_REG_FRMT_ROI_VER_START_15_TO_8_ES (0x0094) > +#define SBL_REG_FRMT_ROI_VER_END_7_TO_0_ES (0x0098) > +#define SBL_REG_FRMT_ROI_VER_END_15_TO_8_ES (0x009c) > +#define SBL_REG_CALC_CONTROL_0_ES (0x0400) > +#define SBL_REG_CALC_CONTROL_1_ES (0x0404) > +#define SBL_REG_CALC_AMBIENT_LIGHT_7_TO_0_ES (0x0408) > +#define SBL_REG_CALC_AMBIENT_LIGHT_15_TO_8_ES (0x040c) > +#define SBL_REG_CALC_BACKLIGHT_7_TO_0_ES (0x0410) > +#define SBL_REG_CALC_BACKLIGHT_15_TO_8_ES (0x0414) > +#define SBL_REG_CALC_ASSERTIVENESS_ES (0x0418) > +#define SBL_REG_CALC_TF_CONTROL_ES (0x041c) > +#define SBL_REG_CALC_STRENGTH_MANUAL_7_TO_0_ES (0x0420) > +#define SBL_REG_CALC_STRENGTH_MANUAL_9_TO_8_ES (0x0424) > +#define SBL_REG_CALC_GAIN_AA_MANUAL_7_TO_0_ES (0x0428) > +#define SBL_REG_CALC_GAIN_AA_MANUAL_11_TO_8_ES (0x042c) > +#define SBL_REG_CALC_ROI_FACTOR_IN_7_TO_0_ES (0x0430) > +#define SBL_REG_CALC_ROI_FACTOR_IN_15_TO_8_ES (0x0434) > +#define SBL_REG_CALC_ROI_FACTOR_OUT_7_TO_0_ES (0x0438) > +#define SBL_REG_CALC_ROI_FACTOR_OUT_15_TO_8_ES (0x043c) > +#define SBL_REG_CALC_PSR_DELTA_CHANGE_7_TO_0_ES (0x0448) > +#define SBL_REG_CALC_PSR_DELTA_CHANGE_15_TO_8_ES (0x044c) > +#define SBL_REG_CALC_PSR_DELTA_SETTLE_7_TO_0_ES (0x0450) > +#define SBL_REG_CALC_PSR_DELTA_SETTLE_15_TO_8_ES (0x0454) > +#define SBL_REG_CALC_AL_SCALE_7_TO_0_ES (0x0458) > +#define SBL_REG_CALC_AL_SCALE_15_TO_8_ES (0x045c) > +#define SBL_REG_CALC_AL_TF_STEP_SAMPLE_ES (0x0460) > +#define SBL_REG_CALC_AL_TF_STEP_WAIT_7_TO_0_ES (0x0468) > +#define SBL_REG_CALC_AL_TF_STEP_WAIT_11_TO_8_ES (0x046c) > +#define SBL_REG_CALC_AL_TF_STEP_WAITUP_7_TO_0_ES (0x0470) > +#define SBL_REG_CALC_AL_TF_STEP_WAITUP_11_TO_8_ES (0x0474) > +#define SBL_REG_CALC_AL_TF_STEP_SIZE_7_TO_0_ES (0x0478) > +#define SBL_REG_CALC_AL_TF_STEP_SIZE_11_TO_8_ES (0x047c) > +#define SBL_REG_CALC_AL_TF_LIMIT_7_TO_0_ES (0x0480) > +#define SBL_REG_CALC_AL_TF_LIMIT_15_TO_8_ES (0x0484) > +#define SBL_REG_CALC_AL_TF_ALPHA_ES (0x0488) > +#define SBL_REG_CALC_AL_TF_ALPHA_UP_ES (0x048c) > +#define SBL_REG_CALC_AL_TF_NOISE_7_TO_0_ES (0x0490) > +#define SBL_REG_CALC_AL_TF_NOISE_15_TO_8_ES (0x0494) > +#define SBL_REG_CALC_AL_TF_M_INC_7_TO_0_ES (0x0498) > +#define SBL_REG_CALC_AL_TF_M_INC_15_TO_8_ES (0x049c) > +#define SBL_REG_CALC_AL_TF_K_INC_7_TO_0_ES (0x04a0) > +#define SBL_REG_CALC_AL_TF_K_INC_15_TO_8_ES (0x04a4) > +#define SBL_REG_CALC_AL_TF_M_DEC_7_TO_0_ES (0x04a8) > +#define SBL_REG_CALC_AL_TF_M_DEC_15_TO_8_ES (0x04ac) > +#define SBL_REG_CALC_AL_TF_K_DEC_7_TO_0_ES (0x04b0) > +#define SBL_REG_CALC_AL_TF_K_DEC_15_TO_8_ES (0x04b4) > +#define SBL_REG_CALC_AL_TF_AGGRESSIVENESS_ES (0x04b8) > +#define SBL_REG_CALC_AL_RTF_FILTER_A_7_TO_0_ES (0x04c0) > +#define SBL_REG_CALC_AL_RTF_FILTER_A_15_TO_8_ES (0x04c4) > +#define SBL_REG_CALC_AL_RTF_FILTER_B_7_TO_0_ES (0x04c8) > +#define SBL_REG_CALC_AL_RTF_FILTER_B_15_TO_8_ES (0x04cc) > +#define SBL_REG_CALC_AL_RTF_FILTER_C_7_TO_0_ES (0x04d0) > +#define SBL_REG_CALC_AL_RTF_FILTER_C_15_TO_8_ES (0x04d4) > +#define SBL_REG_CALC_AB_AL_KNEE1_7_TO_0_ES (0x04d8) > +#define SBL_REG_CALC_AB_AL_KNEE1_15_TO_8_ES (0x04dc) > +#define SBL_REG_CALC_AB_AL_KNEE2_7_TO_0_ES (0x04e0) > +#define SBL_REG_CALC_AB_AL_KNEE2_15_TO_8_ES (0x04e4) > +#define SBL_REG_CALC_AB_BL_KNEE1_7_TO_0_ES (0x04e8) > +#define SBL_REG_CALC_AB_BL_KNEE1_15_TO_8_ES (0x04ec) > +#define SBL_REG_CALC_AB_BL_KNEE2_7_TO_0_ES (0x04f0) > +#define SBL_REG_CALC_AB_BL_KNEE2_15_TO_8_ES (0x04f4) > +#define SBL_REG_CALC_BL_PANEL_MAX_7_TO_0_ES (0x04f8) > +#define SBL_REG_CALC_BL_PANEL_MAX_15_TO_8_ES (0x04fc) > +#define SBL_REG_CALC_BL_OFFSET_7_TO_0_ES (0x0500) > +#define SBL_REG_CALC_BL_OFFSET_15_TO_8_ES (0x0504) > +#define SBL_REG_CALC_BL_MIN_7_TO_0_ES (0x0508) > +#define SBL_REG_CALC_BL_MIN_15_TO_8_ES (0x050c) > +#define SBL_REG_CALC_BL_ATTEN_ALPHA_7_TO_0_ES (0x0510) > +#define SBL_REG_CALC_BL_ATTEN_ALPHA_9_TO_8_ES (0x0514) > +#define SBL_REG_CALC_SBC1_TF_DEPTH_7_TO_0_ES (0x0518) > +#define SBL_REG_CALC_SBC1_TF_DEPTH_15_TO_8_ES (0x051c) > +#define SBL_REG_CALC_SBC1_TF_STEP_7_TO_0_ES (0x0520) > +#define SBL_REG_CALC_SBC1_TF_STEP_15_TO_8_ES (0x0524) > +#define SBL_REG_CALC_SBC1_TF_ASYM_ES (0x0528) > +#define SBL_REG_CALC_SBC1_TF_DEPTH_LOG_7_TO_0_ES (0x0530) > +#define SBL_REG_CALC_SBC1_TF_DEPTH_LOG_15_TO_8_ES (0x0534) > +#define SBL_REG_CALC_SBC1_TF_STEP_LOG_7_TO_0_ES (0x0538) > +#define SBL_REG_CALC_SBC1_TF_STEP_LOG_15_TO_8_ES (0x053c) > +#define SBL_REG_CALC_SBC1_TF_ASYM_LOG_ES (0x0540) > +#define SBL_REG_CALC_SBC2_TF_DEPTH_7_TO_0_ES (0x0548) > +#define SBL_REG_CALC_SBC2_TF_DEPTH_15_TO_8_ES (0x054c) > +#define SBL_REG_CALC_SBC2_TF_STEP_7_TO_0_ES (0x0550) > +#define SBL_REG_CALC_SBC2_TF_STEP_15_TO_8_ES (0x0554) > +#define SBL_REG_CALC_SBC2_TF_ASYM_ES (0x0558) > +#define SBL_REG_CALC_SBC2_TF_DEPTH_LOG_7_TO_0_ES (0x0560) > +#define SBL_REG_CALC_SBC2_TF_DEPTH_LOG_15_TO_8_ES (0x0564) > +#define SBL_REG_CALC_SBC2_TF_STEP_LOG_7_TO_0_ES (0x0568) > +#define SBL_REG_CALC_SBC2_TF_STEP_LOG_15_TO_8_ES (0x056c) > +#define SBL_REG_CALC_SBC2_TF_ASYM_LOG_ES (0x0570) > +#define SBL_REG_CALC_CALIBRATION_A_7_TO_0_ES (0x05b8) > +#define SBL_REG_CALC_CALIBRATION_A_15_TO_8_ES (0x05bc) > +#define SBL_REG_CALC_CALIBRATION_B_7_TO_0_ES (0x05c0) > +#define SBL_REG_CALC_CALIBRATION_B_15_TO_8_ES (0x05c4) > +#define SBL_REG_CALC_CALIBRATION_C_7_TO_0_ES (0x05c8) > +#define SBL_REG_CALC_CALIBRATION_C_15_TO_8_ES (0x05cc) > +#define SBL_REG_CALC_CALIBRATION_D_7_TO_0_ES (0x05d0) > +#define SBL_REG_CALC_CALIBRATION_D_15_TO_8_ES (0x05d4) > +#define SBL_REG_CALC_CALIBRATION_E_7_TO_0_ES (0x05d8) > +#define SBL_REG_CALC_CALIBRATION_E_15_TO_8_ES (0x05dc) > +#define SBL_REG_CALC_BACKLIGHT_SCALE_7_TO_0_ES (0x05e0) > +#define SBL_REG_CALC_BACKLIGHT_SCALE_15_TO_8_ES (0x05e4) > +#define SBL_REG_CALC_GAIN_AA_TF_DEPTH_7_TO_0_ES (0x05e8) > +#define SBL_REG_CALC_GAIN_AA_TF_DEPTH_15_TO_8_ES (0x05ec) > +#define SBL_REG_CALC_GAIN_AA_TF_STEP_7_TO_0_ES (0x05f0) > +#define SBL_REG_CALC_GAIN_AA_TF_STEP_11_TO_8_ES (0x05f4) > +#define SBL_REG_CALC_GAIN_AA_TF_ASYM_ES (0x05f8) > +#define SBL_REG_CALC_STRENGTH_LIMIT_7_TO_0_ES (0x0600) > +#define SBL_REG_CALC_STRENGTH_LIMIT_9_TO_8_ES (0x0604) > +#define SBL_REG_CALC_ICUT_HIST_MIN_ES (0x0608) > +#define SBL_REG_CALC_ICUT_BL_MIN_7_TO_0_ES (0x0610) > +#define SBL_REG_CALC_ICUT_BL_MIN_15_TO_8_ES (0x0614) > +#define SBL_REG_CALC_GAIN_CA_TF_DEPTH_7_TO_0_ES (0x0618) > +#define SBL_REG_CALC_GAIN_CA_TF_DEPTH_15_TO_8_ES (0x061c) > +#define SBL_REG_CALC_GAIN_CA_TF_STEP_7_TO_0_ES (0x0620) > +#define SBL_REG_CALC_GAIN_CA_TF_STEP_11_TO_8_ES (0x0624) > +#define SBL_REG_CALC_GAIN_CA_TF_ASYM_ES (0x0628) > +#define SBL_REG_CALC_GAIN_MAX_7_TO_0_ES (0x0630) > +#define SBL_REG_CALC_GAIN_MAX_11_TO_8_ES (0x0634) > +#define SBL_REG_CALC_GAIN_MIDDLE_7_TO_0_ES (0x0638) > +#define SBL_REG_CALC_GAIN_MIDDLE_11_TO_8_ES (0x063c) > +#define SBL_REG_CALC_BRIGHTPR_ES (0x0640) > +#define SBL_REG_CALC_BPR_CORRECT_ES (0x0648) > +#define SBL_CALC_BACKLIGHT_OUT_7_TO_0_ES (0x0650) > +#define SBL_CALC_BACKLIGHT_OUT_15_TO_8_ES (0x0654) > +#define SBL_CALC_STRENGTH_INROI_OUT_7_TO_0_ES (0x0658) > +#define SBL_CALC_STRENGTH_INROI_OUT_9_TO_8_ES (0x065c) > +#define SBL_CALC_STRENGTH_OUTROI_OUT_7_TO_0_ES (0x0660) > +#define SBL_CALC_STRENGTH_OUTROI_OUT_9_TO_8_ES (0x0664) > +#define SBL_CALC_DARKENH_OUT_7_TO_0_ES (0x0668) > +#define SBL_CALC_DARKENH_OUT_15_TO_8_ES (0x066c) > +#define SBL_CALC_BRIGHTPR_OUT_ES (0x0670) > +#define SBL_CALC_STAT_OUT_7_TO_0_ES (0x0678) > +#define SBL_CALC_STAT_OUT_15_TO_8_ES (0x067c) > +#define SBL_REG_CALC_AL_DELTA_SETTLE_7_TO_0_ES (0x0680) > +#define SBL_REG_CALC_AL_DELTA_SETTLE_15_TO_8_ES (0x0684) > +#define SBL_REG_CALC_BL_DELTA_SETTLE_7_TO_0_ES (0x0688) > +#define SBL_REG_CALC_BL_DELTA_SETTLE_15_TO_8_ES (0x068c) > +#define SBL_CALC_AL_CALIB_LUT_ADDR_I_ES (0x06c0) > +#define SBL_CALC_AL_CALIB_LUT_DATA_W_7_TO_0_ES (0x06d0) > +#define SBL_CALC_AL_CALIB_LUT_DATA_W_15_TO_8_ES (0x06d4) > +#define SBL_CALC_BL_IN_LUT_ADDR_I_ES (0x0700) > +#define SBL_CALC_BL_IN_LUT_DATA_W_7_TO_0_ES (0x0710) > +#define SBL_CALC_BL_IN_LUT_DATA_W_15_TO_8_ES (0x0714) > +#define SBL_CALC_BL_OUT_LUT_ADDR_I_ES (0x0740) > +#define SBL_CALC_BL_OUT_LUT_DATA_W_7_TO_0_ES (0x0750) > +#define SBL_CALC_BL_OUT_LUT_DATA_W_15_TO_8_ES (0x0754) > +#define SBL_CALC_BL_ATTEN_LUT_ADDR_I_ES (0x0780) > +#define SBL_CALC_BL_ATTEN_LUT_DATA_W_7_TO_0_ES (0x0790) > +#define SBL_CALC_BL_ATTEN_LUT_DATA_W_15_TO_8_ES (0x0794) > +#define SBL_CALC_BL_AUTO_LUT_ADDR_I_ES (0x07c0) > +#define SBL_CALC_BL_AUTO_LUT_DATA_W_7_TO_0_ES (0x07d0) > +#define SBL_CALC_BL_AUTO_LUT_DATA_W_15_TO_8_ES (0x07d4) > +#define SBL_CALC_AL_CHANGE_LUT_ADDR_I_ES (0x0800) > +#define SBL_CALC_AL_CHANGE_LUT_DATA_W_7_TO_0_ES (0x0810) > +#define SBL_CALC_AL_CHANGE_LUT_DATA_W_15_TO_8_ES (0x0814) > +#define SBL_REG_CABC_INTENSITY_7_TO_0_ES (0x0900) > +#define SBL_REG_CABC_INTENSITY_11_TO_8_ES (0x0904) > +#define SBL_REG_CABC_ICUT_SELECT_ES (0x0908) > +#define SBL_REG_CABC_ICUT_MANUAL_ES (0x090c) > +#define SBL_CABC_ICUT_OUT_ES (0x0910) > +#define SBL_REG_CORE1_VC_CONTROL_0_ES (0x0c00) > +#define SBL_REG_CORE1_IRDX_CONTROL_0_ES (0x0c40) > +#define SBL_REG_CORE1_IRDX_CONTROL_1_ES (0x0c44) > +#define SBL_REG_CORE1_IRDX_VARIANCE_ES (0x0c4c) > +#define SBL_REG_CORE1_IRDX_SLOPE_MAX_ES (0x0c50) > +#define SBL_REG_CORE1_IRDX_SLOPE_MIN_ES (0x0c54) > +#define SBL_REG_CORE1_IRDX_BLACK_LEVEL_7_TO_0_ES (0x0c58) > +#define SBL_REG_CORE1_IRDX_BLACK_LEVEL_9_TO_8_ES (0x0c5c) > +#define SBL_REG_CORE1_IRDX_WHITE_LEVEL_7_TO_0_ES (0x0c60) > +#define SBL_REG_CORE1_IRDX_WHITE_LEVEL_9_TO_8_ES (0x0c64) > +#define SBL_REG_CORE1_IRDX_LIMIT_AMPL_ES (0x0c68) > +#define SBL_REG_CORE1_IRDX_DITHER_ES (0x0c6c) > +#define SBL_REG_CORE1_IRDX_STRENGTH_INROI_7_TO_0_ES (0x0c70) > +#define SBL_REG_CORE1_IRDX_STRENGTH_INROI_9_TO_8_ES (0x0c74) > +#define SBL_REG_CORE1_IRDX_STRENGTH_OUTROI_7_TO_0_ES (0x0c78) > +#define SBL_REG_CORE1_IRDX_STRENGTH_OUTROI_9_TO_8_ES (0x0c7c) > +#define SBL_CORE1_IRDX_ASYMMETRY_LUT_ADDR_I_ES (0x0c80) > +#define SBL_CORE1_IRDX_ASYMMETRY_LUT_DATA_W_7_TO_0_ES (0x0c84) > +#define SBL_CORE1_IRDX_ASYMMETRY_LUT_DATA_W_11_TO_8_ES (0x0c88) > +#define SBL_CORE1_IRDX_COLOR_LUT_ADDR_I_ES (0x0cc0) > +#define SBL_CORE1_IRDX_COLOR_LUT_DATA_W_7_TO_0_ES (0x0cc4) > +#define SBL_CORE1_IRDX_COLOR_LUT_DATA_W_11_TO_8_ES (0x0cc8) > +#define SBL_REG_CORE1_IRDX_FILTER_CTRL_ES (0x0d00) > +#define SBL_REG_CORE1_IRDX_SVARIANCE_ES (0x0d04) > +#define SBL_REG_CORE1_IRDX_BRIGHTPR_ES (0x0d08) > +#define SBL_REG_CORE1_IRDX_CONTRAST_ES (0x0d0c) > +#define SBL_REG_CORE1_IRDX_DARKENH_7_TO_0_ES (0x0d10) > +#define SBL_REG_CORE1_IRDX_DARKENH_15_TO_8_ES (0x0d14) > +#define SBL_REG_CORE1_DTHR_CONTROL_ES (0x0dc0) > +#define SBL_REG_CORE1_LOGO_TOP_ES (0x0dd0) > +#define SBL_REG_CORE1_LOGO_LEFT_ES (0x0dd4) > +#define SBL_REG_CORE1_CA_D_ARTITHRESH_7_TO_0_ES (0x0e00) > +#define SBL_REG_CORE1_CA_D_ARTITHRESH_9_TO_8_ES (0x0e04) > +#define SBL_CORE1_CA_STR_ATTEN_7_TO_0_ES (0x0e10) > +#define SBL_CORE1_CA_STR_ATTEN_15_TO_8_ES (0x0e14) > +#define SBL_CORE1_CA_STR_ATTEN_16_ES (0x0e18) > +#define SBL_REG_CORE1_FRD_D_THRESH_7_TO_0_ES (0x0e20) > +#define SBL_REG_CORE1_FRD_D_THRESH_9_TO_8_ES (0x0e24) > +#define SBL_REG_CORE1_REG0_7_TO_0_ES (0x0e28) > +#define SBL_REG_CORE1_REG0_15_TO_8_ES (0x0e2c) > +#define SBL_REG_CORE1_REG1_7_TO_0_ES (0x0e30) > +#define SBL_REG_CORE1_REG1_15_TO_8_ES (0x0e34) > +#define SBL_REG_CORE1_REG2_7_TO_0_ES (0x0e38) > +#define SBL_REG_CORE1_REG2_15_TO_8_ES (0x0e3c) > +#define SBL_REG_CORE1_REG3_7_TO_0_ES (0x0e40) > +#define SBL_REG_CORE1_REG3_15_TO_8_ES (0x0e44) > +#define SBL_REG_CORE1_REG4_7_TO_0_ES (0x0e48) > +#define SBL_REG_CORE1_REG4_15_TO_8_ES (0x0e4c) > +#define SBL_REG_CORE1_REG5_7_TO_0_ES (0x0e50) > +#define SBL_REG_CORE1_REG5_15_TO_8_ES (0x0e54) > +#define SBL_CORE1_REG_OUT0_7_TO_0_ES (0x0e58) > +#define SBL_CORE1_REG_OUT0_15_TO_8_ES (0x0e5c) > +#define SBL_CORE1_REG_OUT1_7_TO_0_ES (0x0e60) > +#define SBL_CORE1_REG_OUT1_15_TO_8_ES (0x0e64) > + > +/* SBL for 970 */ > +#define SBL_REG_FRMT_MODE (0x0000) > +#define SBL_REG_FRMT_FRAME_DIMEN (0x0004) > +#define SBL_REG_FRMT_HW_VERSION (0x0014) > +#define SBL_REG_FRMT_ROI_HOR (0x0020) > +#define SBL_REG_FRMT_ROI_VER (0x0024) > +#define SBL_REG_CALC_CONTROL (0x0100) > +#define SBL_REG_AL_BL (0x0104) > +#define SBL_REG_FILTERS_CTRL (0x0108) > +#define SBL_REG_MANUAL (0x010c) > +#define SBL_REG_CALC_ROI_FACTOR (0x0110) > +#define SBL_REG_CALC_PSR_DELTA (0x0114) > +#define SBL_REG_CALC_AL (0x0118) > +#define SBL_REG_CALC_AL_TF_STEP_WAIT (0x011c) > +#define SBL_REG_CALC_AL_TF_STEP_SIZE_LIMIT (0x0120) > +#define SBL_REG_CALC_AL_TF_ALPHA (0x0124) > +#define SBL_REG_CALC_AL_TF_NOISE_M_INC (0x0128) > +#define SBL_REG_CALC_AL_TF_K_INC_M_DEC (0x012c) > +#define SBL_REG_CALC_AL_TF_K_DEC_AGGRESSIVENESS (0x0130) > +#define SBL_REG_CALC_AL_RTF_FILTER_A_7_TO_0 (0x0134) > +#define SBL_REG_CALC_AL_RTF_FILTER_C_AB_AL_KNEE1 (0x0138) > +#define SBL_REG_CALC_AB_AL_KNEE2_AB_BL_KNEE1 (0x013c) > +#define SBL_REG_CALC_AB_BL_KNEE2_BL_PANEL_MAX (0x0140) > +#define SBL_REG_CALC_BL_OFFSET_BL_MIN (0x0144) > +#define SBL_REG_CALC_BL_ATTEN_ALPHA_SBC1_TF_DEPTH (0x0148) > +#define SBL_REG_CALC_SBC1_TF_STEP_SBC1_TF_ASYM (0x014c) > +#define SBL_REG_CALC_SBC1_TF_DEPTH_LOG_SBC1_TF_STEP_LOG (0x0150) > +#define SBL_REG_CALC_SBC1_TF_ASYM_LOG_SBC2_TF_DEPTH (0x0154) > +#define SBL_REG_CALC_SBC2_TF_STEP_SBC2_TF_ASYM (0x0158) > +#define SBL_REG_CALC_SBC2_TF_DEPTH_LOG_SBC2_TF_STEP_LOG (0x015c) > +#define SBL_REG_CALC_SBC2_TF_ASYM_LOG (0x0160) > +#define SBL_REG_CALC_CALIBRATION_A_B (0x0170) > +#define SBL_REG_CALC_CALIBRATION_C_D (0x0174) > +#define SBL_REG_CALC_CALIBRATION_E_BACKLIGHT_SCALE (0x0178) > +#define SBL_REG_CALC_GAIN_AA_TF_DEPTH_STEP (0x017c) > +#define SBL_REG_CALC_GAIN_AA_TF_ASYM_STRENGTH_LIMIT (0x0180) > +#define SBL_REG_CALC_ICUT_HIST_MIN_ICUT_BL_MIN (0x0184) > +#define SBL_REG_CALC_GAIN_CA_TF_DEPTH_GAIN_CA_TF_STEP (0x0188) > +#define SBL_REG_CALC_GAIN_CA_TF_ASYM_GAIN_MAX (0x018c) > +#define SBL_REG_CALC_GAIN_MIDDLE_CALC_BRIGHTPR (0x0190) > +#define SBL_REG_CALC_BPR_CORRECT_CALC_BACKLIGHT_OUT (0x0194) > +#define SBL_CALC_STRENGTH_INROI_OUTROI_OUT (0x0198) > +#define SBL_CALC_DARKENH_OUT_CALC_BRIGHTPR_OUT (0x019c) > +#define SBL_CALC_STAT_OUT (0x01A0) > +#define SBL_REG_CALC_BL_DELTA_SETTLE (0x01A4) > +#define SBL_CALC_AL_CALIB_LUT_ADDR_I (0x01B0) > +#define SBL_CALC_AL_CALIB_LUT_DATA_W (0x01B4) > +#define SBL_CALC_BL_IN_LUT_ADDR_I (0x01C0) > +#define SBL_CALC_BL_IN_LUT_DATA_W (0x01C4) > +#define SBL_CALC_BL_OUT_LUT_ADDR_I (0x01D0) > +#define SBL_CALC_BL_OUT_LUT_DATA_W (0x01D4) > +#define SBL_CALC_BL_ATTEN_LUT_ADDR_I (0x01E0) > +#define SBL_CALC_BL_ATTEN_LUT_DATA_W (0x01E4) > +#define SBL_CALC_BL_AUTO_LUT_ADDR_I (0x01F0) > +#define SBL_CALC_BL_AUTO_LUT_DATA_W (0x01F4) > +#define SBL_CALC_AL_CHANGE_LUT_ADDR_I (0x0200) > +#define SBL_CALC_AL_CHANGE_LUT_DATA_W (0x0204) > +#define SBL_REG_CABC_INTENSITY_CABC_ICUT_SELECT (0x0240) > +#define SBL_REG_CABC_ICUT_MANUAL_CABC_ICUT_OUT (0x0244) > +#define SBL_REG_VC_VC_CONTROL_0 (0x0300) > +#define SBL_REG_VC_IRDX_CONTROL (0x0308) > +#define SBL_REG_VC_IRDX_ALPHA_MANUAL_VC_IRDX_BETA_MANUA (0x030c) > +#define SBL_REG_VC_IRDX_VARIANCE (0x0310) > +#define SBL_REG_VC_IRDX_SLOPE_MAX_MIN (0x0314) > +#define SBL_REG_VC_IRDX_BLACK_WHITE_LEVEL_7_TO_0 (0x0318) > +#define SBL_REG_VC_IRDX_LIMIT_AMPL_VC_IRDX_DITHER (0x031c) > +#define SBL_REG_VC_IRDX_STRENGTH_INROI_OUTROI (0x0320) > +#define SBL_CORE1_IRDX_ASYMMETRY_LUT_ADDR_I (0x0324) > +#define SBL_CORE1_IRDX_ASYMMETRY_LUT_DATA_W (0x0328) > +#define SBL_CORE1_IRDX_COLOR_LUT_ADDR_I (0x0334) > +#define SBL_CORE1_IRDX_COLOR_LUT_DATA_W (0x0338) > +#define SBL_REG_VC_IRDX_FILTER_CTRL (0x0344) > +#define SBL_REG_VC_IRDX_BRIGHTPR (0x0348) > +#define SBL_REG_VC_IRDX_CONTRAST (0x034c) > +#define SBL_REG_VC_IRDX_DARKENH (0x0350) > +#define SBL_REG_VC_DTHR_CONTROL (0x0370) > +#define SBL_REG_VC_LOGO_TOP_LEFT (0x0374) > +#define SBL_REG_VC_CA_D_ARTITHRESH (0x0380) > +#define SBL_VC_CA_STR_ATTEN (0x0384) > +#define SBL_REG_VC_REG1_REG2 (0x038c) > +#define SBL_REG_VC_REG3_REG4 (0x0390) > +#define SBL_REG_VC_REG5_REG_OUT0 (0x0394) > +#define SBL_VC_REG_OUT1 (0x0398) > +#define SBL_VC_ANTI_FLCKR_CONTROL (0x039c) > +#define SBL_VC_ANTI_FLCKR_RFD_FRD_THR (0x03a0) > +#define SBL_VC_ANTI_FLCKR_SCD_THR_ANTI_FLCKR_FD3_SC_DLY (0x03a4) > +#define SBL_VC_ANTI_FLCKR_AL_ANTI_FLCKR_T_DURATION (0x03a8) > +#define SBL_VC_ANTI_FLCKR_ALPHA (0x03ac) > + > +/* DPP */ > +/* DPP TOP */ > +/* #define DPP_ARSR1P_MEM_CTRL (0x01C) */ > +#define DPP_ARSR_POST_MEM_CTRL (0x01C) > +/* #define DPP_ARSR1P (0x048) */ > + > +/* DITHER */ > +#define DITHER_CTL1 (0x000) > +#define DITHER_CTL0 (0x004) > +#define DITHER_TRI_THD12_0 (0x008) > +#define DITHER_TRI_THD12_1 (0x00C) > +#define DITHER_TRI_THD10 (0x010) > +#define DITHER_TRI_THD12_UNI_0 (0x014) > +#define DITHER_TRI_THD12_UNI_1 (0x018) > +#define DITHER_TRI_THD10_UNI (0x01C) > +#define DITHER_BAYER_CTL (0x020) > +#define DITHER_BAYER_ALPHA_THD (0x024) > +#define DITHER_MATRIX_PART1 (0x028) > +#define DITHER_MATRIX_PART0 (0x02C) > +#define DITHER_HIFREQ_REG_INI_CFG_EN (0x030) > +#define DITHER_HIFREQ_REG_INI0_0 (0x034) > +#define DITHER_HIFREQ_REG_INI0_1 (0x038) > +#define DITHER_HIFREQ_REG_INI0_2 (0x03C) > +#define DITHER_HIFREQ_REG_INI0_3 (0x040) > +#define DITHER_HIFREQ_REG_INI1_0 (0x044) > +#define DITHER_HIFREQ_REG_INI1_1 (0x048) > +#define DITHER_HIFREQ_REG_INI1_2 (0x04C) > +#define DITHER_HIFREQ_REG_INI1_3 (0x050) > +#define DITHER_HIFREQ_REG_INI2_0 (0x054) > +#define DITHER_HIFREQ_REG_INI2_1 (0x058) > +#define DITHER_HIFREQ_REG_INI2_2 (0x05C) > +#define DITHER_HIFREQ_REG_INI2_3 (0x060) > +#define DITHER_HIFREQ_POWER_CTRL (0x064) > +#define DITHER_HIFREQ_FILT_0 (0x068) > +#define DITHER_HIFREQ_FILT_1 (0x06C) > +#define DITHER_HIFREQ_FILT_2 (0x070) > +#define DITHER_HIFREQ_THD_R0 (0x074) > +#define DITHER_HIFREQ_THD_R1 (0x078) > +#define DITHER_HIFREQ_THD_G0 (0x07C) > +#define DITHER_HIFREQ_THD_G1 (0x080) > +#define DITHER_HIFREQ_THD_B0 (0x084) > +#define DITHER_HIFREQ_THD_B1 (0x088) > +#define DITHER_HIFREQ_DBG0 (0x08C) > +#define DITHER_HIFREQ_DBG1 (0x090) > +#define DITHER_HIFREQ_DBG2 (0x094) > +#define DITHER_ERRDIFF_CTL (0x098) > +#define DITHER_ERRDIFF_WEIGHT (0x09C) > +#define DITHER_FRC_CTL (0x0A0) > +#define DITHER_FRC_01_PART1 (0x0A4) > +#define DITHER_FRC_01_PART0 (0x0A8) > +#define DITHER_FRC_10_PART1 (0x0AC) > +#define DITHER_FRC_10_PART0 (0x0B0) > +#define DITHER_FRC_11_PART1 (0x0B4) > +#define DITHER_FRC_11_PART0 (0x0B8) > +#define DITHER_MEM_CTRL (0x0BC) > +#define DITHER_DBG0 (0x0C0) > +#define DITHER_DBG1 (0x0C4) > +#define DITHER_DBG2 (0x0C8) > +#define DITHER_CTRL2 (0x0CC) > + > +/* Dither for ES */ > +#define DITHER_PARA_ES (0x000) > +#define DITHER_CTL_ES (0x004) > +#define DITHER_MATRIX_PART1_ES (0x008) > +#define DITHER_MATRIX_PART0_ES (0x00C) > +#define DITHER_ERRDIFF_WEIGHT_ES (0x010) > +#define DITHER_FRC_01_PART1_ES (0x014) > +#define DITHER_FRC_01_PART0_ES (0x018) > +#define DITHER_FRC_10_PART1_ES (0x01C) > +#define DITHER_FRC_10_PART0_ES (0x020) > +#define DITHER_FRC_11_PART1_ES (0x024) > +#define DITHER_FRC_11_PART0_ES (0x028) > +#define DITHER_MEM_CTRL_ES (0x02C) > +#define DITHER_DBG0_ES (0x030) > +#define DITHER_DBG1_ES (0x034) > +#define DITHER_DBG2_ES (0x038) > + > +/* CSC_RGB2YUV_10bits CSC_YUV2RGB_10bits */ > + > +/* GAMA */ > +#define GAMA_LUT_SEL (0x008) > +#define GAMA_DBG0 (0x00C) > +#define GAMA_DBG1 (0x010) > + > +/* ACM for ES */ > +#define ACM_EN_ES (0x000) > +#define ACM_SATA_OFFSET_ES (0x004) > +#define ACM_HUESEL_ES (0x008) > +#define ACM_CSC_IDC0_ES (0x00C) > +#define ACM_CSC_IDC1_ES (0x010) > +#define ACM_CSC_IDC2_ES (0x014) > +#define ACM_CSC_P00_ES (0x018) > +#define ACM_CSC_P01_ES (0x01C) > +#define ACM_CSC_P02_ES (0x020) > +#define ACM_CSC_P10_ES (0x024) > +#define ACM_CSC_P11_ES (0x028) > +#define ACM_CSC_P12_ES (0x02C) > +#define ACM_CSC_P20_ES (0x030) > +#define ACM_CSC_P21_ES (0x034) > +#define ACM_CSC_P22_ES (0x038) > +#define ACM_CSC_MRREC_ES (0x03C) > +#define ACM_R0_H_ES (0x040) > +#define ACM_R1_H_ES (0x044) > +#define ACM_R2_H_ES (0x048) > +#define ACM_R3_H_ES (0x04C) > +#define ACM_R4_H_ES (0x050) > +#define ACM_R5_H_ES (0x054) > +#define ACM_R6_H_ES (0x058) > +#define ACM_LUT_DIS0_ES (0x05C) > +#define ACM_LUT_DIS1_ES (0x060) > +#define ACM_LUT_DIS2_ES (0x064) > +#define ACM_LUT_DIS3_ES (0x068) > +#define ACM_LUT_DIS4_ES (0x06C) > +#define ACM_LUT_DIS5_ES (0x070) > +#define ACM_LUT_DIS6_ES (0x074) > +#define ACM_LUT_DIS7_ES (0x078) > +#define ACM_LUT_PARAM0_ES (0x07C) > +#define ACM_LUT_PARAM1_ES (0x080) > +#define ACM_LUT_PARAM2_ES (0x084) > +#define ACM_LUT_PARAM3_ES (0x088) > +#define ACM_LUT_PARAM4_ES (0x08C) > +#define ACM_LUT_PARAM5_ES (0x090) > +#define ACM_LUT_PARAM6_ES (0x094) > +#define ACM_LUT_PARAM7_ES (0x098) > +#define ACM_LUT_SEL_ES (0x09C) > +#define ACM_MEM_CTRL_ES (0x0A0) > +#define ACM_DEBUG_TOP_ES (0x0A4) > +#define ACM_DEBUG_CFG_ES (0x0A8) > +#define ACM_DEBUG_W_ES (0x0AC) > + > +/* ACM */ > +#define ACM_HUE_RLH01 (0x040) > +#define ACM_HUE_RLH23 (0x044) > +#define ACM_HUE_RLH45 (0x048) > +#define ACM_HUE_RLH67 (0x04C) > +#define ACM_HUE_PARAM01 (0x060) > +#define ACM_HUE_PARAM23 (0x064) > +#define ACM_HUE_PARAM45 (0x068) > +#define ACM_HUE_PARAM67 (0x06C) > +#define ACM_HUE_SMOOTH0 (0x070) > +#define ACM_HUE_SMOOTH1 (0x074) > +#define ACM_HUE_SMOOTH2 (0x078) > +#define ACM_HUE_SMOOTH3 (0x07C) > +#define ACM_HUE_SMOOTH4 (0x080) > +#define ACM_HUE_SMOOTH5 (0x084) > +#define ACM_HUE_SMOOTH6 (0x088) > +#define ACM_HUE_SMOOTH7 (0x08C) > +#define ACM_DBG_TOP (0x0A4) > +#define ACM_DBG_CFG (0x0A8) > +#define ACM_DBG_W (0x0AC) > +#define ACM_COLOR_CHOOSE (0x0B0) > +#define ACM_RGB2YUV_IDC0 (0x0C0) > +#define ACM_RGB2YUV_IDC1 (0x0C4) > +#define ACM_RGB2YUV_IDC2 (0x0C8) > +#define ACM_RGB2YUV_P00 (0x0CC) > +#define ACM_RGB2YUV_P01 (0x0D0) > +#define ACM_RGB2YUV_P02 (0x0D4) > +#define ACM_RGB2YUV_P10 (0x0D8) > +#define ACM_RGB2YUV_P11 (0x0DC) > +#define ACM_RGB2YUV_P12 (0x0E0) > +#define ACM_RGB2YUV_P20 (0x0E4) > +#define ACM_RGB2YUV_P21 (0x0E8) > +#define ACM_RGB2YUV_P22 (0x0EC) > +#define ACM_FACE_CRTL (0x100) > +#define ACM_FACE_STARTXY (0x104) > +#define ACM_FACE_SMOOTH_LEN01 (0x108) > +#define ACM_FACE_SMOOTH_LEN23 (0x10C) > +#define ACM_FACE_SMOOTH_PARAM0 (0x118) > +#define ACM_FACE_SMOOTH_PARAM1 (0x11C) > +#define ACM_FACE_SMOOTH_PARAM2 (0x120) > +#define ACM_FACE_SMOOTH_PARAM3 (0x124) > +#define ACM_FACE_SMOOTH_PARAM4 (0x128) > +#define ACM_FACE_SMOOTH_PARAM5 (0x12C) > +#define ACM_FACE_SMOOTH_PARAM6 (0x130) > +#define ACM_FACE_SMOOTH_PARAM7 (0x134) > +#define ACM_FACE_AREA_SEL (0x138) > +#define ACM_FACE_SAT_LH (0x13C) > +#define ACM_FACE_SAT_SMOOTH_LH (0x140) > +#define ACM_FACE_SAT_SMO_PARAM_LH (0x148) > +#define ACM_L_CONT_EN (0x160) > +#define ACM_LC_PARAM01 (0x174) > +#define ACM_LC_PARAM23 (0x178) > +#define ACM_LC_PARAM45 (0x17C) > +#define ACM_LC_PARAM67 (0x180) > +#define ACM_L_ADJ_CTRL (0x1A0) > +#define ACM_CAPTURE_CTRL (0x1B0) > +#define ACM_CAPTURE_IN (0x1B4) > +#define ACM_CAPTURE_OUT (0x1B8) > +#define ACM_INK_CTRL (0x1C0) > +#define ACM_INK_OUT (0x1C4) > + > +/* ACE FOR ES */ > + > +/* LCP */ > +#define LCP_GMP_BYPASS_EN_ES (0x030) > +#define LCP_XCC_BYPASS_EN_ES (0x034) > +#define LCP_DEGAMA_EN_ES (0x038) > +#define LCP_DEGAMA_MEM_CTRL_ES (0x03C) > +#define LCP_GMP_MEM_CTRL_ES (0x040) > + > +/* XCC */ > +#define XCC_COEF_00 (0x000) > +#define XCC_COEF_01 (0x004) > +#define XCC_COEF_02 (0x008) > +#define XCC_COEF_03 (0x00C) > +#define XCC_COEF_10 (0x010) > +#define XCC_COEF_11 (0x014) > +#define XCC_COEF_12 (0x018) > +#define XCC_COEF_13 (0x01C) > +#define XCC_COEF_20 (0x020) > +#define XCC_COEF_21 (0x024) > +#define XCC_COEF_22 (0x028) > +#define XCC_COEF_23 (0x02C) > +#define XCC_EN (0x034) > + > +/* DEGAMMA */ > +#define DEGAMA_EN (0x000) > +#define DEGAMA_MEM_CTRL (0x004) > +#define DEGAMA_LUT_SEL (0x008) > +#define DEGAMA_DBG0 (0x00C) > +#define DEGAMA_DBG1 (0x010) > + > +/* GMP */ > +#define GMP_EN (0x000) > +#define GMP_MEM_CTRL (0x004) > +#define GMP_LUT_SEL (0x008) > +#define GMP_DBG_W0 (0x00C) > +#define GMP_DBG_R0 (0x010) > +#define GMP_DBG_R1 (0x014) > +#define GMP_DBG_R2 (0x018) > + > +/* ARSR1P ES */ > +#define ARSR1P_IHLEFT_ES (0x000) > +#define ARSR1P_IHRIGHT_ES (0x004) > +#define ARSR1P_IHLEFT1_ES (0x008) > +#define ARSR1P_IHRIGHT1_ES (0x00C) > +#define ARSR1P_IVTOP_ES (0x010) > +#define ARSR1P_IVBOTTOM_ES (0x014) > +#define ARSR1P_UV_OFFSET_ES (0x018) > +#define ARSR1P_IHINC_ES (0x01C) > +#define ARSR1P_IVINC_ES (0x020) > +#define ARSR1P_MODE_ES (0x024) > +#define ARSR1P_FORMAT_ES (0x028) > +#define ARSR1P_SKIN_THRES_Y_ES (0x02C) > +#define ARSR1P_SKIN_THRES_U_ES (0x030) > +#define ARSR1P_SKIN_THRES_V_ES (0x034) > +#define ARSR1P_SKIN_EXPECTED_ES (0x038) > +#define ARSR1P_SKIN_CFG_ES (0x03C) > +#define ARSR1P_SHOOT_CFG1_ES (0x040) > +#define ARSR1P_SHOOT_CFG2_ES (0x044) > +#define ARSR1P_SHARP_CFG1_ES (0x048) > +#define ARSR1P_SHARP_CFG2_ES (0x04C) > +#define ARSR1P_SHARP_CFG3_ES (0x050) > +#define ARSR1P_SHARP_CFG4_ES (0x054) > +#define ARSR1P_SHARP_CFG5_ES (0x058) > +#define ARSR1P_SHARP_CFG6_ES (0x05C) > +#define ARSR1P_SHARP_CFG7_ES (0x060) > +#define ARSR1P_SHARP_CFG8_ES (0x064) > +#define ARSR1P_SHARP_CFG9_ES (0x068) > +#define ARSR1P_SHARP_CFG10_ES (0x06C) > +#define ARSR1P_SHARP_CFG11_ES (0x070) > +#define ARSR1P_DIFF_CTRL_ES (0x074) > +#define ARSR1P_LSC_CFG1_ES (0x078) > +#define ARSR1P_LSC_CFG2_ES (0x07C) > +#define ARSR1P_LSC_CFG3_ES (0x080) > +#define ARSR1P_FORCE_CLK_ON_CFG_ES (0x084) > + > +/* ARSR1P */ > + > +#define ARSR_POST_IHLEFT (0x000) > +#define ARSR_POST_IHRIGHT (0x004) > +#define ARSR_POST_IHLEFT1 (0x008) > +#define ARSR_POST_IHRIGHT1 (0x00C) > +#define ARSR_POST_IVTOP (0x010) > +#define ARSR_POST_IVBOTTOM (0x014) > +#define ARSR_POST_UV_OFFSET (0x018) > +#define ARSR_POST_IHINC (0x01C) > +#define ARSR_POST_IVINC (0x020) > +#define ARSR_POST_MODE (0x024) > +#define ARSR_POST_FORMAT (0x028) > +#define ARSR_POST_SKIN_THRES_Y (0x02C) > +#define ARSR_POST_SKIN_THRES_U (0x030) > +#define ARSR_POST_SKIN_THRES_V (0x034) > +#define ARSR_POST_SKIN_EXPECTED (0x038) > +#define ARSR_POST_SKIN_CFG (0x03C) > +#define ARSR_POST_SHOOT_CFG1 (0x040) > +#define ARSR_POST_SHOOT_CFG2 (0x044) > +#define ARSR_POST_SHOOT_CFG3 (0x048) > +#define ARSR_POST_SHARP_CFG1_H (0x04C) > +#define ARSR_POST_SHARP_CFG1_L (0x050) > +#define ARSR_POST_SHARP_CFG2_H (0x054) > +#define ARSR_POST_SHARP_CFG2_L (0x058) > +#define ARSR_POST_SHARP_CFG3 (0x05C) > +#define ARSR_POST_SHARP_CFG4 (0x060) > +#define ARSR_POST_SHARP_CFG5 (0x064) > +#define ARSR_POST_SHARP_CFG6 (0x068) > +#define ARSR_POST_SHARP_CFG6_CUT (0x06C) > +#define ARSR_POST_SHARP_CFG7 (0x070) > +#define ARSR_POST_SHARP_CFG7_RATIO (0x074) > +#define ARSR_POST_SHARP_CFG8 (0x078) > +#define ARSR_POST_SHARP_CFG9 (0x07C) > +#define ARSR_POST_SHARP_CFG10 (0x080) > +#define ARSR_POST_SHARP_CFG11 (0x084) > +#define ARSR_POST_DIFF_CTRL (0x088) > +#define ARSR_POST_SKIN_SLOP_Y (0x08C) > +#define ARSR_POST_SKIN_SLOP_U (0x090) > +#define ARSR_POST_SKIN_SLOP_V (0x094) > +#define ARSR_POST_FORCE_CLK_ON_CFG (0x098) > +#define ARSR_POST_DEBUG_RW_0 (0x09C) > +#define ARSR_POST_DEBUG_RW_1 (0x0A0) > +#define ARSR_POST_DEBUG_RW_2 (0x0A4) > +#define ARSR_POST_DEBUG_RO_0 (0x0A8) > +#define ARSR_POST_DEBUG_RO_1 (0x0AC) > +#define ARSR_POST_DEBUG_RO_2 (0x0B0) > + > +/* BIT EXT */ > + > +/* GAMA PRE LUT */ > +#define U_GAMA_PRE_R_COEF (0x000) > +#define U_GAMA_PRE_G_COEF (0x400) > +#define U_GAMA_PRE_B_COEF (0x800) > +#define U_GAMA_PRE_R_LAST_COEF (0x200) > +#define U_GAMA_PRE_G_LAST_COEF (0x600) > +#define U_GAMA_PRE_B_LAST_COEF (0xA00) > + > +/* ACM LUT */ > +#define ACM_U_ACM_SATR_FACE_COEF (0x500) > +#define ACM_U_ACM_LTA_COEF (0x580) > +#define ACM_U_ACM_LTR0_COEF (0x600) > +#define ACM_U_ACM_LTR1_COEF (0x640) > +#define ACM_U_ACM_LTR2_COEF (0x680) > +#define ACM_U_ACM_LTR3_COEF (0x6C0) > +#define ACM_U_ACM_LTR4_COEF (0x700) > +#define ACM_U_ACM_LTR5_COEF (0x740) > +#define ACM_U_ACM_LTR6_COEF (0x780) > +#define ACM_U_ACM_LTR7_COEF (0x7C0) > +#define ACM_U_ACM_LH0_COFF (0x800) > +#define ACM_U_ACM_LH1_COFF (0x880) > +#define ACM_U_ACM_LH2_COFF (0x900) > +#define ACM_U_ACM_LH3_COFF (0x980) > +#define ACM_U_ACM_LH4_COFF (0xA00) > +#define ACM_U_ACM_LH5_COFF (0xA80) > +#define ACM_U_ACM_LH6_COFF (0xB00) > +#define ACM_U_ACM_LH7_COFF (0xB80) > +#define ACM_U_ACM_CH0_COFF (0xC00) > +#define ACM_U_ACM_CH1_COFF (0xC80) > +#define ACM_U_ACM_CH2_COFF (0xD00) > +#define ACM_U_ACM_CH3_COFF (0xD80) > +#define ACM_U_ACM_CH4_COFF (0xE00) > +#define ACM_U_ACM_CH5_COFF (0xE80) > +#define ACM_U_ACM_CH6_COFF (0xF00) > +#define ACM_U_ACM_CH7_COFF (0xF80) > + > +/* LCP LUT */ > +#define GMP_U_GMP_COEF (0x0000) > + > +#define U_DEGAMA_R_COEF (0x0000) > +#define U_DEGAMA_G_COEF (0x0400) > +#define U_DEGAMA_B_COEF (0x0800) > +#define U_DEGAMA_R_LAST_COEF (0x0200) > +#define U_DEGAMA_G_LAST_COEF (0x0600) > +#define U_DEGAMA_B_LAST_COEF (0x0A00) > + > +/* ARSR1P LUT for ES */ > +#define ARSR1P_LSC_GAIN_ES (0x084) /* 0xB07C+0x4*range27 */ > +#define ARSR1P_COEFF_H_Y0_ES (0x0F0) /* 0xB0E8+0x4*range9 */ > +#define ARSR1P_COEFF_H_Y1_ES (0x114) /* 0xB10C+0x4*range9 */ > +#define ARSR1P_COEFF_V_Y0_ES (0x138) /* 0xB130+0x4*range9 */ > +#define ARSR1P_COEFF_V_Y1_ES (0x15C) /* 0xB154+0x4*range9 */ > +#define ARSR1P_COEFF_H_UV0_ES (0x180) /* 0xB178+0x4*range9 */ > +#define ARSR1P_COEFF_H_UV1_ES (0x1A4) /* 0xB19C+0x4*range9 */ > +#define ARSR1P_COEFF_V_UV0_ES (0x1C8) /* 0xB1C0+0x4*range9 */ > +#define ARSR1P_COEFF_V_UV1_ES (0x1EC) /* 0xB1E4+0x4*range9 */ > + > +/* ARSR1P LUT */ > +#define ARSR_POST_COEFF_H_Y0 (0x0F0) /* 0xB0E8+0x4*range9 */ > +#define ARSR_POST_COEFF_H_Y1 (0x114) /* 0xB10C+0x4*range9 */ > +#define ARSR_POST_COEFF_V_Y0 (0x138) /* 0xB130+0x4*range9 */ > +#define ARSR_POST_COEFF_V_Y1 (0x15C) /* 0xB154+0x4*range9 */ > +#define ARSR_POST_COEFF_H_UV0 (0x180) /* 0xB178+0x4*range9 */ > +#define ARSR_POST_COEFF_H_UV1 (0x1A4) /* 0xB19C+0x4*range9 */ > +#define ARSR_POST_COEFF_V_UV0 (0x1C8) /* 0xB1C0+0x4*range9 */ > +#define ARSR_POST_COEFF_V_UV1 (0x1EC) /* 0xB1E4+0x4*range9 */ > + > +/* DPE */ > +#define DPE_INT_STAT (0x0000) > +#define DPE_INT_UNMASK (0x0004) > +#define DPE_BYPASS_ACE (0x0008) > +#define DPE_BYPASS_ACE_STAT (0x000c) > +#define DPE_UPDATE_LOCAL (0x0010) > +#define DPE_LOCAL_VALID (0x0014) > +#define DPE_GAMMA_AB_SHADOW (0x0018) > +#define DPE_GAMMA_AB_WORK (0x001c) > +#define DPE_GLOBAL_HIST_AB_SHADOW (0x0020) > +#define DPE_GLOBAL_HIST_AB_WORK (0x0024) > +#define DPE_IMAGE_INFO (0x0030) > +#define DPE_HALF_BLOCK_INFO (0x0034) > +#define DPE_XYWEIGHT (0x0038) > +#define DPE_LHIST_SFT (0x003c) > +#define DPE_ROI_START_POINT (0x0040) > +#define DPE_ROI_WIDTH_HIGH (0x0044) > +#define DPE_ROI_MODE_CTRL (0x0048) > +#define DPE_ROI_HIST_STAT_MODE (0x004c) > +#define DPE_HUE (0x0050) > +#define DPE_SATURATION (0x0054) > +#define DPE_VALUE (0x0058) > +#define DPE_SKIN_GAIN (0x005c) > +#define DPE_UP_LOW_TH (0x0060) > +#define DPE_RGB_BLEND_WEIGHT (0x0064) > +#define DPE_FNA_STATISTIC (0x0068) > +#define DPE_UP_CNT (0x0070) > +#define DPE_LOW_CNT (0x0074) > +#define DPE_SUM_SATURATION (0x0078) > +#define DPE_GLOBAL_HIST_LUT_ADDR (0x0080) > +#define DPE_LHIST_EN (0x0100) > +#define DPE_LOCAL_HIST_VxHy_2z_2z1 (0x0104) > +#define DPE_GAMMA_EN (0x0108) > +#define DPE_GAMMA_W (0x0108) > +#define DPE_GAMMA_R (0x0110) > +#define DPE_GAMMA_VxHy_3z2_3z1_3z_W (0x010c) > +#define DPE_GAMMA_EN_HV_R (0x0110) > +#define DPE_GAMMA_VxHy_3z2_3z1_3z_R (0x0114) > +#define DPE_INIT_GAMMA (0x0120) > +#define DPE_MANUAL_RELOAD (0x0124) > +#define DPE_RAMCLK_FUNC (0x0128) > +#define DPE_CLK_GATE (0x012c) > +#define DPE_GAMMA_RAM_A_CFG_MEM_CTRL (0x0130) > +#define DPE_GAMMA_RAM_B_CFG_MEM_CTRL (0x0134) > +#define DPE_LHIST_RAM_CFG_MEM_CTRL (0x0138) > +#define DPE_GAMMA_RAM_A_CFG_PM_CTRL (0x0140) > +#define DPE_GAMMA_RAM_B_CFG_PM_CTRL (0x0144) > +#define DPE_LHIST_RAM_CFG_PM_CTRL (0x0148) > +#define DPE_SAT_GLOBAL_HIST_LUT_ADDR (0x0180) > +#define DPE_FNA_EN (0x0200) > +#define DPE_FNA_ADDR (0x0200) > +#define DPE_FNA_DATA (0x0204) > +#define DPE_FNA_VxHy (0x0204) > +#define DPE_UPDATE_FNA (0x0208) > +#define DPE_FNA_VALID (0x0210) > +#define DPE_DB_PIPE_CFG (0x0220) > +#define DPE_DB_PIPE_EXT_WIDTH (0x0224) > +#define DPE_DB_PIPE_FULL_IMG_WIDTH (0x0228) > +#define DPE_ACE_DBG0 (0x0300) > +#define DPE_ACE_DBG1 (0x0304) > +#define DPE_ACE_DBG2 (0x0308) > +#define DPE_BYPASS_NR (0x0400) > +#define DPE_S3_SOME_BRIGHTNESS01 (0x0410) > +#define DPE_S3_SOME_BRIGHTNESS23 (0x0414) > +#define DPE_S3_SOME_BRIGHTNESS4 (0x0418) > +#define DPE_S3_MIN_MAX_SIGMA (0x0420) > +#define DPE_S3_GREEN_SIGMA03 (0x0430) > +#define DPE_S3_GREEN_SIGMA45 (0x0434) > +#define DPE_S3_RED_SIGMA03 (0x0440) > +#define DPE_S3_RED_SIGMA45 (0x0444) > +#define DPE_S3_BLUE_SIGMA03 (0x0450) > +#define DPE_S3_BLUE_SIGMA45 (0x0454) > +#define DPE_S3_WHITE_SIGMA03 (0x0460) > +#define DPE_S3_WHITE_SIGMA45 (0x0464) > +#define DPE_S3_FILTER_LEVEL (0x0470) > +#define DPE_S3_SIMILARITY_COEFF (0x0474) > +#define DPE_S3_V_FILTER_WEIGHT_ADJ (0x0478) > +#define DPE_S3_HUE (0x0480) > +#define DPE_S3_SATURATION (0x0484) > +#define DPE_S3_VALUE (0x0488) > +#define DPE_S3_SKIN_GAIN (0x048c) > +#define DPE_NR_RAMCLK_FUNC (0x0490) > +#define DPE_NR_CLK_GATE (0x0494) > +#define DPE_NR_RAM_A_CFG_MEM_CTRL (0x0498) > +#define DPE_NR_RAM_A_CFG_PM_CTRL (0x049c) > + > +/* IFBC */ > + > +/* LDI */ > +#define LDI_DP_DSI_SEL (0x0080) > + > +/* MIPI DSI */ > + > +#define AUTO_ULPS_MODE (0x00E0) > +#define AUTO_ULPS_ENTER_DELAY (0x00E4) > +#define AUTO_ULPS_WAKEUP_TIME (0x00E8) > +#define AUTO_ULPS_MIN_TIME (0xF8) > +#define DSI_MEM_CTRL (0x0194) > +#define DSI_PM_CTRL (0x0198) > +#define DSI_DEBUG (0x019C) > + > +/* MMBUF */ > + > +/* MEDIA_CRG */ > +#define MEDIA_PEREN0 (0x000) > +#define MEDIA_PERDIS0 (0x004) > +#define MEDIA_PERDIS1 (0x014) > +#define MEDIA_PERDIS2 (0x024) > +#define MEDIA_PERRSTEN0 (0x030) > +#define MEDIA_PERRSTDIS0 (0x034) > +#define MEDIA_PERRSTDIS1 (0x040) > +#define MEDIA_CLKDIV8 (0x080) > +#define MEDIA_CLKDIV9 (0x084) > +#define MEDIA_PEREN1 (0x010) > +#define MEDIA_PEREN2 (0x020) > +#define PERRSTEN_GENERAL_SEC (0xA00) > +#define PERRSTDIS_GENERAL_SEC (0xA04) > + > +#endif > diff --git a/drivers/staging/hikey9xx/gpu/kirin9xx_dpe.h b/drivers/staging/hikey9xx/gpu/kirin9xx_dpe.h > new file mode 100644 > index 000000000000..26add227c389 > --- /dev/null > +++ b/drivers/staging/hikey9xx/gpu/kirin9xx_dpe.h > @@ -0,0 +1,2457 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > + > +/* > + * Copyright (c) 2016 Linaro Limited. > + * Copyright (c) 2014-2016 Hisilicon Limited. > + * Copyright (c) 2014-2020, Huawei Technologies Co., Ltd > + */ > + > +#ifndef __KIRIN_DPE_H__ > +#define __KIRIN_DPE_H__ > + > +#include <linux/clk.h> > +#include <linux/delay.h> > +#include <linux/string.h> > +#include <linux/platform_device.h> > +#include <linux/device.h> > +#include <linux/kernel.h> > +#include <linux/wait.h> > +#include <linux/bug.h> > +#include <linux/iommu.h> > +#include <linux/regulator/consumer.h> > +#include <linux/regulator/driver.h> > +#include <linux/regulator/machine.h> > + > +#include <drm/drm_plane.h> > +#include <drm/drm_crtc.h> Reduce headers to what is necessary. This seems to be a common pattern. Each header file shall include only what is required by that header file. And .c file shall include the header file they need. Note - for a poitner use forward and do not incldue the header. > + > +/* vcc name */ > +#define REGULATOR_PDP_NAME "ldo3" ... > +struct mipi_ifbc_division { > + u32 xres_div; > + u32 yres_div; > + u32 comp_mode; > + u32 pxl0_div2_gt_en; > + u32 pxl0_div4_gt_en; > + u32 pxl0_divxcfg; > + u32 pxl0_dsi_gt_en; > +}; ... > + > +/*****************************************************************************/ > + > +#define to_dss_crtc(crtc) container_of(crtc, struct dss_crtc, base) > +#define to_dss_plane(plane) container_of(plane, struct dss_plane, base) These upcasts belongs to the header file that contains the struct that they upcast too. So thay should be next to struct dss_crtc and struct dss_plane. > + > +#endif > diff --git a/drivers/staging/hikey9xx/gpu/kirin9xx_drm_dpe_utils.c b/drivers/staging/hikey9xx/gpu/kirin9xx_drm_dpe_utils.c > new file mode 100644 > index 000000000000..5669914697a1 > --- /dev/null > +++ b/drivers/staging/hikey9xx/gpu/kirin9xx_drm_dpe_utils.c > @@ -0,0 +1,912 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (c) 2013-2014, Hisilicon Tech. Co., Ltd. All rights reserved. > + * Copyright (c) 2013-2020, Huawei Technologies Co., Ltd > + */ > +#include <drm/drm_drv.h> > +#include <drm/drm_mipi_dsi.h> > + > +#include "kirin9xx_drm_dpe_utils.h" > +#include "kirin9xx_dpe.h" > + > +struct mipi_ifbc_division g_mipi_ifbc_division[MIPI_DPHY_NUM][IFBC_TYPE_MAX] = { Only used in this file => static > + /* single mipi */ > + { > + /* none */ > + { > + XRES_DIV_1, YRES_DIV_1, IFBC_COMP_MODE_0, PXL0_DIV2_GT_EN_CLOSE, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_0, PXL0_DSI_GT_EN_1 > + }, { > + /* orise2x */ > + XRES_DIV_2, YRES_DIV_1, IFBC_COMP_MODE_0, PXL0_DIV2_GT_EN_OPEN, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_1, PXL0_DSI_GT_EN_3 > + }, { > + /* orise3x */ > + XRES_DIV_3, YRES_DIV_1, IFBC_COMP_MODE_1, PXL0_DIV2_GT_EN_OPEN, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_2, PXL0_DSI_GT_EN_3 > + }, { > + /* himax2x */ > + XRES_DIV_2, YRES_DIV_1, IFBC_COMP_MODE_2, PXL0_DIV2_GT_EN_OPEN, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_1, PXL0_DSI_GT_EN_3 > + }, { > + /* rsp2x */ > + XRES_DIV_2, YRES_DIV_1, IFBC_COMP_MODE_3, PXL0_DIV2_GT_EN_CLOSE, > + PXL0_DIV4_GT_EN_OPEN, PXL0_DIVCFG_1, PXL0_DSI_GT_EN_3 > + }, { > + /* > + * rsp3x > + * NOTE: in reality: xres_div = 1.5, yres_div = 2, > + * amended in "mipi_ifbc_get_rect" function > + */ > + XRES_DIV_3, YRES_DIV_1, IFBC_COMP_MODE_4, PXL0_DIV2_GT_EN_CLOSE, > + PXL0_DIV4_GT_EN_OPEN, PXL0_DIVCFG_2, PXL0_DSI_GT_EN_3 > + }, { > + /* vesa2x_1pipe */ > + XRES_DIV_2, YRES_DIV_1, IFBC_COMP_MODE_5, PXL0_DIV2_GT_EN_CLOSE, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_1, PXL0_DSI_GT_EN_3 > + }, { > + /* vesa3x_1pipe */ > + XRES_DIV_3, YRES_DIV_1, IFBC_COMP_MODE_5, PXL0_DIV2_GT_EN_CLOSE, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_2, PXL0_DSI_GT_EN_3 > + }, { > + /* vesa2x_2pipe */ > + XRES_DIV_2, YRES_DIV_1, IFBC_COMP_MODE_6, PXL0_DIV2_GT_EN_OPEN, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_1, PXL0_DSI_GT_EN_3 > + }, { > + /* vesa3x_2pipe */ > + XRES_DIV_3, YRES_DIV_1, IFBC_COMP_MODE_6, PXL0_DIV2_GT_EN_OPEN, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_2, PXL0_DSI_GT_EN_3 > + } > + > + /* dual mipi */ > + }, { > + { > + /* none */ > + XRES_DIV_2, YRES_DIV_1, IFBC_COMP_MODE_0, PXL0_DIV2_GT_EN_CLOSE, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_1, PXL0_DSI_GT_EN_3 > + }, { > + /* orise2x */ > + XRES_DIV_4, YRES_DIV_1, IFBC_COMP_MODE_0, PXL0_DIV2_GT_EN_OPEN, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_3, PXL0_DSI_GT_EN_3 > + }, { > + /* orise3x */ > + XRES_DIV_6, YRES_DIV_1, IFBC_COMP_MODE_1, PXL0_DIV2_GT_EN_OPEN, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_5, PXL0_DSI_GT_EN_3 > + }, { > + /* himax2x */ > + XRES_DIV_4, YRES_DIV_1, IFBC_COMP_MODE_2, PXL0_DIV2_GT_EN_OPEN, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_3, PXL0_DSI_GT_EN_3 > + }, { > + /* rsp2x */ > + XRES_DIV_4, YRES_DIV_1, IFBC_COMP_MODE_3, PXL0_DIV2_GT_EN_CLOSE, > + PXL0_DIV4_GT_EN_OPEN, PXL0_DIVCFG_3, PXL0_DSI_GT_EN_3 > + }, { > + /* rsp3x */ > + XRES_DIV_3, YRES_DIV_2, IFBC_COMP_MODE_4, PXL0_DIV2_GT_EN_CLOSE, > + PXL0_DIV4_GT_EN_OPEN, PXL0_DIVCFG_5, PXL0_DSI_GT_EN_3 > + }, { > + /* vesa2x_1pipe */ > + XRES_DIV_4, YRES_DIV_1, IFBC_COMP_MODE_5, PXL0_DIV2_GT_EN_CLOSE, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_3, PXL0_DSI_GT_EN_3 > + }, { > + /* vesa3x_1pipe */ > + XRES_DIV_6, YRES_DIV_1, IFBC_COMP_MODE_5, PXL0_DIV2_GT_EN_CLOSE, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_5, PXL0_DSI_GT_EN_3 > + }, { > + /* vesa2x_2pipe */ > + XRES_DIV_4, YRES_DIV_1, IFBC_COMP_MODE_6, PXL0_DIV2_GT_EN_OPEN, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_3, PXL0_DSI_GT_EN_3 > + }, { > + /* vesa3x_2pipe */ > + XRES_DIV_6, YRES_DIV_1, IFBC_COMP_MODE_6, PXL0_DIV2_GT_EN_OPEN, > + PXL0_DIV4_GT_EN_CLOSE, PXL0_DIVCFG_5, 3 > + } > + } > +}; > + > +u32 set_bits32(u32 old_val, uint32_t val, uint8_t bw, uint8_t bs) Not used - can be deleted. Remember to delete prototype in header file. > +{ > + u32 mask = (1UL << bw) - 1UL; > + u32 tmp = 0; > + > + tmp = old_val; > + tmp &= ~(mask << bs); > + > + return (tmp | ((val & mask) << bs)); > +} > + > +static int mipi_ifbc_get_rect(struct dss_hw_ctx *ctx, struct dss_rect *rect) > +{ > + u32 ifbc_type; > + u32 mipi_idx; > + u32 xres_div; > + u32 yres_div; > + > + ifbc_type = IFBC_TYPE_NONE; > + mipi_idx = 0; > + > + xres_div = g_mipi_ifbc_division[mipi_idx][ifbc_type].xres_div; > + yres_div = g_mipi_ifbc_division[mipi_idx][ifbc_type].yres_div; > + > + if ((rect->w % xres_div) > 0) > + drm_err(ctx->dev, > + "xres(%d) is not division_h(%d) pixel aligned!\n", > + rect->w, xres_div); > + > + if ((rect->h % yres_div) > 0) > + drm_err(ctx->dev, > + "yres(%d) is not division_v(%d) pixel aligned!\n", > + rect->h, yres_div); > + > + /* > + * NOTE: rsp3x && single_mipi CMD mode amended xres_div = 1.5, > + * yres_div = 2, > + * VIDEO mode amended xres_div = 3, yres_div = 1 > + */ > + rect->w /= xres_div; > + rect->h /= yres_div; > + > + return 0; > +} > + > +static void init_ldi_pxl_div(struct dss_crtc *acrtc) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + char __iomem *ldi_base; > + struct drm_display_mode *mode; > + struct drm_display_mode *adj_mode; > + > + u32 ifbc_type = 0; > + u32 mipi_idx = 0; > + u32 pxl0_div2_gt_en = 0; > + u32 pxl0_div4_gt_en = 0; > + u32 pxl0_divxcfg = 0; > + u32 pxl0_dsi_gt_en = 0; > + > + mode = &acrtc->base.state->mode; > + adj_mode = &acrtc->base.state->adjusted_mode; > + > + ldi_base = ctx->base + DSS_LDI0_OFFSET; > + > + ifbc_type = IFBC_TYPE_NONE; > + mipi_idx = 0; > + > + pxl0_div2_gt_en = g_mipi_ifbc_division[mipi_idx][ifbc_type].pxl0_div2_gt_en; > + pxl0_div4_gt_en = g_mipi_ifbc_division[mipi_idx][ifbc_type].pxl0_div4_gt_en; > + pxl0_divxcfg = g_mipi_ifbc_division[mipi_idx][ifbc_type].pxl0_divxcfg; > + pxl0_dsi_gt_en = g_mipi_ifbc_division[mipi_idx][ifbc_type].pxl0_dsi_gt_en; > + > + set_reg(ldi_base + LDI_PXL0_DIV2_GT_EN, pxl0_div2_gt_en, 1, 0); > + set_reg(ldi_base + LDI_PXL0_DIV4_GT_EN, pxl0_div4_gt_en, 1, 0); > + set_reg(ldi_base + LDI_PXL0_GT_EN, 0x1, 1, 0); > + set_reg(ldi_base + LDI_PXL0_DSI_GT_EN, pxl0_dsi_gt_en, 2, 0); > + set_reg(ldi_base + LDI_PXL0_DIVXCFG, pxl0_divxcfg, 3, 0); > +} > + > +void init_other(struct dss_crtc *acrtc) Only used in this file => static (And drop prototype in header file) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + char __iomem *dss_base = ctx->base; > + > + /** > + * VESA_CLK_SEL is set to 0 for initial, > + * 1 is needed only by vesa dual pipe compress > + */ > + set_reg(dss_base + DSS_LDI0_OFFSET + LDI_VESA_CLK_SEL, 0, 1, 0); > +} > + > +void init_ldi(struct dss_crtc *acrtc) Only used in this file => static (And drop prototype in header file) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + char __iomem *ldi_base; > + struct drm_display_mode *mode; > + struct drm_display_mode *adj_mode; > + > + struct dss_rect rect = {0, 0, 0, 0}; > + u32 hfp, hbp, hsw, vfp, vbp, vsw; > + u32 vsync_plr = 0; > + u32 hsync_plr = 0; > + u32 pixelclk_plr = 0; > + u32 data_en_plr = 0; > + > + mode = &acrtc->base.state->mode; > + adj_mode = &acrtc->base.state->adjusted_mode; > + > + hfp = mode->hsync_start - mode->hdisplay; > + hbp = mode->htotal - mode->hsync_end; > + hsw = mode->hsync_end - mode->hsync_start; > + vfp = mode->vsync_start - mode->vdisplay; > + vbp = mode->vtotal - mode->vsync_end; > + vsw = mode->vsync_end - mode->vsync_start; > + > + ldi_base = ctx->base + DSS_LDI0_OFFSET; > + > + rect.x = 0; > + rect.y = 0; > + rect.w = mode->hdisplay; > + rect.h = mode->vdisplay; > + mipi_ifbc_get_rect(ctx, &rect); > + > + init_ldi_pxl_div(acrtc); > + > + writel(hfp | ((hbp + DSS_WIDTH(hsw)) << 16), > + ldi_base + LDI_DPI0_HRZ_CTRL0); > + writel(0, ldi_base + LDI_DPI0_HRZ_CTRL1); > + writel(DSS_WIDTH(rect.w), ldi_base + LDI_DPI0_HRZ_CTRL2); > + writel(vfp | (vbp << 16), ldi_base + LDI_VRT_CTRL0); > + writel(DSS_HEIGHT(vsw), ldi_base + LDI_VRT_CTRL1); > + writel(DSS_HEIGHT(rect.h), ldi_base + LDI_VRT_CTRL2); > + > + writel(vsync_plr | (hsync_plr << 1) | (pixelclk_plr << 2) | (data_en_plr << 3), > + ldi_base + LDI_PLR_CTRL); > + > + /* bpp */ > + set_reg(ldi_base + LDI_CTRL, acrtc->out_format, 2, 3); > + /* bgr */ > + set_reg(ldi_base + LDI_CTRL, acrtc->bgr_fmt, 1, 13); > + > + /* for ddr pmqos */ > + writel(vfp, ldi_base + LDI_VINACT_MSK_LEN); > + > + /* cmd event sel */ > + writel(0x1, ldi_base + LDI_CMD_EVENT_SEL); > + > + /* for 1Hz LCD and mipi command LCD */ > + set_reg(ldi_base + LDI_DSI_CMD_MOD_CTRL, 0x1, 1, 1); > + > + /* ldi_data_gate(ctx, true); */ > + > + /* normal */ > + set_reg(ldi_base + LDI_WORK_MODE, 0x1, 1, 0); > + > + /* ldi disable */ > + set_reg(ldi_base + LDI_CTRL, 0x0, 1, 0); > +} > + > +void deinit_ldi(struct dss_crtc *acrtc) Only used in this file => static (And drop prototype in header file) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + char __iomem *ldi_base; > + > + ldi_base = ctx->base + DSS_LDI0_OFFSET; > + > + /* ldi disable */ > + set_reg(ldi_base + LDI_CTRL, 0, 1, 0); > +} > + > +void init_dbuf(struct dss_crtc *acrtc) Only used in this file => static (And drop prototype in header file) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + struct drm_display_mode *mode; > + struct drm_display_mode *adj_mode; > + char __iomem *dbuf_base; > + > + int sram_valid_num = 0; > + int sram_max_mem_depth = 0; > + int sram_min_support_depth = 0; > + > + u32 thd_rqos_in = 0; > + u32 thd_rqos_out = 0; > + u32 thd_wqos_in = 0; > + u32 thd_wqos_out = 0; > + u32 thd_cg_in = 0; > + u32 thd_cg_out = 0; > + u32 thd_wr_wait = 0; > + u32 thd_cg_hold = 0; > + u32 thd_flux_req_befdfs_in = 0; > + u32 thd_flux_req_befdfs_out = 0; > + u32 thd_flux_req_aftdfs_in = 0; > + u32 thd_flux_req_aftdfs_out = 0; > + u32 thd_dfs_ok = 0; > + u32 dfs_ok_mask = 0; > + u32 thd_flux_req_sw_en = 1; > + u32 hfp, hbp, hsw, vfp, vbp, vsw; > + > + int dfs_time = 0; > + int dfs_time_min = 0; > + int depth = 0; > + int dfs_ram = 0; > + > + mode = &acrtc->base.state->mode; > + adj_mode = &acrtc->base.state->adjusted_mode; > + > + hfp = mode->hsync_start - mode->hdisplay; > + hbp = mode->htotal - mode->hsync_end; > + hsw = mode->hsync_end - mode->hsync_start; > + vfp = mode->vsync_start - mode->vdisplay; > + vbp = mode->vtotal - mode->vsync_end; > + vsw = mode->vsync_end - mode->vsync_start; > + > + dbuf_base = ctx->base + DSS_DBUF0_OFFSET; > + > + if (mode->hdisplay * mode->vdisplay >= RES_4K_PHONE) { > + dfs_time_min = DFS_TIME_MIN_4K; > + dfs_ram = 0x0; > + } else { > + dfs_time_min = DFS_TIME_MIN; > + dfs_ram = 0xF00; > + } > + > + dfs_time = DFS_TIME; > + depth = DBUF0_DEPTH; > + > + /* > + * int K = 0; > + * int Tp = 1000000 / adj_mode->clock; > + * K = (hsw + hbp + mode->hdisplay + > + * hfp) / mode->hdisplay; > + * thd_cg_out = dfs_time / (Tp * K * 6); > + */ > + thd_cg_out = (dfs_time * adj_mode->clock * 1000UL * mode->hdisplay) / > + (((hsw + hbp + hfp) + mode->hdisplay) * 6 * 1000000UL); > + > + sram_valid_num = thd_cg_out / depth; > + thd_cg_in = (sram_valid_num + 1) * depth - 1; > + > + sram_max_mem_depth = (sram_valid_num + 1) * depth; > + > + thd_rqos_in = thd_cg_out * 85 / 100; > + thd_rqos_out = thd_cg_out; > + thd_flux_req_befdfs_in = GET_FLUX_REQ_IN(sram_max_mem_depth); > + thd_flux_req_befdfs_out = GET_FLUX_REQ_OUT(sram_max_mem_depth); > + > + sram_min_support_depth = dfs_time_min * mode->hdisplay / (1000000 / 60 / (mode->vdisplay + > + vbp + vfp + vsw) * (DBUF_WIDTH_BIT / 3 / BITS_PER_BYTE)); > + > + thd_flux_req_aftdfs_in = (sram_max_mem_depth - sram_min_support_depth) / 3; > + thd_flux_req_aftdfs_out = 2 * (sram_max_mem_depth - sram_min_support_depth) / 3; > + > + thd_dfs_ok = thd_flux_req_befdfs_in; > + > + writel(mode->hdisplay * mode->vdisplay, dbuf_base + DBUF_FRM_SIZE); > + writel(DSS_WIDTH(mode->hdisplay), dbuf_base + DBUF_FRM_HSIZE); > + writel(sram_valid_num, dbuf_base + DBUF_SRAM_VALID_NUM); > + > + writel((thd_rqos_out << 16) | thd_rqos_in, dbuf_base + DBUF_THD_RQOS); > + writel((thd_wqos_out << 16) | thd_wqos_in, dbuf_base + DBUF_THD_WQOS); > + writel((thd_cg_out << 16) | thd_cg_in, dbuf_base + DBUF_THD_CG); > + writel((thd_cg_hold << 16) | thd_wr_wait, dbuf_base + DBUF_THD_OTHER); > + writel((thd_flux_req_befdfs_out << 16) | thd_flux_req_befdfs_in, > + dbuf_base + DBUF_THD_FLUX_REQ_BEF); > + writel((thd_flux_req_aftdfs_out << 16) | thd_flux_req_aftdfs_in, > + dbuf_base + DBUF_THD_FLUX_REQ_AFT); > + writel(thd_dfs_ok, dbuf_base + DBUF_THD_DFS_OK); > + writel((dfs_ok_mask << 1) | thd_flux_req_sw_en, > + dbuf_base + DBUF_FLUX_REQ_CTRL); > + > + writel(0x1, dbuf_base + DBUF_DFS_LP_CTRL); > + if (ctx->g_dss_version_tag == FB_ACCEL_KIRIN970) > + writel(dfs_ram, dbuf_base + DBUF_DFS_RAM_MANAGE); > +} > + > +void init_dpp(struct dss_crtc *acrtc) Only used in this file => static (And drop prototype in header file) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + struct drm_display_mode *mode; > + struct drm_display_mode *adj_mode; > + char __iomem *dpp_base; > + char __iomem *mctl_sys_base; > + > + mode = &acrtc->base.state->mode; > + adj_mode = &acrtc->base.state->adjusted_mode; > + > + dpp_base = ctx->base + DSS_DPP_OFFSET; > + mctl_sys_base = ctx->base + DSS_MCTRL_SYS_OFFSET; > + > + writel((DSS_HEIGHT(mode->vdisplay) << 16) | DSS_WIDTH(mode->hdisplay), > + dpp_base + DPP_IMG_SIZE_BEF_SR); > + writel((DSS_HEIGHT(mode->vdisplay) << 16) | DSS_WIDTH(mode->hdisplay), > + dpp_base + DPP_IMG_SIZE_AFT_SR); > +} > + > +void enable_ldi(struct dss_crtc *acrtc) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + char __iomem *ldi_base; > + > + ldi_base = ctx->base + DSS_LDI0_OFFSET; > + > + /* ldi enable */ > + set_reg(ldi_base + LDI_CTRL, 0x1, 1, 0); > +} > + > +void disable_ldi(struct dss_crtc *acrtc) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + char __iomem *ldi_base; > + > + ldi_base = ctx->base + DSS_LDI0_OFFSET; > + > + /* ldi disable */ > + set_reg(ldi_base + LDI_CTRL, 0x0, 1, 0); > +} > + > +void dpe_interrupt_clear(struct dss_crtc *acrtc) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + char __iomem *dss_base; > + u32 clear; > + > + dss_base = ctx->base; > + > + clear = ~0; > + writel(clear, dss_base + GLB_CPU_PDP_INTS); > + writel(clear, dss_base + DSS_LDI0_OFFSET + LDI_CPU_ITF_INTS); > + writel(clear, dss_base + DSS_DPP_OFFSET + DPP_INTS); > + > + writel(clear, dss_base + DSS_DBG_OFFSET + DBG_MCTL_INTS); > + writel(clear, dss_base + DSS_DBG_OFFSET + DBG_WCH0_INTS); > + writel(clear, dss_base + DSS_DBG_OFFSET + DBG_WCH1_INTS); > + writel(clear, dss_base + DSS_DBG_OFFSET + DBG_RCH0_INTS); > + writel(clear, dss_base + DSS_DBG_OFFSET + DBG_RCH1_INTS); > + writel(clear, dss_base + DSS_DBG_OFFSET + DBG_RCH2_INTS); > + writel(clear, dss_base + DSS_DBG_OFFSET + DBG_RCH3_INTS); > + writel(clear, dss_base + DSS_DBG_OFFSET + DBG_RCH4_INTS); > + writel(clear, dss_base + DSS_DBG_OFFSET + DBG_RCH5_INTS); > + writel(clear, dss_base + DSS_DBG_OFFSET + DBG_RCH6_INTS); > + writel(clear, dss_base + DSS_DBG_OFFSET + DBG_RCH7_INTS); > + writel(clear, dss_base + DSS_DBG_OFFSET + DBG_DSS_GLB_INTS); > +} > + > +void dpe_interrupt_unmask(struct dss_crtc *acrtc) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + char __iomem *dss_base; > + u32 unmask; > + > + dss_base = ctx->base; > + > + unmask = ~0; > + unmask &= ~(BIT_ITF0_INTS | BIT_MMU_IRPT_NS); > + writel(unmask, dss_base + GLB_CPU_PDP_INT_MSK); > + > + unmask = ~0; > + unmask &= ~(BIT_VSYNC | BIT_LDI_UNFLOW); > + > + writel(unmask, dss_base + DSS_LDI0_OFFSET + LDI_CPU_ITF_INT_MSK); > +} > + > +void dpe_interrupt_mask(struct dss_crtc *acrtc) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + char __iomem *dss_base; > + u32 mask; > + > + dss_base = ctx->base; > + > + mask = ~0; > + writel(mask, dss_base + GLB_CPU_PDP_INT_MSK); > + writel(mask, dss_base + DSS_LDI0_OFFSET + LDI_CPU_ITF_INT_MSK); > + writel(mask, dss_base + DSS_DPP_OFFSET + DPP_INT_MSK); > + writel(mask, dss_base + DSS_DBG_OFFSET + DBG_DSS_GLB_INT_MSK); > + writel(mask, dss_base + DSS_DBG_OFFSET + DBG_MCTL_INT_MSK); > + writel(mask, dss_base + DSS_DBG_OFFSET + DBG_WCH0_INT_MSK); > + writel(mask, dss_base + DSS_DBG_OFFSET + DBG_WCH1_INT_MSK); > + writel(mask, dss_base + DSS_DBG_OFFSET + DBG_RCH0_INT_MSK); > + writel(mask, dss_base + DSS_DBG_OFFSET + DBG_RCH1_INT_MSK); > + writel(mask, dss_base + DSS_DBG_OFFSET + DBG_RCH2_INT_MSK); > + writel(mask, dss_base + DSS_DBG_OFFSET + DBG_RCH3_INT_MSK); > + writel(mask, dss_base + DSS_DBG_OFFSET + DBG_RCH4_INT_MSK); > + writel(mask, dss_base + DSS_DBG_OFFSET + DBG_RCH5_INT_MSK); > + writel(mask, dss_base + DSS_DBG_OFFSET + DBG_RCH6_INT_MSK); > + writel(mask, dss_base + DSS_DBG_OFFSET + DBG_RCH7_INT_MSK); > +} > + > +int dpe_init(struct dss_crtc *acrtc) > +{ > + struct drm_display_mode *mode; > + struct drm_display_mode *adj_mode; > + > + mode = &acrtc->base.state->mode; > + adj_mode = &acrtc->base.state->adjusted_mode; > + > + init_dbuf(acrtc); > + init_dpp(acrtc); > + init_other(acrtc); > + init_ldi(acrtc); > + > + hisifb_dss_on(acrtc->ctx); > + hisi_dss_mctl_on(acrtc->ctx); > + > + hisi_dss_mctl_mutex_lock(acrtc->ctx); > + > + hisi_dss_ovl_base_config(acrtc->ctx, mode->hdisplay, mode->vdisplay); > + > + hisi_dss_mctl_mutex_unlock(acrtc->ctx); > + > + enable_ldi(acrtc); > + > + mdelay(60); > + > + return 0; > +} > + > +int dpe_deinit(struct dss_crtc *acrtc) > +{ > + deinit_ldi(acrtc); > + > + return 0; > +} > + > +void dpe_check_itf_status(struct dss_crtc *acrtc) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + char __iomem *mctl_sys_base = ctx->base + DSS_MCTRL_SYS_OFFSET; > + int tmp = 0; > + int delay_count = 0; > + bool is_timeout = true; > + int itf_idx = 0; > + > + while (1) { > + tmp = readl(mctl_sys_base + MCTL_MOD17_STATUS + itf_idx * 0x4); > + if (((tmp & 0x10) == 0x10) || delay_count > 100) { > + is_timeout = (delay_count > 100) ? true : false; > + delay_count = 0; > + break; > + } > + mdelay(1); > + ++delay_count; > + } > + > + if (is_timeout) > + DRM_DEBUG_DRIVER("mctl_itf%d not in idle status,ints=0x%x !\n", > + itf_idx, tmp); drm_dbg(), same goes for other DRM_DEBUG_DRIVER() uses. Find drmdevice via acrtc. > +} > + > +void dss_inner_clk_pdp_disable(struct dss_hw_ctx *ctx) > +{ > +} > + > +void dss_inner_clk_pdp_enable(struct dss_hw_ctx *ctx) > +{ > + char __iomem *dss_base; > + > + dss_base = ctx->base; > + > + writel(0x00000088, dss_base + DSS_IFBC_OFFSET + IFBC_MEM_CTRL); > + writel(0x00000888, dss_base + DSS_DSC_OFFSET + DSC_MEM_CTRL); > + writel(0x00000008, dss_base + DSS_LDI0_OFFSET + LDI_MEM_CTRL); > + writel(0x00000008, dss_base + DSS_DBUF0_OFFSET + DBUF_MEM_CTRL); > + writel(0x00000008, dss_base + DSS_DPP_DITHER_OFFSET + ctx->dither_mem_ctrl); > +} > + > +void dss_inner_clk_common_enable(struct dss_hw_ctx *ctx) > +{ > + char __iomem *dss_base = ctx->base; > + > + /* core/axi/mmbuf */ > + writel(0x00000008, dss_base + DSS_CMDLIST_OFFSET + CMD_MEM_CTRL); /* cmd mem */ > + > + writel(0x00000088, > + dss_base + DSS_RCH_VG0_SCL_OFFSET + SCF_COEF_MEM_CTRL); /* rch_v0 ,scf mem */ > + writel(0x00000008, > + dss_base + DSS_RCH_VG0_SCL_OFFSET + SCF_LB_MEM_CTRL); /* rch_v0 ,scf mem */ > + writel(0x00000008, > + dss_base + DSS_RCH_VG0_ARSR_OFFSET + ctx->arsr2p_lb_mem_ctrl); /* rch_v0 ,arsr2p mem */ > + writel(0x00000008, dss_base + DSS_RCH_VG0_DMA_OFFSET + VPP_MEM_CTRL); /* rch_v0 ,vpp mem */ > + writel(0x00000008, > + dss_base + DSS_RCH_VG0_DMA_OFFSET + DMA_BUF_MEM_CTRL); /* rch_v0 ,dma_buf mem */ > + writel(0x00008888, dss_base + DSS_RCH_VG0_DMA_OFFSET + AFBCD_MEM_CTRL); /* rch_v0 ,afbcd mem */ > + > + writel(0x00000088, > + dss_base + DSS_RCH_VG1_SCL_OFFSET + SCF_COEF_MEM_CTRL); /* rch_v1 ,scf mem */ > + writel(0x00000008, > + dss_base + DSS_RCH_VG1_SCL_OFFSET + SCF_LB_MEM_CTRL); /* rch_v1 ,scf mem */ > + writel(0x00000008, > + dss_base + DSS_RCH_VG1_DMA_OFFSET + DMA_BUF_MEM_CTRL); /* rch_v1 ,dma_buf mem */ > + writel(0x00008888, dss_base + DSS_RCH_VG1_DMA_OFFSET + AFBCD_MEM_CTRL); /* rch_v1 ,afbcd mem */ > + > + if (ctx->g_dss_version_tag == FB_ACCEL_KIRIN970) { > + writel(0x88888888, > + dss_base + DSS_RCH_VG0_DMA_OFFSET + HFBCD_MEM_CTRL); > + writel(0x00000888, > + dss_base + DSS_RCH_VG0_DMA_OFFSET + HFBCD_MEM_CTRL_1); > + writel(0x88888888, > + dss_base + DSS_RCH_VG1_DMA_OFFSET + HFBCD_MEM_CTRL); > + writel(0x00000888, > + dss_base + DSS_RCH_VG1_DMA_OFFSET + HFBCD_MEM_CTRL_1); > + } else { > + writel(0x00000088, > + dss_base + DSS_RCH_VG2_SCL_OFFSET + SCF_COEF_MEM_CTRL); /* rch_v2 ,scf mem */ > + writel(0x00000008, > + dss_base + DSS_RCH_VG2_SCL_OFFSET + SCF_LB_MEM_CTRL); /* rch_v2 ,scf mem */ > + } > + > + writel(0x00000008, > + dss_base + DSS_RCH_VG2_DMA_OFFSET + DMA_BUF_MEM_CTRL); /* rch_v2 ,dma_buf mem */ > + > + writel(0x00000088, > + dss_base + DSS_RCH_G0_SCL_OFFSET + SCF_COEF_MEM_CTRL); /* rch_g0 ,scf mem */ > + writel(0x0000008, dss_base + DSS_RCH_G0_SCL_OFFSET + SCF_LB_MEM_CTRL); /* rch_g0 ,scf mem */ > + writel(0x00000008, > + dss_base + DSS_RCH_G0_DMA_OFFSET + DMA_BUF_MEM_CTRL); /* rch_g0 ,dma_buf mem */ > + writel(0x00008888, dss_base + DSS_RCH_G0_DMA_OFFSET + AFBCD_MEM_CTRL); /* rch_g0 ,afbcd mem */ > + > + writel(0x00000088, > + dss_base + DSS_RCH_G1_SCL_OFFSET + SCF_COEF_MEM_CTRL); /* rch_g1 ,scf mem */ > + writel(0x0000008, dss_base + DSS_RCH_G1_SCL_OFFSET + SCF_LB_MEM_CTRL); /* rch_g1 ,scf mem */ > + writel(0x00000008, > + dss_base + DSS_RCH_G1_DMA_OFFSET + DMA_BUF_MEM_CTRL); /* rch_g1 ,dma_buf mem */ > + writel(0x00008888, dss_base + DSS_RCH_G1_DMA_OFFSET + AFBCD_MEM_CTRL); /* rch_g1 ,afbcd mem */ > + > + writel(0x00000008, > + dss_base + DSS_RCH_D0_DMA_OFFSET + DMA_BUF_MEM_CTRL); /* rch_d0 ,dma_buf mem */ > + writel(0x00008888, dss_base + DSS_RCH_D0_DMA_OFFSET + AFBCD_MEM_CTRL); /* rch_d0 ,afbcd mem */ > + writel(0x00000008, > + dss_base + DSS_RCH_D1_DMA_OFFSET + DMA_BUF_MEM_CTRL); /* rch_d1 ,dma_buf mem */ > + writel(0x00000008, > + dss_base + DSS_RCH_D2_DMA_OFFSET + DMA_BUF_MEM_CTRL); /* rch_d2 ,dma_buf mem */ > + writel(0x00000008, > + dss_base + DSS_RCH_D3_DMA_OFFSET + DMA_BUF_MEM_CTRL); /* rch_d3 ,dma_buf mem */ > + > + writel(0x00000008, dss_base + DSS_WCH0_DMA_OFFSET + DMA_BUF_MEM_CTRL); /* wch0 DMA/AFBCE mem */ > + writel(0x00000888, dss_base + DSS_WCH0_DMA_OFFSET + AFBCE_MEM_CTRL); /* wch0 DMA/AFBCE mem */ > + writel(0x00000008, dss_base + DSS_WCH0_DMA_OFFSET + ctx->rot_mem_ctrl); /* wch0 rot mem */ > + writel(0x00000008, dss_base + DSS_WCH1_DMA_OFFSET + DMA_BUF_MEM_CTRL); /* wch1 DMA/AFBCE mem */ > + writel(0x00000888, dss_base + DSS_WCH1_DMA_OFFSET + AFBCE_MEM_CTRL); /* wch1 DMA/AFBCE mem */ > + writel(0x00000008, dss_base + DSS_WCH1_DMA_OFFSET + ctx->rot_mem_ctrl); /* wch1 rot mem */ > + if (ctx->g_dss_version_tag == FB_ACCEL_KIRIN970) { > + writel(0x00000088, > + dss_base + DSS_WCH1_DMA_OFFSET + WCH_SCF_COEF_MEM_CTRL); > + writel(0x00000008, > + dss_base + DSS_WCH1_DMA_OFFSET + WCH_SCF_LB_MEM_CTRL); > + writel(0x02605550, dss_base + GLB_DSS_MEM_CTRL); > + } else { > + writel(0x00000008, > + dss_base + DSS_WCH2_DMA_OFFSET + DMA_BUF_MEM_CTRL); /* wch2 DMA/AFBCE mem */ > + writel(0x00000008, > + dss_base + DSS_WCH2_DMA_OFFSET + ctx->rot_mem_ctrl); /* wch2 rot mem */ > + } > +} > + > +int dpe_irq_enable(struct dss_crtc *acrtc) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + > + if (ctx->irq) > + enable_irq(ctx->irq); > + > + return 0; > +} > + > +int dpe_irq_disable(struct dss_crtc *acrtc) > +{ > + struct dss_hw_ctx *ctx = acrtc->ctx; > + > + if (ctx->irq) > + disable_irq(ctx->irq); > + > + return 0; > +} > + > +int dpe_common_clk_enable(struct dss_hw_ctx *ctx) > +{ > + int ret = 0; > + struct clk *clk_tmp; > + > + clk_tmp = ctx->dss_mmbuf_clk; > + if (clk_tmp) { > + ret = clk_prepare(clk_tmp); > + if (ret) { > + drm_err(ctx->dev, > + " dss_mmbuf_clk clk_prepare failed, error=%d!\n", > + ret); > + return -EINVAL; > + } > + > + ret = clk_enable(clk_tmp); > + if (ret) { > + drm_err(ctx->dev, > + " dss_mmbuf_clk clk_enable failed, error=%d!\n", > + ret); > + return -EINVAL; > + } > + } > + > + clk_tmp = ctx->dss_axi_clk; > + if (clk_tmp) { > + ret = clk_prepare(clk_tmp); > + if (ret) { > + drm_err(ctx->dev, > + " dss_axi_clk clk_prepare failed, error=%d!\n", > + ret); > + return -EINVAL; > + } > + > + ret = clk_enable(clk_tmp); > + if (ret) { > + drm_err(ctx->dev, > + " dss_axi_clk clk_enable failed, error=%d!\n", > + ret); > + return -EINVAL; > + } > + } > + > + clk_tmp = ctx->dss_pclk_dss_clk; > + if (clk_tmp) { > + ret = clk_prepare(clk_tmp); > + if (ret) { > + drm_err(ctx->dev, > + " dss_pclk_dss_clk clk_prepare failed, error=%d!\n", > + ret); > + return -EINVAL; > + } > + > + ret = clk_enable(clk_tmp); > + if (ret) { > + drm_err(ctx->dev, > + " dss_pclk_dss_clk clk_enable failed, error=%d!\n", > + ret); > + return -EINVAL; > + } > + } > + > + return 0; > +} > + > +int dpe_common_clk_disable(struct dss_hw_ctx *ctx) > +{ > + struct clk *clk_tmp; > + > + clk_tmp = ctx->dss_pclk_dss_clk; > + if (clk_tmp) { > + clk_disable(clk_tmp); > + clk_unprepare(clk_tmp); > + } > + > + clk_tmp = ctx->dss_axi_clk; > + if (clk_tmp) { > + clk_disable(clk_tmp); > + clk_unprepare(clk_tmp); > + } > + > + clk_tmp = ctx->dss_mmbuf_clk; > + if (clk_tmp) { > + clk_disable(clk_tmp); > + clk_unprepare(clk_tmp); > + } > + > + return 0; > +} > + > +int dpe_inner_clk_enable(struct dss_hw_ctx *ctx) > +{ > + int ret = 0; > + struct clk *clk_tmp; > + > + clk_tmp = ctx->dss_pri_clk; > + if (clk_tmp) { > + ret = clk_prepare(clk_tmp); > + if (ret) { > + drm_err(ctx->dev, > + " dss_pri_clk clk_prepare failed, error=%d!\n", > + ret); > + return -EINVAL; > + } > + > + ret = clk_enable(clk_tmp); > + if (ret) { > + drm_err(ctx->dev, > + " dss_pri_clk clk_enable failed, error=%d!\n", > + ret); > + return -EINVAL; > + } > + } > + > + clk_tmp = ctx->dss_pxl0_clk; > + if (clk_tmp) { > + ret = clk_prepare(clk_tmp); > + if (ret) { > + drm_err(ctx->dev, > + " dss_pxl0_clk clk_prepare failed, error=%d!\n", > + ret); > + return -EINVAL; > + } > + > + ret = clk_enable(clk_tmp); > + if (ret) { > + drm_err(ctx->dev, " dss_pxl0_clk clk_enable failed, error=%d!\n", > + ret); > + return -EINVAL; > + } > + } > + > + return 0; > +} > + > +int dpe_inner_clk_disable(struct dss_hw_ctx *ctx) > +{ > + struct clk *clk_tmp; > + > + clk_tmp = ctx->dss_pxl0_clk; > + if (clk_tmp) { > + clk_disable(clk_tmp); > + clk_unprepare(clk_tmp); > + } > + > + clk_tmp = ctx->dss_pri_clk; > + if (clk_tmp) { > + clk_disable(clk_tmp); > + clk_unprepare(clk_tmp); > + } > + > + return 0; > +} > + > +int dpe_set_clk_rate(struct dss_hw_ctx *ctx) > +{ > + u64 clk_rate; > + int ret = 0; > + > + clk_rate = DEFAULT_DSS_CORE_CLK_RATE_L1; > + ret = clk_set_rate(ctx->dss_pri_clk, DEFAULT_DSS_CORE_CLK_RATE_L1); > + if (ret < 0) { > + drm_err(ctx->dev, > + "dss_pri_clk clk_set_rate failed, error=%d!\n", ret); > + return -EINVAL; > + } > + drm_dbg(ctx->dev, "dss_pri_clk:[%llu]->[%llu].\n", > + clk_rate, (uint64_t)clk_get_rate(ctx->dss_pri_clk)); > + > + clk_rate = DEFAULT_DSS_MMBUF_CLK_RATE_L1; > + ret = clk_set_rate(ctx->dss_mmbuf_clk, DEFAULT_DSS_MMBUF_CLK_RATE_L1); > + if (ret < 0) { > + drm_err(ctx->dev, > + "dss_mmbuf clk_set_rate failed, error=%d!\n", ret); > + return -EINVAL; > + } > + > + drm_dbg(ctx->dev, "dss_mmbuf_clk:[%llu]->[%llu].\n", > + clk_rate, (uint64_t)clk_get_rate(ctx->dss_mmbuf_clk)); > + > + return ret; > +} > + > +int dpe_set_pixel_clk_rate_on_pll0(struct dss_hw_ctx *ctx) Not used - delete > +{ > + int ret; > + u64 clk_rate; > + > + clk_rate = ctx->pxl0_clk_rate_power_off; > + ret = clk_set_rate(ctx->dss_pxl0_clk, clk_rate); > + if (ret < 0) { > + drm_err(ctx->dev, > + "dss_pxl0_clk clk_set_rate(%llu) failed, error=%d!\n", > + clk_rate, ret); > + return -EINVAL; > + } > + drm_dbg(ctx->dev, "dss_pxl0_clk:[%llu]->[%llu].\n", > + clk_rate, (uint64_t)clk_get_rate(ctx->dss_pxl0_clk)); > + > + return ret; > +} > + > +int dpe_set_common_clk_rate_on_pll0(struct dss_hw_ctx *ctx) Not used - delete > +{ > + int ret; > + u64 clk_rate; > + > + clk_rate = ctx->dss_mmbuf_clk_rate_power_off; > + ret = clk_set_rate(ctx->dss_mmbuf_clk, clk_rate); > + if (ret < 0) { > + drm_err(ctx->dev, > + "dss_mmbuf clk_set_rate(%llu) failed, error=%d!\n", > + clk_rate, ret); > + return -EINVAL; > + } > + DRM_INFO("dss_mmbuf_clk:[%llu]->[%llu].\n", > + clk_rate, (uint64_t)clk_get_rate(ctx->dss_mmbuf_clk)); > + > + clk_rate = DEFAULT_DSS_CORE_CLK_RATE_POWER_OFF; > + ret = clk_set_rate(ctx->dss_pri_clk, clk_rate); > + if (ret < 0) { > + drm_err(ctx->dev, > + "dss_pri_clk clk_set_rate(%llu) failed, error=%d!\n", > + clk_rate, ret); > + return -EINVAL; > + } > + drm_dbg(ctx->dev, "dss_pri_clk:[%llu]->[%llu].\n", > + clk_rate, (uint64_t)clk_get_rate(ctx->dss_pri_clk)); > + > + return ret; > +} > diff --git a/drivers/staging/hikey9xx/gpu/kirin9xx_drm_dpe_utils.h b/drivers/staging/hikey9xx/gpu/kirin9xx_drm_dpe_utils.h > new file mode 100644 > index 000000000000..a3071388a86c > --- /dev/null > +++ b/drivers/staging/hikey9xx/gpu/kirin9xx_drm_dpe_utils.h > @@ -0,0 +1,230 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (c) 2013-2014, Hisilicon Tech. Co., Ltd. All rights reserved. > + * Copyright (c) 2013-2020, Huawei Technologies Co., Ltd > + */ > + > +#ifndef KIRIN_DRM_DPE_UTILS_H > +#define KIRIN_DRM_DPE_UTILS_H > + > +#include <linux/kernel.h> > + > +#include <drm/drm_plane.h> > +#include <drm/drm_crtc.h> > + > +#include "kirin9xx_drm_drv.h" > +#include "kirin9xx_dpe.h" > + > +enum dss_channel { > + DSS_CH1 = 0, /* channel 1 for primary plane */ > + DSS_CH_NUM > +}; > + > +#define PRIMARY_CH DSS_CH1 /* primary plane */ > + > +#define HISI_FB_PIXEL_FORMAT_UNSUPPORT 800 > + > +struct dss_hw_ctx { > + struct drm_device *dev; drm_device is supposed to be embedded in struct dss_hw_ctx, and not a pointer. > + void __iomem *base; > + struct regmap *noc_regmap; > + struct reset_control *reset; > + u32 g_dss_version_tag; > + > + void __iomem *noc_dss_base; > + void __iomem *peri_crg_base; > + void __iomem *pmc_base; > + void __iomem *sctrl_base; > + void __iomem *media_crg_base; > + void __iomem *pctrl_base; > + void __iomem *mmbuf_crg_base; Not used, delete > + void __iomem *pmctrl_base; > + > + struct clk *dss_axi_clk; > + struct clk *dss_pclk_dss_clk; > + struct clk *dss_pri_clk; > + struct clk *dss_pxl0_clk; > + struct clk *dss_pxl1_clk; > + struct clk *dss_mmbuf_clk; > + struct clk *dss_pclk_mmbuf_clk; Not used - delete. > + > + struct dss_clk_rate *dss_clk; Not used. Delete struct and this field. > + > + struct regulator *dpe_regulator; > + struct regulator *mmbuf_regulator; Not used - delete. > + struct regulator *mediacrg_regulator; Not used - delete. > + > + bool power_on; > + int irq; > + > + wait_queue_head_t vactive0_end_wq; > + u32 vactive0_end_flag; Seems not to be used - delete. > + ktime_t vsync_timestamp; > + ktime_t vsync_timestamp_prev; vsync_timestamp is only assinged and vsync_timestamp_prev is not used. Delete. I gave up verifying the rest - there is some cleaning to be done here. > + > + struct iommu_domain *mmu_domain; > + char __iomem *screen_base; > + unsigned long smem_start; > + unsigned long screen_size; > + > + /* Version-specific data */ > + u32 g_dss_module_base[DSS_CHN_MAX_DEFINE][MODULE_CHN_MAX]; > + u32 g_dss_module_ovl_base[DSS_MCTL_IDX_MAX][MODULE_OVL_MAX]; > + int g_scf_lut_chn_coef_idx[DSS_CHN_MAX_DEFINE]; > + u32 g_dss_module_cap[DSS_CHN_MAX_DEFINE][MODULE_CAP_MAX]; > + u32 g_dss_chn_sid_num[DSS_CHN_MAX_DEFINE]; > + u32 g_dss_smmu_smrx_idx[DSS_CHN_MAX_DEFINE]; > + u32 smmu_offset; > + u32 afbc_header_addr_align; > + u32 dss_mmbuf_clk_rate_power_off; > + u32 rot_mem_ctrl; > + u32 dither_mem_ctrl; > + u32 arsr2p_lb_mem_ctrl; > + u32 pxl0_clk_rate_power_off; > +}; > + > +void kirin960_dpe_defs(struct dss_hw_ctx *ctx); > +void kirin970_dpe_defs(struct dss_hw_ctx *ctx); > + > +struct dss_clk_rate { > + u64 dss_pri_clk_rate; > + u64 dss_pclk_dss_rate; > + u64 dss_pclk_pctrl_rate; > + u64 dss_mmbuf_rate; > + u32 dss_voltage_value; /* 0:0.7v, 2:0.8v */ > + u32 reserved; > +}; > + > +struct dss_crtc { > + struct drm_crtc base; > + struct dss_hw_ctx *ctx; > + bool enable; > + u32 out_format; > + u32 bgr_fmt; > +}; > + > +struct dss_plane { > + struct drm_plane base; > + /* void *ctx; */ > + void *acrtc; > + u8 ch; /* channel */ > +}; > + > +struct dss_data { > + struct dss_crtc acrtc; > + struct dss_plane aplane[DSS_CH_NUM]; > + struct dss_hw_ctx ctx; > +}; I looks like dss_data should be dropped and the above should be embedded in struct dss_hw_ctx. This would simplyfy things and it would all be allocated in one go. > + > +struct dss_img { > + u32 format; > + u32 width; > + u32 height; > + u32 bpp; /* bytes per pixel */ > + u32 buf_size; > + u32 stride; > + u32 stride_plane1; > + u32 stride_plane2; > + u64 phy_addr; > + u64 vir_addr; > + u32 offset_plane1; > + u32 offset_plane2; > + > + u64 afbc_header_addr; > + u64 afbc_payload_addr; > + u32 afbc_header_stride; > + u32 afbc_payload_stride; > + u32 afbc_scramble_mode; > + u32 mmbuf_base; > + u32 mmbuf_size; > + > + u32 mmu_enable; > + u32 csc_mode; > + u32 secure_mode; > + s32 shared_fd; > + u32 reserved0; > +}; > + > +struct dss_rect { > + s32 x; > + s32 y; > + s32 w; > + s32 h; > +}; Hmm, use drm_rect? > + > +struct drm_dss_layer { > + struct dss_img img; > + struct dss_rect src_rect; > + struct dss_rect src_rect_mask; > + struct dss_rect dst_rect; > + u32 transform; > + s32 blending; > + u32 glb_alpha; > + u32 color; /* background color or dim color */ > + s32 layer_idx; > + s32 chn_idx; > + u32 need_cap; > + s32 acquire_fence; > +}; There seems to be some relation between a dss layer and a drm panle missing somewhere. > + > +static inline void set_reg(char __iomem *addr, uint32_t val, uint8_t bw, > + uint8_t bs) > +{ > + u32 mask = (1UL << bw) - 1UL; > + u32 tmp = 0; > + > + tmp = readl(addr); > + tmp &= ~(mask << bs); > + > + writel(tmp | ((val & mask) << bs), addr); > +} > + > +u32 set_bits32(u32 old_val, uint32_t val, uint8_t bw, uint8_t bs); > + > +void init_dbuf(struct dss_crtc *acrtc); > +void init_dpp(struct dss_crtc *acrtc); > +void init_other(struct dss_crtc *acrtc); > +void init_ldi(struct dss_crtc *acrtc); > + > +void deinit_ldi(struct dss_crtc *acrtc); > +void enable_ldi(struct dss_crtc *acrtc); > +void disable_ldi(struct dss_crtc *acrtc); > + > +void dss_inner_clk_pdp_enable(struct dss_hw_ctx *ctx); > +void dss_inner_clk_pdp_disable(struct dss_hw_ctx *ctx); > +void dss_inner_clk_common_enable(struct dss_hw_ctx *ctx); > +void dss_inner_clk_common_disable(struct dss_hw_ctx *ctx); > +void dpe_interrupt_clear(struct dss_crtc *acrtc); > +void dpe_interrupt_unmask(struct dss_crtc *acrtc); > +void dpe_interrupt_mask(struct dss_crtc *acrtc); > +int dpe_common_clk_enable(struct dss_hw_ctx *ctx); > +int dpe_common_clk_disable(struct dss_hw_ctx *ctx); > +int dpe_inner_clk_enable(struct dss_hw_ctx *ctx); > +int dpe_inner_clk_disable(struct dss_hw_ctx *ctx); > +int dpe_set_clk_rate(struct dss_hw_ctx *ctx); > + > +int dpe_irq_enable(struct dss_crtc *acrtc); > +int dpe_irq_disable(struct dss_crtc *acrtc); > + > +int dpe_init(struct dss_crtc *acrtc); > +int dpe_deinit(struct dss_crtc *acrtc); > +void dpe_check_itf_status(struct dss_crtc *acrtc); > +int dpe_set_clk_rate_on_pll0(struct dss_hw_ctx *ctx); > +int dpe_set_common_clk_rate_on_pll0(struct dss_hw_ctx *ctx); > +int dpe_set_pixel_clk_rate_on_pll0(struct dss_hw_ctx *ctx); > + > +void hisifb_dss_on(struct dss_hw_ctx *ctx); > +void hisi_dss_mctl_on(struct dss_hw_ctx *ctx); > + > +void hisi_dss_unflow_handler(struct dss_hw_ctx *ctx, bool unmask); > +int hisi_dss_mctl_mutex_lock(struct dss_hw_ctx *ctx); > +int hisi_dss_mctl_mutex_unlock(struct dss_hw_ctx *ctx); > +int hisi_dss_ovl_base_config(struct dss_hw_ctx *ctx, u32 xres, u32 yres); > + > +u32 hisi_dss_get_channel_formats(struct drm_device *dev, u8 ch, const u32 **formats); > + > +void hisi_fb_pan_display(struct drm_plane *plane); > + > +u32 dpe_get_format(struct dss_hw_ctx *ctx, u32 pixel_format); > + > +#endif _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel