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

source code of linux/drivers/media/pci/saa7164/saa7164-types.h