]>
Commit | Line | Data |
---|---|---|
443c1228 ST |
1 | /* |
2 | * Driver for the NXP SAA7164 PCIe bridge | |
3 | * | |
9b8b0199 | 4 | * Copyright (c) 2010 Steven Toth <stoth@kernellabs.com> |
443c1228 ST |
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 | */ | |
4d270cfb | 27 | struct tmComResHWDescr { |
443c1228 ST |
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; | |
4d270cfb | 40 | } __attribute__((packed)); |
443c1228 ST |
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 | */ | |
4d270cfb | 47 | struct tmComResInterfaceDescr { |
443c1228 ST |
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]; | |
4d270cfb | 59 | }; |
443c1228 | 60 | |
4d270cfb | 61 | struct tmComResBusDescr { |
443c1228 ST |
62 | u64 CommandRing; |
63 | u64 ResponseRing; | |
64 | u32 CommandWrite; | |
65 | u32 CommandRead; | |
66 | u32 ResponseWrite; | |
67 | u32 ResponseRead; | |
4d270cfb | 68 | }; |
443c1228 | 69 | |
4d270cfb | 70 | enum tmBusType { |
443c1228 ST |
71 | NONE = 0, |
72 | TYPE_BUS_PCI = 1, | |
73 | TYPE_BUS_PCIe = 2, | |
74 | TYPE_BUS_USB = 3, | |
75 | TYPE_BUS_I2C = 4 | |
4d270cfb | 76 | }; |
443c1228 | 77 | |
4d270cfb MCC |
78 | struct tmComResBusInfo { |
79 | enum tmBusType Type; | |
443c1228 ST |
80 | u16 m_wMaxReqSize; |
81 | u8 *m_pdwSetRing; | |
82 | u32 m_dwSizeSetRing; | |
83 | u8 *m_pdwGetRing; | |
84 | u32 m_dwSizeGetRing; | |
60665829 ST |
85 | u32 m_dwSetWritePos; |
86 | u32 m_dwSetReadPos; | |
87 | u32 m_dwGetWritePos; | |
88 | u32 m_dwGetReadPos; | |
443c1228 ST |
89 | |
90 | /* All access is protected */ | |
91 | struct mutex lock; | |
92 | ||
4d270cfb | 93 | }; |
443c1228 | 94 | |
4d270cfb | 95 | struct tmComResInfo { |
443c1228 ST |
96 | u8 id; |
97 | u8 flags; | |
98 | u16 size; | |
99 | u32 command; | |
100 | u16 controlselector; | |
101 | u8 seqno; | |
4d270cfb | 102 | } __attribute__((packed)); |
443c1228 | 103 | |
4d270cfb | 104 | enum tmComResCmd { |
443c1228 ST |
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 | |
4d270cfb | 113 | }; |
443c1228 ST |
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 | ||
4d270cfb | 124 | struct tmDescriptor { |
443c1228 ST |
125 | u32 pathid; |
126 | u32 size; | |
127 | void *descriptor; | |
4d270cfb | 128 | }; |
443c1228 | 129 | |
4d270cfb | 130 | struct tmComResDescrHeader { |
443c1228 ST |
131 | u8 len; |
132 | u8 type; | |
133 | u8 subtype; | |
134 | u8 unitid; | |
4d270cfb | 135 | } __attribute__((packed)); |
443c1228 | 136 | |
4d270cfb | 137 | struct tmComResExtDevDescrHeader { |
443c1228 ST |
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; | |
4d270cfb | 147 | } __attribute__((packed)); |
443c1228 | 148 | |
4d270cfb | 149 | struct tmComResGPIO { |
443c1228 ST |
150 | u32 pin; |
151 | u8 state; | |
4d270cfb | 152 | } __attribute__((packed)); |
443c1228 | 153 | |
4d270cfb | 154 | struct tmComResPathDescrHeader { |
443c1228 ST |
155 | u8 len; |
156 | u8 type; | |
157 | u8 subtype; | |
158 | u8 pathid; | |
4d270cfb | 159 | } __attribute__((packed)); |
443c1228 ST |
160 | |
161 | /* terminaltype */ | |
4d270cfb | 162 | enum tmComResTermType { |
443c1228 ST |
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 | |
4d270cfb | 170 | }; |
443c1228 | 171 | |
4d270cfb | 172 | struct tmComResAntTermDescrHeader { |
443c1228 ST |
173 | u8 len; |
174 | u8 type; | |
175 | u8 subtype; | |
176 | u8 terminalid; | |
177 | u16 terminaltype; | |
178 | u8 assocterminal; | |
179 | u8 iterminal; | |
180 | u8 controlsize; | |
4d270cfb | 181 | } __attribute__((packed)); |
443c1228 | 182 | |
4d270cfb | 183 | struct tmComResTunerDescrHeader { |
443c1228 ST |
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; | |
4d270cfb | 193 | } __attribute__((packed)); |
443c1228 | 194 | |
4d270cfb | 195 | enum tmBufferFlag { |
443c1228 ST |
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 | |
4d270cfb | 204 | }; |
443c1228 | 205 | |
4d270cfb | 206 | struct tmBuffer { |
443c1228 ST |
207 | u64 *pagetablevirt; |
208 | u64 pagetablephys; | |
209 | u16 offset; | |
210 | u8 *context; | |
211 | u64 timestamp; | |
4d270cfb | 212 | enum tmBufferFlag BufferFlag; |
443c1228 ST |
213 | u32 lostbuffers; |
214 | u32 validbuffers; | |
215 | u64 *dummypagevirt; | |
216 | u64 dummypagephys; | |
217 | u64 *addressvirt; | |
4d270cfb | 218 | }; |
443c1228 | 219 | |
4d270cfb | 220 | struct tmHWStreamParameters { |
443c1228 ST |
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; | |
4d270cfb | 230 | }; |
443c1228 | 231 | |
4d270cfb MCC |
232 | struct tmStreamParameters { |
233 | struct tmHWStreamParameters HWStreamParameters; | |
443c1228 ST |
234 | u64 qwDummyPageTablePhys; |
235 | u64 *pDummyPageTableVirt; | |
4d270cfb | 236 | }; |
443c1228 | 237 | |
4d270cfb | 238 | struct tmComResDMATermDescrHeader { |
443c1228 ST |
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; | |
4d270cfb | 254 | } __attribute__((packed)); |
443c1228 ST |
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 | */ | |
4d270cfb | 277 | struct tmComResTSFormatDescrHeader { |
443c1228 ST |
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]; | |
4d270cfb | 286 | } __attribute__((packed)); |
443c1228 | 287 | |
335961ca ST |
288 | /* Encoder related structures */ |
289 | ||
290 | /* A/V Mux Selector */ | |
4d270cfb | 291 | struct tmComResSelDescrHeader { |
335961ca ST |
292 | u8 len; |
293 | u8 type; | |
294 | u8 subtype; | |
295 | u8 unitid; | |
296 | u8 nrinpins; | |
297 | u8 sourceid; | |
4d270cfb | 298 | } __attribute__((packed)); |
335961ca ST |
299 | |
300 | /* A/V Audio processor definitions */ | |
4d270cfb | 301 | struct tmComResProcDescrHeader { |
335961ca ST |
302 | u8 len; |
303 | u8 type; | |
304 | u8 subtype; | |
305 | u8 unitid; | |
306 | u8 sourceid; | |
307 | u16 wreserved; | |
308 | u8 controlsize; | |
4d270cfb | 309 | } __attribute__((packed)); |
335961ca ST |
310 | |
311 | /* Video bitrate control message */ | |
2600d71c ST |
312 | #define EU_VIDEO_BIT_RATE_MODE_CONSTANT (0) |
313 | #define EU_VIDEO_BIT_RATE_MODE_VARIABLE_AVERAGE (1) | |
314 | #define EU_VIDEO_BIT_RATE_MODE_VARIABLE_PEAK (2) | |
4d270cfb | 315 | struct tmComResEncVideoBitRate { |
335961ca ST |
316 | u8 ucVideoBitRateMode; |
317 | u32 dwVideoBitRate; | |
318 | u32 dwVideoBitRatePeak; | |
4d270cfb | 319 | } __attribute__((packed)); |
335961ca ST |
320 | |
321 | /* Video Encoder Aspect Ratio message */ | |
4d270cfb | 322 | struct tmComResEncVideoInputAspectRatio { |
335961ca ST |
323 | u8 width; |
324 | u8 height; | |
4d270cfb | 325 | } __attribute__((packed)); |
335961ca | 326 | |
eafea210 ST |
327 | /* Video Encoder GOP IBP message */ |
328 | /* 1. IPPPPPPPPPPPPPP */ | |
329 | /* 2. IBPBPBPBPBPBPBP */ | |
330 | /* 3. IBBPBBPBBPBBP */ | |
c7e242ba | 331 | #define SAA7164_ENCODER_DEFAULT_GOP_DIST (1) |
eafea210 | 332 | #define SAA7164_ENCODER_DEFAULT_GOP_SIZE (15) |
4d270cfb | 333 | struct tmComResEncVideoGopStructure { |
eafea210 ST |
334 | u8 ucGOPSize; /* GOP Size 12, 15 */ |
335 | u8 ucRefFrameDist; /* Reference Frame Distance */ | |
4d270cfb | 336 | } __attribute__((packed)); |
eafea210 | 337 | |
335961ca | 338 | /* Encoder processor definition */ |
4d270cfb | 339 | struct tmComResEncoderDescrHeader { |
335961ca ST |
340 | u8 len; |
341 | u8 type; | |
342 | u8 subtype; | |
343 | u8 unitid; | |
344 | u8 vsourceid; | |
345 | u8 asourceid; | |
346 | u8 iunit; | |
347 | u32 dwmControlCap; | |
348 | u32 dwmProfileCap; | |
349 | u32 dwmVidFormatCap; | |
350 | u8 bmVidBitrateCap; | |
351 | u16 wmVidResolutionsCap; | |
352 | u16 wmVidFrmRateCap; | |
353 | u32 dwmAudFormatCap; | |
354 | u8 bmAudBitrateCap; | |
4d270cfb | 355 | } __attribute__((packed)); |
335961ca ST |
356 | |
357 | /* Audio processor definition */ | |
4d270cfb | 358 | struct tmComResAFeatureDescrHeader { |
335961ca ST |
359 | u8 len; |
360 | u8 type; | |
361 | u8 subtype; | |
362 | u8 unitid; | |
363 | u8 sourceid; | |
364 | u8 controlsize; | |
4d270cfb | 365 | } __attribute__((packed)); |
335961ca ST |
366 | |
367 | /* Audio control messages */ | |
4d270cfb | 368 | struct tmComResAudioDefaults { |
335961ca ST |
369 | u8 ucDecoderLevel; |
370 | u8 ucDecoderFM_Level; | |
371 | u8 ucMonoLevel; | |
372 | u8 ucNICAM_Level; | |
373 | u8 ucSAP_Level; | |
374 | u8 ucADC_Level; | |
4d270cfb | 375 | } __attribute__((packed)); |
335961ca ST |
376 | |
377 | /* Audio bitrate control message */ | |
4d270cfb | 378 | struct tmComResEncAudioBitRate { |
335961ca ST |
379 | u8 ucAudioBitRateMode; |
380 | u32 dwAudioBitRate; | |
381 | u32 dwAudioBitRatePeak; | |
4d270cfb | 382 | } __attribute__((packed)); |
335961ca ST |
383 | |
384 | /* Tuner / AV Decoder messages */ | |
4d270cfb | 385 | struct tmComResTunerStandard { |
335961ca ST |
386 | u8 std; |
387 | u32 country; | |
4d270cfb | 388 | } __attribute__((packed)); |
335961ca | 389 | |
4d270cfb | 390 | struct tmComResTunerStandardAuto { |
335961ca | 391 | u8 mode; |
4d270cfb | 392 | } __attribute__((packed)); |
335961ca ST |
393 | |
394 | /* EEPROM definition for PS stream types */ | |
4d270cfb | 395 | struct tmComResPSFormatDescrHeader { |
335961ca ST |
396 | u8 len; |
397 | u8 type; | |
398 | u8 subtype; | |
399 | u8 bFormatIndex; | |
400 | u16 wPacketLength; | |
401 | u16 wPackLength; | |
402 | u8 bPackDataType; | |
4d270cfb | 403 | } __attribute__((packed)); |
335961ca | 404 | |
e8ce2f21 | 405 | /* VBI control structure */ |
4d270cfb | 406 | struct tmComResVBIFormatDescrHeader { |
e8ce2f21 ST |
407 | u8 len; |
408 | u8 type; | |
409 | u8 subtype; /* VS_FORMAT_VBI */ | |
410 | u8 bFormatIndex; | |
411 | u32 VideoStandard; /* See KS_AnalogVideoStandard, NTSC = 1 */ | |
412 | u8 StartLine; /* NTSC Start = 10 */ | |
413 | u8 EndLine; /* NTSC = 21 */ | |
414 | u8 FieldRate; /* 60 for NTSC */ | |
25985edc | 415 | u8 bNumLines; /* Unused - scheduled for removal */ |
4d270cfb | 416 | } __attribute__((packed)); |
e8ce2f21 | 417 | |
4d270cfb | 418 | struct tmComResProbeCommit { |
e8ce2f21 ST |
419 | u16 bmHint; |
420 | u8 bFormatIndex; | |
421 | u8 bFrameIndex; | |
4d270cfb | 422 | } __attribute__((packed)); |
e48836b8 | 423 | |
4d270cfb | 424 | struct tmComResDebugSetLevel { |
e48836b8 | 425 | u32 dwDebugLevel; |
4d270cfb | 426 | } __attribute__((packed)); |
e48836b8 | 427 | |
4d270cfb | 428 | struct tmComResDebugGetData { |
e48836b8 ST |
429 | u32 dwResult; |
430 | u8 ucDebugData[256]; | |
4d270cfb | 431 | } __attribute__((packed)); |
e48836b8 | 432 | |
4d270cfb | 433 | struct tmFwInfoStruct { |
1247ff5c ST |
434 | u32 status; |
435 | u32 mode; | |
436 | u32 devicespec; | |
437 | u32 deviceinst; | |
438 | u32 CPULoad; | |
439 | u32 RemainHeap; | |
440 | u32 CPUClock; | |
441 | u32 RAMSpeed; | |
4d270cfb | 442 | } __attribute__((packed)); |