linux/drivers/media/pci/saa7164/saa7164-types.h
<<
>>
Prefs
   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 structues 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 decies 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