/*
 *
 * Register definition file for Samsung DECON driver
 *
 * Copyright (c) 2012-2019, Samsung Electronics
 * SeungBeom park<sb1.park@samsung.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
*/


#ifndef _REGS_DECON_H
#define _REGS_DECON_H

/*
 * [ BLK_DPU BASE ADDRESS ]
 *
 * - CMU_DPU            0x1900_0000
 * - SYSREG_DPU         0x1902_0000
 * - DPP                0x1904_0000
 * - DECON0             0x1905_0000
 * - DECON1             0x1906_0000
 * - DECON2             0x1907_0000
 * - DPU_WB_MUX         0x1908_0000
 * - DPU_DMA            0x1909_0000
 * - MIPI_DSIM0         0x190C_0000
 * - MIPI_DSIM1         0x190D_0000
 * - MIPI_DCPHY         0x190E_0000
 * - SYSMMU_DPUD0_S1    0x1910_0000
 * - SYSMMU_DPUD1_S1    0x1911_0000
 * - SYSMMU_DPUD2_S1    0x1912_0000
 * - SYSMMU_DPUD0_S1_S  0x1913_0000
 * - SYSMMU_DPUD1_S1_S  0x1914_0000
 * - SYSMMU_DPUD2_S1_S  0x1915_0000
 * - SYSMMU_DPUD0_S2    0x1916_0000
 * - SYSMMU_DPUD1_S2    0x1917_0000
 * - SYSMMU_DPUD2_S2    0x1918_0000
 * - PPMU_DPUD0         0x1919_0000
 * - PPMU_DPUD1         0x191A_0000
 * - PPMU_DPUD2         0x191B_0000
 * need to check whether the following things exist or not.
 * - BTM_DPUD0          0x1913_0000
 * - BTM_DPUD1          0x1914_0000
 * - BTM_DPUD2          0x1915_0000
 * - DPU_PGEN           0x191A_0000
 */

/*
 *  IP          start_offset    end_offset
 *=================================================
 *  DECON           0x0000      0x0fff
 *  BLENDER         0x1000      0x1fff
 *-------------------------------------------------
 *  DSC0            0x4000      0x4fff
 *  DSC1            0x5000      0x5fff
 *  DSC2            0x6000      0x6fff
 *-------------------------------------------------
 *  SHD_DECON       0x7000      0x7FFF
 *-------------------------------------------------
 *  SHD_BLENDER     0x8000      0x8FFF
 *-------------------------------------------------
 *  SHD_DSC0        0xB000      0xBFFF
 *  SHD_DSC1        0xC000      0xCFFF
 *  SHD_DSC2        0xD000      0xCFFF
 *-------------------------------------------------
 */

/*
 * DECON registers
 * ->
 * updated by SHADOW_REG_UPDATE_REQ[31] : SHADOW_REG_UPDATE_REQ
 * (0x0000~0x011C, 0x0230~0x209C )
 */


#define GLOBAL_CONTROL                          0x0000
#define GLOBAL_CONTROL_SRESET                   (1 << 28)
#define GLOBAL_CONTROL_PSLVERR_EN               (1 << 24)
#define GLOBAL_CONTROL_TEN_BPC_MODE_F           (1 << 20)
#define GLOBAL_CONTROL_TEN_BPC_MODE_MASK        (1 << 20)
#define GLOBAL_CONTROL_MASTER_MODE_F(_v)        ((_v) << 12)
#define GLOBAL_CONTROL_MASTER_MODE_MASK         (0xF << 12)
#define GLOBAL_CONTROL_OPERATION_MODE_F         (1 << 8)
#define GLOBAL_CONTROL_OPERATION_MODE_VIDEO_F   (0 << 8)
#define GLOBAL_CONTROL_OPERATION_MODE_CMD_F     (1 << 8)
#define GLOBAL_CONTROL_IDLE_STATUS              (1 << 5)
#define GLOBAL_CONTROL_RUN_STATUS               (1 << 4)
#define GLOBAL_CONTROL_DECON_EN                 (1 << 1)
#define GLOBAL_CONTROL_DECON_EN_F               (1 << 0)

