linux/drivers/media/platform/ti-vpe/vpdma_priv.h
<<
>>
Prefs
   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 */
 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;     /* 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
 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 * configuration descriptor
 437 */
 438struct 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
 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 * control descriptor
 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/* 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
 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