1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef _TI_VPDMA_PRIV_H_
14#define _TI_VPDMA_PRIV_H_
15
16
17
18
19
20
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
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
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
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
82
83
84
85
86
87
88
89
90
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
106
107
108
109
110
111
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
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
156
157
158
159
160#define VPDMA_ADB_SIZE_ALIGN 0x0f
161
162
163
164
165struct 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;
175 dma_addr_t desc_write_addr;
176 };
177 union {
178 u32 start_h_v;
179 u32 max_width_height;
180 };
181 u32 client_attr0;
182 u32 client_attr1;
183};
184
185
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
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
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
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
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
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
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
256static 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
267static 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
272static 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
280static inline u32 dtd_frame_width_height(int width, int height)
281{
282 return (width << DTD_FRAME_WIDTH_SHFT) | height;
283}
284
285static 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
294static 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
299static 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
304static inline int dtd_get_data_type(struct vpdma_dtd *dtd)
305{
306 return dtd->type_ctl_stride >> DTD_DATA_TYPE_SHFT;
307}
308
309static inline bool dtd_get_notify(struct vpdma_dtd *dtd)
310{
311 return (dtd->type_ctl_stride >> DTD_NOTIFY_SHFT) & DTD_NOTIFY_MASK;
312}
313
314static inline int dtd_get_field(struct vpdma_dtd *dtd)
315{
316 return (dtd->type_ctl_stride >> DTD_FIELD_SHFT) & DTD_FIELD_MASK;
317}
318
319static inline bool dtd_get_1d(struct vpdma_dtd *dtd)
320{
321 return (dtd->type_ctl_stride >> DTD_1D_SHFT) & DTD_1D_MASK;
322}
323
324static 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
330static 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
336static inline int dtd_get_line_stride(struct vpdma_dtd *dtd)
337{
338 return dtd->type_ctl_stride & DTD_LINE_STRIDE_MASK;
339}
340
341static inline int dtd_get_line_length(struct vpdma_dtd *dtd)
342{
343 return dtd->xfer_length_height >> DTD_LINE_LENGTH_SHFT;
344}
345
346static inline int dtd_get_xfer_height(struct vpdma_dtd *dtd)
347{
348 return dtd->xfer_length_height & DTD_XFER_HEIGHT_MASK;
349}
350
351static inline int dtd_get_pkt_type(struct vpdma_dtd *dtd)
352{
353 return dtd->pkt_ctl >> DTD_PKT_TYPE_SHFT;
354}
355
356static inline bool dtd_get_mode(struct vpdma_dtd *dtd)
357{
358 return (dtd->pkt_ctl >> DTD_MODE_SHFT) & DTD_MODE_MASK;
359}
360
361static inline bool dtd_get_dir(struct vpdma_dtd *dtd)
362{
363 return (dtd->pkt_ctl >> DTD_DIR_SHFT) & DTD_DIR_MASK;
364}
365
366static inline int dtd_get_chan(struct vpdma_dtd *dtd)
367{
368 return (dtd->pkt_ctl >> DTD_CHAN_SHFT) & DTD_CHAN_MASK;
369}
370
371static inline int dtd_get_priority(struct vpdma_dtd *dtd)
372{
373 return (dtd->pkt_ctl >> DTD_PRI_SHFT) & DTD_PRI_MASK;
374}
375
376static 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
381static inline int dtd_get_frame_width(struct vpdma_dtd *dtd)
382{
383 return dtd->frame_width_height >> DTD_FRAME_WIDTH_SHFT;
384}
385
386static inline int dtd_get_frame_height(struct vpdma_dtd *dtd)
387{
388 return dtd->frame_width_height & DTD_FRAME_HEIGHT_MASK;
389}
390
391static inline int dtd_get_desc_write_addr(struct vpdma_dtd *dtd)
392{
393 return dtd->desc_write_addr & DTD_DESC_START_MASK;
394}
395
396static 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
402static 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
408static inline bool dtd_get_use_desc(struct vpdma_dtd *dtd)
409{
410 return dtd->desc_write_addr & DTD_USE_DESC_MASK;
411}
412
413static inline int dtd_get_h_start(struct vpdma_dtd *dtd)
414{
415 return dtd->start_h_v >> DTD_H_START_SHFT;
416}
417
418static inline int dtd_get_v_start(struct vpdma_dtd *dtd)
419{
420 return dtd->start_h_v & DTD_V_START_MASK;
421}
422
423static 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
429static 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
437
438struct vpdma_cfd {
439 union {
440 u32 dest_addr_offset;
441 u32 w0;
442 };
443 union {
444 u32 block_len;
445 u32 w1;
446 };
447 u32 payload_addr;
448 u32 ctl_payload_len;
449};
450
451
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
461#define CFD__BLOCK_LEN_MASK 0xffff
462#define CFD__BLOCK_LEN_SHFT 0
463
464
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
476static 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
486static inline int cfd_get_pkt_type(struct vpdma_cfd *cfd)
487{
488 return cfd->ctl_payload_len >> CFD_PKT_TYPE_SHFT;
489}
490
491static inline bool cfd_get_direct(struct vpdma_cfd *cfd)
492{
493 return (cfd->ctl_payload_len >> CFD_DIRECT_SHFT) & CFD_DIRECT_MASK;
494}
495
496static inline bool cfd_get_class(struct vpdma_cfd *cfd)
497{
498 return (cfd->ctl_payload_len >> CFD_CLASS_SHFT) & CFD_CLASS_MASK;
499}
500
501static inline int cfd_get_dest(struct vpdma_cfd *cfd)
502{
503 return (cfd->ctl_payload_len >> CFD_DEST_SHFT) & CFD_DEST_MASK;
504}
505
506static 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
513
514struct 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
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
547#define CTD_TIMER_VALUE_MASK 0xffff
548#define CTD_TIMER_VALUE_SHFT 0
549
550
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
557#define CTD_LIST_SIZE_MASK 0xffff
558#define CTD_LIST_SIZE_SHFT 0
559
560
561#define CTD_EVENT_MASK 0x0f
562#define CTD_EVENT_SHFT 0
563
564
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
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
580static 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
585static 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
590static 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
596static inline u32 ctd_get_pixel_count(struct vpdma_ctd *ctd)
597{
598 return ctd->pixel_line_count >> CTD_PIXEL_COUNT_SHFT;
599}
600
601static inline int ctd_get_line_count(struct vpdma_ctd *ctd)
602{
603 return ctd->pixel_line_count & CTD_LINE_COUNT_MASK;
604}
605
606static inline int ctd_get_event(struct vpdma_ctd *ctd)
607{
608 return ctd->event & CTD_EVENT_MASK;
609}
610
611static inline int ctd_get_fid2_ctl(struct vpdma_ctd *ctd)
612{
613 return (ctd->fid_ctl >> CTD_FID2_SHFT) & CTD_FID2_MASK;
614}
615
616static inline int ctd_get_fid1_ctl(struct vpdma_ctd *ctd)
617{
618 return (ctd->fid_ctl >> CTD_FID1_SHFT) & CTD_FID1_MASK;
619}
620
621static inline int ctd_get_fid0_ctl(struct vpdma_ctd *ctd)
622{
623 return ctd->fid_ctl & CTD_FID2_MASK;
624}
625
626static inline int ctd_get_pkt_type(struct vpdma_ctd *ctd)
627{
628 return ctd->type_source_ctl >> CTD_PKT_TYPE_SHFT;
629}
630
631static inline int ctd_get_source(struct vpdma_ctd *ctd)
632{
633 return (ctd->type_source_ctl >> CTD_SOURCE_SHFT) & CTD_SOURCE_MASK;
634}
635
636static inline int ctd_get_ctl(struct vpdma_ctd *ctd)
637{
638 return ctd->type_source_ctl & CTD_CONTROL_MASK;
639}
640
641#endif
642