/* SPDX-License-Identifier: GPL-2.0-only */ 
 | 
/* 
 | 
 * Copyright (c) 2013 Texas Instruments Inc. 
 | 
 * 
 | 
 * David Griego, <dagriego@biglakesoftware.com> 
 | 
 * Dale Farnsworth, <dale@farnsworth.org> 
 | 
 * Archit Taneja, <archit@ti.com> 
 | 
 */ 
 | 
  
 | 
#ifndef _TI_VPDMA_PRIV_H_ 
 | 
#define _TI_VPDMA_PRIV_H_ 
 | 
  
 | 
/* 
 | 
 * VPDMA Register offsets 
 | 
 */ 
 | 
  
 | 
/* Top level */ 
 | 
#define VPDMA_PID        0x00 
 | 
#define VPDMA_LIST_ADDR        0x04 
 | 
#define VPDMA_LIST_ATTR        0x08 
 | 
#define VPDMA_LIST_STAT_SYNC    0x0c 
 | 
#define VPDMA_BG_RGB        0x18 
 | 
#define VPDMA_BG_YUV        0x1c 
 | 
#define VPDMA_SETUP        0x30 
 | 
#define VPDMA_MAX_SIZE1        0x34 
 | 
#define VPDMA_MAX_SIZE2        0x38 
 | 
#define VPDMA_MAX_SIZE3        0x3c 
 | 
#define VPDMA_MAX_SIZE_WIDTH_MASK    0xffff 
 | 
#define VPDMA_MAX_SIZE_WIDTH_SHFT    16 
 | 
#define VPDMA_MAX_SIZE_HEIGHT_MASK    0xffff 
 | 
#define VPDMA_MAX_SIZE_HEIGHT_SHFT    0 
 | 
  
 | 
/* Interrupts */ 
 | 
#define VPDMA_INT_CHAN_STAT(grp)    (0x40 + grp * 8) 
 | 
#define VPDMA_INT_CHAN_MASK(grp)    (VPDMA_INT_CHAN_STAT(grp) + 4) 
 | 
#define VPDMA_INT_CLIENT0_STAT        0x78 
 | 
#define VPDMA_INT_CLIENT0_MASK        0x7c 
 | 
#define VPDMA_INT_CLIENT1_STAT        0x80 
 | 
#define VPDMA_INT_CLIENT1_MASK        0x84 
 | 
#define VPDMA_INT_LIST0_STAT        0x88 
 | 
#define VPDMA_INT_LIST0_MASK        0x8c 
 | 
  
 | 
#define VPDMA_INTX_OFFSET        0x50 
 | 
  
 | 
#define VPDMA_PERFMON(i)        (0x200 + i * 4) 
 | 
  
 | 
/* VIP/VPE client registers */ 
 | 
#define VPDMA_DEI_CHROMA1_CSTAT        0x0300 
 | 
#define VPDMA_DEI_LUMA1_CSTAT        0x0304 
 | 
#define VPDMA_DEI_LUMA2_CSTAT        0x0308 
 | 
#define VPDMA_DEI_CHROMA2_CSTAT        0x030c 
 | 
#define VPDMA_DEI_LUMA3_CSTAT        0x0310 
 | 
#define VPDMA_DEI_CHROMA3_CSTAT        0x0314 
 | 
#define VPDMA_DEI_MV_IN_CSTAT        0x0330 
 | 
#define VPDMA_DEI_MV_OUT_CSTAT        0x033c 
 | 
#define VPDMA_VIP_LO_Y_CSTAT        0x0388 
 | 
#define VPDMA_VIP_LO_UV_CSTAT        0x038c 
 | 
#define VPDMA_VIP_UP_Y_CSTAT        0x0390 
 | 
#define VPDMA_VIP_UP_UV_CSTAT        0x0394 
 | 
#define VPDMA_VPI_CTL_CSTAT        0x03d0 
 | 
  
 | 
