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 struct 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 */ 47 struct 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 61 struct tmComResBusDescr { 62 u64 CommandRing; 63 u64 ResponseRing; 64 u32 CommandWrite; 65 u32 CommandRead; 66 u32 ResponseWrite; 67 u32 ResponseRead; 68 }; 69 70 enum 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 78 struct 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 95 struct tmComResInfo { 96 u8 id; 97 u8 flags; 98 u16 size; 99 u32 command; 100 u16 controlselector; 101 u8 seqno; 102 } __attribute__((packed)); 103 104 enum 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 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 struct tmDescriptor { 125 u32 pathid; 126 u32 size; 127 void *descriptor; 128 }; 129 130 struct tmComResDescrHeader { 131 u8 len; 132 u8 type; 133 u8 subtype; 134 u8 unitid; 135 } __attribute__((packed)); 136 137 struct 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 149 struct tmComResGPIO { 150 u32 pin; 151 u8 state; 152 } __attribute__((packed)); 153 154 struct tmComResPathDescrHeader { 155 u8 len; 156 u8 type; 157 u8 subtype; 158 u8 pathid; 159 } __attribute__((packed)); 160 161 /* terminaltype */ 162 enum 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 172 struct 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 183 struct 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 195 enum 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 206 struct 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 220 struct 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 232 struct tmStreamParameters { 233 struct tmHWStreamParameters HWStreamParameters; 234 u64 qwDummyPageTablePhys; 235 u64 *pDummyPageTableVirt; 236 }; 237 238 struct 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 */ 277 struct 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 */ 291 struct 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 */ 301 struct 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) 315 struct tmComResEncVideoBitRate { 316 u8 ucVideoBitRateMode; 317 u32 dwVideoBitRate; 318 u32 dwVideoBitRatePeak; 319 } __attribute__((packed)); 320 321 /* Video Encoder Aspect Ratio message */ 322 struct 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) 333 struct tmComResEncVideoGopStructure { 334 u8 ucGOPSize; /* GOP Size 12, 15 */ 335 u8 ucRefFrameDist; /* Reference Frame Distance */ 336 } __attribute__((packed)); 337 338 /* Encoder processor definition */ 339 struct 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 */ 358 struct 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 */ 368 struct 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 */ 378 struct tmComResEncAudioBitRate { 379 u8 ucAudioBitRateMode; 380 u32 dwAudioBitRate; 381 u32 dwAudioBitRatePeak; 382 } __attribute__((packed)); 383 384 /* Tuner / AV Decoder messages */ 385 struct tmComResTunerStandard { 386 u8 std; 387 u32 country; 388 } __attribute__((packed)); 389 390 struct tmComResTunerStandardAuto { 391 u8 mode; 392 } __attribute__((packed)); 393 394 /* EEPROM definition for PS stream types */ 395 struct 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 */ 406 struct 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 418 struct tmComResProbeCommit { 419 u16 bmHint; 420 u8 bFormatIndex; 421 u8 bFrameIndex; 422 } __attribute__((packed)); 423 424 struct tmComResDebugSetLevel { 425 u32 dwDebugLevel; 426 } __attribute__((packed)); 427 428 struct tmComResDebugGetData { 429 u32 dwResult; 430 u8 ucDebugData[256]; 431 } __attribute__((packed)); 432 433 struct 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