xref: /openbmc/linux/drivers/usb/misc/sisusbvga/sisusb.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1*e90b8e91SNishad Kamdar /* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * sisusb - usb kernel driver for Net2280/SiS315 based USB2VGA dongles
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Copyright (C) 2005 by Thomas Winischhofer, Vienna, Austria
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  * If distributed as part of the Linux kernel, this code is licensed under the
81da177e4SLinus Torvalds  * terms of the GPL v2.
91da177e4SLinus Torvalds  *
101da177e4SLinus Torvalds  * Otherwise, the following license terms apply:
111da177e4SLinus Torvalds  *
121c1772a2SFelipe Balbi  * Redistribution and use in source and binary forms, with or without
131c1772a2SFelipe Balbi  * modification, are permitted provided that the following conditions
141c1772a2SFelipe Balbi  * are met:
151c1772a2SFelipe Balbi  * 1) Redistributions of source code must retain the above copyright
161c1772a2SFelipe Balbi  *    notice, this list of conditions and the following disclaimer.
171c1772a2SFelipe Balbi  * 2) Redistributions in binary form must reproduce the above copyright
181c1772a2SFelipe Balbi  *    notice, this list of conditions and the following disclaimer in the
191c1772a2SFelipe Balbi  *    documentation and/or other materials provided with the distribution.
201c1772a2SFelipe Balbi  * 3) The name of the author may not be used to endorse or promote products
211c1772a2SFelipe Balbi  *    derived from this software without specific prior written permission.
221c1772a2SFelipe Balbi  *
231c1772a2SFelipe Balbi  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
241c1772a2SFelipe Balbi  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
251c1772a2SFelipe Balbi  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
261c1772a2SFelipe Balbi  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
271c1772a2SFelipe Balbi  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
281c1772a2SFelipe Balbi  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
291c1772a2SFelipe Balbi  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
301c1772a2SFelipe Balbi  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
311c1772a2SFelipe Balbi  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
321c1772a2SFelipe Balbi  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
331da177e4SLinus Torvalds  *
341da177e4SLinus Torvalds  * Author:	Thomas Winischhofer <thomas@winischhofer.net>
351da177e4SLinus Torvalds  *
361da177e4SLinus Torvalds  */
371da177e4SLinus Torvalds 
381da177e4SLinus Torvalds #ifndef _SISUSB_H_
391da177e4SLinus Torvalds #define _SISUSB_H_
401da177e4SLinus Torvalds 
412682d27cSArjan van de Ven #include <linux/mutex.h>
422682d27cSArjan van de Ven 
431da177e4SLinus Torvalds /* Version Information */
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds #define SISUSB_VERSION		0
461da177e4SLinus Torvalds #define SISUSB_REVISION		0
471bbb4f20SThomas Winischhofer #define SISUSB_PATCHLEVEL	8
481bbb4f20SThomas Winischhofer 
491bbb4f20SThomas Winischhofer /* Include console and mode switching code? */
501bbb4f20SThomas Winischhofer 
511bbb4f20SThomas Winischhofer #include <linux/vt_kern.h>
521bbb4f20SThomas Winischhofer #include "sisusb_struct.h"
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds /* USB related */
551da177e4SLinus Torvalds 
561bbb4f20SThomas Winischhofer #define SISUSB_MINOR		133	/* official */
571da177e4SLinus Torvalds 
581da177e4SLinus Torvalds /* Size of the sisusb input/output buffers */
591da177e4SLinus Torvalds #define SISUSB_IBUF_SIZE  0x01000
601da177e4SLinus Torvalds #define SISUSB_OBUF_SIZE  0x10000	/* fixed */
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds #define NUMOBUFS 8		/* max number of output buffers/output URBs */
631da177e4SLinus Torvalds 
641da177e4SLinus Torvalds /* About endianness:
651da177e4SLinus Torvalds  *
661da177e4SLinus Torvalds  * 1) I/O ports, PCI config registers. The read/write()
671da177e4SLinus Torvalds  *    calls emulate inX/outX. Hence, the data is
681da177e4SLinus Torvalds  *    expected/delivered in machine endiannes by this
691da177e4SLinus Torvalds  *    driver.
701da177e4SLinus Torvalds  * 2) Video memory. The data is copied 1:1. There is
711da177e4SLinus Torvalds  *    no swapping. Ever. This means for userland that
721da177e4SLinus Torvalds  *    the data has to be prepared properly. (Hint:
731da177e4SLinus Torvalds  *    think graphics data format, command queue,
741da177e4SLinus Torvalds  *    hardware cursor.)
751da177e4SLinus Torvalds  * 3) MMIO. Data is copied 1:1. MMIO must be swapped
761da177e4SLinus Torvalds  *    properly by userland.
771da177e4SLinus Torvalds  *
781da177e4SLinus Torvalds  */
791da177e4SLinus Torvalds 
801da177e4SLinus Torvalds #ifdef __BIG_ENDIAN
811da177e4SLinus Torvalds #define SISUSB_CORRECT_ENDIANNESS_PACKET(p)		\
821da177e4SLinus Torvalds 	do {						\
831da177e4SLinus Torvalds 		p->header  = cpu_to_le16(p->header);	\
841da177e4SLinus Torvalds 		p->address = cpu_to_le32(p->address);	\
851da177e4SLinus Torvalds 		p->data    = cpu_to_le32(p->data);	\
861da177e4SLinus Torvalds 	} while(0)
871da177e4SLinus Torvalds #else
881da177e4SLinus Torvalds #define SISUSB_CORRECT_ENDIANNESS_PACKET(p)
891da177e4SLinus Torvalds #endif
901da177e4SLinus Torvalds 
911da177e4SLinus Torvalds struct sisusb_usb_data;
921da177e4SLinus Torvalds 
931da177e4SLinus Torvalds struct sisusb_urb_context {	/* urb->context for outbound bulk URBs */
941da177e4SLinus Torvalds 	struct sisusb_usb_data *sisusb;
951da177e4SLinus Torvalds 	int urbindex;
961da177e4SLinus Torvalds 	int *actual_length;
971da177e4SLinus Torvalds };
981da177e4SLinus Torvalds 
991da177e4SLinus Torvalds struct sisusb_usb_data {
1001da177e4SLinus Torvalds 	struct usb_device *sisusb_dev;
1011da177e4SLinus Torvalds 	struct usb_interface *interface;
1021da177e4SLinus Torvalds 	struct kref kref;
1031da177e4SLinus Torvalds 	wait_queue_head_t wait_q;	/* for syncind and timeouts */
1042682d27cSArjan van de Ven 	struct mutex lock;	/* general race avoidance */
1051da177e4SLinus Torvalds 	unsigned int ifnum;	/* interface number of the USB device */
1061da177e4SLinus Torvalds 	int minor;		/* minor (for logging clarity) */
1071da177e4SLinus Torvalds 	int isopen;		/* !=0 if open */
1081da177e4SLinus Torvalds 	int present;		/* !=0 if device is present on the bus */
1091da177e4SLinus Torvalds 	int ready;		/* !=0 if device is ready for userland */
1101da177e4SLinus Torvalds 	int numobufs;		/* number of obufs = number of out urbs */
1111da177e4SLinus Torvalds 	char *obuf[NUMOBUFS], *ibuf;	/* transfer buffers */
1121da177e4SLinus Torvalds 	int obufsize, ibufsize;
1131da177e4SLinus Torvalds 	struct urb *sisurbout[NUMOBUFS];
1141da177e4SLinus Torvalds 	struct urb *sisurbin;
1151da177e4SLinus Torvalds 	unsigned char urbstatus[NUMOBUFS];
1161da177e4SLinus Torvalds 	unsigned char completein;
1171da177e4SLinus Torvalds 	struct sisusb_urb_context urbout_context[NUMOBUFS];
1181da177e4SLinus Torvalds 	unsigned long flagb0;
1191da177e4SLinus Torvalds 	unsigned long vrambase;	/* framebuffer base */
1201da177e4SLinus Torvalds 	unsigned int vramsize;	/* framebuffer size (bytes) */
1211da177e4SLinus Torvalds 	unsigned long mmiobase;
1221da177e4SLinus Torvalds 	unsigned int mmiosize;
1231da177e4SLinus Torvalds 	unsigned long ioportbase;
1241da177e4SLinus Torvalds 	unsigned char devinit;	/* device initialized? */
1251da177e4SLinus Torvalds 	unsigned char gfxinit;	/* graphics core initialized? */
1261da177e4SLinus Torvalds 	unsigned short chipid, chipvendor;
1271da177e4SLinus Torvalds 	unsigned short chiprevision;
1281da177e4SLinus Torvalds };
1291da177e4SLinus Torvalds 
1301da177e4SLinus Torvalds #define to_sisusb_dev(d) container_of(d, struct sisusb_usb_data, kref)
1311da177e4SLinus Torvalds 
1321da177e4SLinus Torvalds /* USB transport related */
1331da177e4SLinus Torvalds 
1341da177e4SLinus Torvalds /* urbstatus */
1351da177e4SLinus Torvalds #define SU_URB_BUSY   1
1361da177e4SLinus Torvalds #define SU_URB_ALLOC  2
1371da177e4SLinus Torvalds 
1381da177e4SLinus Torvalds /* Endpoints */
1391da177e4SLinus Torvalds 
1401da177e4SLinus Torvalds #define SISUSB_EP_GFX_IN	0x0e	/* gfx std packet out(0e)/in(8e) */
1411da177e4SLinus Torvalds #define SISUSB_EP_GFX_OUT	0x0e
1421da177e4SLinus Torvalds 
1431da177e4SLinus Torvalds #define SISUSB_EP_GFX_BULK_OUT	0x01	/* gfx mem bulk out/in */
1441da177e4SLinus Torvalds #define SISUSB_EP_GFX_BULK_IN	0x02	/* ? 2 is "OUT" ? */
1451da177e4SLinus Torvalds 
1461da177e4SLinus Torvalds #define SISUSB_EP_GFX_LBULK_OUT	0x03	/* gfx large mem bulk out */
1471da177e4SLinus Torvalds 
1481da177e4SLinus Torvalds #define SISUSB_EP_UNKNOWN_04	0x04	/* ? 4 is "OUT" ? - unused */
1491da177e4SLinus Torvalds 
1501da177e4SLinus Torvalds #define SISUSB_EP_BRIDGE_IN	0x0d	/* Net2280 out(0d)/in(8d) */
1511da177e4SLinus Torvalds #define SISUSB_EP_BRIDGE_OUT	0x0d
1521da177e4SLinus Torvalds 
1531da177e4SLinus Torvalds #define SISUSB_TYPE_MEM		0
1541da177e4SLinus Torvalds #define SISUSB_TYPE_IO		1
1551da177e4SLinus Torvalds 
1561da177e4SLinus Torvalds struct sisusb_packet {
1571da177e4SLinus Torvalds 	unsigned short header;
1581da177e4SLinus Torvalds 	u32 address;
1591da177e4SLinus Torvalds 	u32 data;
1601da177e4SLinus Torvalds } __attribute__ ((__packed__));
1611da177e4SLinus Torvalds 
1621da177e4SLinus Torvalds #define CLEARPACKET(packet) memset(packet, 0, 10)
1631da177e4SLinus Torvalds 
1641da177e4SLinus Torvalds /* PCI bridge related */
1651da177e4SLinus Torvalds 
1661da177e4SLinus Torvalds #define SISUSB_PCI_MEMBASE	0xd0000000
1671da177e4SLinus Torvalds #define SISUSB_PCI_MMIOBASE	0xe4000000
1681da177e4SLinus Torvalds #define SISUSB_PCI_IOPORTBASE	0x0000d000
1691da177e4SLinus Torvalds 
1701da177e4SLinus Torvalds #define SISUSB_PCI_PSEUDO_MEMBASE	0x10000000
1711da177e4SLinus Torvalds #define SISUSB_PCI_PSEUDO_MMIOBASE	0x20000000
1721da177e4SLinus Torvalds #define SISUSB_PCI_PSEUDO_IOPORTBASE	0x0000d000
1731da177e4SLinus Torvalds #define SISUSB_PCI_PSEUDO_PCIBASE	0x00010000
1741da177e4SLinus Torvalds 
1751da177e4SLinus Torvalds #define SISUSB_PCI_MMIOSIZE	(128*1024)
1761da177e4SLinus Torvalds #define SISUSB_PCI_PCONFSIZE	0x5c
1771da177e4SLinus Torvalds 
1781da177e4SLinus Torvalds /* graphics core related */
1791da177e4SLinus Torvalds 
1801da177e4SLinus Torvalds #define AROFFSET	0x40
1811da177e4SLinus Torvalds #define ARROFFSET	0x41
1821da177e4SLinus Torvalds #define GROFFSET	0x4e
1831da177e4SLinus Torvalds #define SROFFSET	0x44
1841da177e4SLinus Torvalds #define CROFFSET	0x54
1851da177e4SLinus Torvalds #define MISCROFFSET	0x4c
1861da177e4SLinus Torvalds #define MISCWOFFSET	0x42
1871da177e4SLinus Torvalds #define INPUTSTATOFFSET 0x5A
1881da177e4SLinus Torvalds #define PART1OFFSET	0x04
1891da177e4SLinus Torvalds #define PART2OFFSET	0x10
1901da177e4SLinus Torvalds #define PART3OFFSET	0x12
1911da177e4SLinus Torvalds #define PART4OFFSET	0x14
1921da177e4SLinus Torvalds #define PART5OFFSET	0x16
1931da177e4SLinus Torvalds #define CAPTUREOFFSET	0x00
1941da177e4SLinus Torvalds #define VIDEOOFFSET	0x02
1951da177e4SLinus Torvalds #define COLREGOFFSET	0x48
1961da177e4SLinus Torvalds #define PELMASKOFFSET	0x46
1971da177e4SLinus Torvalds #define VGAENABLE	0x43
1981da177e4SLinus Torvalds 
1991da177e4SLinus Torvalds #define SISAR		SISUSB_PCI_IOPORTBASE + AROFFSET
2001da177e4SLinus Torvalds #define SISARR		SISUSB_PCI_IOPORTBASE + ARROFFSET
2011da177e4SLinus Torvalds #define SISGR		SISUSB_PCI_IOPORTBASE + GROFFSET
2021da177e4SLinus Torvalds #define SISSR		SISUSB_PCI_IOPORTBASE + SROFFSET
2031da177e4SLinus Torvalds #define SISCR		SISUSB_PCI_IOPORTBASE + CROFFSET
2041da177e4SLinus Torvalds #define SISMISCR	SISUSB_PCI_IOPORTBASE + MISCROFFSET
2051da177e4SLinus Torvalds #define SISMISCW	SISUSB_PCI_IOPORTBASE + MISCWOFFSET
2061da177e4SLinus Torvalds #define SISINPSTAT	SISUSB_PCI_IOPORTBASE + INPUTSTATOFFSET
2071da177e4SLinus Torvalds #define SISPART1	SISUSB_PCI_IOPORTBASE + PART1OFFSET
2081da177e4SLinus Torvalds #define SISPART2	SISUSB_PCI_IOPORTBASE + PART2OFFSET
2091da177e4SLinus Torvalds #define SISPART3	SISUSB_PCI_IOPORTBASE + PART3OFFSET
2101da177e4SLinus Torvalds #define SISPART4	SISUSB_PCI_IOPORTBASE + PART4OFFSET
2111da177e4SLinus Torvalds #define SISPART5	SISUSB_PCI_IOPORTBASE + PART5OFFSET
2121da177e4SLinus Torvalds #define SISCAP		SISUSB_PCI_IOPORTBASE + CAPTUREOFFSET
2131da177e4SLinus Torvalds #define SISVID		SISUSB_PCI_IOPORTBASE + VIDEOOFFSET
2141da177e4SLinus Torvalds #define SISCOLIDXR	SISUSB_PCI_IOPORTBASE + COLREGOFFSET - 1
2151da177e4SLinus Torvalds #define SISCOLIDX	SISUSB_PCI_IOPORTBASE + COLREGOFFSET
2161da177e4SLinus Torvalds #define SISCOLDATA	SISUSB_PCI_IOPORTBASE + COLREGOFFSET + 1
2171da177e4SLinus Torvalds #define SISCOL2IDX	SISPART5
2181da177e4SLinus Torvalds #define SISCOL2DATA	SISPART5 + 1
2191da177e4SLinus Torvalds #define SISPEL		SISUSB_PCI_IOPORTBASE + PELMASKOFFSET
2201da177e4SLinus Torvalds #define SISVGAEN	SISUSB_PCI_IOPORTBASE + VGAENABLE
2211da177e4SLinus Torvalds #define SISDACA		SISCOLIDX
2221da177e4SLinus Torvalds #define SISDACD		SISCOLDATA
2231da177e4SLinus Torvalds 
2241da177e4SLinus Torvalds /* ioctl related */
2251da177e4SLinus Torvalds 
2261da177e4SLinus Torvalds /* Structure argument for SISUSB_GET_INFO ioctl  */
2271da177e4SLinus Torvalds struct sisusb_info {
2281da177e4SLinus Torvalds 	__u32 sisusb_id;	/* for identifying sisusb */
2291da177e4SLinus Torvalds #define SISUSB_ID  0x53495355	/* Identify myself with 'SISU' */
2301da177e4SLinus Torvalds 	__u8 sisusb_version;
2311da177e4SLinus Torvalds 	__u8 sisusb_revision;
2321da177e4SLinus Torvalds 	__u8 sisusb_patchlevel;
2331da177e4SLinus Torvalds 	__u8 sisusb_gfxinit;	/* graphics core initialized? */
2341da177e4SLinus Torvalds 
2351da177e4SLinus Torvalds 	__u32 sisusb_vrambase;
2361da177e4SLinus Torvalds 	__u32 sisusb_mmiobase;
2371da177e4SLinus Torvalds 	__u32 sisusb_iobase;
2381da177e4SLinus Torvalds 	__u32 sisusb_pcibase;
2391da177e4SLinus Torvalds 
2401da177e4SLinus Torvalds 	__u32 sisusb_vramsize;	/* framebuffer size in bytes */
2411da177e4SLinus Torvalds 
2421da177e4SLinus Torvalds 	__u32 sisusb_minor;
2431da177e4SLinus Torvalds 
2441da177e4SLinus Torvalds 	__u32 sisusb_fbdevactive;	/* != 0 if framebuffer device active */
2451da177e4SLinus Torvalds 
2461bbb4f20SThomas Winischhofer 	__u32 sisusb_conactive;	/* != 0 if console driver active */
2471bbb4f20SThomas Winischhofer 
2481bbb4f20SThomas Winischhofer 	__u8 sisusb_reserved[28];	/* for future use */
2491da177e4SLinus Torvalds };
2501da177e4SLinus Torvalds 
2511da177e4SLinus Torvalds struct sisusb_command {
2521da177e4SLinus Torvalds 	__u8 operation;		/* see below */
2531da177e4SLinus Torvalds 	__u8 data0;		/* operation dependent */
2541da177e4SLinus Torvalds 	__u8 data1;		/* operation dependent */
2551da177e4SLinus Torvalds 	__u8 data2;		/* operation dependent */
2561da177e4SLinus Torvalds 	__u32 data3;		/* operation dependent */
2571da177e4SLinus Torvalds 	__u32 data4;		/* for future use */
2581da177e4SLinus Torvalds };
2591da177e4SLinus Torvalds 
2601da177e4SLinus Torvalds #define SUCMD_GET	0x01	/* for all: data0 = index, data3 = port */
2611da177e4SLinus Torvalds #define SUCMD_SET	0x02	/* data1 = value */
2621da177e4SLinus Torvalds #define SUCMD_SETOR	0x03	/* data1 = or */
2631da177e4SLinus Torvalds #define SUCMD_SETAND	0x04	/* data1 = and */
2641da177e4SLinus Torvalds #define SUCMD_SETANDOR	0x05	/* data1 = and, data2 = or */
2651da177e4SLinus Torvalds #define SUCMD_SETMASK	0x06	/* data1 = data, data2 = mask */
2661da177e4SLinus Torvalds 
2671da177e4SLinus Torvalds #define SUCMD_CLRSCR	0x07	/* data0:1:2 = length, data3 = address */
2681da177e4SLinus Torvalds 
2691bbb4f20SThomas Winischhofer #define SUCMD_HANDLETEXTMODE 0x08	/* Reset/destroy text mode */
2701bbb4f20SThomas Winischhofer 
2711bbb4f20SThomas Winischhofer #define SUCMD_SETMODE	0x09	/* Set a display mode (data3 = SiS mode) */
2721bbb4f20SThomas Winischhofer #define SUCMD_SETVESAMODE 0x0a	/* Set a display mode (data3 = VESA mode) */
2731bbb4f20SThomas Winischhofer 
2741da177e4SLinus Torvalds #define SISUSB_COMMAND		_IOWR(0xF3,0x3D,struct sisusb_command)
2751da177e4SLinus Torvalds #define SISUSB_GET_CONFIG_SIZE	_IOR(0xF3,0x3E,__u32)
2761da177e4SLinus Torvalds #define SISUSB_GET_CONFIG	_IOR(0xF3,0x3F,struct sisusb_info)
2771da177e4SLinus Torvalds 
2781da177e4SLinus Torvalds #endif /* SISUSB_H */
279