/* Reg field info for VPDMA_CLIENT_CSTAT registers */ 
 | 
#define VPDMA_CSTAT_LINE_MODE_MASK    0x03 
 | 
#define VPDMA_CSTAT_LINE_MODE_SHIFT    8 
 | 
#define VPDMA_CSTAT_FRAME_START_MASK    0xf 
 | 
#define VPDMA_CSTAT_FRAME_START_SHIFT    10 
 | 
  
 | 
#define VPDMA_LIST_NUM_MASK        0x07 
 | 
#define VPDMA_LIST_NUM_SHFT        24 
 | 
#define VPDMA_LIST_STOP_SHFT        20 
 | 
#define VPDMA_LIST_RDY_MASK        0x01 
 | 
#define VPDMA_LIST_RDY_SHFT        19 
 | 
#define VPDMA_LIST_TYPE_MASK        0x03 
 | 
#define VPDMA_LIST_TYPE_SHFT        16 
 | 
#define VPDMA_LIST_SIZE_MASK        0xffff 
 | 
  
 | 
/* 
 | 
 * The YUV data type definition below are taken from 
 | 
 * both the TRM and i839 Errata information. 
 | 
 * Use the correct data type considering byte 
 | 
 * reordering of components. 
 | 
 * 
 | 
 * Also since the single use of "C" in the 422 case 
 | 
 * to mean "Cr" (i.e. V component). It was decided 
 | 
 * to explicitly label them CR to remove any confusion. 
 | 
 * Bear in mind that the type label refer to the memory 
 | 
 * packed order (LSB - MSB). 
 | 
 */ 
 | 
#define DATA_TYPE_Y444                0x0 
 | 
#define DATA_TYPE_Y422                0x1 
 | 
#define DATA_TYPE_Y420                0x2 
 | 
#define DATA_TYPE_C444                0x4 
 | 
#define DATA_TYPE_C422                0x5 
 | 
#define DATA_TYPE_C420                0x6 
 | 
#define DATA_TYPE_CB420                0x16 
 | 
#define DATA_TYPE_YC444                0x8 
 | 
#define DATA_TYPE_YCB422            0x7 
 | 
#define DATA_TYPE_YCR422            0x17 
 | 
#define DATA_TYPE_CBY422            0x27 
 | 
#define DATA_TYPE_CRY422            0x37 
 | 
  
 | 
/* 
 | 
 * The RGB data type definition below are defined 
 | 
 * to follow Errata i819. 
 | 
 * The initial values were taken from: 
 | 
 * VPDMA_data_type_mapping_v0.2vayu_c.pdf 
 | 
 * But some of the ARGB definition appeared to be wrong 
 | 
 * in the document also. As they would yield RGBA instead. 
 | 
 * They have been corrected based on experimentation. 
 | 
 */ 
 | 
#define DATA_TYPE_RGB16_565            0x10 
 | 
#define DATA_TYPE_ARGB_1555            0x13 
 | 
#define DATA_TYPE_ARGB_4444            0x14 
 | 
#define DATA_TYPE_RGBA_5551            0x11 
 | 
#define DATA_TYPE_RGBA_4444            0x12 
 | 
#define DATA_TYPE_ARGB24_6666            0x18 
 | 
#define DATA_TYPE_RGB24_888            0x16 
 | 
#define DATA_TYPE_ARGB32_8888            0x17 
 | 
#define DATA_TYPE_RGBA24_6666            0x15 
 | 
#define DATA_TYPE_RGBA32_8888            0x19 
 | 
#define DATA_TYPE_BGR16_565            0x0 
 | 
#define DATA_TYPE_ABGR_1555            0x3 
 | 
#define DATA_TYPE_ABGR_4444            0x4 
 | 
#define DATA_TYPE_BGRA_5551            0x1 
 | 
#define DATA_TYPE_BGRA_4444            0x2 
 | 
#define DATA_TYPE_ABGR24_6666            0x8 
 | 
