summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev/msm/mdp3_ppp.h
blob: 428906370a8c6b86c288401a65ffc75fd0307b03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
/* Copyright (c) 2007, 2013, 2016, The Linux Foundation. All rights reserved.
 * Copyright (C) 2007 Google Incorporated
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#ifndef MDP3_PPP_H
#define MDP3_PPP_H
#include "mdp3.h"
#include "mdss_fb.h"

#define PPP_WRITEL(val, off) MDP3_REG_WRITE(off, val)

#define MAX_BLIT_REQ 16
#define PPP_UPSCALE_MAX 64
#define PPP_BLUR_SCALE_MAX 128
#define PPP_LUT_MAX 256

#define MDPOP_SMART_BLIT        BIT(31) /* blit optimization flag */

/* MDP PPP Operations */
#define MDPOP_NOP               0
#define MDPOP_LR                BIT(0)	/* left to right flip */
#define MDPOP_UD                BIT(1)	/* up and down flip */
#define MDPOP_ROT90             BIT(2)	/* rotate image to 90 degree */
#define MDPOP_ROT180            (MDPOP_UD|MDPOP_LR)
#define MDPOP_ROT270            (MDPOP_ROT90|MDPOP_UD|MDPOP_LR)
#define MDPOP_ASCALE            BIT(7)
#define MDPOP_ALPHAB            BIT(8)	/* enable alpha blending */
#define MDPOP_TRANSP            BIT(9)	/* enable transparency */
#define MDPOP_DITHER            BIT(10)	/* enable dither */
#define MDPOP_SHARPENING		BIT(11) /* enable sharpening */
#define MDPOP_BLUR				BIT(12) /* enable blur */
#define MDPOP_FG_PM_ALPHA       BIT(13)
#define MDPOP_LAYER_IS_FG       BIT(14)

#define MDPOP_ROTATION (MDPOP_ROT90|MDPOP_LR|MDPOP_UD)

#define PPP_OP_CONVERT_YCBCR2RGB BIT(2)
#define PPP_OP_CONVERT_ON		BIT(3)
#define PPP_OP_SCALE_X_ON		BIT(0)
#define PPP_OP_SCALE_Y_ON		BIT(1)
#define PPP_OP_ROT_ON			BIT(8)
#define PPP_OP_ROT_90			BIT(9)
#define PPP_OP_FLIP_LR			BIT(10)
#define PPP_OP_FLIP_UD			BIT(11)
#define PPP_OP_BLEND_ON			BIT(12)
#define PPP_OP_BLEND_CONSTANT_ALPHA BIT(14)
#define PPP_OP_BLEND_BG_ALPHA		BIT(13)
#define PPP_OP_BLEND_EQ_REVERSE		BIT(15)
#define PPP_OP_DITHER_EN		BIT(16)
#define PPP_BLEND_CALPHA_TRNASP BIT(24)

#define PPP_OP_BLEND_SRCPIXEL_ALPHA 0
#define PPP_OP_BLEND_ALPHA_BLEND_NORMAL 0
#define PPP_OP_BLEND_ALPHA_BLEND_REVERSE BIT(15)

#define PPP_BLEND_BG_USE_ALPHA_SEL      (1 << 0)
#define PPP_BLEND_BG_ALPHA_REVERSE      (1 << 3)
#define PPP_BLEND_BG_SRCPIXEL_ALPHA     (0 << 1)
#define PPP_BLEND_BG_DSTPIXEL_ALPHA     (1 << 1)
#define PPP_BLEND_BG_CONSTANT_ALPHA     (2 << 1)
#define PPP_BLEND_BG_CONST_ALPHA_VAL(x) ((x) << 24)
#define PPP_OP_BG_CHROMA_H2V1 BIT(25)

#define CLR_G 0x0
#define CLR_B 0x1
#define CLR_R 0x2
#define CLR_ALPHA 0x3

#define CLR_Y  CLR_G
#define CLR_CB CLR_B
#define CLR_CR CLR_R

/* from lsb to msb */
#define PPP_GET_PACK_PATTERN(a, x, y, z, bit) \
	(((a)<<(bit*3))|((x)<<(bit*2))|((y)<<bit)|(z))

