[media] saa7164: allow the encoder GOP structure to be configured
[pandora-kernel.git] / drivers / media / video / saa7164 / saa7164-types.h
1 /*
2  *  Driver for the NXP SAA7164 PCIe bridge
3  *
4  *  Copyright (c) 2010 Steven Toth <stoth@kernellabs.com>
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program; if not, write to the Free Software
19  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21
22 /* TODO: Cleanup and shorten the namespace */
23
24 /* Some structues are passed directly to/from the firmware and
25  * have strict alignment requirements. This is one of them.
26  */
27 typedef struct {
28         u8      bLength;
29         u8      bDescriptorType;
30         u8      bDescriptorSubtype;
31         u16     bcdSpecVersion;
32         u32     dwClockFrequency;
33         u32     dwClockUpdateRes;
34         u8      bCapabilities;
35         u32     dwDeviceRegistersLocation;
36         u32     dwHostMemoryRegion;
37         u32     dwHostMemoryRegionSize;
38         u32     dwHostHibernatMemRegion;
39         u32     dwHostHibernatMemRegionSize;
40 } __attribute__((packed)) tmComResHWDescr_t;
41
42 /* This is DWORD aligned on windows but I can't find the right
43  * gcc syntax to match the binary data from the device.
44  * I've manually padded with Reserved[3] bytes to match the hardware,
45  * but this could break if GCC decies to pack in a different way.
46  */
47 typedef struct {
48         u8      bLength;
49         u8      bDescriptorType;
50         u8      bDescriptorSubtype;
51         u8      bFlags;
52         u8      bInterfaceType;
53         u8      bInterfaceId;
54         u8      bBaseInterface;
55         u8      bInterruptId;
56         u8      bDebugInterruptId;
57         u8      BARLocation;
58         u8      Reserved[3];
59 } tmComResInterfaceDescr_t;
60
61 typedef struct {
62         u64     CommandRing;
63         u64     ResponseRing;
64         u32     CommandWrite;
65         u32     CommandRead;
66         u32     ResponseWrite;
67         u32     ResponseRead;
68 } tmComResBusDescr_t;
69
70 typedef enum {
71         NONE            = 0,
72         TYPE_BUS_PCI    = 1,
73         TYPE_BUS_PCIe   = 2,
74         TYPE_BUS_USB    = 3,
75         TYPE_BUS_I2C    = 4
76 } tmBusType_t;
77
78 typedef struct {
79         tmBusType_t Type;
80         u16     m_wMaxReqSize;
81         u8      *m_pdwSetRing;
82         u32     m_dwSizeSetRing;
83         u8      *m_pdwGetRing;
84         u32     m_dwSizeGetRing;
85         u32     *m_pdwSetWritePos;
86         u32     *m_pdwSetReadPos;
87         u32     *m_pdwGetWritePos;
88         u32     *m_pdwGetReadPos;
89
90         /* All access is protected */
91         struct mutex lock;
92
93 } tmComResBusInfo_t;
94
95 typedef struct {
96         u8      id;
97         u8      flags;
98         u16     size;
99         u32     command;
100         u16     controlselector;
101         u8      seqno;
102 } __attribute__((packed)) tmComResInfo_t;
103
104 typedef enum {
105         SET_CUR  = 0x01,
106         GET_CUR  = 0x81,
107         GET_MIN  = 0x82,
108         GET_MAX  = 0x83,
109         GET_RES  = 0x84,
110         GET_LEN  = 0x85,
111         GET_INFO = 0x86,
112         GET_DEF  = 0x87
113 } tmComResCmd_t;
114
115 struct cmd {
116         u8 seqno;
117         u32 inuse;
118         u32 timeout;
119         u32 signalled;
120         struct mutex lock;
121         wait_queue_head_t wait;
122 };
123
124 typedef struct {
125         u32     pathid;
126         u32     size;
127         void    *descriptor;
128 } tmDescriptor_t;
129
130 typedef struct {
131         u8      len;
132         u8      type;
133         u8      subtype;
134         u8      unitid;
135 } __attribute__((packed)) tmComResDescrHeader_t;
136
137 typedef struct {
138         u8      len;
139         u8      type;
140         u8      subtype;
141         u8      unitid;
142         u32     devicetype;
143         u16     deviceid;
144         u32     numgpiopins;
145         u8      numgpiogroups;
146         u8      controlsize;
147 } __attribute__((packed)) tmComResExtDevDescrHeader_t;
148
149 typedef struct {
150         u32     pin;
151         u8      state;
152 } __attribute__((packed)) tmComResGPIO_t;
153
154 typedef struct {
155         u8      len;
156         u8      type;
157         u8      subtype;
158         u8      pathid;
159 } __attribute__((packed)) tmComResPathDescrHeader_t;
160
161 /* terminaltype */
162 typedef enum {
163         ITT_ANTENNA              = 0x0203,
164         LINE_CONNECTOR           = 0x0603,
165         SPDIF_CONNECTOR          = 0x0605,
166         COMPOSITE_CONNECTOR      = 0x0401,
167         SVIDEO_CONNECTOR         = 0x0402,
168         COMPONENT_CONNECTOR      = 0x0403,
169         STANDARD_DMA             = 0xF101
170 } tmComResTermType_t;
171
172 typedef struct {
173         u8      len;
174         u8      type;
175         u8      subtype;
176         u8      terminalid;
177         u16     terminaltype;
178         u8      assocterminal;
179         u8      iterminal;
180         u8      controlsize;
181 } __attribute__((packed)) tmComResAntTermDescrHeader_t;
182
183 typedef struct {
184         u8      len;
185         u8      type;
186         u8      subtype;
187         u8      unitid;
188         u8      sourceid;
189         u8      iunit;
190         u32     tuningstandards;
191         u8      controlsize;
192         u32     controls;
193 } __attribute__((packed)) tmComResTunerDescrHeader_t;
194
195 typedef enum {
196         /* the buffer does not contain any valid data */
197         TM_BUFFER_FLAG_EMPTY,
198
199         /* the buffer is filled with valid data */
200         TM_BUFFER_FLAG_DONE,
201
202         /* the buffer is the dummy buffer - TODO??? */
203         TM_BUFFER_FLAG_DUMMY_BUFFER
204 } tmBufferFlag_t;
205
206 typedef struct {
207         u64             *pagetablevirt;
208         u64             pagetablephys;
209         u16             offset;
210         u8              *context;
211         u64             timestamp;
212         tmBufferFlag_t  BufferFlag_t;
213         u32             lostbuffers;
214         u32             validbuffers;
215         u64             *dummypagevirt;
216         u64             dummypagephys;
217         u64             *addressvirt;
218 } tmBuffer_t;
219
220 typedef struct {
221         u32     bitspersample;
222         u32     samplesperline;
223         u32     numberoflines;
224         u32     pitch;
225         u32     linethreshold;
226         u64     **pagetablelistvirt;
227         u64     *pagetablelistphys;
228         u32     numpagetables;
229         u32     numpagetableentries;
230 } tmHWStreamParameters_t;
231
232 typedef struct {
233         tmHWStreamParameters_t          HWStreamParameters_t;
234         u64                             qwDummyPageTablePhys;
235         u64                             *pDummyPageTableVirt;
236 } tmStreamParameters_t;
237
238 typedef struct {
239         u8      len;
240         u8      type;
241         u8      subtyle;
242         u8      unitid;
243         u16     terminaltype;
244         u8      assocterminal;
245         u8      sourceid;
246         u8      iterminal;
247         u32     BARLocation;
248         u8      flags;
249         u8      interruptid;
250         u8      buffercount;
251         u8      metadatasize;
252         u8      numformats;
253         u8      controlsize;
254 } __attribute__((packed)) tmComResDMATermDescrHeader_t;
255
256 /*
257  *
258  * Description:
259  *  This is the transport stream format header.
260  *
261  * Settings:
262  *  bLength                 - The size of this descriptor in bytes.
263  *  bDescriptorType         - CS_INTERFACE.
264  *  bDescriptorSubtype      - VS_FORMAT_MPEG2TS descriptor subtype.
265  *  bFormatIndex            - A non-zero constant that uniquely identifies the
266  *                            format.
267  *  bDataOffset             - Offset to TSP packet within MPEG-2 TS transport
268  *                            stride, in bytes.
269  *  bPacketLength           - Length of TSP packet, in bytes (typically 188).
270  *  bStrideLength           - Length of MPEG-2 TS transport stride.
271  *  guidStrideFormat        - A Globally Unique Identifier indicating the
272  *                            format of the stride data (if any). Set to zeros
273  *                            if there is no Stride Data, or if the Stride
274  *                            Data is to be ignored by the application.
275  *
276  */
277 typedef struct {
278         u8      len;
279         u8      type;
280         u8      subtype;
281         u8      bFormatIndex;
282         u8      bDataOffset;
283         u8      bPacketLength;
284         u8      bStrideLength;
285         u8      guidStrideFormat[16];
286 } __attribute__((packed)) tmComResTSFormatDescrHeader_t;
287
288 /* Encoder related structures */
289
290 /* A/V Mux Selector */
291 typedef struct
292 {
293         u8      len;
294         u8      type;
295         u8      subtype;
296         u8      unitid;
297         u8      nrinpins;
298         u8      sourceid;
299 } __attribute__((packed)) tmComResSelDescrHeader_t;
300
301 /* A/V Audio processor definitions */
302 typedef struct
303 {
304         u8      len;
305         u8      type;
306         u8      subtype;
307         u8      unitid;
308         u8      sourceid;
309         u16     wreserved;
310         u8      controlsize;
311 } __attribute__((packed)) tmComResProcDescrHeader_t;
312
313 /* Video bitrate control message */
314 typedef struct
315 {
316         u8      ucVideoBitRateMode;
317         u32     dwVideoBitRate;
318         u32     dwVideoBitRatePeak;
319 } __attribute__((packed)) tmComResEncVideoBitRate_t;
320
321 /* Video Encoder Aspect Ratio message */
322 typedef struct
323 {
324         u8      width;
325         u8      height;
326 } __attribute__((packed)) tmComResEncVideoInputAspectRatio_t;
327
328 /* Video Encoder GOP IBP message */
329 /* 1. IPPPPPPPPPPPPPP */
330 /* 2. IBPBPBPBPBPBPBP */
331 /* 3. IBBPBBPBBPBBP   */
332 #define SAA7164_ENCODER_DEFAULT_GOP_DIST ( 1)
333 #define SAA7164_ENCODER_DEFAULT_GOP_SIZE (15)
334 typedef struct
335 {
336         u8      ucGOPSize;      /* GOP Size 12, 15 */
337         u8      ucRefFrameDist; /* Reference Frame Distance */
338 } __attribute__((packed)) tmComResEncVideoGopStructure_t;
339
340 /* Encoder processor definition */
341 typedef struct
342 {
343         u8      len;
344         u8      type;
345         u8      subtype;
346         u8      unitid;
347         u8      vsourceid;
348         u8      asourceid;
349         u8      iunit;
350         u32     dwmControlCap;
351         u32     dwmProfileCap;
352         u32     dwmVidFormatCap;
353         u8      bmVidBitrateCap;
354         u16     wmVidResolutionsCap;
355         u16     wmVidFrmRateCap;
356         u32     dwmAudFormatCap;
357         u8      bmAudBitrateCap;
358 } __attribute__((packed)) tmComResEncoderDescrHeader_t;
359
360 /* Audio processor definition */
361 typedef struct
362 {
363         u8      len;
364         u8      type;
365         u8      subtype;
366         u8      unitid;
367         u8      sourceid;
368         u8      controlsize;
369 } __attribute__((packed)) tmComResAFeatureDescrHeader_t;
370
371 /* Audio control messages */
372 typedef struct
373 {
374         u8      ucDecoderLevel;
375         u8      ucDecoderFM_Level;
376         u8      ucMonoLevel;
377         u8      ucNICAM_Level;
378         u8      ucSAP_Level;
379         u8      ucADC_Level;
380 } __attribute__((packed)) tmComResAudioDefaults_t;
381
382 /* Audio bitrate control message */
383 typedef struct
384 {
385         u8      ucAudioBitRateMode;
386         u32     dwAudioBitRate;
387         u32     dwAudioBitRatePeak;
388 } __attribute__((packed)) tmComResEncAudioBitRate_t;
389
390 /* Tuner / AV Decoder messages */
391 typedef struct
392 {
393         u8      std;
394         u32     country;
395 } __attribute__((packed)) tmComResTunerStandard_t;
396
397 typedef struct
398 {
399         u8      mode;
400 } __attribute__((packed)) tmComResTunerStandardAuto_t;
401
402 /* EEPROM definition for PS stream types */
403 typedef struct
404 {
405         u8      len;
406         u8      type;
407         u8      subtype;
408         u8      bFormatIndex;
409         u16     wPacketLength;
410         u16     wPackLength;
411         u8      bPackDataType;
412 } __attribute__((packed)) tmComResPSFormatDescrHeader_t;
413