sisusb.h 10.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*
 * sisusb - usb kernel driver for Net2280/SiS315 based USB2VGA dongles
 *
 * Copyright (C) 2005 by Thomas Winischhofer, Vienna, Austria
 *
 * If distributed as part of the Linux kernel, this code is licensed under the
 * terms of the GPL v2.
 *
 * Otherwise, the following license terms apply:
 *
 * * Redistribution and use in source and binary forms, with or without
 * * modification, are permitted provided that the following conditions
 * * are met:
 * * 1) Redistributions of source code must retain the above copyright
 * *    notice, this list of conditions and the following disclaimer.
 * * 2) Redistributions in binary form must reproduce the above copyright
 * *    notice, this list of conditions and the following disclaimer in the
 * *    documentation and/or other materials provided with the distribution.
 * * 3) The name of the author may not be used to endorse or promote products
 * *    derived from this software without specific prior written permission.
 * *
 * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR
 * * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
33
 * Author:	Thomas Winischhofer <thomas@winischhofer.net>
L
Linus Torvalds 已提交
34 35 36 37 38 39 40 41 42 43
 *
 */

#ifndef _SISUSB_H_
#define _SISUSB_H_

#ifdef CONFIG_COMPAT
#define SISUSB_NEW_CONFIG_COMPAT
#endif

44 45
#include <linux/mutex.h>

46 47 48
/* For older kernels, support for text consoles is by default
 * off. To ensable text console support, change the following:
 */
49
/* #define CONFIG_USB_SISUSBVGA_CON */
50

L
Linus Torvalds 已提交
51 52 53
/* Version Information */

#define SISUSB_VERSION		0
54
#define SISUSB_REVISION		0
55 56 57 58 59 60 61 62 63 64 65
#define SISUSB_PATCHLEVEL	8

/* Include console and mode switching code? */

#ifdef CONFIG_USB_SISUSBVGA_CON
#define INCL_SISUSB_CON		1
#endif

#include <linux/console.h>
#include <linux/vt_kern.h>
#include "sisusb_struct.h"
L
Linus Torvalds 已提交
66 67 68

/* USB related */

69
#define SISUSB_MINOR		133	/* official */
L
Linus Torvalds 已提交
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

/* Size of the sisusb input/output buffers */
#define SISUSB_IBUF_SIZE  0x01000
#define SISUSB_OBUF_SIZE  0x10000	/* fixed */

#define NUMOBUFS 8			/* max number of output buffers/output URBs */

/* About endianness:
 *
 * 1) I/O ports, PCI config registers. The read/write()
 *    calls emulate inX/outX. Hence, the data is
 *    expected/delivered in machine endiannes by this
 *    driver.
 * 2) Video memory. The data is copied 1:1. There is
 *    no swapping. Ever. This means for userland that
 *    the data has to be prepared properly. (Hint:
 *    think graphics data format, command queue,
 *    hardware cursor.)
 * 3) MMIO. Data is copied 1:1. MMIO must be swapped
 *    properly by userland.
 *
 */

#ifdef __BIG_ENDIAN
94
#define SISUSB_CORRECT_ENDIANNESS_PACKET(p)		\
L
Linus Torvalds 已提交
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
	do {						\
		p->header  = cpu_to_le16(p->header);	\
		p->address = cpu_to_le32(p->address);	\
		p->data    = cpu_to_le32(p->data);	\
	} while(0)
#else
#define SISUSB_CORRECT_ENDIANNESS_PACKET(p)
#endif

struct sisusb_usb_data;

struct sisusb_urb_context {		/* urb->context for outbound bulk URBs */
	struct sisusb_usb_data *sisusb;
	int urbindex;
	int *actual_length;
};

