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