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