1/*
2 *  Driver for the NXP SAA7164 PCIe bridge
3 *
4 *  Copyright (c) 2010-2015 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 __iomem *m_pdwSetRing;
82	u32	m_dwSizeSetRing;
83	u8 __iomem *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