#define DATA_TYPE_BGR24_888            0x6 
 | 
#define DATA_TYPE_ABGR32_8888            0x7 
 | 
#define DATA_TYPE_BGRA24_6666            0x5 
 | 
#define DATA_TYPE_BGRA32_8888            0x9 
 | 
  
 | 
#define DATA_TYPE_MV                0x3 
 | 
  
 | 
/* VPDMA channel numbers, some are common between VIP/VPE and appear twice */ 
 | 
#define    VPE_CHAN_NUM_LUMA1_IN        0 
 | 
#define    VPE_CHAN_NUM_CHROMA1_IN        1 
 | 
#define    VPE_CHAN_NUM_LUMA2_IN        2 
 | 
#define    VPE_CHAN_NUM_CHROMA2_IN        3 
 | 
#define    VPE_CHAN_NUM_LUMA3_IN        4 
 | 
#define    VPE_CHAN_NUM_CHROMA3_IN        5 
 | 
#define    VPE_CHAN_NUM_MV_IN        12 
 | 
#define    VPE_CHAN_NUM_MV_OUT        15 
 | 
#define VIP1_CHAN_NUM_MULT_PORT_A_SRC0    38 
 | 
#define VIP1_CHAN_NUM_MULT_ANC_A_SRC0    70 
 | 
#define    VPE_CHAN_NUM_LUMA_OUT        102 
 | 
#define    VPE_CHAN_NUM_CHROMA_OUT        103 
 | 
#define VIP1_CHAN_NUM_PORT_A_LUMA    102 
 | 
#define VIP1_CHAN_NUM_PORT_A_CHROMA    103 
 | 
#define    VPE_CHAN_NUM_RGB_OUT        106 
 | 
#define VIP1_CHAN_NUM_PORT_A_RGB    106 
 | 
#define VIP1_CHAN_NUM_PORT_B_RGB    107 
 | 
/* 
 | 
 * a VPDMA address data block payload for a configuration descriptor needs to 
 | 
 * have each sub block length as a multiple of 16 bytes. Therefore, the overall 
 | 
 * size of the payload also needs to be a multiple of 16 bytes. The sub block 
 | 
 * lengths should be ensured to be aligned by the VPDMA user. 
 | 
 */ 
 | 
#define VPDMA_ADB_SIZE_ALIGN        0x0f 
 | 
  
 | 
/* 
 | 
 * data transfer descriptor 
 | 
 */ 
 | 
struct vpdma_dtd { 
 | 
    u32            type_ctl_stride; 
 | 
    union { 
 | 
        u32        xfer_length_height; 
 | 
        u32        w1; 
 | 
    }; 
 | 
    u32            start_addr; 
 | 
    u32            pkt_ctl; 
 | 
    union { 
 | 
        u32        frame_width_height;    /* inbound */ 
 | 
        u32        desc_write_addr;    /* outbound */ 
 | 
    }; 
 | 
    union { 
 | 
        u32        start_h_v;        /* inbound */ 
 | 
        u32        max_width_height;    /* outbound */ 
 | 
    }; 
 | 
    u32            client_attr0; 
 | 
    u32            client_attr1; 
 | 
}; 
 | 
  
 | 
/* Data Transfer Descriptor specifics */ 
 | 
#define DTD_NO_NOTIFY        0 
 | 
#define DTD_NOTIFY        1 
 | 
  
 | 
#define DTD_PKT_TYPE        0xa 
 | 
#define DTD_DIR_IN        0 
 | 
#define DTD_DIR_OUT        1 
 | 
  
 | 
/* type_ctl_stride */ 
 | 
#define DTD_DATA_TYPE_MASK    0x3f 
 | 
#define DTD_DATA_TYPE_SHFT    26 
 | 
#define DTD_NOTIFY_MASK        0x01 
 | 
#define DTD_NOTIFY_SHFT        25 
 | 
#define DTD_FIELD_MASK        0x01 
 | 
