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