/* Frame unpacking */
#define PPP_C0G_8BITS (BIT(1)|BIT(0))
#define PPP_C1B_8BITS (BIT(3)|BIT(2))
#define PPP_C2R_8BITS (BIT(5)|BIT(4))
#define PPP_C3A_8BITS (BIT(7)|BIT(6))

#define PPP_C0G_6BITS BIT(1)
#define PPP_C1B_6BITS BIT(3)
#define PPP_C2R_6BITS BIT(5)

#define PPP_C0G_5BITS BIT(0)
#define PPP_C1B_5BITS BIT(2)
#define PPP_C2R_5BITS BIT(4)

#define PPP_SRC_C3_ALPHA_EN BIT(8)

#define PPP_SRC_BPP_INTERLVD_1BYTES 0
#define PPP_SRC_BPP_INTERLVD_2BYTES BIT(9)
#define PPP_SRC_BPP_INTERLVD_3BYTES BIT(10)
#define PPP_SRC_BPP_INTERLVD_4BYTES (BIT(10)|BIT(9))

#define PPP_SRC_BPP_ROI_ODD_X BIT(11)
#define PPP_SRC_BPP_ROI_ODD_Y BIT(12)
#define PPP_SRC_INTERLVD_2COMPONENTS BIT(13)
#define PPP_SRC_INTERLVD_3COMPONENTS BIT(14)
#define PPP_SRC_INTERLVD_4COMPONENTS (BIT(14)|BIT(13))

#define PPP_SRC_UNPACK_TIGHT BIT(17)
#define PPP_SRC_UNPACK_LOOSE 0
#define PPP_SRC_UNPACK_ALIGN_LSB 0
#define PPP_SRC_UNPACK_ALIGN_MSB BIT(18)

#define PPP_SRC_FETCH_PLANES_INTERLVD 0
#define PPP_SRC_FETCH_PLANES_PSEUDOPLNR BIT(20)

#define PPP_OP_SRC_CHROMA_H2V1 BIT(18)
#define PPP_OP_SRC_CHROMA_H1V2 BIT(19)
#define PPP_OP_SRC_CHROMA_420 (BIT(18)|BIT(19))
#define PPP_OP_SRC_CHROMA_OFFSITE BIT(20)

#define PPP_DST_PACKET_CNT_INTERLVD_2ELEM BIT(9)
#define PPP_DST_PACKET_CNT_INTERLVD_3ELEM BIT(10)
#define PPP_DST_PACKET_CNT_INTERLVD_4ELEM (BIT(10)|BIT(9))
#define PPP_DST_PACKET_CNT_INTERLVD_6ELEM (BIT(11)|BIT(9))

#define PPP_DST_C3A_8BIT (BIT(7)|BIT(6))
#define PPP_DST_C3ALPHA_EN BIT(8)

#define PPP_DST_PACK_LOOSE 0
#define PPP_DST_PACK_TIGHT BIT(13)
#define PPP_DST_PACK_ALIGN_LSB 0
#define PPP_DST_PACK_ALIGN_MSB BIT(14)

#define PPP_DST_OUT_SEL_AXI 0
#define PPP_DST_OUT_SEL_MDDI BIT(15)

#define PPP_DST_BPP_2BYTES BIT(16)
#define PPP_DST_BPP_3BYTES BIT(17)
#define PPP_DST_BPP_4BYTES (BIT(17)|BIT(16))

#define PPP_DST_PLANE_INTERLVD 0
#define PPP_DST_PLANE_PLANAR BIT(18)
#define PPP_DST_PLANE_PSEUDOPLN BIT(19)

#define PPP_OP_DST_CHROMA_H2V1 BIT(21)
#define PPP_OP_DST_CHROMA_420 (BIT(21)|BIT(22))
#define PPP_OP_COLOR_SPACE_YCBCR BIT(17)

#define MDP_SCALE_Q_FACTOR 512
#define MDP_MAX_X_SCALE_FACTOR (MDP_SCALE_Q_FACTOR*4)
#define MDP_MIN_X_SCALE_FACTOR (MDP_SCALE_Q_FACTOR/4)
#define MDP_MAX_Y_SCALE_FACTOR (MDP_SCALE_Q_FACTOR*4)
#define MDP_MIN_Y_SCALE_FACTOR (MDP_SCALE_Q_FACTOR/4)