#define DTD_FIELD_SHFT        24 
 | 
#define DTD_1D_MASK        0x01 
 | 
#define DTD_1D_SHFT        23 
 | 
#define DTD_EVEN_LINE_SKIP_MASK    0x01 
 | 
#define DTD_EVEN_LINE_SKIP_SHFT    20 
 | 
#define DTD_ODD_LINE_SKIP_MASK    0x01 
 | 
#define DTD_ODD_LINE_SKIP_SHFT    16 
 | 
#define DTD_LINE_STRIDE_MASK    0xffff 
 | 
#define DTD_LINE_STRIDE_SHFT    0 
 | 
  
 | 
/* xfer_length_height */ 
 | 
#define DTD_LINE_LENGTH_MASK    0xffff 
 | 
#define DTD_LINE_LENGTH_SHFT    16 
 | 
#define DTD_XFER_HEIGHT_MASK    0xffff 
 | 
#define DTD_XFER_HEIGHT_SHFT    0 
 | 
  
 | 
/* pkt_ctl */ 
 | 
#define DTD_PKT_TYPE_MASK    0x1f 
 | 
#define DTD_PKT_TYPE_SHFT    27 
 | 
#define DTD_MODE_MASK        0x01 
 | 
#define DTD_MODE_SHFT        26 
 | 
#define DTD_DIR_MASK        0x01 
 | 
#define DTD_DIR_SHFT        25 
 | 
#define DTD_CHAN_MASK        0x01ff 
 | 
#define DTD_CHAN_SHFT        16 
 | 
#define DTD_PRI_MASK        0x0f 
 | 
#define DTD_PRI_SHFT        9 
 | 
#define DTD_NEXT_CHAN_MASK    0x01ff 
 | 
#define DTD_NEXT_CHAN_SHFT    0 
 | 
  
 | 
/* frame_width_height */ 
 | 
#define DTD_FRAME_WIDTH_MASK    0xffff 
 | 
#define DTD_FRAME_WIDTH_SHFT    16 
 | 
#define DTD_FRAME_HEIGHT_MASK    0xffff 
 | 
#define DTD_FRAME_HEIGHT_SHFT    0 
 | 
  
 | 
/* start_h_v */ 
 | 
#define DTD_H_START_MASK    0xffff 
 | 
#define DTD_H_START_SHFT    16 
 | 
#define DTD_V_START_MASK    0xffff 
 | 
#define DTD_V_START_SHFT    0 
 | 
  
 | 
#define DTD_DESC_START_MASK    0xffffffe0 
 | 
#define DTD_DESC_START_SHIFT    5 
 | 
#define DTD_WRITE_DESC_MASK    0x01 
 | 
#define DTD_WRITE_DESC_SHIFT    2 
 | 
#define DTD_DROP_DATA_MASK    0x01 
 | 
#define DTD_DROP_DATA_SHIFT    1 
 | 
#define DTD_USE_DESC_MASK    0x01 
 | 
#define DTD_USE_DESC_SHIFT    0 
 | 
  
 | 
/* max_width_height */ 
 | 
#define DTD_MAX_WIDTH_MASK    0x07 
 | 
#define DTD_MAX_WIDTH_SHFT    4 
 | 
#define DTD_MAX_HEIGHT_MASK    0x07 
 | 
#define DTD_MAX_HEIGHT_SHFT    0 
 | 
  
 | 
static inline u32 dtd_type_ctl_stride(int type, bool notify, int field, 
 | 
            bool one_d, bool even_line_skip, bool odd_line_skip, 
 | 
            int line_stride) 
 | 
{ 
 | 
    return (type << DTD_DATA_TYPE_SHFT) | (notify << DTD_NOTIFY_SHFT) | 
 | 
        (field << DTD_FIELD_SHFT) | (one_d << DTD_1D_SHFT) | 
 | 
        (even_line_skip << DTD_EVEN_LINE_SKIP_SHFT) | 
 | 
        (odd_line_skip << DTD_ODD_LINE_SKIP_SHFT) | 
 | 
        line_stride; 
 | 
} 
 | 
  
 | 
