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