#define RESOURCE_OCCUPANCY_INFO_0               0x0010
#define SEL_SRAM5                               (3 << 10)
#define SEL_SRAM4                               (3 << 8)
#define SEL_SRAM3                               (3 << 6)
#define SEL_SRAM2                               (3 << 4)
#define SEL_SRAM1                               (3 << 2)
#define SEL_SRAM0                               (3 << 0)
#define RESOURCE_OCCUPANCY_INFO_1               0x0014
#define RESOURCE_OCCUPANCY_INFO_2               0x0018

#define SRAM_SHARE_ENABLE_MAIN                  0x0030
#define SRAM_SHARE_ENABLE_SUB                   0x0034
#define SRAM0_SHARE_ENABLE_F                    (1 << 0)
#define SRAM1_SHARE_ENABLE_F                    (1 << 4)
#define SRAM2_SHARE_ENABLE_F                    (1 << 8)
#define SRAM3_SHARE_ENABLE_F                    (1 << 12)
#define SRAM4_SHARE_ENABLE_F                    (1 << 16)
#define SRAM5_SHARE_ENABLE_F                    (1 << 20)
#define ALL_SRAM_SHARE_ENABLE                   (0x11111 << 0)
#define ALL_SRAM_SHARE_DISABLE                  (0x0)

#define INTERRUPT_ENABLE                        0x0040
#define DPU_DQE_DIMMING_END_INT_EN              (1 << 21)
#define DPU_DQE_DIMMING_START_INT_EN            (1 << 20)
#define DPU_FRAME_DONE_INT_EN                   (1 << 13)
#define DPU_FRAME_START_INT_EN                  (1 << 12)
#define DPU_EXTRA_INT_EN                        (1 << 4)
#define DPU_INT_EN                              (1 << 0)
#define INTERRUPT_ENABLE_MASK                   0x3011

#define EXTRA_INTERRUPT_ENABLE                  0x0044
#define DPU_RESOURCE_CONFLICT_INT_EN            (1 << 8)
#define DPU_TIME_OUT_INT_EN                     (1 << 4)

#define TIME_OUT_VALUE                          0x0048

#define INTERRUPT_PENDING                       0x004C
#define DPU_DQE_DIMMING_END_INT_PEND            (1 << 21)
#define DPU_DQE_DIMMING_START_INT_PEND          (1 << 20)
#define DPU_FRAME_DONE_INT_PEND                 (1 << 13)
#define DPU_FRAME_START_INT_PEND                (1 << 12)
#define DPU_EXTRA_INT_PEND                      (1 << 4)

#define EXTRA_INTERRUPT_PENDING                 0x0050
#define DPU_RESOURCE_CONFLICT_INT_PEND          (1 << 8)
#define DPU_TIME_OUT_INT_PEND                   (1 << 4)

#define SHADOW_REG_UPDATE_REQ                   0x0060
#define SHADOW_REG_UPDATE_REQ_GLOBAL            (1U << 31)
#define SHADOW_REG_UPDATE_REQ_DQE               (1 << 28)
#define SHADOW_REG_UPDATE_REQ_WIN(_win)         (1 << (_win))
#define SHADOW_REG_UPDATE_REQ_FOR_DECON         (0x3f)

#define SECURE_CONTROL                          0x0064
#define TZPC_FLAG_WIN(_win)                     (1 << (_win))

