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