Linux Audio

Check our new training course

Loading...
  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 */
 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 decides 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));