#define HW_SW_TRIG_CONTROL                      0x0070
#define HW_SW_TRIG_HS_STATUS                    (1 << 28)
#define HW_TRIG_SEL(_v)                         ((_v) << 24)
#define HW_TRIG_SEL_MASK                        (0x3 << 24)
#define HW_TRIG_SEL_FROM_DDI1                   (1 << 24)
#define HW_TRIG_SEL_FROM_DDI0                   (0 << 24)
#define HW_TRIG_SKIP(_v)                        ((_v) << 16)
#define HW_TRIG_SKIP_MASK                       (0xff << 16)
#define HW_TRIG_ACTIVE_VALUE                    (1 << 13)
#define HW_TRIG_EDGE_POLARITY                   (1 << 12)
#define SW_TRIG_EN                              (1 << 8)
#define HW_TRIG_MASK_SLAVE1                     (1 << 6)
#define HW_TRIG_MASK_SLAVE0                     (1 << 5)
#define HW_TRIG_MASK_DECON                      (1 << 4)
#define HW_SW_TRIG_TIMER_CLEAR                  (1 << 3)
#define HW_SW_TRIG_TIMER_EN                     (1 << 2)
#define HW_TRIG_EN                              (1 << 0)

#define HW_SW_TRIG_TIMER                        0x0074

#define HW_TE_CNT                               0x0078
#define HW_TRIG_CNT_B_GET(_v)                   (((_v) >> 16) & 0xffff)
#define HW_TRIG_CNT_A_GET(_v)                   (((_v) >> 0) & 0xffff)

#define HW_SW_TRIG_CONTROL_SECURE               0x007C
#define HW_TRIG_MASK_SECURE_SLAVE1              (1 << 6)
#define HW_TRIG_MASK_SECURE_SLAVE0              (1 << 5)
#define HW_TRIG_MASK_SECURE                     (1 << 4)

#define EWR_CONTROL                             0x0080
#define EWR_EN_F                                (1 << 0)

#define EWR_TIMER                               0x0084
#define TIMER_VALUE(_v)                         ((_v) << 0)
#define TIMER_VALUE_MASK                        (0xffffffff << 0)

#define PLL_SLEEP_CONTROL                       0x0090
#define SLEEP_CTRL_MODE_F                       (1 << 8)
#define PLL_SLEEP_MASK_OUTIF1                   (1 << 5)
#define PLL_SLEEP_MASK_OUTIF0                   (1 << 4)
#define PLL_SLEEP_EN_OUTIF1_F                   (1 << 1)
#define PLL_SLEEP_EN_OUTIF0_F                   (1 << 0)

#define SCALED_SIZE_CONTROL_0                   0x00A0
#define SCALED_SIZE_HEIGHT_F(_v)                ((_v) << 16)
#define SCALED_SIZE_HEIGHT_MASK                 (0x3fff << 16)
#define SCALED_SIZE_HEIGHT_GET(_v)              (((_v) >> 16) & 0x3fff)
#define SCALED_SIZE_WIDTH_F(_v)                 ((_v) << 0)
#define SCALED_SIZE_WIDTH_MASK                  (0x3fff << 0)
#define SCALED_SIZE_WIDTH_GET(_v)               (((_v) >> 0) & 0x3fff)

#define CLOCK_CONTROL_0                         0x00F0
/*
 * [28] QACTIVE_PLL_VALUE = 0
 * [24] QACTIVE_VALUE = 0
 *   0: QACTIVE is dynamically changed by DECON h/w,
 *   1: QACTIVE is stuck to 1'b1
 * [16][12][8][4][0] AUTO_CG_EN_xxx
 */
/* clock gating is disabled on bringup */
#define CLOCK_CONTROL_0_CG_MASK                 (0x11111 << 0)
#define CLOCK_CONTROL_0_QACTIVE_MASK            ((0x1 << 24) | (0x1 << 28))
#define CLOCK_CONTROL_0_TE_QACTIVE_PLL_ON       (0x1 << 28)

#define DATA_PATH_CONTROL_0                     0x0214
#define WIN_MAPCOLOR_EN_F(_win)                 (1 << (4*_win + 1))
#define WIN_EN_F(_win)                          (1 << (4*_win + 0))