#define MDP_TOP_LUMA       16
#define MDP_TOP_CHROMA     0
#define MDP_BOTTOM_LUMA    19
#define MDP_BOTTOM_CHROMA  3
#define MDP_LEFT_LUMA      22
#define MDP_LEFT_CHROMA    6
#define MDP_RIGHT_LUMA     25
#define MDP_RIGHT_CHROMA   9

#define MDP_RGB_565_SRC_REG (PPP_C2R_5BITS | PPP_C0G_6BITS | \
	PPP_C1B_5BITS | PPP_SRC_BPP_INTERLVD_2BYTES | \
	PPP_SRC_INTERLVD_3COMPONENTS | PPP_SRC_UNPACK_TIGHT | \
	PPP_SRC_UNPACK_ALIGN_LSB | \
	PPP_SRC_FETCH_PLANES_INTERLVD)

#define MDP_RGB_888_SRC_REG (PPP_C2R_8BITS | PPP_C0G_8BITS | \
	PPP_C1B_8BITS | PPP_SRC_BPP_INTERLVD_3BYTES | \
	PPP_SRC_INTERLVD_3COMPONENTS | PPP_SRC_UNPACK_TIGHT | \
	PPP_SRC_UNPACK_ALIGN_LSB | PPP_SRC_FETCH_PLANES_INTERLVD)

#define MDP_RGBX_8888_SRC_REG (PPP_C2R_8BITS | PPP_C0G_8BITS | \
	PPP_C1B_8BITS | PPP_C3A_8BITS | \
	PPP_SRC_C3_ALPHA_EN | PPP_SRC_BPP_INTERLVD_4BYTES | \
	PPP_SRC_INTERLVD_4COMPONENTS | PPP_SRC_UNPACK_TIGHT | \
	PPP_SRC_UNPACK_ALIGN_LSB | \
	PPP_SRC_FETCH_PLANES_INTERLVD)

#define MDP_Y_CBCR_H2V2_SRC_REG (PPP_C2R_8BITS | PPP_C0G_8BITS | \
	PPP_C1B_8BITS | PPP_SRC_BPP_INTERLVD_2BYTES | \
	PPP_SRC_INTERLVD_2COMPONENTS | PPP_SRC_UNPACK_TIGHT | \
	PPP_SRC_UNPACK_ALIGN_LSB | \
	PPP_SRC_FETCH_PLANES_PSEUDOPLNR)

#define MDP_YCRYCB_H2V1_SRC_REG (PPP_C2R_8BITS | \
	PPP_C0G_8BITS | PPP_C1B_8BITS | \
	PPP_C3A_8BITS | PPP_SRC_BPP_INTERLVD_2BYTES | \
	PPP_SRC_INTERLVD_4COMPONENTS | \
	PPP_SRC_UNPACK_TIGHT | PPP_SRC_UNPACK_ALIGN_LSB)

#define MDP_Y_CRCB_H2V1_SRC_REG (PPP_C2R_8BITS | \
	PPP_C0G_8BITS | PPP_C1B_8BITS | \
	PPP_C3A_8BITS | PPP_SRC_BPP_INTERLVD_2BYTES | \
	PPP_SRC_INTERLVD_2COMPONENTS | PPP_SRC_UNPACK_TIGHT | \
	PPP_SRC_UNPACK_ALIGN_LSB | PPP_SRC_FETCH_PLANES_PSEUDOPLNR)

#define MDP_RGB_565_DST_REG (PPP_C0G_6BITS | \
	PPP_C1B_5BITS | PPP_C2R_5BITS | \
	PPP_DST_PACKET_CNT_INTERLVD_3ELEM | \
	PPP_DST_PACK_TIGHT | PPP_DST_PACK_ALIGN_LSB | \
	PPP_DST_OUT_SEL_AXI | PPP_DST_BPP_2BYTES | \
	PPP_DST_PLANE_INTERLVD)

#define MDP_RGB_888_DST_REG (PPP_C0G_8BITS | \
	PPP_C1B_8BITS | PPP_C2R_8BITS | \
	PPP_DST_PACKET_CNT_INTERLVD_3ELEM | PPP_DST_PACK_TIGHT | \
	PPP_DST_PACK_ALIGN_LSB | PPP_DST_OUT_SEL_AXI | \
	PPP_DST_BPP_3BYTES | PPP_DST_PLANE_INTERLVD)

