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