Home | History | Annotate | Download | only in drm
      1 #ifndef _SDE_DRM_H_
      2 #define _SDE_DRM_H_
      3 
      4 #include "drm.h"
      5 
      6 /* Total number of supported color planes */
      7 #define SDE_MAX_PLANES  4
      8 
      9 /* Total number of parameterized detail enhancer mapping curves */
     10 #define SDE_MAX_DE_CURVES 3
     11 
     12  /* Y/RGB and UV filter configuration */
     13 #define FILTER_EDGE_DIRECTED_2D		0x0
     14 #define FILTER_CIRCULAR_2D		0x1
     15 #define FILTER_SEPARABLE_1D		0x2
     16 #define FILTER_BILINEAR			0x3
     17 
     18 /* Alpha filters */
     19 #define FILTER_ALPHA_DROP_REPEAT	0x0
     20 #define FILTER_ALPHA_BILINEAR		0x1
     21 #define FILTER_ALPHA_2D			0x3
     22 
     23 /* Blend filters */
     24 #define FILTER_BLEND_CIRCULAR_2D	0x0
     25 #define FILTER_BLEND_SEPARABLE_1D	0x1
     26 
     27 /* LUT configuration flags */
     28 #define SCALER_LUT_SWAP			0x1
     29 #define SCALER_LUT_DIR_WR		0x2
     30 #define SCALER_LUT_Y_CIR_WR		0x4
     31 #define SCALER_LUT_UV_CIR_WR		0x8
     32 #define SCALER_LUT_Y_SEP_WR		0x10
     33 #define SCALER_LUT_UV_SEP_WR		0x20
     34 
     35 /**
     36  * Blend operations for "blend_op" property
     37  *
     38  * @SDE_DRM_BLEND_OP_NOT_DEFINED:   No blend operation defined for the layer.
     39  * @SDE_DRM_BLEND_OP_OPAQUE:        Apply a constant blend operation. The layer
     40  *                                  would appear opaque in case fg plane alpha
     41  *                                  is 0xff.
     42  * @SDE_DRM_BLEND_OP_PREMULTIPLIED: Apply source over blend rule. Layer already
     43  *                                  has alpha pre-multiplication done. If the fg
     44  *                                  plane alpha is less than 0xff, apply
     45  *                                  modulation as well. This operation is
     46  *                                  intended on layers having alpha channel.
     47  * @SDE_DRM_BLEND_OP_COVERAGE:      Apply source over blend rule. Layer is not
     48  *                                  alpha pre-multiplied. Apply
     49  *                                  pre-multiplication. If fg plane alpha is
     50  *                                  less than 0xff, apply modulation as well.
     51  * @SDE_DRM_BLEND_OP_MAX:           Used to track maximum blend operation
     52  *                                  possible by mdp.
     53  */
     54 #define SDE_DRM_BLEND_OP_NOT_DEFINED    0
     55 #define SDE_DRM_BLEND_OP_OPAQUE         1
     56 #define SDE_DRM_BLEND_OP_PREMULTIPLIED  2
     57 #define SDE_DRM_BLEND_OP_COVERAGE       3
     58 #define SDE_DRM_BLEND_OP_MAX            4
     59 
     60 /**
     61  * Bit masks for "src_config" property
     62  * construct bitmask via (1UL << SDE_DRM_<flag>)
     63  */
     64 #define SDE_DRM_DEINTERLACE         0   /* Specifies interlaced input */
     65 
     66 /* DRM bitmasks are restricted to 0..63 */
     67 #define SDE_DRM_BITMASK_COUNT       64
     68 
     69 /**
     70  * Framebuffer modes for "fb_translation_mode" PLANE and CONNECTOR property
     71  *
     72  * @SDE_DRM_FB_NON_SEC:          IOMMU configuration for this framebuffer mode
     73  *                               is non-secure domain and requires
     74  *                               both stage I and stage II translations when
     75  *                               this buffer is accessed by the display HW.
     76  *                               This is the default mode of all frambuffers.
     77  * @SDE_DRM_FB_SEC:              IOMMU configuration for this framebuffer mode
     78  *                               is secure domain and requires
     79  *                               both stage I and stage II translations when
     80  *                               this buffer is accessed by the display HW.
     81  * @SDE_DRM_FB_NON_SEC_DIR_TRANS: IOMMU configuration for this framebuffer mode
     82  *                               is non-secure domain and requires
     83  *                               only stage II translation when
     84  *                               this buffer is accessed by the display HW.
     85  * @SDE_DRM_FB_SEC_DIR_TRANS:    IOMMU configuration for this framebuffer mode
     86  *                               is secure domain and requires
     87  *                               only stage II translation when
     88  *                               this buffer is accessed by the display HW.
     89  */
     90 
     91 #define SDE_DRM_FB_NON_SEC              0
     92 #define SDE_DRM_FB_SEC                  1
     93 #define SDE_DRM_FB_NON_SEC_DIR_TRANS    2
     94 #define SDE_DRM_FB_SEC_DIR_TRANS        3
     95 
     96 /**
     97  * Secure levels for "security_level" CRTC property.
     98  *                        CRTC property which specifies what plane types
     99  *                        can be attached to this CRTC. Plane component
    100  *                        derives the plane type based on the FB_MODE.
    101  * @ SDE_DRM_SEC_NON_SEC: Both Secure and non-secure plane types can be
    102  *                        attached to this CRTC. This is the default state of
    103  *                        the CRTC.
    104  * @ SDE_DRM_SEC_ONLY:    Only secure planes can be added to this CRTC. If a
    105  *                        CRTC is instructed to be in this mode it follows the
    106  *                        platform dependent restrictions.
    107  */
    108 #define SDE_DRM_SEC_NON_SEC            0
    109 #define SDE_DRM_SEC_ONLY               1
    110 
    111 /**
    112  * struct sde_drm_pix_ext_v1 - version 1 of pixel ext structure
    113  * @num_ext_pxls_lr: Number of total horizontal pixels
    114  * @num_ext_pxls_tb: Number of total vertical lines
    115  * @left_ftch:       Number of extra pixels to overfetch from left
    116  * @right_ftch:      Number of extra pixels to overfetch from right
    117  * @top_ftch:        Number of extra lines to overfetch from top
    118  * @btm_ftch:        Number of extra lines to overfetch from bottom
    119  * @left_rpt:        Number of extra pixels to repeat from left
    120  * @right_rpt:       Number of extra pixels to repeat from right
    121  * @top_rpt:         Number of extra lines to repeat from top
    122  * @btm_rpt:         Number of extra lines to repeat from bottom
    123  */
    124 struct sde_drm_pix_ext_v1 {
    125 	/*
    126 	 * Number of pixels ext in left, right, top and bottom direction
    127 	 * for all color components.
    128 	 */
    129 	int32_t num_ext_pxls_lr[SDE_MAX_PLANES];
    130 	int32_t num_ext_pxls_tb[SDE_MAX_PLANES];
    131 
    132 	/*
    133 	 * Number of pixels needs to be overfetched in left, right, top
    134 	 * and bottom directions from source image for scaling.
    135 	 */
    136 	int32_t left_ftch[SDE_MAX_PLANES];
    137 	int32_t right_ftch[SDE_MAX_PLANES];
    138 	int32_t top_ftch[SDE_MAX_PLANES];
    139 	int32_t btm_ftch[SDE_MAX_PLANES];
    140 	/*
    141 	 * Number of pixels needs to be repeated in left, right, top and
    142 	 * bottom directions for scaling.
    143 	 */
    144 	int32_t left_rpt[SDE_MAX_PLANES];
    145 	int32_t right_rpt[SDE_MAX_PLANES];
    146 	int32_t top_rpt[SDE_MAX_PLANES];
    147 	int32_t btm_rpt[SDE_MAX_PLANES];
    148 
    149 };
    150 
    151 /**
    152  * struct sde_drm_scaler_v1 - version 1 of struct sde_drm_scaler
    153  * @lr:            Pixel extension settings for left/right
    154  * @tb:            Pixel extension settings for top/botton
    155  * @init_phase_x:  Initial scaler phase values for x
    156  * @phase_step_x:  Phase step values for x
    157  * @init_phase_y:  Initial scaler phase values for y
    158  * @phase_step_y:  Phase step values for y
    159  * @horz_filter:   Horizontal filter array
    160  * @vert_filter:   Vertical filter array
    161  */
    162 struct sde_drm_scaler_v1 {
    163 	/*
    164 	 * Pix ext settings
    165 	 */
    166 	struct sde_drm_pix_ext_v1 pe;
    167 	/*
    168 	 * Phase settings
    169 	 */
    170 	int32_t init_phase_x[SDE_MAX_PLANES];
    171 	int32_t phase_step_x[SDE_MAX_PLANES];
    172 	int32_t init_phase_y[SDE_MAX_PLANES];
    173 	int32_t phase_step_y[SDE_MAX_PLANES];
    174 
    175 	/*
    176 	 * Filter type to be used for scaling in horizontal and vertical
    177 	 * directions
    178 	 */
    179 	uint32_t horz_filter[SDE_MAX_PLANES];
    180 	uint32_t vert_filter[SDE_MAX_PLANES];
    181 };
    182 
    183 /**
    184  * struct sde_drm_de_v1 - version 1 of detail enhancer structure
    185  * @enable:         Enables/disables detail enhancer
    186  * @sharpen_level1: Sharpening strength for noise
    187  * @sharpen_level2: Sharpening strength for context
    188  * @clip:           Clip coefficient
    189  * @limit:          Detail enhancer limit factor
    190  * @thr_quiet:      Quite zone threshold
    191  * @thr_dieout:     Die-out zone threshold
    192  * @thr_low:        Linear zone left threshold
    193  * @thr_high:       Linear zone right threshold
    194  * @prec_shift:     Detail enhancer precision
    195  * @adjust_a:       Mapping curves A coefficients
    196  * @adjust_b:       Mapping curves B coefficients
    197  * @adjust_c:       Mapping curves C coefficients
    198  */
    199 struct sde_drm_de_v1 {
    200 	uint32_t enable;
    201 	int16_t sharpen_level1;
    202 	int16_t sharpen_level2;
    203 	uint16_t clip;
    204 	uint16_t limit;
    205 	uint16_t thr_quiet;
    206 	uint16_t thr_dieout;
    207 	uint16_t thr_low;
    208 	uint16_t thr_high;
    209 	uint16_t prec_shift;
    210 	int16_t adjust_a[SDE_MAX_DE_CURVES];
    211 	int16_t adjust_b[SDE_MAX_DE_CURVES];
    212 	int16_t adjust_c[SDE_MAX_DE_CURVES];
    213 };
    214 
    215 /**
    216  * struct sde_drm_scaler_v2 - version 2 of struct sde_drm_scaler
    217  * @enable:            Scaler enable
    218  * @dir_en:            Detail enhancer enable
    219  * @pe:                Pixel extension settings
    220  * @horz_decimate:     Horizontal decimation factor
    221  * @vert_decimate:     Vertical decimation factor
    222  * @init_phase_x:      Initial scaler phase values for x
    223  * @phase_step_x:      Phase step values for x
    224  * @init_phase_y:      Initial scaler phase values for y
    225  * @phase_step_y:      Phase step values for y
    226  * @preload_x:         Horizontal preload value
    227  * @preload_y:         Vertical preload value
    228  * @src_width:         Source width
    229  * @src_height:        Source height
    230  * @dst_width:         Destination width
    231  * @dst_height:        Destination height
    232  * @y_rgb_filter_cfg:  Y/RGB plane filter configuration
    233  * @uv_filter_cfg:     UV plane filter configuration
    234  * @alpha_filter_cfg:  Alpha filter configuration
    235  * @blend_cfg:         Selection of blend coefficients
    236  * @lut_flag:          LUT configuration flags
    237  * @dir_lut_idx:       2d 4x4 LUT index
    238  * @y_rgb_cir_lut_idx: Y/RGB circular LUT index
    239  * @uv_cir_lut_idx:    UV circular LUT index
    240  * @y_rgb_sep_lut_idx: Y/RGB separable LUT index
    241  * @uv_sep_lut_idx:    UV separable LUT index
    242  * @de:                Detail enhancer settings
    243  */
    244 struct sde_drm_scaler_v2 {
    245 	/*
    246 	 * General definitions
    247 	 */
    248 	uint32_t enable;
    249 	uint32_t dir_en;
    250 
    251 	/*
    252 	 * Pix ext settings
    253 	 */
    254 	struct sde_drm_pix_ext_v1 pe;
    255 
    256 	/*
    257 	 * Decimation settings
    258 	 */
    259 	uint32_t horz_decimate;
    260 	uint32_t vert_decimate;
    261 
    262 	/*
    263 	 * Phase settings
    264 	 */
    265 	int32_t init_phase_x[SDE_MAX_PLANES];
    266 	int32_t phase_step_x[SDE_MAX_PLANES];
    267 	int32_t init_phase_y[SDE_MAX_PLANES];
    268 	int32_t phase_step_y[SDE_MAX_PLANES];
    269 
    270 	uint32_t preload_x[SDE_MAX_PLANES];
    271 	uint32_t preload_y[SDE_MAX_PLANES];
    272 	uint32_t src_width[SDE_MAX_PLANES];
    273 	uint32_t src_height[SDE_MAX_PLANES];
    274 
    275 	uint32_t dst_width;
    276 	uint32_t dst_height;
    277 
    278 	uint32_t y_rgb_filter_cfg;
    279 	uint32_t uv_filter_cfg;
    280 	uint32_t alpha_filter_cfg;
    281 	uint32_t blend_cfg;
    282 
    283 	uint32_t lut_flag;
    284 	uint32_t dir_lut_idx;
    285 
    286 	/* for Y(RGB) and UV planes*/
    287 	uint32_t y_rgb_cir_lut_idx;
    288 	uint32_t uv_cir_lut_idx;
    289 	uint32_t y_rgb_sep_lut_idx;
    290 	uint32_t uv_sep_lut_idx;
    291 
    292 	/*
    293 	 * Detail enhancer settings
    294 	 */
    295 	struct sde_drm_de_v1 de;
    296 };
    297 
    298 /* Number of dest scalers supported */
    299 #define SDE_MAX_DS_COUNT 2
    300 
    301 /*
    302  * Destination scaler flag config
    303  */
    304 #define SDE_DRM_DESTSCALER_ENABLE           0x1
    305 #define SDE_DRM_DESTSCALER_SCALE_UPDATE     0x2
    306 #define SDE_DRM_DESTSCALER_ENHANCER_UPDATE  0x4
    307 #define SDE_DRM_DESTSCALER_PU_ENABLE        0x8
    308 
    309 /**
    310  * struct sde_drm_dest_scaler_cfg - destination scaler config structure
    311  * @flags:      Flag to switch between mode for destination scaler
    312  *              refer to destination scaler flag config
    313  * @index:      Destination scaler selection index
    314  * @lm_width:   Layer mixer width configuration
    315  * @lm_height:  Layer mixer height configuration
    316  * @scaler_cfg: The scaling parameters for all the mode except disable
    317  *              Userspace pointer to struct sde_drm_scaler_v2
    318  */
    319 struct sde_drm_dest_scaler_cfg {
    320 	uint32_t flags;
    321 	uint32_t index;
    322 	uint32_t lm_width;
    323 	uint32_t lm_height;
    324 	uint64_t scaler_cfg;
    325 };
    326 
    327 /**
    328  * struct sde_drm_dest_scaler_data - destination scaler data struct
    329  * @num_dest_scaler: Number of dest scalers to be configured
    330  * @ds_cfg:          Destination scaler block configuration
    331  */
    332 struct sde_drm_dest_scaler_data {
    333 	uint32_t num_dest_scaler;
    334 	struct sde_drm_dest_scaler_cfg ds_cfg[SDE_MAX_DS_COUNT];
    335 };
    336 
    337 /*
    338  * Define constants for struct sde_drm_csc
    339  */
    340 #define SDE_CSC_MATRIX_COEFF_SIZE   9
    341 #define SDE_CSC_CLAMP_SIZE          6
    342 #define SDE_CSC_BIAS_SIZE           3
    343 
    344 /**
    345  * struct sde_drm_csc_v1 - version 1 of struct sde_drm_csc
    346  * @ctm_coeff:          Matrix coefficients, in S31.32 format
    347  * @pre_bias:           Pre-bias array values
    348  * @post_bias:          Post-bias array values
    349  * @pre_clamp:          Pre-clamp array values
    350  * @post_clamp:         Post-clamp array values
    351  */
    352 struct sde_drm_csc_v1 {
    353 	int64_t ctm_coeff[SDE_CSC_MATRIX_COEFF_SIZE];
    354 	uint32_t pre_bias[SDE_CSC_BIAS_SIZE];
    355 	uint32_t post_bias[SDE_CSC_BIAS_SIZE];
    356 	uint32_t pre_clamp[SDE_CSC_CLAMP_SIZE];
    357 	uint32_t post_clamp[SDE_CSC_CLAMP_SIZE];
    358 };
    359 
    360 /**
    361  * struct sde_drm_color - struct to store the color and alpha values
    362  * @color_0: Color 0 value
    363  * @color_1: Color 1 value
    364  * @color_2: Color 2 value
    365  * @color_3: Color 3 value
    366  */
    367 struct sde_drm_color {
    368 	uint32_t color_0;
    369 	uint32_t color_1;
    370 	uint32_t color_2;
    371 	uint32_t color_3;
    372 };
    373 
    374 /* Total number of supported dim layers */
    375 #define SDE_MAX_DIM_LAYERS 7
    376 
    377 /* SDE_DRM_DIM_LAYER_CONFIG_FLAG - flags for Dim Layer */
    378 /* Color fill inside of the rect, including border */
    379 #define SDE_DRM_DIM_LAYER_INCLUSIVE     0x1
    380 /* Color fill outside of the rect, excluding border */
    381 #define SDE_DRM_DIM_LAYER_EXCLUSIVE     0x2
    382 
    383 /**
    384  * struct sde_drm_dim_layer - dim layer cfg struct
    385  * @flags:         Refer SDE_DRM_DIM_LAYER_CONFIG_FLAG for possible values
    386  * @stage:         Blending stage of the dim layer
    387  * @color_fill:    Color fill for dim layer
    388  * @rect:          Dim layer coordinates
    389  */
    390 struct sde_drm_dim_layer_cfg {
    391 	uint32_t flags;
    392 	uint32_t stage;
    393 	struct sde_drm_color color_fill;
    394 	struct drm_clip_rect rect;
    395 };
    396 
    397 /**
    398  * struct sde_drm_dim_layer_v1 - version 1 of dim layer struct
    399  * @num_layers:    Numer of Dim Layers
    400  * @layer:         Dim layer user cfgs ptr for the num_layers
    401  */
    402 struct sde_drm_dim_layer_v1 {
    403 	uint32_t num_layers;
    404 	struct sde_drm_dim_layer_cfg layer_cfg[SDE_MAX_DIM_LAYERS];
    405 };
    406 
    407 /* Writeback Config version definition */
    408 #define SDE_DRM_WB_CFG		0x1
    409 
    410 /* SDE_DRM_WB_CONFIG_FLAGS - Writeback configuration flags */
    411 #define SDE_DRM_WB_CFG_FLAGS_CONNECTED	(1<<0)
    412 
    413 /**
    414  * struct sde_drm_wb_cfg - Writeback configuration structure
    415  * @flags:		see DRM_MSM_WB_CONFIG_FLAGS
    416  * @connector_id:	writeback connector identifier
    417  * @count_modes:	Count of modes in modes_ptr
    418  * @modes:		Pointer to struct drm_mode_modeinfo
    419  */
    420 struct sde_drm_wb_cfg {
    421 	uint32_t flags;
    422 	uint32_t connector_id;
    423 	uint32_t count_modes;
    424 	uint64_t modes;
    425 };
    426 
    427 #define SDE_MAX_ROI_V1	4
    428 
    429 /**
    430  * struct sde_drm_roi_v1 - list of regions of interest for a drm object
    431  * @num_rects: number of valid rectangles in the roi array
    432  * @roi: list of roi rectangles
    433  */
    434 struct sde_drm_roi_v1 {
    435 	uint32_t num_rects;
    436 	struct drm_clip_rect roi[SDE_MAX_ROI_V1];
    437 };
    438 
    439 /**
    440  * Define extended power modes supported by the SDE connectors.
    441  */
    442 #define SDE_MODE_DPMS_ON	0
    443 #define SDE_MODE_DPMS_LP1	1
    444 #define SDE_MODE_DPMS_LP2	2
    445 #define SDE_MODE_DPMS_STANDBY	3
    446 #define SDE_MODE_DPMS_SUSPEND	4
    447 #define SDE_MODE_DPMS_OFF	5
    448 
    449 #endif /* _SDE_DRM_H_ */
    450