#define DATA_PATH_CONTROL_1                     0x0218
#define WIN_CHMAP_F(_win, _ch)                  (((_ch) & 0x7) << (4*_win))
#define WIN_CHMAP_MASK(_win)                    (0x7 << (4*_win))

/* BLENDER */
#define WIN_CONTROL_0(_win)                     (0x1000 + ((_win) * 0x30))
#define WIN_ALPHA1_F(_v)                        (((_v) & 0xFF) << 24)
#define WIN_ALPHA1_MASK                         (0xFFU << 24)
#define WIN_ALPHA0_F(_v)                        (((_v) & 0xFF) << 16)
#define WIN_ALPHA0_MASK                         (0xFF << 16)
#define WIN_ALPHA_GET(_v, _n)                   (((_v) >> (16 + 8 * (_n))) & 0xFF)
#define WIN_FUNC_F(_v)                          (((_v) & 0xF) << 8)
#define WIN_FUNC_MASK                           (0xF << 8)
#define WIN_FUNC_GET(_v)                        (((_v) >> 8) & 0xf)
#define WIN_SRESET                              (1 << 4)
#define WIN_ALPHA_MULT_SRC_SEL_F(_v)            (((_v) & 0x3) << 0)
#define WIN_ALPHA_MULT_SRC_SEL_MASK             (0x3 << 0)

#define WIN_CONTROL_1(_win)                     (0x1004 + ((_win) * 0x30))
#define WIN_FG_ALPHA_D_SEL_F(_v)                (((_v) & 0xF) << 24)
#define WIN_FG_ALPHA_D_SEL_MASK                 (0xF << 24)
#define WIN_BG_ALPHA_D_SEL_F(_v)                (((_v) & 0xF) << 16)
#define WIN_BG_ALPHA_D_SEL_MASK                 (0xF << 16)
#define WIN_FG_ALPHA_A_SEL_F(_v)                (((_v) & 0xF) << 8)
#define WIN_FG_ALPHA_A_SEL_MASK                 (0xF << 8)
#define WIN_BG_ALPHA_A_SEL_F(_v)                (((_v) & 0xF) << 0)
#define WIN_BG_ALPHA_A_SEL_MASK                 (0xF << 0)

#define WIN_START_POSITION(_win)                (0x1008 + ((_win) * 0x30))
#define WIN_STRPTR_Y_F(_v)                      (((_v) & 0x3FFF) << 16)
#define WIN_STRPTR_X_F(_v)                      (((_v) & 0x3FFF) << 0)

#define WIN_END_POSITION(_win)                  (0x100C + ((_win) * 0x30))
#define WIN_ENDPTR_Y_F(_v)                      (((_v) & 0x3FFF) << 16)
#define WIN_ENDPTR_X_F(_v)                      (((_v) & 0x3FFF) << 0)

#define WIN_COLORMAP_0(_win)                    (0x1010 + ((_win) * 0x30))
#define WIN_MAPCOLOR_A_F(_v)                    ((_v) << 16)
#define WIN_MAPCOLOR_A_MASK                     (0xff << 16)
#define WIN_MAPCOLOR_R_F(_v)                    ((_v) << 0)
#define WIN_MAPCOLOR_R_MASK                     (0x3ff << 0)

#define WIN_COLORMAP_1(_win)                    (0x1014 + ((_win) * 0x30))
#define WIN_MAPCOLOR_G_F(_v)                    ((_v) << 16)
#define WIN_MAPCOLOR_G_MASK                     (0x3ff << 16)
#define WIN_MAPCOLOR_B_F(_v)                    ((_v) << 0)
#define WIN_MAPCOLOR_B_MASK                     (0x3ff << 0)

#define WIN_START_TIME_CONTROL(_win)            (0x1018 + ((_win) * 0x30))
#define WIN_START_TIME_CONTROL_F(_v)            ((_v) << 0)
#define WIN_START_TIME_CONTROL_MASK             (0x3fff << 0)

#endif /* _REGS_DECON_H */