struct sisusb_usb_data {
	struct usb_device *sisusb_dev;
	struct usb_interface *interface;
	struct kref kref;
	wait_queue_head_t wait_q;	/* for syncind and timeouts */
117
	struct mutex lock;		/* general race avoidance */
L
Linus Torvalds 已提交
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
	unsigned int ifnum;		/* interface number of the USB device */
	int minor;			/* minor (for logging clarity) */
	int isopen;			/* !=0 if open */
	int present;			/* !=0 if device is present on the bus */
	int ready;			/* !=0 if device is ready for userland */
#ifdef SISUSB_OLD_CONFIG_COMPAT
	int ioctl32registered;
#endif
	int numobufs;			/* number of obufs = number of out urbs */
	char *obuf[NUMOBUFS], *ibuf;	/* transfer buffers */
	int obufsize, ibufsize;
	dma_addr_t transfer_dma_out[NUMOBUFS];
	dma_addr_t transfer_dma_in;
	struct urb *sisurbout[NUMOBUFS];
	struct urb *sisurbin;
	unsigned char urbstatus[NUMOBUFS];
	unsigned char completein;
	struct sisusb_urb_context urbout_context[NUMOBUFS];
	unsigned long flagb0;
	unsigned long vrambase;		/* framebuffer base */
	unsigned int vramsize;		/* framebuffer size (bytes) */
	unsigned long mmiobase;
	unsigned int mmiosize;
	unsigned long ioportbase;
	unsigned char devinit;		/* device initialized? */
	unsigned char gfxinit;		/* graphics core initialized? */
	unsigned short chipid, chipvendor;
	unsigned short chiprevision;
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
#ifdef INCL_SISUSB_CON
	struct SiS_Private *SiS_Pr;
	unsigned long scrbuf;
	unsigned int scrbuf_size;
	int haveconsole, con_first, con_last;
	int havethisconsole[MAX_NR_CONSOLES];
	int textmodedestroyed;
	unsigned int sisusb_num_columns; /* real number, not vt's idea */
	int cur_start_addr, con_rolled_over;
	int sisusb_cursor_loc, bad_cursor_pos;
	int sisusb_cursor_size_from;
	int sisusb_cursor_size_to;
	int current_font_height, current_font_512;
	int font_backup_size, font_backup_height, font_backup_512;
	char *font_backup;
	int font_slot;
	struct vc_data *sisusb_display_fg;
	int is_gfx;
	int con_blanked;
#endif
L
Linus Torvalds 已提交
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
};

#define to_sisusb_dev(d) container_of(d, struct sisusb_usb_data, kref)

/* USB transport related */

/* urbstatus */
#define SU_URB_BUSY   1
#define SU_URB_ALLOC  2

/* Endpoints */

#define SISUSB_EP_GFX_IN	0x0e	/* gfx std packet out(0e)/in(8e) */
#define SISUSB_EP_GFX_OUT	0x0e

#define SISUSB_EP_GFX_BULK_OUT	0x01	/* gfx mem bulk out/in */
#define SISUSB_EP_GFX_BULK_IN	0x02	/* ? 2 is "OUT" ? */

#define SISUSB_EP_GFX_LBULK_OUT	0x03	/* gfx large mem bulk out */

#define SISUSB_EP_UNKNOWN_04	0x04	/* ? 4 is "OUT" ? - unused */

#define SISUSB_EP_BRIDGE_IN	0x0d	/* Net2280 out(0d)/in(8d) */
#define SISUSB_EP_BRIDGE_OUT	0x0d

#define SISUSB_TYPE_MEM		0
#define SISUSB_TYPE_IO		1

struct sisusb_packet {
	unsigned short header;
	u32 address;
	u32 data;
} __attribute__((__packed__));

#define CLEARPACKET(packet) memset(packet, 0, 10)

/* PCI bridge related */

#define SISUSB_PCI_MEMBASE	0xd0000000
#define SISUSB_PCI_MMIOBASE	0xe4000000
#define SISUSB_PCI_IOPORTBASE	0x0000d000

#define SISUSB_PCI_PSEUDO_MEMBASE	0x10000000
#define SISUSB_PCI_PSEUDO_MMIOBASE	0x20000000
#define SISUSB_PCI_PSEUDO_IOPORTBASE	0x0000d000
#define SISUSB_PCI_PSEUDO_PCIBASE	0x00010000

#define SISUSB_PCI_MMIOSIZE	(128*1024)
#define SISUSB_PCI_PCONFSIZE	0x5c

/* graphics core related */

#define AROFFSET	0x40
#define ARROFFSET	0x41
#define GROFFSET	0x4e
#define SROFFSET	0x44
#define CROFFSET	0x54
#define MISCROFFSET	0x4c
#define MISCWOFFSET	0x42
#define INPUTSTATOFFSET 0x5A
#define PART1OFFSET	0x04
#define PART2OFFSET	0x10
#define PART3OFFSET	0x12
#define PART4OFFSET	0x14
#define PART5OFFSET	0x16
#define CAPTUREOFFSET	0x00
#define VIDEOOFFSET	0x02
#define COLREGOFFSET	0x48
#define PELMASKOFFSET	0x46
#define VGAENABLE	0x43

