1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2013 Texas Instruments Inc.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * David Griego, <dagriego@biglakesoftware.com>
6*4882a593Smuzhiyun * Dale Farnsworth, <dale@farnsworth.org>
7*4882a593Smuzhiyun * Archit Taneja, <archit@ti.com>
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #ifndef _TI_VPDMA_PRIV_H_
11*4882a593Smuzhiyun #define _TI_VPDMA_PRIV_H_
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun /*
14*4882a593Smuzhiyun * VPDMA Register offsets
15*4882a593Smuzhiyun */
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun /* Top level */
18*4882a593Smuzhiyun #define VPDMA_PID 0x00
19*4882a593Smuzhiyun #define VPDMA_LIST_ADDR 0x04
20*4882a593Smuzhiyun #define VPDMA_LIST_ATTR 0x08
21*4882a593Smuzhiyun #define VPDMA_LIST_STAT_SYNC 0x0c
22*4882a593Smuzhiyun #define VPDMA_BG_RGB 0x18
23*4882a593Smuzhiyun #define VPDMA_BG_YUV 0x1c
24*4882a593Smuzhiyun #define VPDMA_SETUP 0x30
25*4882a593Smuzhiyun #define VPDMA_MAX_SIZE1 0x34
26*4882a593Smuzhiyun #define VPDMA_MAX_SIZE2 0x38
27*4882a593Smuzhiyun #define VPDMA_MAX_SIZE3 0x3c
28*4882a593Smuzhiyun #define VPDMA_MAX_SIZE_WIDTH_MASK 0xffff
29*4882a593Smuzhiyun #define VPDMA_MAX_SIZE_WIDTH_SHFT 16
30*4882a593Smuzhiyun #define VPDMA_MAX_SIZE_HEIGHT_MASK 0xffff
31*4882a593Smuzhiyun #define VPDMA_MAX_SIZE_HEIGHT_SHFT 0
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun /* Interrupts */
34*4882a593Smuzhiyun #define VPDMA_INT_CHAN_STAT(grp) (0x40 + grp * 8)
35*4882a593Smuzhiyun #define VPDMA_INT_CHAN_MASK(grp) (VPDMA_INT_CHAN_STAT(grp) + 4)
36*4882a593Smuzhiyun #define VPDMA_INT_CLIENT0_STAT 0x78
37*4882a593Smuzhiyun #define VPDMA_INT_CLIENT0_MASK 0x7c
38*4882a593Smuzhiyun #define VPDMA_INT_CLIENT1_STAT 0x80
39*4882a593Smuzhiyun #define VPDMA_INT_CLIENT1_MASK 0x84
40*4882a593Smuzhiyun #define VPDMA_INT_LIST0_STAT 0x88
41*4882a593Smuzhiyun #define VPDMA_INT_LIST0_MASK 0x8c
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun #define VPDMA_INTX_OFFSET 0x50
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun #define VPDMA_PERFMON(i) (0x200 + i * 4)
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun /* VIP/VPE client registers */
48*4882a593Smuzhiyun #define VPDMA_DEI_CHROMA1_CSTAT 0x0300
49*4882a593Smuzhiyun #define VPDMA_DEI_LUMA1_CSTAT 0x0304
50*4882a593Smuzhiyun #define VPDMA_DEI_LUMA2_CSTAT 0x0308
51*4882a593Smuzhiyun #define VPDMA_DEI_CHROMA2_CSTAT 0x030c
52*4882a593Smuzhiyun #define VPDMA_DEI_LUMA3_CSTAT 0x0310
53*4882a593Smuzhiyun #define VPDMA_DEI_CHROMA3_CSTAT 0x0314
54*4882a593Smuzhiyun #define VPDMA_DEI_MV_IN_CSTAT 0x0330
55*4882a593Smuzhiyun #define VPDMA_DEI_MV_OUT_CSTAT 0x033c
56*4882a593Smuzhiyun #define VPDMA_VIP_LO_Y_CSTAT 0x0388
57*4882a593Smuzhiyun #define VPDMA_VIP_LO_UV_CSTAT 0x038c
58*4882a593Smuzhiyun #define VPDMA_VIP_UP_Y_CSTAT 0x0390
59*4882a593Smuzhiyun #define VPDMA_VIP_UP_UV_CSTAT 0x0394
60*4882a593Smuzhiyun #define VPDMA_VPI_CTL_CSTAT 0x03d0
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun /* Reg field info for VPDMA_CLIENT_CSTAT registers */
63*4882a593Smuzhiyun #define VPDMA_CSTAT_LINE_MODE_MASK 0x03
64*4882a593Smuzhiyun #define VPDMA_CSTAT_LINE_MODE_SHIFT 8
65*4882a593Smuzhiyun #define VPDMA_CSTAT_FRAME_START_MASK 0xf
66*4882a593Smuzhiyun #define VPDMA_CSTAT_FRAME_START_SHIFT 10
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun #define VPDMA_LIST_NUM_MASK 0x07
69*4882a593Smuzhiyun #define VPDMA_LIST_NUM_SHFT 24
70*4882a593Smuzhiyun #define VPDMA_LIST_STOP_SHFT 20
71*4882a593Smuzhiyun #define VPDMA_LIST_RDY_MASK 0x01
72*4882a593Smuzhiyun #define VPDMA_LIST_RDY_SHFT 19
73*4882a593Smuzhiyun #define VPDMA_LIST_TYPE_MASK 0x03
74*4882a593Smuzhiyun #define VPDMA_LIST_TYPE_SHFT 16
75*4882a593Smuzhiyun #define VPDMA_LIST_SIZE_MASK 0xffff
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun /*
78*4882a593Smuzhiyun * The YUV data type definition below are taken from
79*4882a593Smuzhiyun * both the TRM and i839 Errata information.
80*4882a593Smuzhiyun * Use the correct data type considering byte
81*4882a593Smuzhiyun * reordering of components.
82*4882a593Smuzhiyun *
83*4882a593Smuzhiyun * Also since the single use of "C" in the 422 case
84*4882a593Smuzhiyun * to mean "Cr" (i.e. V component). It was decided
85*4882a593Smuzhiyun * to explicitly label them CR to remove any confusion.
86*4882a593Smuzhiyun * Bear in mind that the type label refer to the memory
87*4882a593Smuzhiyun * packed order (LSB - MSB).
88*4882a593Smuzhiyun */
89*4882a593Smuzhiyun #define DATA_TYPE_Y444 0x0
90*4882a593Smuzhiyun #define DATA_TYPE_Y422 0x1
91*4882a593Smuzhiyun #define DATA_TYPE_Y420 0x2
92*4882a593Smuzhiyun #define DATA_TYPE_C444 0x4
93*4882a593Smuzhiyun #define DATA_TYPE_C422 0x5
94*4882a593Smuzhiyun #define DATA_TYPE_C420 0x6
95*4882a593Smuzhiyun #define DATA_TYPE_CB420 0x16
96*4882a593Smuzhiyun #define DATA_TYPE_YC444 0x8
97*4882a593Smuzhiyun #define DATA_TYPE_YCB422 0x7
98*4882a593Smuzhiyun #define DATA_TYPE_YCR422 0x17
99*4882a593Smuzhiyun #define DATA_TYPE_CBY422 0x27
100*4882a593Smuzhiyun #define DATA_TYPE_CRY422 0x37
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun /*
103*4882a593Smuzhiyun * The RGB data type definition below are defined
104*4882a593Smuzhiyun * to follow Errata i819.
105*4882a593Smuzhiyun * The initial values were taken from:
106*4882a593Smuzhiyun * VPDMA_data_type_mapping_v0.2vayu_c.pdf
107*4882a593Smuzhiyun * But some of the ARGB definition appeared to be wrong
108*4882a593Smuzhiyun * in the document also. As they would yield RGBA instead.
109*4882a593Smuzhiyun * They have been corrected based on experimentation.
110*4882a593Smuzhiyun */
111*4882a593Smuzhiyun #define DATA_TYPE_RGB16_565 0x10
112*4882a593Smuzhiyun #define DATA_TYPE_ARGB_1555 0x13
113*4882a593Smuzhiyun #define DATA_TYPE_ARGB_4444 0x14
114*4882a593Smuzhiyun #define DATA_TYPE_RGBA_5551 0x11
115*4882a593Smuzhiyun #define DATA_TYPE_RGBA_4444 0x12
116*4882a593Smuzhiyun #define DATA_TYPE_ARGB24_6666 0x18
117*4882a593Smuzhiyun #define DATA_TYPE_RGB24_888 0x16
118*4882a593Smuzhiyun #define DATA_TYPE_ARGB32_8888 0x17
119*4882a593Smuzhiyun #define DATA_TYPE_RGBA24_6666 0x15
120*4882a593Smuzhiyun #define DATA_TYPE_RGBA32_8888 0x19
121*4882a593Smuzhiyun #define DATA_TYPE_BGR16_565 0x0
122*4882a593Smuzhiyun #define DATA_TYPE_ABGR_1555 0x3
123*4882a593Smuzhiyun #define DATA_TYPE_ABGR_4444 0x4
124*4882a593Smuzhiyun #define DATA_TYPE_BGRA_5551 0x1
125*4882a593Smuzhiyun #define DATA_TYPE_BGRA_4444 0x2
126*4882a593Smuzhiyun #define DATA_TYPE_ABGR24_6666 0x8
127*4882a593Smuzhiyun #define DATA_TYPE_BGR24_888 0x6
128*4882a593Smuzhiyun #define DATA_TYPE_ABGR32_8888 0x7
129*4882a593Smuzhiyun #define DATA_TYPE_BGRA24_6666 0x5
130*4882a593Smuzhiyun #define DATA_TYPE_BGRA32_8888 0x9
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun #define DATA_TYPE_MV 0x3
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun /* VPDMA channel numbers, some are common between VIP/VPE and appear twice */
135*4882a593Smuzhiyun #define VPE_CHAN_NUM_LUMA1_IN 0
136*4882a593Smuzhiyun #define VPE_CHAN_NUM_CHROMA1_IN 1
137*4882a593Smuzhiyun #define VPE_CHAN_NUM_LUMA2_IN 2
138*4882a593Smuzhiyun #define VPE_CHAN_NUM_CHROMA2_IN 3
139*4882a593Smuzhiyun #define VPE_CHAN_NUM_LUMA3_IN 4
140*4882a593Smuzhiyun #define VPE_CHAN_NUM_CHROMA3_IN 5
141*4882a593Smuzhiyun #define VPE_CHAN_NUM_MV_IN 12
142*4882a593Smuzhiyun #define VPE_CHAN_NUM_MV_OUT 15
143*4882a593Smuzhiyun #define VIP1_CHAN_NUM_MULT_PORT_A_SRC0 38
144*4882a593Smuzhiyun #define VIP1_CHAN_NUM_MULT_ANC_A_SRC0 70
145*4882a593Smuzhiyun #define VPE_CHAN_NUM_LUMA_OUT 102
146*4882a593Smuzhiyun #define VPE_CHAN_NUM_CHROMA_OUT 103
147*4882a593Smuzhiyun #define VIP1_CHAN_NUM_PORT_A_LUMA 102
148*4882a593Smuzhiyun #define VIP1_CHAN_NUM_PORT_A_CHROMA 103
149*4882a593Smuzhiyun #define VPE_CHAN_NUM_RGB_OUT 106
150*4882a593Smuzhiyun #define VIP1_CHAN_NUM_PORT_A_RGB 106
151*4882a593Smuzhiyun #define VIP1_CHAN_NUM_PORT_B_RGB 107
152*4882a593Smuzhiyun /*
153*4882a593Smuzhiyun * a VPDMA address data block payload for a configuration descriptor needs to
154*4882a593Smuzhiyun * have each sub block length as a multiple of 16 bytes. Therefore, the overall
155*4882a593Smuzhiyun * size of the payload also needs to be a multiple of 16 bytes. The sub block
156*4882a593Smuzhiyun * lengths should be ensured to be aligned by the VPDMA user.
157*4882a593Smuzhiyun */
158*4882a593Smuzhiyun #define VPDMA_ADB_SIZE_ALIGN 0x0f
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun /*
161*4882a593Smuzhiyun * data transfer descriptor
162*4882a593Smuzhiyun */
163*4882a593Smuzhiyun struct vpdma_dtd {
164*4882a593Smuzhiyun u32 type_ctl_stride;
165*4882a593Smuzhiyun union {
166*4882a593Smuzhiyun u32 xfer_length_height;
167*4882a593Smuzhiyun u32 w1;
168*4882a593Smuzhiyun };
169*4882a593Smuzhiyun u32 start_addr;
170*4882a593Smuzhiyun u32 pkt_ctl;
171*4882a593Smuzhiyun union {
172*4882a593Smuzhiyun u32 frame_width_height; /* inbound */
173*4882a593Smuzhiyun u32 desc_write_addr; /* outbound */
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun union {
176*4882a593Smuzhiyun u32 start_h_v; /* inbound */
177*4882a593Smuzhiyun u32 max_width_height; /* outbound */
178*4882a593Smuzhiyun };
179*4882a593Smuzhiyun u32 client_attr0;
180*4882a593Smuzhiyun u32 client_attr1;
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun /* Data Transfer Descriptor specifics */
184*4882a593Smuzhiyun #define DTD_NO_NOTIFY 0
185*4882a593Smuzhiyun #define DTD_NOTIFY 1
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun #define DTD_PKT_TYPE 0xa
188*4882a593Smuzhiyun #define DTD_DIR_IN 0
189*4882a593Smuzhiyun #define DTD_DIR_OUT 1
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun /* type_ctl_stride */
192*4882a593Smuzhiyun #define DTD_DATA_TYPE_MASK 0x3f
193*4882a593Smuzhiyun #define DTD_DATA_TYPE_SHFT 26
194*4882a593Smuzhiyun #define DTD_NOTIFY_MASK 0x01
195*4882a593Smuzhiyun #define DTD_NOTIFY_SHFT 25
196*4882a593Smuzhiyun #define DTD_FIELD_MASK 0x01
197*4882a593Smuzhiyun #define DTD_FIELD_SHFT 24
198*4882a593Smuzhiyun #define DTD_1D_MASK 0x01
199*4882a593Smuzhiyun #define DTD_1D_SHFT 23
200*4882a593Smuzhiyun #define DTD_EVEN_LINE_SKIP_MASK 0x01
201*4882a593Smuzhiyun #define DTD_EVEN_LINE_SKIP_SHFT 20
202*4882a593Smuzhiyun #define DTD_ODD_LINE_SKIP_MASK 0x01
203*4882a593Smuzhiyun #define DTD_ODD_LINE_SKIP_SHFT 16
204*4882a593Smuzhiyun #define DTD_LINE_STRIDE_MASK 0xffff
205*4882a593Smuzhiyun #define DTD_LINE_STRIDE_SHFT 0
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun /* xfer_length_height */
208*4882a593Smuzhiyun #define DTD_LINE_LENGTH_MASK 0xffff
209*4882a593Smuzhiyun #define DTD_LINE_LENGTH_SHFT 16
210*4882a593Smuzhiyun #define DTD_XFER_HEIGHT_MASK 0xffff
211*4882a593Smuzhiyun #define DTD_XFER_HEIGHT_SHFT 0
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun /* pkt_ctl */
214*4882a593Smuzhiyun #define DTD_PKT_TYPE_MASK 0x1f
215*4882a593Smuzhiyun #define DTD_PKT_TYPE_SHFT 27
216*4882a593Smuzhiyun #define DTD_MODE_MASK 0x01
217*4882a593Smuzhiyun #define DTD_MODE_SHFT 26
218*4882a593Smuzhiyun #define DTD_DIR_MASK 0x01
219*4882a593Smuzhiyun #define DTD_DIR_SHFT 25
220*4882a593Smuzhiyun #define DTD_CHAN_MASK 0x01ff
221*4882a593Smuzhiyun #define DTD_CHAN_SHFT 16
222*4882a593Smuzhiyun #define DTD_PRI_MASK 0x0f
223*4882a593Smuzhiyun #define DTD_PRI_SHFT 9
224*4882a593Smuzhiyun #define DTD_NEXT_CHAN_MASK 0x01ff
225*4882a593Smuzhiyun #define DTD_NEXT_CHAN_SHFT 0
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun /* frame_width_height */
228*4882a593Smuzhiyun #define DTD_FRAME_WIDTH_MASK 0xffff
229*4882a593Smuzhiyun #define DTD_FRAME_WIDTH_SHFT 16
230*4882a593Smuzhiyun #define DTD_FRAME_HEIGHT_MASK 0xffff
231*4882a593Smuzhiyun #define DTD_FRAME_HEIGHT_SHFT 0
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun /* start_h_v */
234*4882a593Smuzhiyun #define DTD_H_START_MASK 0xffff
235*4882a593Smuzhiyun #define DTD_H_START_SHFT 16
236*4882a593Smuzhiyun #define DTD_V_START_MASK 0xffff
237*4882a593Smuzhiyun #define DTD_V_START_SHFT 0
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun #define DTD_DESC_START_MASK 0xffffffe0
240*4882a593Smuzhiyun #define DTD_DESC_START_SHIFT 5
241*4882a593Smuzhiyun #define DTD_WRITE_DESC_MASK 0x01
242*4882a593Smuzhiyun #define DTD_WRITE_DESC_SHIFT 2
243*4882a593Smuzhiyun #define DTD_DROP_DATA_MASK 0x01
244*4882a593Smuzhiyun #define DTD_DROP_DATA_SHIFT 1
245*4882a593Smuzhiyun #define DTD_USE_DESC_MASK 0x01
246*4882a593Smuzhiyun #define DTD_USE_DESC_SHIFT 0
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun /* max_width_height */
249*4882a593Smuzhiyun #define DTD_MAX_WIDTH_MASK 0x07
250*4882a593Smuzhiyun #define DTD_MAX_WIDTH_SHFT 4
251*4882a593Smuzhiyun #define DTD_MAX_HEIGHT_MASK 0x07
252*4882a593Smuzhiyun #define DTD_MAX_HEIGHT_SHFT 0
253*4882a593Smuzhiyun
dtd_type_ctl_stride(int type,bool notify,int field,bool one_d,bool even_line_skip,bool odd_line_skip,int line_stride)254*4882a593Smuzhiyun static inline u32 dtd_type_ctl_stride(int type, bool notify, int field,
255*4882a593Smuzhiyun bool one_d, bool even_line_skip, bool odd_line_skip,
256*4882a593Smuzhiyun int line_stride)
257*4882a593Smuzhiyun {
258*4882a593Smuzhiyun return (type << DTD_DATA_TYPE_SHFT) | (notify << DTD_NOTIFY_SHFT) |
259*4882a593Smuzhiyun (field << DTD_FIELD_SHFT) | (one_d << DTD_1D_SHFT) |
260*4882a593Smuzhiyun (even_line_skip << DTD_EVEN_LINE_SKIP_SHFT) |
261*4882a593Smuzhiyun (odd_line_skip << DTD_ODD_LINE_SKIP_SHFT) |
262*4882a593Smuzhiyun line_stride;
263*4882a593Smuzhiyun }
264*4882a593Smuzhiyun
dtd_xfer_length_height(int line_length,int xfer_height)265*4882a593Smuzhiyun static inline u32 dtd_xfer_length_height(int line_length, int xfer_height)
266*4882a593Smuzhiyun {
267*4882a593Smuzhiyun return (line_length << DTD_LINE_LENGTH_SHFT) | xfer_height;
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun
dtd_pkt_ctl(bool mode,bool dir,int chan,int pri,int next_chan)270*4882a593Smuzhiyun static inline u32 dtd_pkt_ctl(bool mode, bool dir, int chan, int pri,
271*4882a593Smuzhiyun int next_chan)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun return (DTD_PKT_TYPE << DTD_PKT_TYPE_SHFT) | (mode << DTD_MODE_SHFT) |
274*4882a593Smuzhiyun (dir << DTD_DIR_SHFT) | (chan << DTD_CHAN_SHFT) |
275*4882a593Smuzhiyun (pri << DTD_PRI_SHFT) | next_chan;
276*4882a593Smuzhiyun }
277*4882a593Smuzhiyun
dtd_frame_width_height(int width,int height)278*4882a593Smuzhiyun static inline u32 dtd_frame_width_height(int width, int height)
279*4882a593Smuzhiyun {
280*4882a593Smuzhiyun return (width << DTD_FRAME_WIDTH_SHFT) | height;
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun
dtd_desc_write_addr(unsigned int addr,bool write_desc,bool drop_data,bool use_desc)283*4882a593Smuzhiyun static inline u32 dtd_desc_write_addr(unsigned int addr, bool write_desc,
284*4882a593Smuzhiyun bool drop_data, bool use_desc)
285*4882a593Smuzhiyun {
286*4882a593Smuzhiyun return (addr & DTD_DESC_START_MASK) |
287*4882a593Smuzhiyun (write_desc << DTD_WRITE_DESC_SHIFT) |
288*4882a593Smuzhiyun (drop_data << DTD_DROP_DATA_SHIFT) |
289*4882a593Smuzhiyun use_desc;
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun
dtd_start_h_v(int h_start,int v_start)292*4882a593Smuzhiyun static inline u32 dtd_start_h_v(int h_start, int v_start)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun return (h_start << DTD_H_START_SHFT) | v_start;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun
dtd_max_width_height(int max_width,int max_height)297*4882a593Smuzhiyun static inline u32 dtd_max_width_height(int max_width, int max_height)
298*4882a593Smuzhiyun {
299*4882a593Smuzhiyun return (max_width << DTD_MAX_WIDTH_SHFT) | max_height;
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun
dtd_get_data_type(struct vpdma_dtd * dtd)302*4882a593Smuzhiyun static inline int dtd_get_data_type(struct vpdma_dtd *dtd)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun return dtd->type_ctl_stride >> DTD_DATA_TYPE_SHFT;
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun
dtd_get_notify(struct vpdma_dtd * dtd)307*4882a593Smuzhiyun static inline bool dtd_get_notify(struct vpdma_dtd *dtd)
308*4882a593Smuzhiyun {
309*4882a593Smuzhiyun return (dtd->type_ctl_stride >> DTD_NOTIFY_SHFT) & DTD_NOTIFY_MASK;
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun
dtd_get_field(struct vpdma_dtd * dtd)312*4882a593Smuzhiyun static inline int dtd_get_field(struct vpdma_dtd *dtd)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun return (dtd->type_ctl_stride >> DTD_FIELD_SHFT) & DTD_FIELD_MASK;
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun
dtd_get_1d(struct vpdma_dtd * dtd)317*4882a593Smuzhiyun static inline bool dtd_get_1d(struct vpdma_dtd *dtd)
318*4882a593Smuzhiyun {
319*4882a593Smuzhiyun return (dtd->type_ctl_stride >> DTD_1D_SHFT) & DTD_1D_MASK;
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun
dtd_get_even_line_skip(struct vpdma_dtd * dtd)322*4882a593Smuzhiyun static inline bool dtd_get_even_line_skip(struct vpdma_dtd *dtd)
323*4882a593Smuzhiyun {
324*4882a593Smuzhiyun return (dtd->type_ctl_stride >> DTD_EVEN_LINE_SKIP_SHFT)
325*4882a593Smuzhiyun & DTD_EVEN_LINE_SKIP_MASK;
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun
dtd_get_odd_line_skip(struct vpdma_dtd * dtd)328*4882a593Smuzhiyun static inline bool dtd_get_odd_line_skip(struct vpdma_dtd *dtd)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun return (dtd->type_ctl_stride >> DTD_ODD_LINE_SKIP_SHFT)
331*4882a593Smuzhiyun & DTD_ODD_LINE_SKIP_MASK;
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun
dtd_get_line_stride(struct vpdma_dtd * dtd)334*4882a593Smuzhiyun static inline int dtd_get_line_stride(struct vpdma_dtd *dtd)
335*4882a593Smuzhiyun {
336*4882a593Smuzhiyun return dtd->type_ctl_stride & DTD_LINE_STRIDE_MASK;
337*4882a593Smuzhiyun }
338*4882a593Smuzhiyun
dtd_get_line_length(struct vpdma_dtd * dtd)339*4882a593Smuzhiyun static inline int dtd_get_line_length(struct vpdma_dtd *dtd)
340*4882a593Smuzhiyun {
341*4882a593Smuzhiyun return dtd->xfer_length_height >> DTD_LINE_LENGTH_SHFT;
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun
dtd_get_xfer_height(struct vpdma_dtd * dtd)344*4882a593Smuzhiyun static inline int dtd_get_xfer_height(struct vpdma_dtd *dtd)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun return dtd->xfer_length_height & DTD_XFER_HEIGHT_MASK;
347*4882a593Smuzhiyun }
348*4882a593Smuzhiyun
dtd_get_pkt_type(struct vpdma_dtd * dtd)349*4882a593Smuzhiyun static inline int dtd_get_pkt_type(struct vpdma_dtd *dtd)
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun return dtd->pkt_ctl >> DTD_PKT_TYPE_SHFT;
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun
dtd_get_mode(struct vpdma_dtd * dtd)354*4882a593Smuzhiyun static inline bool dtd_get_mode(struct vpdma_dtd *dtd)
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun return (dtd->pkt_ctl >> DTD_MODE_SHFT) & DTD_MODE_MASK;
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun
dtd_get_dir(struct vpdma_dtd * dtd)359*4882a593Smuzhiyun static inline bool dtd_get_dir(struct vpdma_dtd *dtd)
360*4882a593Smuzhiyun {
361*4882a593Smuzhiyun return (dtd->pkt_ctl >> DTD_DIR_SHFT) & DTD_DIR_MASK;
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun
dtd_get_chan(struct vpdma_dtd * dtd)364*4882a593Smuzhiyun static inline int dtd_get_chan(struct vpdma_dtd *dtd)
365*4882a593Smuzhiyun {
366*4882a593Smuzhiyun return (dtd->pkt_ctl >> DTD_CHAN_SHFT) & DTD_CHAN_MASK;
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun
dtd_get_priority(struct vpdma_dtd * dtd)369*4882a593Smuzhiyun static inline int dtd_get_priority(struct vpdma_dtd *dtd)
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun return (dtd->pkt_ctl >> DTD_PRI_SHFT) & DTD_PRI_MASK;
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun
dtd_get_next_chan(struct vpdma_dtd * dtd)374*4882a593Smuzhiyun static inline int dtd_get_next_chan(struct vpdma_dtd *dtd)
375*4882a593Smuzhiyun {
376*4882a593Smuzhiyun return (dtd->pkt_ctl >> DTD_NEXT_CHAN_SHFT) & DTD_NEXT_CHAN_MASK;
377*4882a593Smuzhiyun }
378*4882a593Smuzhiyun
dtd_get_frame_width(struct vpdma_dtd * dtd)379*4882a593Smuzhiyun static inline int dtd_get_frame_width(struct vpdma_dtd *dtd)
380*4882a593Smuzhiyun {
381*4882a593Smuzhiyun return dtd->frame_width_height >> DTD_FRAME_WIDTH_SHFT;
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun
dtd_get_frame_height(struct vpdma_dtd * dtd)384*4882a593Smuzhiyun static inline int dtd_get_frame_height(struct vpdma_dtd *dtd)
385*4882a593Smuzhiyun {
386*4882a593Smuzhiyun return dtd->frame_width_height & DTD_FRAME_HEIGHT_MASK;
387*4882a593Smuzhiyun }
388*4882a593Smuzhiyun
dtd_get_desc_write_addr(struct vpdma_dtd * dtd)389*4882a593Smuzhiyun static inline int dtd_get_desc_write_addr(struct vpdma_dtd *dtd)
390*4882a593Smuzhiyun {
391*4882a593Smuzhiyun return dtd->desc_write_addr & DTD_DESC_START_MASK;
392*4882a593Smuzhiyun }
393*4882a593Smuzhiyun
dtd_get_write_desc(struct vpdma_dtd * dtd)394*4882a593Smuzhiyun static inline bool dtd_get_write_desc(struct vpdma_dtd *dtd)
395*4882a593Smuzhiyun {
396*4882a593Smuzhiyun return (dtd->desc_write_addr >> DTD_WRITE_DESC_SHIFT) &
397*4882a593Smuzhiyun DTD_WRITE_DESC_MASK;
398*4882a593Smuzhiyun }
399*4882a593Smuzhiyun
dtd_get_drop_data(struct vpdma_dtd * dtd)400*4882a593Smuzhiyun static inline bool dtd_get_drop_data(struct vpdma_dtd *dtd)
401*4882a593Smuzhiyun {
402*4882a593Smuzhiyun return (dtd->desc_write_addr >> DTD_DROP_DATA_SHIFT) &
403*4882a593Smuzhiyun DTD_DROP_DATA_MASK;
404*4882a593Smuzhiyun }
405*4882a593Smuzhiyun
dtd_get_use_desc(struct vpdma_dtd * dtd)406*4882a593Smuzhiyun static inline bool dtd_get_use_desc(struct vpdma_dtd *dtd)
407*4882a593Smuzhiyun {
408*4882a593Smuzhiyun return dtd->desc_write_addr & DTD_USE_DESC_MASK;
409*4882a593Smuzhiyun }
410*4882a593Smuzhiyun
dtd_get_h_start(struct vpdma_dtd * dtd)411*4882a593Smuzhiyun static inline int dtd_get_h_start(struct vpdma_dtd *dtd)
412*4882a593Smuzhiyun {
413*4882a593Smuzhiyun return dtd->start_h_v >> DTD_H_START_SHFT;
414*4882a593Smuzhiyun }
415*4882a593Smuzhiyun
dtd_get_v_start(struct vpdma_dtd * dtd)416*4882a593Smuzhiyun static inline int dtd_get_v_start(struct vpdma_dtd *dtd)
417*4882a593Smuzhiyun {
418*4882a593Smuzhiyun return dtd->start_h_v & DTD_V_START_MASK;
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun
dtd_get_max_width(struct vpdma_dtd * dtd)421*4882a593Smuzhiyun static inline int dtd_get_max_width(struct vpdma_dtd *dtd)
422*4882a593Smuzhiyun {
423*4882a593Smuzhiyun return (dtd->max_width_height >> DTD_MAX_WIDTH_SHFT) &
424*4882a593Smuzhiyun DTD_MAX_WIDTH_MASK;
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun
dtd_get_max_height(struct vpdma_dtd * dtd)427*4882a593Smuzhiyun static inline int dtd_get_max_height(struct vpdma_dtd *dtd)
428*4882a593Smuzhiyun {
429*4882a593Smuzhiyun return (dtd->max_width_height >> DTD_MAX_HEIGHT_SHFT) &
430*4882a593Smuzhiyun DTD_MAX_HEIGHT_MASK;
431*4882a593Smuzhiyun }
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun /*
434*4882a593Smuzhiyun * configuration descriptor
435*4882a593Smuzhiyun */
436*4882a593Smuzhiyun struct vpdma_cfd {
437*4882a593Smuzhiyun union {
438*4882a593Smuzhiyun u32 dest_addr_offset;
439*4882a593Smuzhiyun u32 w0;
440*4882a593Smuzhiyun };
441*4882a593Smuzhiyun union {
442*4882a593Smuzhiyun u32 block_len; /* in words */
443*4882a593Smuzhiyun u32 w1;
444*4882a593Smuzhiyun };
445*4882a593Smuzhiyun u32 payload_addr;
446*4882a593Smuzhiyun u32 ctl_payload_len; /* in words */
447*4882a593Smuzhiyun };
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun /* Configuration descriptor specifics */
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun #define CFD_PKT_TYPE 0xb
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun #define CFD_DIRECT 1
454*4882a593Smuzhiyun #define CFD_INDIRECT 0
455*4882a593Smuzhiyun #define CFD_CLS_ADB 0
456*4882a593Smuzhiyun #define CFD_CLS_BLOCK 1
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun /* block_len */
459*4882a593Smuzhiyun #define CFD__BLOCK_LEN_MASK 0xffff
460*4882a593Smuzhiyun #define CFD__BLOCK_LEN_SHFT 0
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun /* ctl_payload_len */
463*4882a593Smuzhiyun #define CFD_PKT_TYPE_MASK 0x1f
464*4882a593Smuzhiyun #define CFD_PKT_TYPE_SHFT 27
465*4882a593Smuzhiyun #define CFD_DIRECT_MASK 0x01
466*4882a593Smuzhiyun #define CFD_DIRECT_SHFT 26
467*4882a593Smuzhiyun #define CFD_CLASS_MASK 0x03
468*4882a593Smuzhiyun #define CFD_CLASS_SHFT 24
469*4882a593Smuzhiyun #define CFD_DEST_MASK 0xff
470*4882a593Smuzhiyun #define CFD_DEST_SHFT 16
471*4882a593Smuzhiyun #define CFD_PAYLOAD_LEN_MASK 0xffff
472*4882a593Smuzhiyun #define CFD_PAYLOAD_LEN_SHFT 0
473*4882a593Smuzhiyun
cfd_pkt_payload_len(bool direct,int cls,int dest,int payload_len)474*4882a593Smuzhiyun static inline u32 cfd_pkt_payload_len(bool direct, int cls, int dest,
475*4882a593Smuzhiyun int payload_len)
476*4882a593Smuzhiyun {
477*4882a593Smuzhiyun return (CFD_PKT_TYPE << CFD_PKT_TYPE_SHFT) |
478*4882a593Smuzhiyun (direct << CFD_DIRECT_SHFT) |
479*4882a593Smuzhiyun (cls << CFD_CLASS_SHFT) |
480*4882a593Smuzhiyun (dest << CFD_DEST_SHFT) |
481*4882a593Smuzhiyun payload_len;
482*4882a593Smuzhiyun }
483*4882a593Smuzhiyun
cfd_get_pkt_type(struct vpdma_cfd * cfd)484*4882a593Smuzhiyun static inline int cfd_get_pkt_type(struct vpdma_cfd *cfd)
485*4882a593Smuzhiyun {
486*4882a593Smuzhiyun return cfd->ctl_payload_len >> CFD_PKT_TYPE_SHFT;
487*4882a593Smuzhiyun }
488*4882a593Smuzhiyun
cfd_get_direct(struct vpdma_cfd * cfd)489*4882a593Smuzhiyun static inline bool cfd_get_direct(struct vpdma_cfd *cfd)
490*4882a593Smuzhiyun {
491*4882a593Smuzhiyun return (cfd->ctl_payload_len >> CFD_DIRECT_SHFT) & CFD_DIRECT_MASK;
492*4882a593Smuzhiyun }
493*4882a593Smuzhiyun
cfd_get_class(struct vpdma_cfd * cfd)494*4882a593Smuzhiyun static inline bool cfd_get_class(struct vpdma_cfd *cfd)
495*4882a593Smuzhiyun {
496*4882a593Smuzhiyun return (cfd->ctl_payload_len >> CFD_CLASS_SHFT) & CFD_CLASS_MASK;
497*4882a593Smuzhiyun }
498*4882a593Smuzhiyun
cfd_get_dest(struct vpdma_cfd * cfd)499*4882a593Smuzhiyun static inline int cfd_get_dest(struct vpdma_cfd *cfd)
500*4882a593Smuzhiyun {
501*4882a593Smuzhiyun return (cfd->ctl_payload_len >> CFD_DEST_SHFT) & CFD_DEST_MASK;
502*4882a593Smuzhiyun }
503*4882a593Smuzhiyun
cfd_get_payload_len(struct vpdma_cfd * cfd)504*4882a593Smuzhiyun static inline int cfd_get_payload_len(struct vpdma_cfd *cfd)
505*4882a593Smuzhiyun {
506*4882a593Smuzhiyun return cfd->ctl_payload_len & CFD_PAYLOAD_LEN_MASK;
507*4882a593Smuzhiyun }
508*4882a593Smuzhiyun
509*4882a593Smuzhiyun /*
510*4882a593Smuzhiyun * control descriptor
511*4882a593Smuzhiyun */
512*4882a593Smuzhiyun struct vpdma_ctd {
513*4882a593Smuzhiyun union {
514*4882a593Smuzhiyun u32 timer_value;
515*4882a593Smuzhiyun u32 list_addr;
516*4882a593Smuzhiyun u32 w0;
517*4882a593Smuzhiyun };
518*4882a593Smuzhiyun union {
519*4882a593Smuzhiyun u32 pixel_line_count;
520*4882a593Smuzhiyun u32 list_size;
521*4882a593Smuzhiyun u32 w1;
522*4882a593Smuzhiyun };
523*4882a593Smuzhiyun union {
524*4882a593Smuzhiyun u32 event;
525*4882a593Smuzhiyun u32 fid_ctl;
526*4882a593Smuzhiyun u32 w2;
527*4882a593Smuzhiyun };
528*4882a593Smuzhiyun u32 type_source_ctl;
529*4882a593Smuzhiyun };
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun /* control descriptor types */
532*4882a593Smuzhiyun #define CTD_TYPE_SYNC_ON_CLIENT 0
533*4882a593Smuzhiyun #define CTD_TYPE_SYNC_ON_LIST 1
534*4882a593Smuzhiyun #define CTD_TYPE_SYNC_ON_EXT 2
535*4882a593Smuzhiyun #define CTD_TYPE_SYNC_ON_LM_TIMER 3
536*4882a593Smuzhiyun #define CTD_TYPE_SYNC_ON_CHANNEL 4
537*4882a593Smuzhiyun #define CTD_TYPE_CHNG_CLIENT_IRQ 5
538*4882a593Smuzhiyun #define CTD_TYPE_SEND_IRQ 6
539*4882a593Smuzhiyun #define CTD_TYPE_RELOAD_LIST 7
540*4882a593Smuzhiyun #define CTD_TYPE_ABORT_CHANNEL 8
541*4882a593Smuzhiyun
542*4882a593Smuzhiyun #define CTD_PKT_TYPE 0xc
543*4882a593Smuzhiyun
544*4882a593Smuzhiyun /* timer_value */
545*4882a593Smuzhiyun #define CTD_TIMER_VALUE_MASK 0xffff
546*4882a593Smuzhiyun #define CTD_TIMER_VALUE_SHFT 0
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun /* pixel_line_count */
549*4882a593Smuzhiyun #define CTD_PIXEL_COUNT_MASK 0xffff
550*4882a593Smuzhiyun #define CTD_PIXEL_COUNT_SHFT 16
551*4882a593Smuzhiyun #define CTD_LINE_COUNT_MASK 0xffff
552*4882a593Smuzhiyun #define CTD_LINE_COUNT_SHFT 0
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun /* list_size */
555*4882a593Smuzhiyun #define CTD_LIST_SIZE_MASK 0xffff
556*4882a593Smuzhiyun #define CTD_LIST_SIZE_SHFT 0
557*4882a593Smuzhiyun
558*4882a593Smuzhiyun /* event */
559*4882a593Smuzhiyun #define CTD_EVENT_MASK 0x0f
560*4882a593Smuzhiyun #define CTD_EVENT_SHFT 0
561*4882a593Smuzhiyun
562*4882a593Smuzhiyun /* fid_ctl */
563*4882a593Smuzhiyun #define CTD_FID2_MASK 0x03
564*4882a593Smuzhiyun #define CTD_FID2_SHFT 4
565*4882a593Smuzhiyun #define CTD_FID1_MASK 0x03
566*4882a593Smuzhiyun #define CTD_FID1_SHFT 2
567*4882a593Smuzhiyun #define CTD_FID0_MASK 0x03
568*4882a593Smuzhiyun #define CTD_FID0_SHFT 0
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun /* type_source_ctl */
571*4882a593Smuzhiyun #define CTD_PKT_TYPE_MASK 0x1f
572*4882a593Smuzhiyun #define CTD_PKT_TYPE_SHFT 27
573*4882a593Smuzhiyun #define CTD_SOURCE_MASK 0xff
574*4882a593Smuzhiyun #define CTD_SOURCE_SHFT 16
575*4882a593Smuzhiyun #define CTD_CONTROL_MASK 0x0f
576*4882a593Smuzhiyun #define CTD_CONTROL_SHFT 0
577*4882a593Smuzhiyun
ctd_pixel_line_count(int pixel_count,int line_count)578*4882a593Smuzhiyun static inline u32 ctd_pixel_line_count(int pixel_count, int line_count)
579*4882a593Smuzhiyun {
580*4882a593Smuzhiyun return (pixel_count << CTD_PIXEL_COUNT_SHFT) | line_count;
581*4882a593Smuzhiyun }
582*4882a593Smuzhiyun
ctd_set_fid_ctl(int fid0,int fid1,int fid2)583*4882a593Smuzhiyun static inline u32 ctd_set_fid_ctl(int fid0, int fid1, int fid2)
584*4882a593Smuzhiyun {
585*4882a593Smuzhiyun return (fid2 << CTD_FID2_SHFT) | (fid1 << CTD_FID1_SHFT) | fid0;
586*4882a593Smuzhiyun }
587*4882a593Smuzhiyun
ctd_type_source_ctl(int source,int control)588*4882a593Smuzhiyun static inline u32 ctd_type_source_ctl(int source, int control)
589*4882a593Smuzhiyun {
590*4882a593Smuzhiyun return (CTD_PKT_TYPE << CTD_PKT_TYPE_SHFT) |
591*4882a593Smuzhiyun (source << CTD_SOURCE_SHFT) | control;
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun
ctd_get_pixel_count(struct vpdma_ctd * ctd)594*4882a593Smuzhiyun static inline u32 ctd_get_pixel_count(struct vpdma_ctd *ctd)
595*4882a593Smuzhiyun {
596*4882a593Smuzhiyun return ctd->pixel_line_count >> CTD_PIXEL_COUNT_SHFT;
597*4882a593Smuzhiyun }
598*4882a593Smuzhiyun
ctd_get_line_count(struct vpdma_ctd * ctd)599*4882a593Smuzhiyun static inline int ctd_get_line_count(struct vpdma_ctd *ctd)
600*4882a593Smuzhiyun {
601*4882a593Smuzhiyun return ctd->pixel_line_count & CTD_LINE_COUNT_MASK;
602*4882a593Smuzhiyun }
603*4882a593Smuzhiyun
ctd_get_event(struct vpdma_ctd * ctd)604*4882a593Smuzhiyun static inline int ctd_get_event(struct vpdma_ctd *ctd)
605*4882a593Smuzhiyun {
606*4882a593Smuzhiyun return ctd->event & CTD_EVENT_MASK;
607*4882a593Smuzhiyun }
608*4882a593Smuzhiyun
ctd_get_fid2_ctl(struct vpdma_ctd * ctd)609*4882a593Smuzhiyun static inline int ctd_get_fid2_ctl(struct vpdma_ctd *ctd)
610*4882a593Smuzhiyun {
611*4882a593Smuzhiyun return (ctd->fid_ctl >> CTD_FID2_SHFT) & CTD_FID2_MASK;
612*4882a593Smuzhiyun }
613*4882a593Smuzhiyun
ctd_get_fid1_ctl(struct vpdma_ctd * ctd)614*4882a593Smuzhiyun static inline int ctd_get_fid1_ctl(struct vpdma_ctd *ctd)
615*4882a593Smuzhiyun {
616*4882a593Smuzhiyun return (ctd->fid_ctl >> CTD_FID1_SHFT) & CTD_FID1_MASK;
617*4882a593Smuzhiyun }
618*4882a593Smuzhiyun
ctd_get_fid0_ctl(struct vpdma_ctd * ctd)619*4882a593Smuzhiyun static inline int ctd_get_fid0_ctl(struct vpdma_ctd *ctd)
620*4882a593Smuzhiyun {
621*4882a593Smuzhiyun return ctd->fid_ctl & CTD_FID2_MASK;
622*4882a593Smuzhiyun }
623*4882a593Smuzhiyun
ctd_get_pkt_type(struct vpdma_ctd * ctd)624*4882a593Smuzhiyun static inline int ctd_get_pkt_type(struct vpdma_ctd *ctd)
625*4882a593Smuzhiyun {
626*4882a593Smuzhiyun return ctd->type_source_ctl >> CTD_PKT_TYPE_SHFT;
627*4882a593Smuzhiyun }
628*4882a593Smuzhiyun
ctd_get_source(struct vpdma_ctd * ctd)629*4882a593Smuzhiyun static inline int ctd_get_source(struct vpdma_ctd *ctd)
630*4882a593Smuzhiyun {
631*4882a593Smuzhiyun return (ctd->type_source_ctl >> CTD_SOURCE_SHFT) & CTD_SOURCE_MASK;
632*4882a593Smuzhiyun }
633*4882a593Smuzhiyun
ctd_get_ctl(struct vpdma_ctd * ctd)634*4882a593Smuzhiyun static inline int ctd_get_ctl(struct vpdma_ctd *ctd)
635*4882a593Smuzhiyun {
636*4882a593Smuzhiyun return ctd->type_source_ctl & CTD_CONTROL_MASK;
637*4882a593Smuzhiyun }
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun #endif
640