linux/drivers/media/platform/ti-vpe/vpdma.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_H_
  14#define __TI_VPDMA_H_
  15
  16/*
  17 * A vpdma_buf tracks the size, DMA address and mapping status of each
  18 * driver DMA area.
  19 */
  20struct vpdma_buf {
  21        void                    *addr;
  22        dma_addr_t              dma_addr;
  23        size_t                  size;
  24        bool                    mapped;
  25};
  26
  27struct vpdma_desc_list {
  28        struct vpdma_buf buf;
  29        void *next;
  30        int type;
  31};
  32
  33struct vpdma_data {
  34        void __iomem            *base;
  35
  36        struct platform_device  *pdev;
  37
  38        /* callback to VPE driver when the firmware is loaded */
  39        void (*cb)(struct platform_device *pdev);
  40};
  41
  42enum vpdma_data_format_type {
  43        VPDMA_DATA_FMT_TYPE_YUV,
  44        VPDMA_DATA_FMT_TYPE_RGB,
  45        VPDMA_DATA_FMT_TYPE_MISC,
  46};
  47
  48struct vpdma_data_format {
  49        enum vpdma_data_format_type type;
  50        int data_type;
  51        u8 depth;
  52};
  53
  54#define VPDMA_DESC_ALIGN                16      /* 16-byte descriptor alignment */
  55#define VPDMA_STRIDE_ALIGN              16      /*
  56                                                 * line stride of source and dest
  57                                                 * buffers should be 16 byte aligned
  58                                                 */
  59#define VPDMA_DTD_DESC_SIZE             32      /* 8 words */
  60#define VPDMA_CFD_CTD_DESC_SIZE         16      /* 4 words */
  61
  62#define VPDMA_LIST_TYPE_NORMAL          0
  63#define VPDMA_LIST_TYPE_SELF_MODIFYING  1
  64#define VPDMA_LIST_TYPE_DOORBELL        2
  65
  66enum vpdma_yuv_formats {
  67        VPDMA_DATA_FMT_Y444 = 0,
  68        VPDMA_DATA_FMT_Y422,
  69        VPDMA_DATA_FMT_Y420,
  70        VPDMA_DATA_FMT_C444,
  71        VPDMA_DATA_FMT_C422,
  72        VPDMA_DATA_FMT_C420,
  73        VPDMA_DATA_FMT_YC422,
  74        VPDMA_DATA_FMT_YC444,
  75        VPDMA_DATA_FMT_CY422,
  76};
  77
  78enum vpdma_rgb_formats {
  79        VPDMA_DATA_FMT_RGB565 = 0,
  80        VPDMA_DATA_FMT_ARGB16_1555,
  81        VPDMA_DATA_FMT_ARGB16,
  82        VPDMA_DATA_FMT_RGBA16_5551,
  83        VPDMA_DATA_FMT_RGBA16,
  84        VPDMA_DATA_FMT_ARGB24,
  85        VPDMA_DATA_FMT_RGB24,
  86        VPDMA_DATA_FMT_ARGB32,
  87        VPDMA_DATA_FMT_RGBA24,
  88        VPDMA_DATA_FMT_RGBA32,
  89        VPDMA_DATA_FMT_BGR565,
  90        VPDMA_DATA_FMT_ABGR16_1555,
  91        VPDMA_DATA_FMT_ABGR16,
  92        VPDMA_DATA_FMT_BGRA16_5551,
  93        VPDMA_DATA_FMT_BGRA16,
  94        VPDMA_DATA_FMT_ABGR24,
  95        VPDMA_DATA_FMT_BGR24,
  96        VPDMA_DATA_FMT_ABGR32,
  97        VPDMA_DATA_FMT_BGRA24,
  98        VPDMA_DATA_FMT_BGRA32,
  99};
 100
 101enum vpdma_misc_formats {
 102        VPDMA_DATA_FMT_MV = 0,
 103};
 104
 105extern const struct vpdma_data_format vpdma_yuv_fmts[];
 106extern const struct vpdma_data_format vpdma_rgb_fmts[];
 107extern const struct vpdma_data_format vpdma_misc_fmts[];
 108
 109enum vpdma_frame_start_event {
 110        VPDMA_FSEVENT_HDMI_FID = 0,
 111        VPDMA_FSEVENT_DVO2_FID,
 112        VPDMA_FSEVENT_HDCOMP_FID,
 113        VPDMA_FSEVENT_SD_FID,
 114        VPDMA_FSEVENT_LM_FID0,
 115        VPDMA_FSEVENT_LM_FID1,
 116        VPDMA_FSEVENT_LM_FID2,
 117        VPDMA_FSEVENT_CHANNEL_ACTIVE,
 118};
 119
 120/*
 121 * VPDMA channel numbers
 122 */
 123enum vpdma_channel {
 124        VPE_CHAN_LUMA1_IN,
 125        VPE_CHAN_CHROMA1_IN,
 126        VPE_CHAN_LUMA2_IN,
 127        VPE_CHAN_CHROMA2_IN,
 128        VPE_CHAN_LUMA3_IN,
 129        VPE_CHAN_CHROMA3_IN,
 130        VPE_CHAN_MV_IN,
 131        VPE_CHAN_MV_OUT,
 132        VPE_CHAN_LUMA_OUT,
 133        VPE_CHAN_CHROMA_OUT,
 134        VPE_CHAN_RGB_OUT,
 135};
 136
 137/* flags for VPDMA data descriptors */
 138#define VPDMA_DATA_ODD_LINE_SKIP        (1 << 0)
 139#define VPDMA_DATA_EVEN_LINE_SKIP       (1 << 1)
 140#define VPDMA_DATA_FRAME_1D             (1 << 2)
 141#define VPDMA_DATA_MODE_TILED           (1 << 3)
 142
 143/*
 144 * client identifiers used for configuration descriptors
 145 */
 146#define CFD_MMR_CLIENT          0
 147#define CFD_SC_CLIENT           4
 148
 149/* Address data block header format */
 150struct vpdma_adb_hdr {
 151        u32                     offset;
 152        u32                     nwords;
 153        u32                     reserved0;
 154        u32                     reserved1;
 155};
 156
 157/* helpers for creating ADB headers for config descriptors MMRs as client */
 158#define ADB_ADDR(dma_buf, str, fld)     ((dma_buf)->addr + offsetof(str, fld))
 159#define MMR_ADB_ADDR(buf, str, fld)     ADB_ADDR(&(buf), struct str, fld)
 160
 161#define VPDMA_SET_MMR_ADB_HDR(buf, str, hdr, regs, offset_a)    \
 162        do {                                                    \
 163                struct vpdma_adb_hdr *h;                        \
 164                struct str *adb = NULL;                         \
 165                h = MMR_ADB_ADDR(buf, str, hdr);                \
 166                h->offset = (offset_a);                         \
 167                h->nwords = sizeof(adb->regs) >> 2;             \
 168        } while (0)
 169
 170/* vpdma descriptor buffer allocation and management */
 171int vpdma_alloc_desc_buf(struct vpdma_buf *buf, size_t size);
 172void vpdma_free_desc_buf(struct vpdma_buf *buf);
 173int vpdma_map_desc_buf(struct vpdma_data *vpdma, struct vpdma_buf *buf);
 174void vpdma_unmap_desc_buf(struct vpdma_data *vpdma, struct vpdma_buf *buf);
 175
 176/* vpdma descriptor list funcs */
 177int vpdma_create_desc_list(struct vpdma_desc_list *list, size_t size, int type);
 178void vpdma_reset_desc_list(struct vpdma_desc_list *list);
 179void vpdma_free_desc_list(struct vpdma_desc_list *list);
 180int vpdma_submit_descs(struct vpdma_data *vpdma, struct vpdma_desc_list *list);
 181
 182/* helpers for creating vpdma descriptors */
 183void vpdma_add_cfd_block(struct vpdma_desc_list *list, int client,
 184                struct vpdma_buf *blk, u32 dest_offset);
 185void vpdma_add_cfd_adb(struct vpdma_desc_list *list, int client,
 186                struct vpdma_buf *adb);
 187void vpdma_add_sync_on_channel_ctd(struct vpdma_desc_list *list,
 188                enum vpdma_channel chan);
 189void vpdma_add_out_dtd(struct vpdma_desc_list *list, int width,
 190                const struct v4l2_rect *c_rect,
 191                const struct vpdma_data_format *fmt, dma_addr_t dma_addr,
 192                enum vpdma_channel chan, u32 flags);
 193void vpdma_add_in_dtd(struct vpdma_desc_list *list, int width,
 194                const struct v4l2_rect *c_rect,
 195                const struct vpdma_data_format *fmt, dma_addr_t dma_addr,
 196                enum vpdma_channel chan, int field, u32 flags, int frame_width,
 197                int frame_height, int start_h, int start_v);
 198
 199/* vpdma list interrupt management */
 200void vpdma_enable_list_complete_irq(struct vpdma_data *vpdma, int list_num,
 201                bool enable);
 202void vpdma_clear_list_stat(struct vpdma_data *vpdma);
 203
 204/* vpdma client configuration */
 205void vpdma_set_line_mode(struct vpdma_data *vpdma, int line_mode,
 206                enum vpdma_channel chan);
 207void vpdma_set_frame_start_event(struct vpdma_data *vpdma,
 208                enum vpdma_frame_start_event fs_event, enum vpdma_channel chan);
 209
 210void vpdma_dump_regs(struct vpdma_data *vpdma);
 211
 212/* initialize vpdma, passed with VPE's platform device pointer */
 213struct vpdma_data *vpdma_create(struct platform_device *pdev,
 214                void (*cb)(struct platform_device *pdev));
 215
 216#endif
 217