summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev/starfive/starfive_vpp.h
blob: a8c8802f41d6afda145b0ea7612f0684057c3082 (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
/*
 * StarFive Vout driver
 *
 * Copyright 2020 StarFive Inc.
 *
 * Licensed under the GPL-2.
 */

#ifndef __SF_FB_VPP_H__
#define __SF_FB_VPP_H__

#define PP_ID_0	0
#define PP_ID_1	1
#define PP_ID_2	2

#define PP_NUM	3

#define PP_STOP	0
#define PP_RUN	1

#define PP_INTR_ENABLE	1
#define PP_INTR_DISABLE	0
//PP coefficients
///*
#define R2Y_COEF_R1       77
#define R2Y_COEF_G1       150
#define R2Y_COEF_B1       29
#define R2Y_OFFSET1       0

#define R2Y_COEF_R2       (0x400|43)
#define R2Y_COEF_G2       (0x400|85)
#define R2Y_COEF_B2       128
#define R2Y_OFFSET2       128

#define R2Y_COEF_R3       128
#define R2Y_COEF_G3       (0x400|107)
#define R2Y_COEF_B3       (0x400|21)
#define R2Y_OFFSET3       128
//*/
enum PP_LCD_PATH
{
    SYS_BUS_OUTPUT = 0,
    FIFO_OUTPUT = 1,
};

enum PP_COLOR_CONVERT_SCALE
{
    NOT_BYPASS = 0,
    BYPASS,
};

enum PP_SRC_FORMAT
{
    PP_SRC_YUV420P = 0,
    PP_SRC_YUV422,
    PP_SRC_YUV420I,
    PP_RESERVED,
    PP_SRC_GRB888,
    PP_SRC_RGB565,
};

enum PP_DST_FORMAT
{
    PP_DST_YUV420P = 0,
    PP_DST_YUV422,
    PP_DST_YUV420I,
    PP_DST_RGBA888,
    PP_DST_ARGB888,
    PP_DST_RGB565,
    PP_DST_ABGR888,
    PP_DST_BGRA888,
};

enum COLOR_FORMAT{
    COLOR_YUV422_UYVY = 0,  //00={Y1,V0,Y0,U0}
    COLOR_YUV422_VYUY = 1,  //01={Y1,U0,Y0,V0}
    COLOR_YUV422_YUYV = 2,  //10={V0,Y1,U0,Y0}
    COLOR_YUV422_YVYU = 3,  //11={U0,Y1,V0,Y0}

    COLOR_YUV420P,
    COLOR_YUV420_NV21,
    COLOR_YUV420_NV12,

    COLOR_RGB888_ARGB,
    COLOR_RGB888_ABGR,
    COLOR_RGB888_RGBA,
    COLOR_RGB888_BGRA,
    COLOR_RGB565,
};


struct pp_video_mode {
    enum COLOR_FORMAT format;
    unsigned int height;
    unsigned int width;
	unsigned int addr;
};

struct pp_mode {
	char pp_id;
	bool bus_out;	/*out to ddr*/
	bool fifo_out;	/*out to lcdc*/
	bool inited;
	struct pp_video_mode src;
	struct pp_video_mode dst;
};

//vpp registers
#define PP_SWITCH		0x0000
#define PP_CTRL1		0x0004
#define PP_CTRL2		0x0008
#define PP_SRC_SIZE		0x000C
#define PP_DROP_CTRL		0x0010
#define PP_DES_SIZE		0x0014
#define PP_Scale_Hratio		0x0018
#define PP_Scale_Vratio		0x001C
#define PP_Scale_limit		0x0020
#define PP_SRC_Y_SA_NXT		0x0024
#define PP_SRC_U_SA_NXT		0x0028
#define PP_SRC_V_SA_NXT		0x002c
#define PP_LOAD_NXT_PAR		0x0030
#define PP_SRC_Y_SA0		0x0034
#define PP_SRC_U_SA0		0x0038
#define PP_SRC_V_SA0		0x003c
#define PP_SRC_Y_OFS		0x0040
#define PP_SRC_U_OFS		0x0044
#define PP_SRC_V_OFS		0x0048
#define PP_SRC_Y_SA1		0x004C
#define PP_SRC_U_SA1		0x0050
#define PP_SRC_V_SA1		0x0054
#define PP_DES_Y_SA		0x0058
#define PP_DES_U_SA		0x005C
#define PP_DES_V_SA		0x0060
#define PP_DES_Y_OFS		0x0064
#define PP_DES_U_OFS		0x0068
#define PP_DES_V_OFS		0x006C
#define PP_INT_MASK		0x0074
#define PP_INT_CLR		0x0078
#define PP_R2Y_COEF1		0x007C
#define PP_R2Y_COEF2		0x0080

/* Definition controller bit for LCDC registers */
//for PP_SWITCH
#define PP_TRIG		0
//for PP_CTRL1
#define PP_LCDPATH_EN		0
#define PP_INTERLACE		1
#define PP_POINTER_MODE		2
#define PP_SRC_FORMAT_N		4
#define PP_420_ITLC		7
#define PP_DES_FORMAT		8
#define PP_R2Y_BPS		12
#define PP_MSCALE_BPS		13
#define PP_Y2R_BPS		14
#define PP_ARGB_ALPHA		16
#define PP_UV_IN_ADD_128		24
#define PP_UV_OUT_ADD_128		25
#define PP_SRC_422_YUV_POS		26
#define PP_SRC_420_YUV_POS		28
#define PP_SRC_ARGB_ORDER		29
//for PP_CTRL2
#define PP_LOCK_EN		0
#define PP_INT_INTERVAL		8
#define PP_DES_422_ORDER		16
#define PP_DES_420_ORDER		18
//for PP_SRC_SIZE
#define PP_SRC_HSIZE		0
#define PP_SRC_VSIZE		16
//for PP_DROP_CTRL
#define PP_DROP_HRATION		0
#define PP_DROP_VRATION		4
//for PP_DES_SIZE
#define PP_DES_HSIZE		0
#define PP_DES_VSIZE		16
//for PP_R2Y_COEF1
#define PP_COEF_R1		0
#define PP_COEF_G1		16
//for PP_R2Y_COEF2
#define PP_COEF_B1		0
#define PP_OFFSET_1		16

extern void mapconv_pp0_sel(struct sf_fb_data *sf_dev, int sel);
extern void pp_srcAddr_next(struct sf_fb_data *sf_dev, int ppNum, int ysa, int usa, int vsa);
extern void pp_srcOffset_cfg(struct sf_fb_data *sf_dev, int ppNum, int yoff, int uoff, int voff);
extern void pp_nxtAddr_load(struct sf_fb_data *sf_dev, int ppNum, int nxtPar, int nxtPos);
extern void pp_intcfg(struct sf_fb_data *sf_dev, int ppNum, int intMask);
extern irqreturn_t vpp1_isr_handler(int this_irq, void *dev_id);
extern void pp1_enable_intr(struct sf_fb_data *sf_dev);
extern void pp_enable_intr(struct sf_fb_data *sf_dev, int ppNum);
extern void pp_disable_intr(struct sf_fb_data *sf_dev, int ppNum);
extern void pp_config(struct sf_fb_data *sf_dev, int ppNum, struct pp_video_mode *src, struct pp_video_mode *dst);
extern void pp_run(struct sf_fb_data *sf_dev, int ppNum, int start);

#endif