GNU Linux-libre 4.19.245-gnu1
[releases.git] / drivers / media / pci / saa7164 / saa7164-types.h
1 /*
2  *  Driver for the NXP SAA7164 PCIe bridge
3  *
4  *  Copyright (c) 2010-2015 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
18 /* TODO: Cleanup and shorten the namespace */
19
20 /* Some structues are passed directly to/from the firmware and
21  * have strict alignment requirements. This is one of them.
22  */
23 struct tmComResHWDescr {
24         u8      bLength;
25         u8      bDescriptorType;
26         u8      bDescriptorSubtype;
27         u16     bcdSpecVersion;
28         u32     dwClockFrequency;
29         u32     dwClockUpdateRes;
30         u8      bCapabilities;
31         u32     dwDeviceRegistersLocation;
32         u32     dwHostMemoryRegion;
33         u32     dwHostMemoryRegionSize;
34         u32     dwHostHibernatMemRegion;
35         u32     dwHostHibernatMemRegionSize;
36 } __attribute__((packed));
37
38 /* This is DWORD aligned on windows but I can't find the right
39  * gcc syntax to match the binary data from the device.
40  * I've manually padded with Reserved[3] bytes to match the hardware,
41  * but this could break if GCC decies to pack in a different way.
42  */
43 struct tmComResInterfaceDescr {
44         u8      bLength;
45         u8      bDescriptorType;
46         u8      bDescriptorSubtype;
47         u8      bFlags;
48         u8      bInterfaceType;
49         u8      bInterfaceId;
50         u8      bBaseInterface;
51         u8      bInterruptId;
52         u8      bDebugInterruptId;
53         u8      BARLocation;
54         u8      Reserved[3];
55 };
56
57 struct tmComResBusDescr {
58         u64     CommandRing;
59         u64     ResponseRing;
60         u32     CommandWrite;
61         u32     CommandRead;
62         u32     ResponseWrite;
63         u32     ResponseRead;
64 };
65
66 enum tmBusType {
67         NONE            = 0,
68         TYPE_BUS_PCI    = 1,
69         TYPE_BUS_PCIe   = 2,
70         TYPE_BUS_USB    = 3,
71         TYPE_BUS_I2C    = 4
72 };
73
74 struct tmComResBusInfo {
75         enum tmBusType Type;
76         u16     m_wMaxReqSize;
77         u8 __iomem *m_pdwSetRing;
78         u32     m_dwSizeSetRing;
79         u8 __iomem *m_pdwGetRing;
80         u32     m_dwSizeGetRing;
81         u32     m_dwSetWritePos;
82         u32     m_dwSetReadPos;
83         u32     m_dwGetWritePos;
84         u32     m_dwGetReadPos;
85
86         /* All access is protected */
87         struct mutex lock;
88
89 };
90
91 struct tmComResInfo {
92         u8      id;
93         u8      flags;
94         u16     size;
95         u32     command;
96         u16     controlselector;
97         u8      seqno;
98 } __attribute__((packed));
99
100 enum tmComResCmd {
101         SET_CUR  = 0x01,
102         GET_CUR  = 0x81,
103         GET_MIN  = 0x82,
104         GET_MAX  = 0x83,
105         GET_RES  = 0x84,
106         GET_LEN  = 0x85,
107         GET_INFO = 0x86,
108         GET_DEF  = 0x87
109 };
110
111 struct cmd {
112         u8 seqno;
113         u32 inuse;
114         u32 timeout;
115         u32 signalled;
116         struct mutex lock;
117         wait_queue_head_t wait;
118 };
119
120 struct tmDescriptor {
121         u32     pathid;
122         u32     size;
123         void    *descriptor;
124 };
125
126 struct tmComResDescrHeader {
127         u8      len;
128         u8      type;
129         u8      subtype;
130         u8      unitid;
131 } __attribute__((packed));
132
133 struct tmComResExtDevDescrHeader {
134         u8      len;
135         u8      type;
136         u8      subtype;
137         u8      unitid;
138         u32     devicetype;
139         u16     deviceid;
140         u32     numgpiopins;
141         u8      numgpiogroups;
142         u8      controlsize;
143 } __attribute__((packed));
144
145 struct tmComResGPIO {
146         u32     pin;
147         u8      state;
148 } __attribute__((packed));
149
150 struct tmComResPathDescrHeader {
151         u8      len;
152         u8      type;
153         u8      subtype;
154         u8      pathid;
155 } __attribute__((packed));
156
157 /* terminaltype */
158 enum tmComResTermType {
159         ITT_ANTENNA              = 0x0203,
160         LINE_CONNECTOR           = 0x0603,
161         SPDIF_CONNECTOR          = 0x0605,
162         COMPOSITE_CONNECTOR      = 0x0401,
163         SVIDEO_CONNECTOR         = 0x0402,
164         COMPONENT_CONNECTOR      = 0x0403,
165         STANDARD_DMA             = 0xF101
166 };
167
168 struct tmComResAntTermDescrHeader {
169         u8      len;
170         u8      type;
171         u8      subtype;
172         u8      terminalid;
173         u16     terminaltype;
174         u8      assocterminal;
175         u8      iterminal;
176         u8      controlsize;
177 } __attribute__((packed));
178
179 struct tmComResTunerDescrHeader {
180         u8      len;
181         u8      type;
182         u8      subtype;
183         u8      unitid;
184         u8      sourceid;
185         u8      iunit;
186         u32     tuningstandards;
187         u8      controlsize;
188         u32     controls;
189 } __attribute__((packed));
190
191 enum tmBufferFlag {
192         /* the buffer does not contain any valid data */
193         TM_BUFFER_FLAG_EMPTY,
194
195         /* the buffer is filled with valid data */
196         TM_BUFFER_FLAG_DONE,
197
198         /* the buffer is the dummy buffer - TODO??? */
199         TM_BUFFER_FLAG_DUMMY_BUFFER
200 };
201
202 struct tmBuffer {
203         u64             *pagetablevirt;
204         u64             pagetablephys;
205         u16             offset;
206         u8              *context;
207         u64             timestamp;
208         enum tmBufferFlag BufferFlag;
209         u32             lostbuffers;
210         u32             validbuffers;
211         u64             *dummypagevirt;
212         u64             dummypagephys;
213         u64             *addressvirt;
214 };
215
216 struct tmHWStreamParameters {
217         u32     bitspersample;
218         u32     samplesperline;
219         u32     numberoflines;
220         u32     pitch;
221         u32     linethreshold;
222         u64     **pagetablelistvirt;
223         u64     *pagetablelistphys;
224         u32     numpagetables;
225         u32     numpagetableentries;
226 };
227
228 struct tmStreamParameters {
229         struct tmHWStreamParameters     HWStreamParameters;
230         u64                             qwDummyPageTablePhys;
231         u64                             *pDummyPageTableVirt;
232 };
233
234 struct tmComResDMATermDescrHeader {
235         u8      len;
236         u8      type;
237         u8      subtyle;
238         u8      unitid;
239         u16     terminaltype;
240         u8      assocterminal;
241         u8      sourceid;
242         u8      iterminal;
243         u32     BARLocation;
244         u8      flags;
245         u8      interruptid;
246         u8      buffercount;
247         u8      metadatasize;
248         u8      numformats;
249         u8      controlsize;
250 } __attribute__((packed));
251
252 /*
253  *
254  * Description:
255  *  This is the transport stream format header.
256  *
257  * Settings:
258  *  bLength                 - The size of this descriptor in bytes.
259  *  bDescriptorType         - CS_INTERFACE.
260  *  bDescriptorSubtype      - VS_FORMAT_MPEG2TS descriptor subtype.
261  *  bFormatIndex            - A non-zero constant that uniquely identifies the
262  *                            format.
263  *  bDataOffset             - Offset to TSP packet within MPEG-2 TS transport
264  *                            stride, in bytes.
265  *  bPacketLength           - Length of TSP packet, in bytes (typically 188).
266  *  bStrideLength           - Length of MPEG-2 TS transport stride.
267  *  guidStrideFormat        - A Globally Unique Identifier indicating the
268  *                            format of the stride data (if any). Set to zeros
269  *                            if there is no Stride Data, or if the Stride
270  *                            Data is to be ignored by the application.
271  *
272  */
273 struct tmComResTSFormatDescrHeader {
274         u8      len;
275         u8      type;
276         u8      subtype;
277         u8      bFormatIndex;
278         u8      bDataOffset;
279         u8      bPacketLength;
280         u8      bStrideLength;
281         u8      guidStrideFormat[16];
282 } __attribute__((packed));
283
284 /* Encoder related structures */
285
286 /* A/V Mux Selector */
287 struct tmComResSelDescrHeader {
288         u8      len;
289         u8      type;
290         u8      subtype;
291         u8      unitid;
292         u8      nrinpins;
293         u8      sourceid;
294 } __attribute__((packed));
295
296 /* A/V Audio processor definitions */
297 struct tmComResProcDescrHeader {
298         u8      len;
299         u8      type;
300         u8      subtype;
301         u8      unitid;
302         u8      sourceid;
303         u16     wreserved;
304         u8      controlsize;
305 } __attribute__((packed));
306
307 /* Video bitrate control message */
308 #define EU_VIDEO_BIT_RATE_MODE_CONSTANT         (0)
309 #define EU_VIDEO_BIT_RATE_MODE_VARIABLE_AVERAGE (1)
310 #define EU_VIDEO_BIT_RATE_MODE_VARIABLE_PEAK    (2)
311 struct tmComResEncVideoBitRate {
312         u8      ucVideoBitRateMode;
313         u32     dwVideoBitRate;
314         u32     dwVideoBitRatePeak;
315 } __attribute__((packed));
316
317 /* Video Encoder Aspect Ratio message */
318 struct tmComResEncVideoInputAspectRatio {
319         u8      width;
320         u8      height;
321 } __attribute__((packed));
322
323 /* Video Encoder GOP IBP message */
324 /* 1. IPPPPPPPPPPPPPP */
325 /* 2. IBPBPBPBPBPBPBP */
326 /* 3. IBBPBBPBBPBBP   */
327 #define SAA7164_ENCODER_DEFAULT_GOP_DIST (1)
328 #define SAA7164_ENCODER_DEFAULT_GOP_SIZE (15)
329 struct tmComResEncVideoGopStructure {
330         u8      ucGOPSize;      /* GOP Size 12, 15 */
331         u8      ucRefFrameDist; /* Reference Frame Distance */
332 } __attribute__((packed));
333
334 /* Encoder processor definition */
335 struct tmComResEncoderDescrHeader {
336         u8      len;
337         u8      type;
338         u8      subtype;
339         u8      unitid;
340         u8      vsourceid;
341         u8      asourceid;
342         u8      iunit;
343         u32     dwmControlCap;
344         u32     dwmProfileCap;
345         u32     dwmVidFormatCap;
346         u8      bmVidBitrateCap;
347         u16     wmVidResolutionsCap;
348         u16     wmVidFrmRateCap;
349         u32     dwmAudFormatCap;
350         u8      bmAudBitrateCap;
351 } __attribute__((packed));
352
353 /* Audio processor definition */
354 struct tmComResAFeatureDescrHeader {
355         u8      len;
356         u8      type;
357         u8      subtype;
358         u8      unitid;
359         u8      sourceid;
360         u8      controlsize;
361 } __attribute__((packed));
362
363 /* Audio control messages */
364 struct tmComResAudioDefaults {
365         u8      ucDecoderLevel;
366         u8      ucDecoderFM_Level;
367         u8      ucMonoLevel;
368         u8      ucNICAM_Level;
369         u8      ucSAP_Level;
370         u8      ucADC_Level;
371 } __attribute__((packed));
372
373 /* Audio bitrate control message */
374 struct tmComResEncAudioBitRate {
375         u8      ucAudioBitRateMode;
376         u32     dwAudioBitRate;
377         u32     dwAudioBitRatePeak;
378 } __attribute__((packed));
379
380 /* Tuner / AV Decoder messages */
381 struct tmComResTunerStandard {
382         u8      std;
383         u32     country;
384 } __attribute__((packed));
385
386 struct tmComResTunerStandardAuto {
387         u8      mode;
388 } __attribute__((packed));
389
390 /* EEPROM definition for PS stream types */
391 struct tmComResPSFormatDescrHeader {
392         u8      len;
393         u8      type;
394         u8      subtype;
395         u8      bFormatIndex;
396         u16     wPacketLength;
397         u16     wPackLength;
398         u8      bPackDataType;
399 } __attribute__((packed));
400
401 /* VBI control structure */
402 struct tmComResVBIFormatDescrHeader {
403         u8      len;
404         u8      type;
405         u8      subtype; /* VS_FORMAT_VBI */
406         u8      bFormatIndex;
407         u32     VideoStandard; /* See KS_AnalogVideoStandard, NTSC = 1 */
408         u8      StartLine; /* NTSC Start = 10 */
409         u8      EndLine; /* NTSC = 21 */
410         u8      FieldRate; /* 60 for NTSC */
411         u8      bNumLines; /* Unused - scheduled for removal */
412 } __attribute__((packed));
413
414 struct tmComResProbeCommit {
415         u16     bmHint;
416         u8      bFormatIndex;
417         u8      bFrameIndex;
418 } __attribute__((packed));
419
420 struct tmComResDebugSetLevel {
421         u32     dwDebugLevel;
422 } __attribute__((packed));
423
424 struct tmComResDebugGetData {
425         u32     dwResult;
426         u8      ucDebugData[256];
427 } __attribute__((packed));
428
429 struct tmFwInfoStruct {
430         u32     status;
431         u32     mode;
432         u32     devicespec;
433         u32     deviceinst;
434         u32     CPULoad;
435         u32     RemainHeap;
436         u32     CPUClock;
437         u32     RAMSpeed;
438 } __attribute__((packed));