blob: eaa2a71a5db95d1d21533428e96253e009d1d874 [file] [log] [blame]
Archit Taneja9262e5a2013-10-16 02:36:45 -03001/*
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 /* tells whether vpdma firmware is loaded or not */
39 bool ready;
40};
41
42struct vpdma_data_format {
43 int data_type;
44 u8 depth;
45};
46
47#define VPDMA_DESC_ALIGN 16 /* 16-byte descriptor alignment */
48
49#define VPDMA_DTD_DESC_SIZE 32 /* 8 words */
50#define VPDMA_CFD_CTD_DESC_SIZE 16 /* 4 words */
51
52#define VPDMA_LIST_TYPE_NORMAL 0
53#define VPDMA_LIST_TYPE_SELF_MODIFYING 1
54#define VPDMA_LIST_TYPE_DOORBELL 2
55
56enum vpdma_yuv_formats {
57 VPDMA_DATA_FMT_Y444 = 0,
58 VPDMA_DATA_FMT_Y422,
59 VPDMA_DATA_FMT_Y420,
60 VPDMA_DATA_FMT_C444,
61 VPDMA_DATA_FMT_C422,
62 VPDMA_DATA_FMT_C420,
63 VPDMA_DATA_FMT_YC422,
64 VPDMA_DATA_FMT_YC444,
65 VPDMA_DATA_FMT_CY422,
66};
67
68enum vpdma_rgb_formats {
69 VPDMA_DATA_FMT_RGB565 = 0,
70 VPDMA_DATA_FMT_ARGB16_1555,
71 VPDMA_DATA_FMT_ARGB16,
72 VPDMA_DATA_FMT_RGBA16_5551,
73 VPDMA_DATA_FMT_RGBA16,
74 VPDMA_DATA_FMT_ARGB24,
75 VPDMA_DATA_FMT_RGB24,
76 VPDMA_DATA_FMT_ARGB32,
77 VPDMA_DATA_FMT_RGBA24,
78 VPDMA_DATA_FMT_RGBA32,
79 VPDMA_DATA_FMT_BGR565,
80 VPDMA_DATA_FMT_ABGR16_1555,
81 VPDMA_DATA_FMT_ABGR16,
82 VPDMA_DATA_FMT_BGRA16_5551,
83 VPDMA_DATA_FMT_BGRA16,
84 VPDMA_DATA_FMT_ABGR24,
85 VPDMA_DATA_FMT_BGR24,
86 VPDMA_DATA_FMT_ABGR32,
87 VPDMA_DATA_FMT_BGRA24,
88 VPDMA_DATA_FMT_BGRA32,
89};
90
91enum vpdma_misc_formats {
92 VPDMA_DATA_FMT_MV = 0,
93};
94
95extern const struct vpdma_data_format vpdma_yuv_fmts[];
96extern const struct vpdma_data_format vpdma_rgb_fmts[];
97extern const struct vpdma_data_format vpdma_misc_fmts[];
98
99enum vpdma_frame_start_event {
100 VPDMA_FSEVENT_HDMI_FID = 0,
101 VPDMA_FSEVENT_DVO2_FID,
102 VPDMA_FSEVENT_HDCOMP_FID,
103 VPDMA_FSEVENT_SD_FID,
104 VPDMA_FSEVENT_LM_FID0,
105 VPDMA_FSEVENT_LM_FID1,
106 VPDMA_FSEVENT_LM_FID2,
107 VPDMA_FSEVENT_CHANNEL_ACTIVE,
108};
109
110/*
111 * VPDMA channel numbers
112 */
113enum vpdma_channel {
114 VPE_CHAN_LUMA1_IN,
115 VPE_CHAN_CHROMA1_IN,
116 VPE_CHAN_LUMA2_IN,
117 VPE_CHAN_CHROMA2_IN,
118 VPE_CHAN_LUMA3_IN,
119 VPE_CHAN_CHROMA3_IN,
120 VPE_CHAN_MV_IN,
121 VPE_CHAN_MV_OUT,
122 VPE_CHAN_LUMA_OUT,
123 VPE_CHAN_CHROMA_OUT,
124 VPE_CHAN_RGB_OUT,
125};
126
Archit Taneja213b8ee2013-10-16 02:36:46 -0300127/* flags for VPDMA data descriptors */
128#define VPDMA_DATA_ODD_LINE_SKIP (1 << 0)
129#define VPDMA_DATA_EVEN_LINE_SKIP (1 << 1)
130#define VPDMA_DATA_FRAME_1D (1 << 2)
131#define VPDMA_DATA_MODE_TILED (1 << 3)
132
133/*
134 * client identifiers used for configuration descriptors
135 */
136#define CFD_MMR_CLIENT 0
137#define CFD_SC_CLIENT 4
138
139/* Address data block header format */
140struct vpdma_adb_hdr {
141 u32 offset;
142 u32 nwords;
143 u32 reserved0;
144 u32 reserved1;
145};
146
147/* helpers for creating ADB headers for config descriptors MMRs as client */
148#define ADB_ADDR(dma_buf, str, fld) ((dma_buf)->addr + offsetof(str, fld))
149#define MMR_ADB_ADDR(buf, str, fld) ADB_ADDR(&(buf), struct str, fld)
150
151#define VPDMA_SET_MMR_ADB_HDR(buf, str, hdr, regs, offset_a) \
152 do { \
153 struct vpdma_adb_hdr *h; \
154 struct str *adb = NULL; \
155 h = MMR_ADB_ADDR(buf, str, hdr); \
156 h->offset = (offset_a); \
157 h->nwords = sizeof(adb->regs) >> 2; \
158 } while (0)
159
Archit Taneja9262e5a2013-10-16 02:36:45 -0300160/* vpdma descriptor buffer allocation and management */
161int vpdma_alloc_desc_buf(struct vpdma_buf *buf, size_t size);
162void vpdma_free_desc_buf(struct vpdma_buf *buf);
163int vpdma_map_desc_buf(struct vpdma_data *vpdma, struct vpdma_buf *buf);
164void vpdma_unmap_desc_buf(struct vpdma_data *vpdma, struct vpdma_buf *buf);
165
166/* vpdma descriptor list funcs */
167int vpdma_create_desc_list(struct vpdma_desc_list *list, size_t size, int type);
168void vpdma_reset_desc_list(struct vpdma_desc_list *list);
169void vpdma_free_desc_list(struct vpdma_desc_list *list);
170int vpdma_submit_descs(struct vpdma_data *vpdma, struct vpdma_desc_list *list);
171
Archit Taneja213b8ee2013-10-16 02:36:46 -0300172/* helpers for creating vpdma descriptors */
173void vpdma_add_cfd_block(struct vpdma_desc_list *list, int client,
174 struct vpdma_buf *blk, u32 dest_offset);
175void vpdma_add_cfd_adb(struct vpdma_desc_list *list, int client,
176 struct vpdma_buf *adb);
177void vpdma_add_sync_on_channel_ctd(struct vpdma_desc_list *list,
178 enum vpdma_channel chan);
179void vpdma_add_out_dtd(struct vpdma_desc_list *list, struct v4l2_rect *c_rect,
180 const struct vpdma_data_format *fmt, dma_addr_t dma_addr,
181 enum vpdma_channel chan, u32 flags);
182void vpdma_add_in_dtd(struct vpdma_desc_list *list, int frame_width,
183 int frame_height, struct v4l2_rect *c_rect,
184 const struct vpdma_data_format *fmt, dma_addr_t dma_addr,
185 enum vpdma_channel chan, int field, u32 flags);
186
Archit Taneja9262e5a2013-10-16 02:36:45 -0300187/* vpdma list interrupt management */
188void vpdma_enable_list_complete_irq(struct vpdma_data *vpdma, int list_num,
189 bool enable);
190void vpdma_clear_list_stat(struct vpdma_data *vpdma);
191
192/* vpdma client configuration */
193void vpdma_set_line_mode(struct vpdma_data *vpdma, int line_mode,
194 enum vpdma_channel chan);
195void vpdma_set_frame_start_event(struct vpdma_data *vpdma,
196 enum vpdma_frame_start_event fs_event, enum vpdma_channel chan);
197
198void vpdma_dump_regs(struct vpdma_data *vpdma);
199
200/* initialize vpdma, passed with VPE's platform device pointer */
201struct vpdma_data *vpdma_create(struct platform_device *pdev);
202
203#endif