xref: /openbmc/linux/drivers/media/pci/saa7164/saa7164-types.h (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
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   */
13  struct 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   */
33  struct 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  
47  struct tmComResBusDescr {
48  	u64	CommandRing;
49  	u64	ResponseRing;
50  	u32	CommandWrite;
51  	u32	CommandRead;
52  	u32	ResponseWrite;
53  	u32	ResponseRead;
54  };
55  
56  enum 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  
64  struct 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  
81  struct tmComResInfo {
82  	u8	id;
83  	u8	flags;
84  	u16	size;
85  	u32	command;
86  	u16	controlselector;
87  	u8	seqno;
88  } __attribute__((packed));
89  
90  enum 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  
101  struct 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  
110  struct tmDescriptor {
111  	u32	pathid;
112  	u32	size;
113  	void	*descriptor;
114  };
115  
116  struct tmComResDescrHeader {
117  	u8	len;
118  	u8	type;
119  	u8	subtype;
120  	u8	unitid;
121  } __attribute__((packed));
122  
123  struct 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  
135  struct tmComResGPIO {
136  	u32	pin;
137  	u8	state;
138  } __attribute__((packed));
139  
140  struct tmComResPathDescrHeader {
141  	u8	len;
142  	u8	type;
143  	u8	subtype;
144  	u8	pathid;
145  } __attribute__((packed));
146  
147  /* terminaltype */
148  enum 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  
158  struct 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  
169  struct 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  
181  enum 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  
192  struct 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  
206  struct 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  
218  struct tmStreamParameters {
219  	struct tmHWStreamParameters	HWStreamParameters;
220  	u64				qwDummyPageTablePhys;
221  	u64				*pDummyPageTableVirt;
222  };
223  
224  struct 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   */
263  struct 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 */
277  struct 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 */
287  struct 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)
301  struct tmComResEncVideoBitRate {
302  	u8	ucVideoBitRateMode;
303  	u32	dwVideoBitRate;
304  	u32	dwVideoBitRatePeak;
305  } __attribute__((packed));
306  
307  /* Video Encoder Aspect Ratio message */
308  struct 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)
319  struct tmComResEncVideoGopStructure {
320  	u8	ucGOPSize;	/* GOP Size 12, 15 */
321  	u8	ucRefFrameDist; /* Reference Frame Distance */
322  } __attribute__((packed));
323  
324  /* Encoder processor definition */
325  struct 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 */
344  struct 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 */
354  struct 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 */
364  struct tmComResEncAudioBitRate {
365  	u8	ucAudioBitRateMode;
366  	u32	dwAudioBitRate;
367  	u32	dwAudioBitRatePeak;
368  } __attribute__((packed));
369  
370  /* Tuner / AV Decoder messages */
371  struct tmComResTunerStandard {
372  	u8	std;
373  	u32	country;
374  } __attribute__((packed));
375  
376  struct tmComResTunerStandardAuto {
377  	u8	mode;
378  } __attribute__((packed));
379  
380  /* EEPROM definition for PS stream types */
381  struct 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 */
392  struct 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  
404  struct tmComResProbeCommit {
405  	u16	bmHint;
406  	u8	bFormatIndex;
407  	u8	bFrameIndex;
408  } __attribute__((packed));
409  
410  struct tmComResDebugSetLevel {
411  	u32	dwDebugLevel;
412  } __attribute__((packed));
413  
414  struct tmComResDebugGetData {
415  	u32	dwResult;
416  	u8	ucDebugData[256];
417  } __attribute__((packed));
418  
419  struct 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