static inline u32 dtd_xfer_length_height(int line_length, int xfer_height) 
 | 
{ 
 | 
    return (line_length << DTD_LINE_LENGTH_SHFT) | xfer_height; 
 | 
} 
 | 
  
 | 
static inline u32 dtd_pkt_ctl(bool mode, bool dir, int chan, int pri, 
 | 
            int next_chan) 
 | 
{ 
 | 
    return (DTD_PKT_TYPE << DTD_PKT_TYPE_SHFT) | (mode << DTD_MODE_SHFT) | 
 | 
        (dir << DTD_DIR_SHFT) | (chan << DTD_CHAN_SHFT) | 
 | 
        (pri << DTD_PRI_SHFT) | next_chan; 
 | 
} 
 | 
  
 | 
static inline u32 dtd_frame_width_height(int width, int height) 
 | 
{ 
 | 
    return (width << DTD_FRAME_WIDTH_SHFT) | height; 
 | 
} 
 | 
  
 | 
static inline u32 dtd_desc_write_addr(unsigned int addr, bool write_desc, 
 | 
            bool drop_data, bool use_desc) 
 | 
{ 
 | 
    return (addr & DTD_DESC_START_MASK) | 
 | 
        (write_desc << DTD_WRITE_DESC_SHIFT) | 
 | 
        (drop_data << DTD_DROP_DATA_SHIFT) | 
 | 
        use_desc; 
 | 
} 
 | 
  
 | 
static inline u32 dtd_start_h_v(int h_start, int v_start) 
 | 
{ 
 | 
    return (h_start << DTD_H_START_SHFT) | v_start; 
 | 
} 
 | 
  
 | 
static inline u32 dtd_max_width_height(int max_width, int max_height) 
 | 
{ 
 | 
    return (max_width << DTD_MAX_WIDTH_SHFT) | max_height; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_data_type(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return dtd->type_ctl_stride >> DTD_DATA_TYPE_SHFT; 
 | 
} 
 | 
  
 | 
static inline bool dtd_get_notify(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->type_ctl_stride >> DTD_NOTIFY_SHFT) & DTD_NOTIFY_MASK; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_field(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->type_ctl_stride >> DTD_FIELD_SHFT) & DTD_FIELD_MASK; 
 | 
} 
 | 
  
 | 
static inline bool dtd_get_1d(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->type_ctl_stride >> DTD_1D_SHFT) & DTD_1D_MASK; 
 | 
} 
 | 
  
 | 
static inline bool dtd_get_even_line_skip(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->type_ctl_stride >> DTD_EVEN_LINE_SKIP_SHFT) 
 | 
        & DTD_EVEN_LINE_SKIP_MASK; 
 | 
} 
 | 
  
 | 