#define MDP_RGBX_8888_DST_REG (PPP_C0G_8BITS | \
	PPP_C1B_8BITS | PPP_C2R_8BITS | PPP_C3A_8BITS | \
	PPP_DST_C3ALPHA_EN | PPP_DST_PACKET_CNT_INTERLVD_4ELEM | \
	PPP_DST_PACK_TIGHT | PPP_DST_PACK_ALIGN_LSB | \
	PPP_DST_OUT_SEL_AXI | PPP_DST_BPP_4BYTES | \
	PPP_DST_PLANE_INTERLVD)

#define MDP_Y_CBCR_H2V2_DST_REG (PPP_C2R_8BITS | \
	PPP_C0G_8BITS | PPP_C1B_8BITS | PPP_C3A_8BITS | \
	PPP_DST_PACKET_CNT_INTERLVD_2ELEM | \
	PPP_DST_PACK_TIGHT | PPP_DST_PACK_ALIGN_LSB | \
	PPP_DST_OUT_SEL_AXI | PPP_DST_BPP_2BYTES)

#define MDP_YCRYCB_H2V1_DST_REG (PPP_C2R_8BITS | PPP_C0G_8BITS | \
	PPP_C1B_8BITS | PPP_C3A_8BITS | PPP_DST_PACKET_CNT_INTERLVD_4ELEM | \
	PPP_DST_PACK_TIGHT | PPP_DST_PACK_ALIGN_LSB | \
	PPP_DST_OUT_SEL_AXI | PPP_DST_BPP_2BYTES | \
	PPP_DST_PLANE_INTERLVD)

#define MDP_Y_CRCB_H2V1_DST_REG (PPP_C2R_8BITS | \
	PPP_C0G_8BITS | PPP_C1B_8BITS | PPP_C3A_8BITS | \
	PPP_DST_PACKET_CNT_INTERLVD_2ELEM | PPP_DST_PACK_TIGHT | \
	PPP_DST_PACK_ALIGN_LSB | PPP_DST_OUT_SEL_AXI | \
	PPP_DST_BPP_2BYTES)

/* LUT */
#define MDP_LUT_C0_EN BIT(5)
#define MDP_LUT_C1_EN BIT(6)
#define MDP_LUT_C2_EN BIT(7)

/* Dither */
#define MDP_OP_DITHER_EN BIT(16)

/* Rotator */
#define MDP_OP_ROT_ON BIT(8)
#define MDP_OP_ROT_90 BIT(9)
#define MDP_OP_FLIP_LR BIT(10)
#define MDP_OP_FLIP_UD BIT(11)

/* Blend */
#define MDP_OP_BLEND_EN BIT(12)
#define MDP_OP_BLEND_EQ_SEL BIT(15)
#define MDP_OP_BLEND_TRANSP_EN BIT(24)
#define MDP_BLEND_MASK (MDP_OP_BLEND_EN | MDP_OP_BLEND_EQ_SEL | \
	MDP_OP_BLEND_TRANSP_EN | BIT(14) | BIT(13))

#define MDP_BLEND_ALPHA_SEL 13
#define MDP_BLEND_ALPHA_MASK 0x3
#define MDP_BLEND_CONST_ALPHA 24
#define MDP_BLEND_TRASP_COL_MASK 0xFFFFFF

/* CSC Matrix */
#define MDP_CSC_RGB2YUV		0
#define MDP_CSC_YUV2RGB		1

#define MDP_CSC_SIZE	9
#define MDP_BV_SIZE		3
#define MDP_LV_SIZE		4

enum ppp_lut_type {
	LUT_PRE_TABLE = 0,
	LUT_POST_TABLE,
};

enum ppp_csc_matrix {
	CSC_PRIMARY_MATRIX = 0,
	CSC_SECONDARY_MATRIX,
};

/* scale tables */
enum {
	PPP_DOWNSCALE_PT2TOPT4,
	PPP_DOWNSCALE_PT4TOPT6,
	PPP_DOWNSCALE_PT6TOPT8,
	PPP_DOWNSCALE_PT8TOPT1,
	PPP_DOWNSCALE_MAX,
};

struct ppp_table {
	uint32_t reg;
	uint32_t val;
};

