mirror of
https://github.com/torvalds/linux.git
synced 2024-12-23 11:21:33 +00:00
63728b1cab
Using dma_addr_t as the type to hold address inside of a fix sized descriptor used by the vpdma firmware is prone to fail when the expected width is 32 bits and suddenly when CONFIG_LPAE is enabled the data size is now 64 bits shifted the remaining members of the descriptor in memory which confuses the firmware. Signed-off-by: Benoit Parrot <bparrot@ti.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
640 lines
16 KiB
C
640 lines
16 KiB
C
/* 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
|