static inline bool dtd_get_odd_line_skip(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->type_ctl_stride >> DTD_ODD_LINE_SKIP_SHFT) 
 | 
        & DTD_ODD_LINE_SKIP_MASK; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_line_stride(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return dtd->type_ctl_stride & DTD_LINE_STRIDE_MASK; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_line_length(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return dtd->xfer_length_height >> DTD_LINE_LENGTH_SHFT; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_xfer_height(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return dtd->xfer_length_height & DTD_XFER_HEIGHT_MASK; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_pkt_type(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return dtd->pkt_ctl >> DTD_PKT_TYPE_SHFT; 
 | 
} 
 | 
  
 | 
static inline bool dtd_get_mode(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->pkt_ctl >> DTD_MODE_SHFT) & DTD_MODE_MASK; 
 | 
} 
 | 
  
 | 
static inline bool dtd_get_dir(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->pkt_ctl >> DTD_DIR_SHFT) & DTD_DIR_MASK; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_chan(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->pkt_ctl >> DTD_CHAN_SHFT) & DTD_CHAN_MASK; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_priority(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->pkt_ctl >> DTD_PRI_SHFT) & DTD_PRI_MASK; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_next_chan(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->pkt_ctl >> DTD_NEXT_CHAN_SHFT) & DTD_NEXT_CHAN_MASK; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_frame_width(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return dtd->frame_width_height >> DTD_FRAME_WIDTH_SHFT; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_frame_height(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return dtd->frame_width_height & DTD_FRAME_HEIGHT_MASK; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_desc_write_addr(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return dtd->desc_write_addr & DTD_DESC_START_MASK; 
 | 
} 
 | 
  
 | 
static inline bool dtd_get_write_desc(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->desc_write_addr >> DTD_WRITE_DESC_SHIFT) & 
 | 
                            DTD_WRITE_DESC_MASK; 
 | 
} 
 | 
  
 | 
static inline bool dtd_get_drop_data(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->desc_write_addr >> DTD_DROP_DATA_SHIFT) & 
 | 
                            DTD_DROP_DATA_MASK; 
 | 
} 
 | 
  
 | 
static inline bool dtd_get_use_desc(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return dtd->desc_write_addr & DTD_USE_DESC_MASK; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_h_start(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return dtd->start_h_v >> DTD_H_START_SHFT; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_v_start(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return dtd->start_h_v & DTD_V_START_MASK; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_max_width(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->max_width_height >> DTD_MAX_WIDTH_SHFT) & 
 | 
                            DTD_MAX_WIDTH_MASK; 
 | 
} 
 | 
  
 | 
static inline int dtd_get_max_height(struct vpdma_dtd *dtd) 
 | 
{ 
 | 
    return (dtd->max_width_height >> DTD_MAX_HEIGHT_SHFT) & 
 | 
                            DTD_MAX_HEIGHT_MASK; 
 | 
} 
 | 
  
 | 
/* 
 | 
 * configuration descriptor 
 | 
 */ 
 | 
struct vpdma_cfd { 
 | 
    union { 
 | 
        u32    dest_addr_offset; 
 | 
        u32    w0; 
 | 
    }; 
 | 
    union { 
 | 
        u32    block_len;        /* in words */ 
 | 
        u32    w1; 
 | 
    }; 
 | 
    u32        payload_addr; 
 | 
    u32        ctl_payload_len;    /* in words */ 
 | 
}; 
 | 
  
 | 
/* Configuration descriptor specifics */ 
 | 
  
 | 
#define CFD_PKT_TYPE        0xb 
 | 
  
 | 
#define CFD_DIRECT        1 
 | 
#define CFD_INDIRECT        0 
 | 
#define CFD_CLS_ADB        0 
 | 
#define CFD_CLS_BLOCK        1 
 | 
  
 | 
/* block_len */ 
 | 
#define CFD__BLOCK_LEN_MASK    0xffff 
 | 
#define CFD__BLOCK_LEN_SHFT    0 
 | 
  
 | 
/* ctl_payload_len */ 
 | 
#define CFD_PKT_TYPE_MASK    0x1f 
 | 
#define CFD_PKT_TYPE_SHFT    27 
 | 
#define CFD_DIRECT_MASK        0x01 
 | 
#define CFD_DIRECT_SHFT        26 
 | 
#define CFD_CLASS_MASK        0x03 
 | 
#define CFD_CLASS_SHFT        24 
 | 
#define CFD_DEST_MASK        0xff 
 | 
#define CFD_DEST_SHFT        16 
 | 
#define CFD_PAYLOAD_LEN_MASK    0xffff 
 | 
#define CFD_PAYLOAD_LEN_SHFT    0 
 | 
  
 | 
static inline u32 cfd_pkt_payload_len(bool direct, int cls, int dest, 
 | 
        int payload_len) 
 | 
{ 
 | 
    return (CFD_PKT_TYPE << CFD_PKT_TYPE_SHFT) | 
 | 
        (direct << CFD_DIRECT_SHFT) | 
 | 
        (cls << CFD_CLASS_SHFT) | 
 | 
        (dest << CFD_DEST_SHFT) | 
 | 
        payload_len; 
 | 
} 
 | 
  
 | 
static inline int cfd_get_pkt_type(struct vpdma_cfd *cfd) 
 | 
{ 
 | 
    return cfd->ctl_payload_len >> CFD_PKT_TYPE_SHFT; 
 | 
} 
 | 
  
 | 
static inline bool cfd_get_direct(struct vpdma_cfd *cfd) 
 | 
{ 
 | 
    return (cfd->ctl_payload_len >> CFD_DIRECT_SHFT) & CFD_DIRECT_MASK; 
 | 
} 
 | 
  
 | 
static inline bool cfd_get_class(struct vpdma_cfd *cfd) 
 | 
{ 
 | 
    return (cfd->ctl_payload_len >> CFD_CLASS_SHFT) & CFD_CLASS_MASK; 
 | 
} 
 | 
  
 | 
static inline int cfd_get_dest(struct vpdma_cfd *cfd) 
 | 
{ 
 | 
    return (cfd->ctl_payload_len >> CFD_DEST_SHFT) & CFD_DEST_MASK; 
 | 
} 
 | 
  
 | 
static inline int cfd_get_payload_len(struct vpdma_cfd *cfd) 
 | 
{ 
 | 
    return cfd->ctl_payload_len & CFD_PAYLOAD_LEN_MASK; 
 | 
} 
 | 
  
 | 
/* 
 | 
 * control descriptor 
 | 
 */ 
 | 
struct vpdma_ctd { 
 | 
    union { 
 | 
        u32    timer_value; 
 | 
        u32    list_addr; 
 | 
        u32    w0; 
 | 
    }; 
 | 
    union { 
 | 
        u32    pixel_line_count; 
 | 
        u32    list_size; 
 | 
        u32    w1; 
 | 
    }; 
 | 
    union { 
 | 
        u32    event; 
 | 
        u32    fid_ctl; 
 | 
        u32    w2; 
 | 
    }; 
 | 
    u32        type_source_ctl; 
 | 
}; 
 | 
  
 | 
/* control descriptor types */ 
 | 
#define CTD_TYPE_SYNC_ON_CLIENT        0 
 | 
#define CTD_TYPE_SYNC_ON_LIST        1 
 | 
#define CTD_TYPE_SYNC_ON_EXT        2 
 | 
#define CTD_TYPE_SYNC_ON_LM_TIMER    3 
 | 
#define CTD_TYPE_SYNC_ON_CHANNEL    4 
 | 
#define CTD_TYPE_CHNG_CLIENT_IRQ    5 
 | 
#define CTD_TYPE_SEND_IRQ        6 
 | 
#define CTD_TYPE_RELOAD_LIST        7 
 | 
#define CTD_TYPE_ABORT_CHANNEL        8 
 | 
  
 | 
#define CTD_PKT_TYPE        0xc 
 | 
  
 | 
/* timer_value */ 
 | 
#define CTD_TIMER_VALUE_MASK    0xffff 
 | 
#define CTD_TIMER_VALUE_SHFT    0 
 | 
  
 | 
/* pixel_line_count */ 
 | 
#define CTD_PIXEL_COUNT_MASK    0xffff 
 | 
#define CTD_PIXEL_COUNT_SHFT    16 
 | 
#define CTD_LINE_COUNT_MASK    0xffff 
 | 
#define CTD_LINE_COUNT_SHFT    0 
 | 
  
 | 
/* list_size */ 
 | 
#define CTD_LIST_SIZE_MASK    0xffff 
 | 
#define CTD_LIST_SIZE_SHFT    0 
 | 
  
 | 
/* event */ 
 | 
#define CTD_EVENT_MASK        0x0f 
 | 
#define CTD_EVENT_SHFT        0 
 | 
  
 | 
/* fid_ctl */ 
 | 
#define CTD_FID2_MASK        0x03 
 | 
#define CTD_FID2_SHFT        4 
 | 
#define CTD_FID1_MASK        0x03 
 | 
#define CTD_FID1_SHFT        2 
 | 
#define CTD_FID0_MASK        0x03 
 | 
#define CTD_FID0_SHFT        0 
 | 
  
 | 
/* type_source_ctl */ 
 | 
#define CTD_PKT_TYPE_MASK    0x1f 
 | 
#define CTD_PKT_TYPE_SHFT    27 
 | 
#define CTD_SOURCE_MASK        0xff 
 | 
#define CTD_SOURCE_SHFT        16 
 | 
#define CTD_CONTROL_MASK    0x0f 
 | 
#define CTD_CONTROL_SHFT    0 
 | 
  
 | 
static inline u32 ctd_pixel_line_count(int pixel_count, int line_count) 
 | 
{ 
 | 
    return (pixel_count << CTD_PIXEL_COUNT_SHFT) | line_count; 
 | 
} 
 | 
  
 | 
static inline u32 ctd_set_fid_ctl(int fid0, int fid1, int fid2) 
 | 
{ 
 | 
    return (fid2 << CTD_FID2_SHFT) | (fid1 << CTD_FID1_SHFT) | fid0; 
 | 
} 
 | 
  
 | 
static inline u32 ctd_type_source_ctl(int source, int control) 
 | 
{ 
 | 
    return (CTD_PKT_TYPE << CTD_PKT_TYPE_SHFT) | 
 | 
        (source << CTD_SOURCE_SHFT) | control; 
 | 
} 
 | 
  
 | 
static inline u32 ctd_get_pixel_count(struct vpdma_ctd *ctd) 
 | 
{ 
 | 
    return ctd->pixel_line_count >> CTD_PIXEL_COUNT_SHFT; 
 | 
} 
 | 
  
 | 
static inline int ctd_get_line_count(struct vpdma_ctd *ctd) 
 | 
{ 
 | 
    return ctd->pixel_line_count & CTD_LINE_COUNT_MASK; 
 | 
} 
 | 
  
 | 
static inline int ctd_get_event(struct vpdma_ctd *ctd) 
 | 
{ 
 | 
    return ctd->event & CTD_EVENT_MASK; 
 | 
} 
 | 
  
 | 
static inline int ctd_get_fid2_ctl(struct vpdma_ctd *ctd) 
 | 
{ 
 | 
    return (ctd->fid_ctl >> CTD_FID2_SHFT) & CTD_FID2_MASK; 
 | 
} 
 | 
  
 | 
static inline int ctd_get_fid1_ctl(struct vpdma_ctd *ctd) 
 | 
{ 
 | 
    return (ctd->fid_ctl >> CTD_FID1_SHFT) & CTD_FID1_MASK; 
 | 
} 
 | 
  
 | 
static inline int ctd_get_fid0_ctl(struct vpdma_ctd *ctd) 
 | 
{ 
 | 
    return ctd->fid_ctl & CTD_FID2_MASK; 
 | 
} 
 | 
  
 | 
static inline int ctd_get_pkt_type(struct vpdma_ctd *ctd) 
 | 
{ 
 | 
    return ctd->type_source_ctl >> CTD_PKT_TYPE_SHFT; 
 | 
} 
 | 
  
 | 
static inline int ctd_get_source(struct vpdma_ctd *ctd) 
 | 
{ 
 | 
    return (ctd->type_source_ctl >> CTD_SOURCE_SHFT) & CTD_SOURCE_MASK; 
 | 
} 
 | 
  
 | 
static inline int ctd_get_ctl(struct vpdma_ctd *ctd) 
 | 
{ 
 | 
    return ctd->type_source_ctl & CTD_CONTROL_MASK; 
 | 
} 
 | 
  
 | 
#endif 
 |