struct ppp_resource {
	u64 next_ab;
	u64 next_ib;
	u64 clk_rate;
	u64 solid_fill_pixel;
	u64 solid_fill_byte;
};

struct ppp_csc_table {
	int direction;			/* MDP_CCS_RGB2YUV or YUV2RGB */
	uint16_t fwd_matrix[MDP_CCS_SIZE];	/* 3x3 color coefficients */
	uint16_t rev_matrix[MDP_CCS_SIZE];	/* 3x3 color coefficients */
	uint16_t bv[MDP_BV_SIZE];	/* 1x3 bias vector */
	uint16_t lv[MDP_LV_SIZE];	/* 1x3 limit vector */
};

struct ppp_blend {
	int const_alpha;
	int trans_color; /*color keying*/
};

struct ppp_img_prop {
	int32_t x;
	int32_t y;
	uint32_t width;
	uint32_t height;
};

struct ppp_img_desc {
	struct ppp_img_prop prop;
	struct ppp_img_prop roi;
	int color_fmt;
	void *p0;  /* plane 0 */
	void *p1;
	void *p3;
	int stride0;
	int stride1;
	int stride2;
};

struct ppp_blit_op {
	struct ppp_img_desc src;
	struct ppp_img_desc dst;
	struct ppp_img_desc bg;
	struct ppp_blend blend;
	uint32_t mdp_op; /* Operations */
	uint32_t solid_fill_color;
	bool solid_fill;
};

struct ppp_edge_rep {
	uint32_t dst_roi_width;
	uint32_t dst_roi_height;
	uint32_t is_scale_enabled;

	/*
	 * positions of the luma pixel(relative to the image ) required for
	 * scaling the ROI
	 */
	int32_t luma_interp_point_left;
	int32_t luma_interp_point_right;
	int32_t luma_interp_point_top;
	int32_t luma_interp_point_bottom;

	/*
	 * positions of the chroma pixel(relative to the image ) required for
	 * interpolating a chroma value at all required luma positions
	 */
	int32_t chroma_interp_point_left;
	int32_t chroma_interp_point_right;
	int32_t chroma_interp_point_top;
	int32_t chroma_interp_point_bottom;

	/*
	 * a rectangular region within the chroma plane of the "image".
	 * Chroma pixels falling inside of this rectangle belongs to the ROI
	 */
	int32_t chroma_bound_left;
	int32_t chroma_bound_right;
	int32_t chroma_bound_top;
	int32_t chroma_bound_bottom;

	/*
	 * number of chroma pixels to replicate on the left, right,
	 * top and bottom edge of the ROI.
	 */
	int32_t chroma_repeat_left;
	int32_t chroma_repeat_right;
	int32_t chroma_repeat_top;
	int32_t chroma_repeat_bottom;

	/*
	 * number of luma pixels to replicate on the left, right,
	 * top and bottom edge of the ROI.
	 */
	int32_t luma_repeat_left;
	int32_t luma_repeat_right;
	int32_t luma_repeat_top;
	int32_t luma_repeat_bottom;
};

bool check_if_rgb(int color);

/* func for ppp register values */
uint32_t ppp_bpp(uint32_t type);
uint32_t ppp_src_config(uint32_t type);
uint32_t ppp_out_config(uint32_t type);
uint32_t ppp_pack_pattern(uint32_t type, uint32_t yuv2rgb);
uint32_t ppp_dst_op_reg(uint32_t type);
uint32_t ppp_src_op_reg(uint32_t type);
bool ppp_per_p_alpha(uint32_t type);
bool ppp_multi_plane(uint32_t type);
uint32_t *ppp_default_pre_lut(void);
uint32_t *ppp_default_post_lut(void);
struct ppp_csc_table *ppp_csc_rgb2yuv(void);
struct ppp_csc_table *ppp_csc_table2(void);
void ppp_load_up_lut(void);
void ppp_load_gaussian_lut(void);
void ppp_load_x_scale_table(int idx);
void ppp_load_y_scale_table(int idx);

int mdp3_ppp_res_init(struct msm_fb_data_type *mfd);
int mdp3_ppp_init(void);
int config_ppp_op_mode(struct ppp_blit_op *blit_op);
void ppp_enable(void);
int mdp3_ppp_parse_req(void __user *p,
	struct mdp_async_blit_req_list *req_list_header,
	int async);

#endif