xref: /OK3568_Linux_fs/kernel/drivers/usb/misc/sisusbvga/sisusb.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * sisusb - usb kernel driver for Net2280/SiS315 based USB2VGA dongles
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2005 by Thomas Winischhofer, Vienna, Austria
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * If distributed as part of the Linux kernel, this code is licensed under the
8*4882a593Smuzhiyun  * terms of the GPL v2.
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Otherwise, the following license terms apply:
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  * Redistribution and use in source and binary forms, with or without
13*4882a593Smuzhiyun  * modification, are permitted provided that the following conditions
14*4882a593Smuzhiyun  * are met:
15*4882a593Smuzhiyun  * 1) Redistributions of source code must retain the above copyright
16*4882a593Smuzhiyun  *    notice, this list of conditions and the following disclaimer.
17*4882a593Smuzhiyun  * 2) Redistributions in binary form must reproduce the above copyright
18*4882a593Smuzhiyun  *    notice, this list of conditions and the following disclaimer in the
19*4882a593Smuzhiyun  *    documentation and/or other materials provided with the distribution.
20*4882a593Smuzhiyun  * 3) The name of the author may not be used to endorse or promote products
21*4882a593Smuzhiyun  *    derived from this software without specific prior written permission.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
24*4882a593Smuzhiyun  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25*4882a593Smuzhiyun  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26*4882a593Smuzhiyun  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27*4882a593Smuzhiyun  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28*4882a593Smuzhiyun  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29*4882a593Smuzhiyun  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30*4882a593Smuzhiyun  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31*4882a593Smuzhiyun  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32*4882a593Smuzhiyun  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33*4882a593Smuzhiyun  *
34*4882a593Smuzhiyun  * Author:	Thomas Winischhofer <thomas@winischhofer.net>
35*4882a593Smuzhiyun  *
36*4882a593Smuzhiyun  */
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #ifndef _SISUSB_H_
39*4882a593Smuzhiyun #define _SISUSB_H_
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #include <linux/mutex.h>
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun /* Version Information */
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define SISUSB_VERSION		0
46*4882a593Smuzhiyun #define SISUSB_REVISION		0
47*4882a593Smuzhiyun #define SISUSB_PATCHLEVEL	8
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /* Include console and mode switching code? */
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #include <linux/console.h>
52*4882a593Smuzhiyun #include <linux/vt_kern.h>
53*4882a593Smuzhiyun #include "sisusb_struct.h"
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun /* USB related */
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #define SISUSB_MINOR		133	/* official */
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /* Size of the sisusb input/output buffers */
60*4882a593Smuzhiyun #define SISUSB_IBUF_SIZE  0x01000
61*4882a593Smuzhiyun #define SISUSB_OBUF_SIZE  0x10000	/* fixed */
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun #define NUMOBUFS 8		/* max number of output buffers/output URBs */
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /* About endianness:
66*4882a593Smuzhiyun  *
67*4882a593Smuzhiyun  * 1) I/O ports, PCI config registers. The read/write()
68*4882a593Smuzhiyun  *    calls emulate inX/outX. Hence, the data is
69*4882a593Smuzhiyun  *    expected/delivered in machine endiannes by this
70*4882a593Smuzhiyun  *    driver.
71*4882a593Smuzhiyun  * 2) Video memory. The data is copied 1:1. There is
72*4882a593Smuzhiyun  *    no swapping. Ever. This means for userland that
73*4882a593Smuzhiyun  *    the data has to be prepared properly. (Hint:
74*4882a593Smuzhiyun  *    think graphics data format, command queue,
75*4882a593Smuzhiyun  *    hardware cursor.)
76*4882a593Smuzhiyun  * 3) MMIO. Data is copied 1:1. MMIO must be swapped
77*4882a593Smuzhiyun  *    properly by userland.
78*4882a593Smuzhiyun  *
79*4882a593Smuzhiyun  */
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #ifdef __BIG_ENDIAN
82*4882a593Smuzhiyun #define SISUSB_CORRECT_ENDIANNESS_PACKET(p)		\
83*4882a593Smuzhiyun 	do {						\
84*4882a593Smuzhiyun 		p->header  = cpu_to_le16(p->header);	\
85*4882a593Smuzhiyun 		p->address = cpu_to_le32(p->address);	\
86*4882a593Smuzhiyun 		p->data    = cpu_to_le32(p->data);	\
87*4882a593Smuzhiyun 	} while(0)
88*4882a593Smuzhiyun #else
89*4882a593Smuzhiyun #define SISUSB_CORRECT_ENDIANNESS_PACKET(p)
90*4882a593Smuzhiyun #endif
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun struct sisusb_usb_data;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun struct sisusb_urb_context {	/* urb->context for outbound bulk URBs */
95*4882a593Smuzhiyun 	struct sisusb_usb_data *sisusb;
96*4882a593Smuzhiyun 	int urbindex;
97*4882a593Smuzhiyun 	int *actual_length;
98*4882a593Smuzhiyun };
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun struct sisusb_usb_data {
101*4882a593Smuzhiyun 	struct usb_device *sisusb_dev;
102*4882a593Smuzhiyun 	struct usb_interface *interface;
103*4882a593Smuzhiyun 	struct kref kref;
104*4882a593Smuzhiyun 	wait_queue_head_t wait_q;	/* for syncind and timeouts */
105*4882a593Smuzhiyun 	struct mutex lock;	/* general race avoidance */
106*4882a593Smuzhiyun 	unsigned int ifnum;	/* interface number of the USB device */
107*4882a593Smuzhiyun 	int minor;		/* minor (for logging clarity) */
108*4882a593Smuzhiyun 	int isopen;		/* !=0 if open */
109*4882a593Smuzhiyun 	int present;		/* !=0 if device is present on the bus */
110*4882a593Smuzhiyun 	int ready;		/* !=0 if device is ready for userland */
111*4882a593Smuzhiyun 	int numobufs;		/* number of obufs = number of out urbs */
112*4882a593Smuzhiyun 	char *obuf[NUMOBUFS], *ibuf;	/* transfer buffers */
113*4882a593Smuzhiyun 	int obufsize, ibufsize;
114*4882a593Smuzhiyun 	struct urb *sisurbout[NUMOBUFS];
115*4882a593Smuzhiyun 	struct urb *sisurbin;
116*4882a593Smuzhiyun 	unsigned char urbstatus[NUMOBUFS];
117*4882a593Smuzhiyun 	unsigned char completein;
118*4882a593Smuzhiyun 	struct sisusb_urb_context urbout_context[NUMOBUFS];
119*4882a593Smuzhiyun 	unsigned long flagb0;
120*4882a593Smuzhiyun 	unsigned long vrambase;	/* framebuffer base */
121*4882a593Smuzhiyun 	unsigned int vramsize;	/* framebuffer size (bytes) */
122*4882a593Smuzhiyun 	unsigned long mmiobase;
123*4882a593Smuzhiyun 	unsigned int mmiosize;
124*4882a593Smuzhiyun 	unsigned long ioportbase;
125*4882a593Smuzhiyun 	unsigned char devinit;	/* device initialized? */
126*4882a593Smuzhiyun 	unsigned char gfxinit;	/* graphics core initialized? */
127*4882a593Smuzhiyun 	unsigned short chipid, chipvendor;
128*4882a593Smuzhiyun 	unsigned short chiprevision;
129*4882a593Smuzhiyun #ifdef CONFIG_USB_SISUSBVGA_CON
130*4882a593Smuzhiyun 	struct SiS_Private *SiS_Pr;
131*4882a593Smuzhiyun 	unsigned long scrbuf;
132*4882a593Smuzhiyun 	unsigned int scrbuf_size;
133*4882a593Smuzhiyun 	int haveconsole, con_first, con_last;
134*4882a593Smuzhiyun 	int havethisconsole[MAX_NR_CONSOLES];
135*4882a593Smuzhiyun 	int textmodedestroyed;
136*4882a593Smuzhiyun 	unsigned int sisusb_num_columns;	/* real number, not vt's idea */
137*4882a593Smuzhiyun 	int cur_start_addr, con_rolled_over;
138*4882a593Smuzhiyun 	int sisusb_cursor_loc, bad_cursor_pos;
139*4882a593Smuzhiyun 	int sisusb_cursor_size_from;
140*4882a593Smuzhiyun 	int sisusb_cursor_size_to;
141*4882a593Smuzhiyun 	int current_font_height, current_font_512;
142*4882a593Smuzhiyun 	int font_backup_size, font_backup_height, font_backup_512;
143*4882a593Smuzhiyun 	char *font_backup;
144*4882a593Smuzhiyun 	int font_slot;
145*4882a593Smuzhiyun 	struct vc_data *sisusb_display_fg;
146*4882a593Smuzhiyun 	int is_gfx;
147*4882a593Smuzhiyun 	int con_blanked;
148*4882a593Smuzhiyun #endif
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #define to_sisusb_dev(d) container_of(d, struct sisusb_usb_data, kref)
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun /* USB transport related */
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun /* urbstatus */
156*4882a593Smuzhiyun #define SU_URB_BUSY   1
157*4882a593Smuzhiyun #define SU_URB_ALLOC  2
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /* Endpoints */
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun #define SISUSB_EP_GFX_IN	0x0e	/* gfx std packet out(0e)/in(8e) */
162*4882a593Smuzhiyun #define SISUSB_EP_GFX_OUT	0x0e
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun #define SISUSB_EP_GFX_BULK_OUT	0x01	/* gfx mem bulk out/in */
165*4882a593Smuzhiyun #define SISUSB_EP_GFX_BULK_IN	0x02	/* ? 2 is "OUT" ? */
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun #define SISUSB_EP_GFX_LBULK_OUT	0x03	/* gfx large mem bulk out */
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun #define SISUSB_EP_UNKNOWN_04	0x04	/* ? 4 is "OUT" ? - unused */
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun #define SISUSB_EP_BRIDGE_IN	0x0d	/* Net2280 out(0d)/in(8d) */
172*4882a593Smuzhiyun #define SISUSB_EP_BRIDGE_OUT	0x0d
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun #define SISUSB_TYPE_MEM		0
175*4882a593Smuzhiyun #define SISUSB_TYPE_IO		1
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun struct sisusb_packet {
178*4882a593Smuzhiyun 	unsigned short header;
179*4882a593Smuzhiyun 	u32 address;
180*4882a593Smuzhiyun 	u32 data;
181*4882a593Smuzhiyun } __attribute__ ((__packed__));
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun #define CLEARPACKET(packet) memset(packet, 0, 10)
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun /* PCI bridge related */
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun #define SISUSB_PCI_MEMBASE	0xd0000000
188*4882a593Smuzhiyun #define SISUSB_PCI_MMIOBASE	0xe4000000
189*4882a593Smuzhiyun #define SISUSB_PCI_IOPORTBASE	0x0000d000
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun #define SISUSB_PCI_PSEUDO_MEMBASE	0x10000000
192*4882a593Smuzhiyun #define SISUSB_PCI_PSEUDO_MMIOBASE	0x20000000
193*4882a593Smuzhiyun #define SISUSB_PCI_PSEUDO_IOPORTBASE	0x0000d000
194*4882a593Smuzhiyun #define SISUSB_PCI_PSEUDO_PCIBASE	0x00010000
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun #define SISUSB_PCI_MMIOSIZE	(128*1024)
197*4882a593Smuzhiyun #define SISUSB_PCI_PCONFSIZE	0x5c
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun /* graphics core related */
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun #define AROFFSET	0x40
202*4882a593Smuzhiyun #define ARROFFSET	0x41
203*4882a593Smuzhiyun #define GROFFSET	0x4e
204*4882a593Smuzhiyun #define SROFFSET	0x44
205*4882a593Smuzhiyun #define CROFFSET	0x54
206*4882a593Smuzhiyun #define MISCROFFSET	0x4c
207*4882a593Smuzhiyun #define MISCWOFFSET	0x42
208*4882a593Smuzhiyun #define INPUTSTATOFFSET 0x5A
209*4882a593Smuzhiyun #define PART1OFFSET	0x04
210*4882a593Smuzhiyun #define PART2OFFSET	0x10
211*4882a593Smuzhiyun #define PART3OFFSET	0x12
212*4882a593Smuzhiyun #define PART4OFFSET	0x14
213*4882a593Smuzhiyun #define PART5OFFSET	0x16
214*4882a593Smuzhiyun #define CAPTUREOFFSET	0x00
215*4882a593Smuzhiyun #define VIDEOOFFSET	0x02
216*4882a593Smuzhiyun #define COLREGOFFSET	0x48
217*4882a593Smuzhiyun #define PELMASKOFFSET	0x46
218*4882a593Smuzhiyun #define VGAENABLE	0x43
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun #define SISAR		SISUSB_PCI_IOPORTBASE + AROFFSET
221*4882a593Smuzhiyun #define SISARR		SISUSB_PCI_IOPORTBASE + ARROFFSET
222*4882a593Smuzhiyun #define SISGR		SISUSB_PCI_IOPORTBASE + GROFFSET
223*4882a593Smuzhiyun #define SISSR		SISUSB_PCI_IOPORTBASE + SROFFSET
224*4882a593Smuzhiyun #define SISCR		SISUSB_PCI_IOPORTBASE + CROFFSET
225*4882a593Smuzhiyun #define SISMISCR	SISUSB_PCI_IOPORTBASE + MISCROFFSET
226*4882a593Smuzhiyun #define SISMISCW	SISUSB_PCI_IOPORTBASE + MISCWOFFSET
227*4882a593Smuzhiyun #define SISINPSTAT	SISUSB_PCI_IOPORTBASE + INPUTSTATOFFSET
228*4882a593Smuzhiyun #define SISPART1	SISUSB_PCI_IOPORTBASE + PART1OFFSET
229*4882a593Smuzhiyun #define SISPART2	SISUSB_PCI_IOPORTBASE + PART2OFFSET
230*4882a593Smuzhiyun #define SISPART3	SISUSB_PCI_IOPORTBASE + PART3OFFSET
231*4882a593Smuzhiyun #define SISPART4	SISUSB_PCI_IOPORTBASE + PART4OFFSET
232*4882a593Smuzhiyun #define SISPART5	SISUSB_PCI_IOPORTBASE + PART5OFFSET
233*4882a593Smuzhiyun #define SISCAP		SISUSB_PCI_IOPORTBASE + CAPTUREOFFSET
234*4882a593Smuzhiyun #define SISVID		SISUSB_PCI_IOPORTBASE + VIDEOOFFSET
235*4882a593Smuzhiyun #define SISCOLIDXR	SISUSB_PCI_IOPORTBASE + COLREGOFFSET - 1
236*4882a593Smuzhiyun #define SISCOLIDX	SISUSB_PCI_IOPORTBASE + COLREGOFFSET
237*4882a593Smuzhiyun #define SISCOLDATA	SISUSB_PCI_IOPORTBASE + COLREGOFFSET + 1
238*4882a593Smuzhiyun #define SISCOL2IDX	SISPART5
239*4882a593Smuzhiyun #define SISCOL2DATA	SISPART5 + 1
240*4882a593Smuzhiyun #define SISPEL		SISUSB_PCI_IOPORTBASE + PELMASKOFFSET
241*4882a593Smuzhiyun #define SISVGAEN	SISUSB_PCI_IOPORTBASE + VGAENABLE
242*4882a593Smuzhiyun #define SISDACA		SISCOLIDX
243*4882a593Smuzhiyun #define SISDACD		SISCOLDATA
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun /* ioctl related */
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun /* Structure argument for SISUSB_GET_INFO ioctl  */
248*4882a593Smuzhiyun struct sisusb_info {
249*4882a593Smuzhiyun 	__u32 sisusb_id;	/* for identifying sisusb */
250*4882a593Smuzhiyun #define SISUSB_ID  0x53495355	/* Identify myself with 'SISU' */
251*4882a593Smuzhiyun 	__u8 sisusb_version;
252*4882a593Smuzhiyun 	__u8 sisusb_revision;
253*4882a593Smuzhiyun 	__u8 sisusb_patchlevel;
254*4882a593Smuzhiyun 	__u8 sisusb_gfxinit;	/* graphics core initialized? */
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	__u32 sisusb_vrambase;
257*4882a593Smuzhiyun 	__u32 sisusb_mmiobase;
258*4882a593Smuzhiyun 	__u32 sisusb_iobase;
259*4882a593Smuzhiyun 	__u32 sisusb_pcibase;
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	__u32 sisusb_vramsize;	/* framebuffer size in bytes */
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	__u32 sisusb_minor;
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun 	__u32 sisusb_fbdevactive;	/* != 0 if framebuffer device active */
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	__u32 sisusb_conactive;	/* != 0 if console driver active */
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun 	__u8 sisusb_reserved[28];	/* for future use */
270*4882a593Smuzhiyun };
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun struct sisusb_command {
273*4882a593Smuzhiyun 	__u8 operation;		/* see below */
274*4882a593Smuzhiyun 	__u8 data0;		/* operation dependent */
275*4882a593Smuzhiyun 	__u8 data1;		/* operation dependent */
276*4882a593Smuzhiyun 	__u8 data2;		/* operation dependent */
277*4882a593Smuzhiyun 	__u32 data3;		/* operation dependent */
278*4882a593Smuzhiyun 	__u32 data4;		/* for future use */
279*4882a593Smuzhiyun };
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun #define SUCMD_GET	0x01	/* for all: data0 = index, data3 = port */
282*4882a593Smuzhiyun #define SUCMD_SET	0x02	/* data1 = value */
283*4882a593Smuzhiyun #define SUCMD_SETOR	0x03	/* data1 = or */
284*4882a593Smuzhiyun #define SUCMD_SETAND	0x04	/* data1 = and */
285*4882a593Smuzhiyun #define SUCMD_SETANDOR	0x05	/* data1 = and, data2 = or */
286*4882a593Smuzhiyun #define SUCMD_SETMASK	0x06	/* data1 = data, data2 = mask */
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun #define SUCMD_CLRSCR	0x07	/* data0:1:2 = length, data3 = address */
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun #define SUCMD_HANDLETEXTMODE 0x08	/* Reset/destroy text mode */
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun #define SUCMD_SETMODE	0x09	/* Set a display mode (data3 = SiS mode) */
293*4882a593Smuzhiyun #define SUCMD_SETVESAMODE 0x0a	/* Set a display mode (data3 = VESA mode) */
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun #define SISUSB_COMMAND		_IOWR(0xF3,0x3D,struct sisusb_command)
296*4882a593Smuzhiyun #define SISUSB_GET_CONFIG_SIZE	_IOR(0xF3,0x3E,__u32)
297*4882a593Smuzhiyun #define SISUSB_GET_CONFIG	_IOR(0xF3,0x3F,struct sisusb_info)
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun #endif /* SISUSB_H */
300