#define SISAR		SISUSB_PCI_IOPORTBASE + AROFFSET
#define SISARR		SISUSB_PCI_IOPORTBASE + ARROFFSET
#define SISGR		SISUSB_PCI_IOPORTBASE + GROFFSET
#define SISSR		SISUSB_PCI_IOPORTBASE + SROFFSET
#define SISCR		SISUSB_PCI_IOPORTBASE + CROFFSET
#define SISMISCR	SISUSB_PCI_IOPORTBASE + MISCROFFSET
#define SISMISCW	SISUSB_PCI_IOPORTBASE + MISCWOFFSET
#define SISINPSTAT	SISUSB_PCI_IOPORTBASE + INPUTSTATOFFSET
#define SISPART1	SISUSB_PCI_IOPORTBASE + PART1OFFSET
#define SISPART2	SISUSB_PCI_IOPORTBASE + PART2OFFSET
#define SISPART3	SISUSB_PCI_IOPORTBASE + PART3OFFSET
#define SISPART4	SISUSB_PCI_IOPORTBASE + PART4OFFSET
#define SISPART5	SISUSB_PCI_IOPORTBASE + PART5OFFSET
#define SISCAP		SISUSB_PCI_IOPORTBASE + CAPTUREOFFSET
#define SISVID		SISUSB_PCI_IOPORTBASE + VIDEOOFFSET
#define SISCOLIDXR	SISUSB_PCI_IOPORTBASE + COLREGOFFSET - 1
#define SISCOLIDX	SISUSB_PCI_IOPORTBASE + COLREGOFFSET
#define SISCOLDATA	SISUSB_PCI_IOPORTBASE + COLREGOFFSET + 1
#define SISCOL2IDX	SISPART5
#define SISCOL2DATA	SISPART5 + 1
#define SISPEL		SISUSB_PCI_IOPORTBASE + PELMASKOFFSET
#define SISVGAEN	SISUSB_PCI_IOPORTBASE + VGAENABLE
#define SISDACA		SISCOLIDX
#define SISDACD		SISCOLDATA

/* ioctl related */

/* Structure argument for SISUSB_GET_INFO ioctl  */
struct sisusb_info {
	__u32	sisusb_id;		/* for identifying sisusb */
#define SISUSB_ID  0x53495355		/* Identify myself with 'SISU' */
	__u8	sisusb_version;
	__u8	sisusb_revision;
	__u8	sisusb_patchlevel;
	__u8	sisusb_gfxinit;		/* graphics core initialized? */

	__u32	sisusb_vrambase;
	__u32	sisusb_mmiobase;
	__u32	sisusb_iobase;
	__u32	sisusb_pcibase;

	__u32	sisusb_vramsize;	/* framebuffer size in bytes */

	__u32	sisusb_minor;

	__u32   sisusb_fbdevactive;	/* != 0 if framebuffer device active */

284 285 286
	__u32   sisusb_conactive;	/* != 0 if console driver active */

	__u8	sisusb_reserved[28];	/* for future use */
L
Linus Torvalds 已提交
287 288 289 290 291 292 293 294 295 296 297
};

struct sisusb_command {
	__u8   operation;	/* see below */
	__u8   data0;		/* operation dependent */
	__u8   data1;		/* operation dependent */
	__u8   data2;		/* operation dependent */
	__u32  data3;		/* operation dependent */
	__u32  data4;		/* for future use */
};

298 299 300 301 302 303
#define SUCMD_GET	0x01	/* for all: data0 = index, data3 = port */
#define SUCMD_SET	0x02	/* data1 = value */
#define SUCMD_SETOR	0x03	/* data1 = or */
#define SUCMD_SETAND	0x04	/* data1 = and */
#define SUCMD_SETANDOR	0x05	/* data1 = and, data2 = or */
#define SUCMD_SETMASK	0x06	/* data1 = data, data2 = mask */
L
Linus Torvalds 已提交
304

305 306 307 308 309 310
#define SUCMD_CLRSCR	0x07	/* data0:1:2 = length, data3 = address */

#define SUCMD_HANDLETEXTMODE 0x08 /* Reset/destroy text mode */

#define SUCMD_SETMODE	0x09	/* Set a display mode (data3 = SiS mode) */
#define SUCMD_SETVESAMODE 0x0a	/* Set a display mode (data3 = VESA mode) */
L
Linus Torvalds 已提交
311 312

#define SISUSB_COMMAND		_IOWR(0xF3,0x3D,struct sisusb_command)
313 314 315
#define SISUSB_GET_CONFIG_SIZE	_IOR(0xF3,0x3E,__u32)
#define SISUSB_GET_CONFIG	_IOR(0xF3,0x3F,struct sisusb_info)

L
Linus Torvalds 已提交
316 317 318

#endif /* SISUSB_H */