1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * SiS 300/540/630[S]/730[S], 4*4882a593Smuzhiyun * SiS 315[E|PRO]/550/[M]65x/[M]661[F|M]X/740/[M]741[GX]/330/[M]76x[GX], 5*4882a593Smuzhiyun * XGI V3XT/V5/V8, Z7 6*4882a593Smuzhiyun * frame buffer driver for Linux kernels >=2.4.14 and >=2.6.3 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Copyright (C) 2001-2005 Thomas Winischhofer, Vienna, Austria. 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifndef _SIS_H_ 12*4882a593Smuzhiyun #define _SIS_H_ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include <video/sisfb.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include "vgatypes.h" 17*4882a593Smuzhiyun #include "vstruct.h" 18*4882a593Smuzhiyun #include "init.h" 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define VER_MAJOR 1 21*4882a593Smuzhiyun #define VER_MINOR 8 22*4882a593Smuzhiyun #define VER_LEVEL 9 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #include <linux/spinlock.h> 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #ifdef CONFIG_COMPAT 27*4882a593Smuzhiyun #define SIS_NEW_CONFIG_COMPAT 28*4882a593Smuzhiyun #endif /* CONFIG_COMPAT */ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #undef SISFBDEBUG 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #ifdef SISFBDEBUG 33*4882a593Smuzhiyun #define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __func__ , ## args) 34*4882a593Smuzhiyun #define TWDEBUG(x) printk(KERN_INFO x "\n"); 35*4882a593Smuzhiyun #else 36*4882a593Smuzhiyun #define DPRINTK(fmt, args...) 37*4882a593Smuzhiyun #define TWDEBUG(x) 38*4882a593Smuzhiyun #endif 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define SISFAIL(x) do { printk(x "\n"); return -EINVAL; } while(0) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* To be included in pci_ids.h */ 43*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_SI_650_VGA 44*4882a593Smuzhiyun #define PCI_DEVICE_ID_SI_650_VGA 0x6325 45*4882a593Smuzhiyun #endif 46*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_SI_650 47*4882a593Smuzhiyun #define PCI_DEVICE_ID_SI_650 0x0650 48*4882a593Smuzhiyun #endif 49*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_SI_651 50*4882a593Smuzhiyun #define PCI_DEVICE_ID_SI_651 0x0651 51*4882a593Smuzhiyun #endif 52*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_SI_740 53*4882a593Smuzhiyun #define PCI_DEVICE_ID_SI_740 0x0740 54*4882a593Smuzhiyun #endif 55*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_SI_330 56*4882a593Smuzhiyun #define PCI_DEVICE_ID_SI_330 0x0330 57*4882a593Smuzhiyun #endif 58*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_SI_660_VGA 59*4882a593Smuzhiyun #define PCI_DEVICE_ID_SI_660_VGA 0x6330 60*4882a593Smuzhiyun #endif 61*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_SI_661 62*4882a593Smuzhiyun #define PCI_DEVICE_ID_SI_661 0x0661 63*4882a593Smuzhiyun #endif 64*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_SI_741 65*4882a593Smuzhiyun #define PCI_DEVICE_ID_SI_741 0x0741 66*4882a593Smuzhiyun #endif 67*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_SI_660 68*4882a593Smuzhiyun #define PCI_DEVICE_ID_SI_660 0x0660 69*4882a593Smuzhiyun #endif 70*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_SI_760 71*4882a593Smuzhiyun #define PCI_DEVICE_ID_SI_760 0x0760 72*4882a593Smuzhiyun #endif 73*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_SI_761 74*4882a593Smuzhiyun #define PCI_DEVICE_ID_SI_761 0x0761 75*4882a593Smuzhiyun #endif 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #ifndef PCI_VENDOR_ID_XGI 78*4882a593Smuzhiyun #define PCI_VENDOR_ID_XGI 0x18ca 79*4882a593Smuzhiyun #endif 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_XGI_20 82*4882a593Smuzhiyun #define PCI_DEVICE_ID_XGI_20 0x0020 83*4882a593Smuzhiyun #endif 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #ifndef PCI_DEVICE_ID_XGI_40 86*4882a593Smuzhiyun #define PCI_DEVICE_ID_XGI_40 0x0040 87*4882a593Smuzhiyun #endif 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* To be included in fb.h */ 90*4882a593Smuzhiyun #ifndef FB_ACCEL_SIS_GLAMOUR_2 91*4882a593Smuzhiyun #define FB_ACCEL_SIS_GLAMOUR_2 40 /* SiS 315, 65x, 740, 661, 741 */ 92*4882a593Smuzhiyun #endif 93*4882a593Smuzhiyun #ifndef FB_ACCEL_SIS_XABRE 94*4882a593Smuzhiyun #define FB_ACCEL_SIS_XABRE 41 /* SiS 330 ("Xabre"), 76x */ 95*4882a593Smuzhiyun #endif 96*4882a593Smuzhiyun #ifndef FB_ACCEL_XGI_VOLARI_V 97*4882a593Smuzhiyun #define FB_ACCEL_XGI_VOLARI_V 47 /* XGI Volari Vx (V3XT, V5, V8) */ 98*4882a593Smuzhiyun #endif 99*4882a593Smuzhiyun #ifndef FB_ACCEL_XGI_VOLARI_Z 100*4882a593Smuzhiyun #define FB_ACCEL_XGI_VOLARI_Z 48 /* XGI Volari Z7 */ 101*4882a593Smuzhiyun #endif 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun /* ivideo->caps */ 104*4882a593Smuzhiyun #define HW_CURSOR_CAP 0x80 105*4882a593Smuzhiyun #define TURBO_QUEUE_CAP 0x40 106*4882a593Smuzhiyun #define AGP_CMD_QUEUE_CAP 0x20 107*4882a593Smuzhiyun #define VM_CMD_QUEUE_CAP 0x10 108*4882a593Smuzhiyun #define MMIO_CMD_QUEUE_CAP 0x08 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* For 300 series */ 111*4882a593Smuzhiyun #define TURBO_QUEUE_AREA_SIZE (512 * 1024) /* 512K */ 112*4882a593Smuzhiyun #define HW_CURSOR_AREA_SIZE_300 4096 /* 4K */ 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun /* For 315/Xabre series */ 115*4882a593Smuzhiyun #define COMMAND_QUEUE_AREA_SIZE (512 * 1024) /* 512K */ 116*4882a593Smuzhiyun #define COMMAND_QUEUE_AREA_SIZE_Z7 (128 * 1024) /* 128k for XGI Z7 */ 117*4882a593Smuzhiyun #define HW_CURSOR_AREA_SIZE_315 16384 /* 16K */ 118*4882a593Smuzhiyun #define COMMAND_QUEUE_THRESHOLD 0x1F 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #define SIS_OH_ALLOC_SIZE 4000 121*4882a593Smuzhiyun #define SENTINEL 0x7fffffff 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #define SEQ_ADR 0x14 124*4882a593Smuzhiyun #define SEQ_DATA 0x15 125*4882a593Smuzhiyun #define DAC_ADR 0x18 126*4882a593Smuzhiyun #define DAC_DATA 0x19 127*4882a593Smuzhiyun #define CRTC_ADR 0x24 128*4882a593Smuzhiyun #define CRTC_DATA 0x25 129*4882a593Smuzhiyun #define DAC2_ADR (0x16-0x30) 130*4882a593Smuzhiyun #define DAC2_DATA (0x17-0x30) 131*4882a593Smuzhiyun #define VB_PART1_ADR (0x04-0x30) 132*4882a593Smuzhiyun #define VB_PART1_DATA (0x05-0x30) 133*4882a593Smuzhiyun #define VB_PART2_ADR (0x10-0x30) 134*4882a593Smuzhiyun #define VB_PART2_DATA (0x11-0x30) 135*4882a593Smuzhiyun #define VB_PART3_ADR (0x12-0x30) 136*4882a593Smuzhiyun #define VB_PART3_DATA (0x13-0x30) 137*4882a593Smuzhiyun #define VB_PART4_ADR (0x14-0x30) 138*4882a593Smuzhiyun #define VB_PART4_DATA (0x15-0x30) 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #define SISSR ivideo->SiS_Pr.SiS_P3c4 141*4882a593Smuzhiyun #define SISCR ivideo->SiS_Pr.SiS_P3d4 142*4882a593Smuzhiyun #define SISDACA ivideo->SiS_Pr.SiS_P3c8 143*4882a593Smuzhiyun #define SISDACD ivideo->SiS_Pr.SiS_P3c9 144*4882a593Smuzhiyun #define SISPART1 ivideo->SiS_Pr.SiS_Part1Port 145*4882a593Smuzhiyun #define SISPART2 ivideo->SiS_Pr.SiS_Part2Port 146*4882a593Smuzhiyun #define SISPART3 ivideo->SiS_Pr.SiS_Part3Port 147*4882a593Smuzhiyun #define SISPART4 ivideo->SiS_Pr.SiS_Part4Port 148*4882a593Smuzhiyun #define SISPART5 ivideo->SiS_Pr.SiS_Part5Port 149*4882a593Smuzhiyun #define SISDAC2A SISPART5 150*4882a593Smuzhiyun #define SISDAC2D (SISPART5 + 1) 151*4882a593Smuzhiyun #define SISMISCR (ivideo->SiS_Pr.RelIO + 0x1c) 152*4882a593Smuzhiyun #define SISMISCW ivideo->SiS_Pr.SiS_P3c2 153*4882a593Smuzhiyun #define SISINPSTAT (ivideo->SiS_Pr.RelIO + 0x2a) 154*4882a593Smuzhiyun #define SISPEL ivideo->SiS_Pr.SiS_P3c6 155*4882a593Smuzhiyun #define SISVGAENABLE (ivideo->SiS_Pr.RelIO + 0x13) 156*4882a593Smuzhiyun #define SISVID (ivideo->SiS_Pr.RelIO + 0x02 - 0x30) 157*4882a593Smuzhiyun #define SISCAP (ivideo->SiS_Pr.RelIO + 0x00 - 0x30) 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun #define IND_SIS_PASSWORD 0x05 /* SRs */ 160*4882a593Smuzhiyun #define IND_SIS_COLOR_MODE 0x06 161*4882a593Smuzhiyun #define IND_SIS_RAMDAC_CONTROL 0x07 162*4882a593Smuzhiyun #define IND_SIS_DRAM_SIZE 0x14 163*4882a593Smuzhiyun #define IND_SIS_MODULE_ENABLE 0x1E 164*4882a593Smuzhiyun #define IND_SIS_PCI_ADDRESS_SET 0x20 165*4882a593Smuzhiyun #define IND_SIS_TURBOQUEUE_ADR 0x26 166*4882a593Smuzhiyun #define IND_SIS_TURBOQUEUE_SET 0x27 167*4882a593Smuzhiyun #define IND_SIS_POWER_ON_TRAP 0x38 168*4882a593Smuzhiyun #define IND_SIS_POWER_ON_TRAP2 0x39 169*4882a593Smuzhiyun #define IND_SIS_CMDQUEUE_SET 0x26 170*4882a593Smuzhiyun #define IND_SIS_CMDQUEUE_THRESHOLD 0x27 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #define IND_SIS_AGP_IO_PAD 0x48 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun #define SIS_CRT2_WENABLE_300 0x24 /* Part1 */ 175*4882a593Smuzhiyun #define SIS_CRT2_WENABLE_315 0x2F 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun #define SIS_PASSWORD 0x86 /* SR05 */ 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun #define SIS_INTERLACED_MODE 0x20 /* SR06 */ 180*4882a593Smuzhiyun #define SIS_8BPP_COLOR_MODE 0x0 181*4882a593Smuzhiyun #define SIS_15BPP_COLOR_MODE 0x1 182*4882a593Smuzhiyun #define SIS_16BPP_COLOR_MODE 0x2 183*4882a593Smuzhiyun #define SIS_32BPP_COLOR_MODE 0x4 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun #define SIS_ENABLE_2D 0x40 /* SR1E */ 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun #define SIS_MEM_MAP_IO_ENABLE 0x01 /* SR20 */ 188*4882a593Smuzhiyun #define SIS_PCI_ADDR_ENABLE 0x80 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun #define SIS_AGP_CMDQUEUE_ENABLE 0x80 /* 315/330/340 series SR26 */ 191*4882a593Smuzhiyun #define SIS_VRAM_CMDQUEUE_ENABLE 0x40 192*4882a593Smuzhiyun #define SIS_MMIO_CMD_ENABLE 0x20 193*4882a593Smuzhiyun #define SIS_CMD_QUEUE_SIZE_512k 0x00 194*4882a593Smuzhiyun #define SIS_CMD_QUEUE_SIZE_1M 0x04 195*4882a593Smuzhiyun #define SIS_CMD_QUEUE_SIZE_2M 0x08 196*4882a593Smuzhiyun #define SIS_CMD_QUEUE_SIZE_4M 0x0C 197*4882a593Smuzhiyun #define SIS_CMD_QUEUE_RESET 0x01 198*4882a593Smuzhiyun #define SIS_CMD_AUTO_CORR 0x02 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun #define SIS_CMD_QUEUE_SIZE_Z7_64k 0x00 /* XGI Z7 */ 201*4882a593Smuzhiyun #define SIS_CMD_QUEUE_SIZE_Z7_128k 0x04 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun #define SIS_SIMULTANEOUS_VIEW_ENABLE 0x01 /* CR30 */ 204*4882a593Smuzhiyun #define SIS_MODE_SELECT_CRT2 0x02 205*4882a593Smuzhiyun #define SIS_VB_OUTPUT_COMPOSITE 0x04 206*4882a593Smuzhiyun #define SIS_VB_OUTPUT_SVIDEO 0x08 207*4882a593Smuzhiyun #define SIS_VB_OUTPUT_SCART 0x10 208*4882a593Smuzhiyun #define SIS_VB_OUTPUT_LCD 0x20 209*4882a593Smuzhiyun #define SIS_VB_OUTPUT_CRT2 0x40 210*4882a593Smuzhiyun #define SIS_VB_OUTPUT_HIVISION 0x80 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #define SIS_VB_OUTPUT_DISABLE 0x20 /* CR31 */ 213*4882a593Smuzhiyun #define SIS_DRIVER_MODE 0x40 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun #define SIS_VB_COMPOSITE 0x01 /* CR32 */ 216*4882a593Smuzhiyun #define SIS_VB_SVIDEO 0x02 217*4882a593Smuzhiyun #define SIS_VB_SCART 0x04 218*4882a593Smuzhiyun #define SIS_VB_LCD 0x08 219*4882a593Smuzhiyun #define SIS_VB_CRT2 0x10 220*4882a593Smuzhiyun #define SIS_CRT1 0x20 221*4882a593Smuzhiyun #define SIS_VB_HIVISION 0x40 222*4882a593Smuzhiyun #define SIS_VB_YPBPR 0x80 223*4882a593Smuzhiyun #define SIS_VB_TV (SIS_VB_COMPOSITE | SIS_VB_SVIDEO | \ 224*4882a593Smuzhiyun SIS_VB_SCART | SIS_VB_HIVISION | SIS_VB_YPBPR) 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #define SIS_EXTERNAL_CHIP_MASK 0x0E /* CR37 (< SiS 660) */ 227*4882a593Smuzhiyun #define SIS_EXTERNAL_CHIP_SIS301 0x01 /* in CR37 << 1 ! */ 228*4882a593Smuzhiyun #define SIS_EXTERNAL_CHIP_LVDS 0x02 229*4882a593Smuzhiyun #define SIS_EXTERNAL_CHIP_TRUMPION 0x03 230*4882a593Smuzhiyun #define SIS_EXTERNAL_CHIP_LVDS_CHRONTEL 0x04 231*4882a593Smuzhiyun #define SIS_EXTERNAL_CHIP_CHRONTEL 0x05 232*4882a593Smuzhiyun #define SIS310_EXTERNAL_CHIP_LVDS 0x02 233*4882a593Smuzhiyun #define SIS310_EXTERNAL_CHIP_LVDS_CHRONTEL 0x03 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun #define SIS_AGP_2X 0x20 /* CR48 */ 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun /* vbflags, private entries (others in sisfb.h) */ 238*4882a593Smuzhiyun #define VB_CONEXANT 0x00000800 /* 661 series only */ 239*4882a593Smuzhiyun #define VB_TRUMPION VB_CONEXANT /* 300 series only */ 240*4882a593Smuzhiyun #define VB_302ELV 0x00004000 241*4882a593Smuzhiyun #define VB_301 0x00100000 /* Video bridge type */ 242*4882a593Smuzhiyun #define VB_301B 0x00200000 243*4882a593Smuzhiyun #define VB_302B 0x00400000 244*4882a593Smuzhiyun #define VB_30xBDH 0x00800000 /* 30xB DH version (w/o LCD support) */ 245*4882a593Smuzhiyun #define VB_LVDS 0x01000000 246*4882a593Smuzhiyun #define VB_CHRONTEL 0x02000000 247*4882a593Smuzhiyun #define VB_301LV 0x04000000 248*4882a593Smuzhiyun #define VB_302LV 0x08000000 249*4882a593Smuzhiyun #define VB_301C 0x10000000 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun #define VB_SISBRIDGE (VB_301|VB_301B|VB_301C|VB_302B|VB_301LV|VB_302LV|VB_302ELV) 252*4882a593Smuzhiyun #define VB_VIDEOBRIDGE (VB_SISBRIDGE | VB_LVDS | VB_CHRONTEL | VB_CONEXANT) 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun /* vbflags2 (static stuff only!) */ 255*4882a593Smuzhiyun #define VB2_SISUMC 0x00000001 256*4882a593Smuzhiyun #define VB2_301 0x00000002 /* Video bridge type */ 257*4882a593Smuzhiyun #define VB2_301B 0x00000004 258*4882a593Smuzhiyun #define VB2_301C 0x00000008 259*4882a593Smuzhiyun #define VB2_307T 0x00000010 260*4882a593Smuzhiyun #define VB2_302B 0x00000800 261*4882a593Smuzhiyun #define VB2_301LV 0x00001000 262*4882a593Smuzhiyun #define VB2_302LV 0x00002000 263*4882a593Smuzhiyun #define VB2_302ELV 0x00004000 264*4882a593Smuzhiyun #define VB2_307LV 0x00008000 265*4882a593Smuzhiyun #define VB2_30xBDH 0x08000000 /* 30xB DH version (w/o LCD support) */ 266*4882a593Smuzhiyun #define VB2_CONEXANT 0x10000000 267*4882a593Smuzhiyun #define VB2_TRUMPION 0x20000000 268*4882a593Smuzhiyun #define VB2_LVDS 0x40000000 269*4882a593Smuzhiyun #define VB2_CHRONTEL 0x80000000 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun #define VB2_SISLVDSBRIDGE (VB2_301LV | VB2_302LV | VB2_302ELV | VB2_307LV) 272*4882a593Smuzhiyun #define VB2_SISTMDSBRIDGE (VB2_301 | VB2_301B | VB2_301C | VB2_302B | VB2_307T) 273*4882a593Smuzhiyun #define VB2_SISBRIDGE (VB2_SISLVDSBRIDGE | VB2_SISTMDSBRIDGE) 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun #define VB2_SISTMDSLCDABRIDGE (VB2_301C | VB2_307T) 276*4882a593Smuzhiyun #define VB2_SISLCDABRIDGE (VB2_SISTMDSLCDABRIDGE | VB2_301LV | VB2_302LV | VB2_302ELV | VB2_307LV) 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun #define VB2_SISHIVISIONBRIDGE (VB2_301 | VB2_301B | VB2_302B) 279*4882a593Smuzhiyun #define VB2_SISYPBPRBRIDGE (VB2_301C | VB2_307T | VB2_SISLVDSBRIDGE) 280*4882a593Smuzhiyun #define VB2_SISYPBPRARBRIDGE (VB2_301C | VB2_307T | VB2_307LV) 281*4882a593Smuzhiyun #define VB2_SISTAP4SCALER (VB2_301C | VB2_307T | VB2_302ELV | VB2_307LV) 282*4882a593Smuzhiyun #define VB2_SISTVBRIDGE (VB2_SISHIVISIONBRIDGE | VB2_SISYPBPRBRIDGE) 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun #define VB2_SISVGA2BRIDGE (VB2_301 | VB2_301B | VB2_301C | VB2_302B | VB2_307T) 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun #define VB2_VIDEOBRIDGE (VB2_SISBRIDGE | VB2_LVDS | VB2_CHRONTEL | VB2_CONEXANT) 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun #define VB2_30xB (VB2_301B | VB2_301C | VB2_302B | VB2_307T) 289*4882a593Smuzhiyun #define VB2_30xBLV (VB2_30xB | VB2_SISLVDSBRIDGE) 290*4882a593Smuzhiyun #define VB2_30xC (VB2_301C | VB2_307T) 291*4882a593Smuzhiyun #define VB2_30xCLV (VB2_301C | VB2_307T | VB2_302ELV| VB2_307LV) 292*4882a593Smuzhiyun #define VB2_SISEMIBRIDGE (VB2_302LV | VB2_302ELV | VB2_307LV) 293*4882a593Smuzhiyun #define VB2_LCD162MHZBRIDGE (VB2_301C | VB2_307T) 294*4882a593Smuzhiyun #define VB2_LCDOVER1280BRIDGE (VB2_301C | VB2_307T | VB2_302LV | VB2_302ELV | VB2_307LV) 295*4882a593Smuzhiyun #define VB2_LCDOVER1600BRIDGE (VB2_307T | VB2_307LV) 296*4882a593Smuzhiyun #define VB2_RAMDAC202MHZBRIDGE (VB2_301C | VB2_307T) 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun /* I/O port access functions */ 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun void SiS_SetReg(SISIOADDRESS, u8, u8); 301*4882a593Smuzhiyun void SiS_SetRegByte(SISIOADDRESS, u8); 302*4882a593Smuzhiyun void SiS_SetRegShort(SISIOADDRESS, u16); 303*4882a593Smuzhiyun void SiS_SetRegLong(SISIOADDRESS, u32); 304*4882a593Smuzhiyun void SiS_SetRegANDOR(SISIOADDRESS, u8, u8, u8); 305*4882a593Smuzhiyun void SiS_SetRegAND(SISIOADDRESS, u8, u8); 306*4882a593Smuzhiyun void SiS_SetRegOR(SISIOADDRESS, u8, u8); 307*4882a593Smuzhiyun u8 SiS_GetReg(SISIOADDRESS, u8); 308*4882a593Smuzhiyun u8 SiS_GetRegByte(SISIOADDRESS); 309*4882a593Smuzhiyun u16 SiS_GetRegShort(SISIOADDRESS); 310*4882a593Smuzhiyun u32 SiS_GetRegLong(SISIOADDRESS); 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun /* Chrontel TV, DDC and DPMS functions */ 313*4882a593Smuzhiyun /* from init.c */ 314*4882a593Smuzhiyun bool SiSInitPtr(struct SiS_Private *SiS_Pr); 315*4882a593Smuzhiyun unsigned short SiS_GetModeID_LCD(int VGAEngine, unsigned int VBFlags, int HDisplay, 316*4882a593Smuzhiyun int VDisplay, int Depth, bool FSTN, 317*4882a593Smuzhiyun unsigned short CustomT, int LCDwith, int LCDheight, 318*4882a593Smuzhiyun unsigned int VBFlags2); 319*4882a593Smuzhiyun unsigned short SiS_GetModeID_TV(int VGAEngine, unsigned int VBFlags, int HDisplay, 320*4882a593Smuzhiyun int VDisplay, int Depth, unsigned int VBFlags2); 321*4882a593Smuzhiyun unsigned short SiS_GetModeID_VGA2(int VGAEngine, unsigned int VBFlags, int HDisplay, 322*4882a593Smuzhiyun int VDisplay, int Depth, unsigned int VBFlags2); 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun void SiS_DisplayOn(struct SiS_Private *SiS_Pr); 325*4882a593Smuzhiyun void SiS_DisplayOff(struct SiS_Private *SiS_Pr); 326*4882a593Smuzhiyun void SiSRegInit(struct SiS_Private *SiS_Pr, SISIOADDRESS BaseAddr); 327*4882a593Smuzhiyun void SiS_SetEnableDstn(struct SiS_Private *SiS_Pr, int enable); 328*4882a593Smuzhiyun void SiS_SetEnableFstn(struct SiS_Private *SiS_Pr, int enable); 329*4882a593Smuzhiyun unsigned short SiS_GetModeFlag(struct SiS_Private *SiS_Pr, unsigned short ModeNo, 330*4882a593Smuzhiyun unsigned short ModeIdIndex); 331*4882a593Smuzhiyun bool SiSDetermineROMLayout661(struct SiS_Private *SiS_Pr); 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun bool SiS_SearchModeID(struct SiS_Private *SiS_Pr, unsigned short *ModeNo, 334*4882a593Smuzhiyun unsigned short *ModeIdIndex); 335*4882a593Smuzhiyun unsigned short SiS_GetModePtr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, 336*4882a593Smuzhiyun unsigned short ModeIdIndex); 337*4882a593Smuzhiyun unsigned short SiS_GetRefCRTVCLK(struct SiS_Private *SiS_Pr, unsigned short Index, int UseWide); 338*4882a593Smuzhiyun unsigned short SiS_GetRefCRT1CRTC(struct SiS_Private *SiS_Pr, unsigned short Index, int UseWide); 339*4882a593Smuzhiyun unsigned short SiS_GetColorDepth(struct SiS_Private *SiS_Pr, unsigned short ModeNo, 340*4882a593Smuzhiyun unsigned short ModeIdIndex); 341*4882a593Smuzhiyun unsigned short SiS_GetOffset(struct SiS_Private *SiS_Pr,unsigned short ModeNo, 342*4882a593Smuzhiyun unsigned short ModeIdIndex, unsigned short RRTI); 343*4882a593Smuzhiyun #ifdef CONFIG_FB_SIS_300 344*4882a593Smuzhiyun void SiS_GetFIFOThresholdIndex300(struct SiS_Private *SiS_Pr, unsigned short *idx1, 345*4882a593Smuzhiyun unsigned short *idx2); 346*4882a593Smuzhiyun unsigned short SiS_GetFIFOThresholdB300(unsigned short idx1, unsigned short idx2); 347*4882a593Smuzhiyun unsigned short SiS_GetLatencyFactor630(struct SiS_Private *SiS_Pr, unsigned short index); 348*4882a593Smuzhiyun #endif 349*4882a593Smuzhiyun void SiS_LoadDAC(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex); 350*4882a593Smuzhiyun bool SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo); 351*4882a593Smuzhiyun void SiS_CalcCRRegisters(struct SiS_Private *SiS_Pr, int depth); 352*4882a593Smuzhiyun void SiS_CalcLCDACRT1Timing(struct SiS_Private *SiS_Pr, unsigned short ModeNo, 353*4882a593Smuzhiyun unsigned short ModeIdIndex); 354*4882a593Smuzhiyun void SiS_Generic_ConvertCRData(struct SiS_Private *SiS_Pr, unsigned char *crdata, int xres, 355*4882a593Smuzhiyun int yres, struct fb_var_screeninfo *var, bool writeres); 356*4882a593Smuzhiyun 357*4882a593Smuzhiyun /* From init301.c: */ 358*4882a593Smuzhiyun extern void SiS_GetVBInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo, 359*4882a593Smuzhiyun unsigned short ModeIdIndex, int chkcrt2mode); 360*4882a593Smuzhiyun extern void SiS_GetLCDResInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo, 361*4882a593Smuzhiyun unsigned short ModeIdIndex); 362*4882a593Smuzhiyun extern void SiS_SetYPbPr(struct SiS_Private *SiS_Pr); 363*4882a593Smuzhiyun extern void SiS_SetTVMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo, 364*4882a593Smuzhiyun unsigned short ModeIdIndex); 365*4882a593Smuzhiyun extern void SiS_UnLockCRT2(struct SiS_Private *SiS_Pr); 366*4882a593Smuzhiyun extern void SiS_DisableBridge(struct SiS_Private *); 367*4882a593Smuzhiyun extern bool SiS_SetCRT2Group(struct SiS_Private *, unsigned short); 368*4882a593Smuzhiyun extern unsigned short SiS_GetRatePtr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, 369*4882a593Smuzhiyun unsigned short ModeIdIndex); 370*4882a593Smuzhiyun extern void SiS_WaitRetrace1(struct SiS_Private *SiS_Pr); 371*4882a593Smuzhiyun extern unsigned short SiS_GetResInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo, 372*4882a593Smuzhiyun unsigned short ModeIdIndex); 373*4882a593Smuzhiyun extern unsigned short SiS_GetCH700x(struct SiS_Private *SiS_Pr, unsigned short tempax); 374*4882a593Smuzhiyun extern unsigned short SiS_GetVCLK2Ptr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, 375*4882a593Smuzhiyun unsigned short ModeIdIndex, unsigned short RRTI); 376*4882a593Smuzhiyun extern bool SiS_IsVAMode(struct SiS_Private *); 377*4882a593Smuzhiyun extern bool SiS_IsDualEdge(struct SiS_Private *); 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun #ifdef CONFIG_FB_SIS_300 380*4882a593Smuzhiyun extern unsigned int sisfb_read_nbridge_pci_dword(struct SiS_Private *SiS_Pr, int reg); 381*4882a593Smuzhiyun extern void sisfb_write_nbridge_pci_dword(struct SiS_Private *SiS_Pr, int reg, 382*4882a593Smuzhiyun unsigned int val); 383*4882a593Smuzhiyun #endif 384*4882a593Smuzhiyun #ifdef CONFIG_FB_SIS_315 385*4882a593Smuzhiyun extern void sisfb_write_nbridge_pci_byte(struct SiS_Private *SiS_Pr, int reg, 386*4882a593Smuzhiyun unsigned char val); 387*4882a593Smuzhiyun extern unsigned int sisfb_read_mio_pci_word(struct SiS_Private *SiS_Pr, int reg); 388*4882a593Smuzhiyun #endif 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun /* MMIO access macros */ 392*4882a593Smuzhiyun #define MMIO_IN8(base, offset) readb((base+offset)) 393*4882a593Smuzhiyun #define MMIO_IN16(base, offset) readw((base+offset)) 394*4882a593Smuzhiyun #define MMIO_IN32(base, offset) readl((base+offset)) 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun #define MMIO_OUT8(base, offset, val) writeb(((u8)(val)), (base+offset)) 397*4882a593Smuzhiyun #define MMIO_OUT16(base, offset, val) writew(((u16)(val)), (base+offset)) 398*4882a593Smuzhiyun #define MMIO_OUT32(base, offset, val) writel(((u32)(val)), (base+offset)) 399*4882a593Smuzhiyun 400*4882a593Smuzhiyun /* Queue control MMIO registers */ 401*4882a593Smuzhiyun #define Q_BASE_ADDR 0x85C0 /* Base address of software queue */ 402*4882a593Smuzhiyun #define Q_WRITE_PTR 0x85C4 /* Current write pointer */ 403*4882a593Smuzhiyun #define Q_READ_PTR 0x85C8 /* Current read pointer */ 404*4882a593Smuzhiyun #define Q_STATUS 0x85CC /* queue status */ 405*4882a593Smuzhiyun 406*4882a593Smuzhiyun #define MMIO_QUEUE_PHYBASE Q_BASE_ADDR 407*4882a593Smuzhiyun #define MMIO_QUEUE_WRITEPORT Q_WRITE_PTR 408*4882a593Smuzhiyun #define MMIO_QUEUE_READPORT Q_READ_PTR 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun #ifndef FB_BLANK_UNBLANK 411*4882a593Smuzhiyun #define FB_BLANK_UNBLANK 0 412*4882a593Smuzhiyun #endif 413*4882a593Smuzhiyun #ifndef FB_BLANK_NORMAL 414*4882a593Smuzhiyun #define FB_BLANK_NORMAL 1 415*4882a593Smuzhiyun #endif 416*4882a593Smuzhiyun #ifndef FB_BLANK_VSYNC_SUSPEND 417*4882a593Smuzhiyun #define FB_BLANK_VSYNC_SUSPEND 2 418*4882a593Smuzhiyun #endif 419*4882a593Smuzhiyun #ifndef FB_BLANK_HSYNC_SUSPEND 420*4882a593Smuzhiyun #define FB_BLANK_HSYNC_SUSPEND 3 421*4882a593Smuzhiyun #endif 422*4882a593Smuzhiyun #ifndef FB_BLANK_POWERDOWN 423*4882a593Smuzhiyun #define FB_BLANK_POWERDOWN 4 424*4882a593Smuzhiyun #endif 425*4882a593Smuzhiyun 426*4882a593Smuzhiyun enum _SIS_LCD_TYPE { 427*4882a593Smuzhiyun LCD_INVALID = 0, 428*4882a593Smuzhiyun LCD_800x600, 429*4882a593Smuzhiyun LCD_1024x768, 430*4882a593Smuzhiyun LCD_1280x1024, 431*4882a593Smuzhiyun LCD_1280x960, 432*4882a593Smuzhiyun LCD_640x480, 433*4882a593Smuzhiyun LCD_1600x1200, 434*4882a593Smuzhiyun LCD_1920x1440, 435*4882a593Smuzhiyun LCD_2048x1536, 436*4882a593Smuzhiyun LCD_320x240, /* FSTN */ 437*4882a593Smuzhiyun LCD_1400x1050, 438*4882a593Smuzhiyun LCD_1152x864, 439*4882a593Smuzhiyun LCD_1152x768, 440*4882a593Smuzhiyun LCD_1280x768, 441*4882a593Smuzhiyun LCD_1024x600, 442*4882a593Smuzhiyun LCD_320x240_2, /* DSTN */ 443*4882a593Smuzhiyun LCD_320x240_3, /* DSTN */ 444*4882a593Smuzhiyun LCD_848x480, 445*4882a593Smuzhiyun LCD_1280x800, 446*4882a593Smuzhiyun LCD_1680x1050, 447*4882a593Smuzhiyun LCD_1280x720, 448*4882a593Smuzhiyun LCD_1280x854, 449*4882a593Smuzhiyun LCD_CUSTOM, 450*4882a593Smuzhiyun LCD_UNKNOWN 451*4882a593Smuzhiyun }; 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun enum _SIS_CMDTYPE { 454*4882a593Smuzhiyun MMIO_CMD = 0, 455*4882a593Smuzhiyun AGP_CMD_QUEUE, 456*4882a593Smuzhiyun VM_CMD_QUEUE, 457*4882a593Smuzhiyun }; 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun struct SIS_OH { 460*4882a593Smuzhiyun struct SIS_OH *poh_next; 461*4882a593Smuzhiyun struct SIS_OH *poh_prev; 462*4882a593Smuzhiyun u32 offset; 463*4882a593Smuzhiyun u32 size; 464*4882a593Smuzhiyun }; 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun struct SIS_OHALLOC { 467*4882a593Smuzhiyun struct SIS_OHALLOC *poha_next; 468*4882a593Smuzhiyun struct SIS_OH aoh[1]; 469*4882a593Smuzhiyun }; 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun struct SIS_HEAP { 472*4882a593Smuzhiyun struct SIS_OH oh_free; 473*4882a593Smuzhiyun struct SIS_OH oh_used; 474*4882a593Smuzhiyun struct SIS_OH *poh_freelist; 475*4882a593Smuzhiyun struct SIS_OHALLOC *poha_chain; 476*4882a593Smuzhiyun u32 max_freesize; 477*4882a593Smuzhiyun struct sis_video_info *vinfo; 478*4882a593Smuzhiyun }; 479*4882a593Smuzhiyun 480*4882a593Smuzhiyun /* Our "par" */ 481*4882a593Smuzhiyun struct sis_video_info { 482*4882a593Smuzhiyun int cardnumber; 483*4882a593Smuzhiyun struct fb_info *memyselfandi; 484*4882a593Smuzhiyun 485*4882a593Smuzhiyun struct SiS_Private SiS_Pr; 486*4882a593Smuzhiyun 487*4882a593Smuzhiyun struct sisfb_info sisfbinfo; /* For ioctl SISFB_GET_INFO */ 488*4882a593Smuzhiyun 489*4882a593Smuzhiyun struct fb_var_screeninfo default_var; 490*4882a593Smuzhiyun 491*4882a593Smuzhiyun struct fb_fix_screeninfo sisfb_fix; 492*4882a593Smuzhiyun u32 pseudo_palette[16]; 493*4882a593Smuzhiyun 494*4882a593Smuzhiyun struct sisfb_monitor { 495*4882a593Smuzhiyun u16 hmin; 496*4882a593Smuzhiyun u16 hmax; 497*4882a593Smuzhiyun u16 vmin; 498*4882a593Smuzhiyun u16 vmax; 499*4882a593Smuzhiyun u32 dclockmax; 500*4882a593Smuzhiyun u8 feature; 501*4882a593Smuzhiyun bool datavalid; 502*4882a593Smuzhiyun } sisfb_thismonitor; 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun unsigned short chip_id; /* PCI ID of chip */ 505*4882a593Smuzhiyun unsigned short chip_vendor; /* PCI ID of vendor */ 506*4882a593Smuzhiyun char myid[40]; 507*4882a593Smuzhiyun 508*4882a593Smuzhiyun struct pci_dev *nbridge; 509*4882a593Smuzhiyun struct pci_dev *lpcdev; 510*4882a593Smuzhiyun 511*4882a593Smuzhiyun int mni; /* Mode number index */ 512*4882a593Smuzhiyun 513*4882a593Smuzhiyun unsigned long video_size; 514*4882a593Smuzhiyun unsigned long video_base; 515*4882a593Smuzhiyun unsigned long mmio_size; 516*4882a593Smuzhiyun unsigned long mmio_base; 517*4882a593Smuzhiyun unsigned long vga_base; 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun unsigned long video_offset; 520*4882a593Smuzhiyun 521*4882a593Smuzhiyun unsigned long UMAsize, LFBsize; 522*4882a593Smuzhiyun 523*4882a593Smuzhiyun void __iomem *video_vbase; 524*4882a593Smuzhiyun void __iomem *mmio_vbase; 525*4882a593Smuzhiyun 526*4882a593Smuzhiyun unsigned char *bios_abase; 527*4882a593Smuzhiyun 528*4882a593Smuzhiyun int wc_cookie; 529*4882a593Smuzhiyun 530*4882a593Smuzhiyun u32 sisfb_mem; 531*4882a593Smuzhiyun 532*4882a593Smuzhiyun u32 sisfb_parm_mem; 533*4882a593Smuzhiyun int sisfb_accel; 534*4882a593Smuzhiyun int sisfb_ypan; 535*4882a593Smuzhiyun int sisfb_max; 536*4882a593Smuzhiyun int sisfb_userom; 537*4882a593Smuzhiyun int sisfb_useoem; 538*4882a593Smuzhiyun int sisfb_mode_idx; 539*4882a593Smuzhiyun int sisfb_parm_rate; 540*4882a593Smuzhiyun int sisfb_crt1off; 541*4882a593Smuzhiyun int sisfb_forcecrt1; 542*4882a593Smuzhiyun int sisfb_crt2type; 543*4882a593Smuzhiyun int sisfb_crt2flags; 544*4882a593Smuzhiyun int sisfb_dstn; 545*4882a593Smuzhiyun int sisfb_fstn; 546*4882a593Smuzhiyun int sisfb_tvplug; 547*4882a593Smuzhiyun int sisfb_tvstd; 548*4882a593Smuzhiyun int sisfb_nocrt2rate; 549*4882a593Smuzhiyun 550*4882a593Smuzhiyun u32 heapstart; /* offset */ 551*4882a593Smuzhiyun void __iomem *sisfb_heap_start; /* address */ 552*4882a593Smuzhiyun void __iomem *sisfb_heap_end; /* address */ 553*4882a593Smuzhiyun u32 sisfb_heap_size; 554*4882a593Smuzhiyun int havenoheap; 555*4882a593Smuzhiyun 556*4882a593Smuzhiyun struct SIS_HEAP sisfb_heap; /* This card's vram heap */ 557*4882a593Smuzhiyun 558*4882a593Smuzhiyun int video_bpp; 559*4882a593Smuzhiyun int video_cmap_len; 560*4882a593Smuzhiyun int video_width; 561*4882a593Smuzhiyun int video_height; 562*4882a593Smuzhiyun unsigned int refresh_rate; 563*4882a593Smuzhiyun 564*4882a593Smuzhiyun unsigned int chip; 565*4882a593Smuzhiyun unsigned int chip_real_id; 566*4882a593Smuzhiyun u8 revision_id; 567*4882a593Smuzhiyun int sisvga_enabled; /* PCI device was enabled */ 568*4882a593Smuzhiyun 569*4882a593Smuzhiyun int video_linelength; /* real pitch */ 570*4882a593Smuzhiyun int scrnpitchCRT1; /* pitch regarding interlace */ 571*4882a593Smuzhiyun 572*4882a593Smuzhiyun u16 DstColor; /* For 2d acceleration */ 573*4882a593Smuzhiyun u32 SiS310_AccelDepth; 574*4882a593Smuzhiyun u32 CommandReg; 575*4882a593Smuzhiyun int cmdqueuelength; /* Current (for accel) */ 576*4882a593Smuzhiyun u32 cmdQueueSize; /* Total size in KB */ 577*4882a593Smuzhiyun 578*4882a593Smuzhiyun spinlock_t lockaccel; /* Do not use outside of kernel! */ 579*4882a593Smuzhiyun 580*4882a593Smuzhiyun unsigned int pcibus; 581*4882a593Smuzhiyun unsigned int pcislot; 582*4882a593Smuzhiyun unsigned int pcifunc; 583*4882a593Smuzhiyun 584*4882a593Smuzhiyun int accel; 585*4882a593Smuzhiyun int engineok; 586*4882a593Smuzhiyun 587*4882a593Smuzhiyun u16 subsysvendor; 588*4882a593Smuzhiyun u16 subsysdevice; 589*4882a593Smuzhiyun 590*4882a593Smuzhiyun u32 vbflags; /* Replacing deprecated stuff from above */ 591*4882a593Smuzhiyun u32 currentvbflags; 592*4882a593Smuzhiyun u32 vbflags2; 593*4882a593Smuzhiyun 594*4882a593Smuzhiyun int lcdxres, lcdyres; 595*4882a593Smuzhiyun int lcddefmodeidx, tvdefmodeidx, defmodeidx; 596*4882a593Smuzhiyun u32 CRT2LCDType; /* defined in "SIS_LCD_TYPE" */ 597*4882a593Smuzhiyun u32 curFSTN, curDSTN; 598*4882a593Smuzhiyun 599*4882a593Smuzhiyun int current_bpp; 600*4882a593Smuzhiyun int current_width; 601*4882a593Smuzhiyun int current_height; 602*4882a593Smuzhiyun int current_htotal; 603*4882a593Smuzhiyun int current_vtotal; 604*4882a593Smuzhiyun int current_linelength; 605*4882a593Smuzhiyun __u32 current_pixclock; 606*4882a593Smuzhiyun int current_refresh_rate; 607*4882a593Smuzhiyun 608*4882a593Smuzhiyun unsigned int current_base; 609*4882a593Smuzhiyun 610*4882a593Smuzhiyun u8 mode_no; 611*4882a593Smuzhiyun u8 rate_idx; 612*4882a593Smuzhiyun int modechanged; 613*4882a593Smuzhiyun unsigned char modeprechange; 614*4882a593Smuzhiyun 615*4882a593Smuzhiyun u8 sisfb_lastrates[128]; 616*4882a593Smuzhiyun 617*4882a593Smuzhiyun int newrom; 618*4882a593Smuzhiyun int haveXGIROM; 619*4882a593Smuzhiyun int registered; 620*4882a593Smuzhiyun int warncount; 621*4882a593Smuzhiyun 622*4882a593Smuzhiyun int sisvga_engine; 623*4882a593Smuzhiyun int hwcursor_size; 624*4882a593Smuzhiyun int CRT2_write_enable; 625*4882a593Smuzhiyun u8 caps; 626*4882a593Smuzhiyun 627*4882a593Smuzhiyun u8 detectedpdc; 628*4882a593Smuzhiyun u8 detectedpdca; 629*4882a593Smuzhiyun u8 detectedlcda; 630*4882a593Smuzhiyun 631*4882a593Smuzhiyun void __iomem *hwcursor_vbase; 632*4882a593Smuzhiyun 633*4882a593Smuzhiyun int chronteltype; 634*4882a593Smuzhiyun int tvxpos, tvypos; 635*4882a593Smuzhiyun u8 p2_1f,p2_20,p2_2b,p2_42,p2_43,p2_01,p2_02; 636*4882a593Smuzhiyun int tvx, tvy; 637*4882a593Smuzhiyun 638*4882a593Smuzhiyun u8 sisfblocked; 639*4882a593Smuzhiyun 640*4882a593Smuzhiyun struct sisfb_info sisfb_infoblock; 641*4882a593Smuzhiyun 642*4882a593Smuzhiyun struct sisfb_cmd sisfb_command; 643*4882a593Smuzhiyun 644*4882a593Smuzhiyun u32 sisfb_id; 645*4882a593Smuzhiyun 646*4882a593Smuzhiyun u8 sisfb_can_post; 647*4882a593Smuzhiyun u8 sisfb_card_posted; 648*4882a593Smuzhiyun u8 sisfb_was_boot_device; 649*4882a593Smuzhiyun 650*4882a593Smuzhiyun struct sis_video_info *next; 651*4882a593Smuzhiyun }; 652*4882a593Smuzhiyun 653*4882a593Smuzhiyun /* from sis_accel.c */ 654*4882a593Smuzhiyun extern void fbcon_sis_fillrect(struct fb_info *info, 655*4882a593Smuzhiyun const struct fb_fillrect *rect); 656*4882a593Smuzhiyun extern void fbcon_sis_copyarea(struct fb_info *info, 657*4882a593Smuzhiyun const struct fb_copyarea *area); 658*4882a593Smuzhiyun extern int fbcon_sis_sync(struct fb_info *info); 659*4882a593Smuzhiyun 660*4882a593Smuzhiyun /* Internal 2D accelerator functions */ 661*4882a593Smuzhiyun extern int sisfb_initaccel(struct sis_video_info *ivideo); 662*4882a593Smuzhiyun extern void sisfb_syncaccel(struct sis_video_info *ivideo); 663*4882a593Smuzhiyun 664*4882a593Smuzhiyun /* Internal general routines */ 665*4882a593Smuzhiyun #ifdef CONFIG_FB_SIS_300 666*4882a593Smuzhiyun unsigned int sisfb_read_nbridge_pci_dword(struct SiS_Private *SiS_Pr, int reg); 667*4882a593Smuzhiyun void sisfb_write_nbridge_pci_dword(struct SiS_Private *SiS_Pr, int reg, unsigned int val); 668*4882a593Smuzhiyun unsigned int sisfb_read_lpc_pci_dword(struct SiS_Private *SiS_Pr, int reg); 669*4882a593Smuzhiyun #endif 670*4882a593Smuzhiyun #ifdef CONFIG_FB_SIS_315 671*4882a593Smuzhiyun void sisfb_write_nbridge_pci_byte(struct SiS_Private *SiS_Pr, int reg, unsigned char val); 672*4882a593Smuzhiyun unsigned int sisfb_read_mio_pci_word(struct SiS_Private *SiS_Pr, int reg); 673*4882a593Smuzhiyun #endif 674*4882a593Smuzhiyun 675*4882a593Smuzhiyun /* SiS-specific exported functions */ 676*4882a593Smuzhiyun void sis_malloc(struct sis_memreq *req); 677*4882a593Smuzhiyun void sis_malloc_new(struct pci_dev *pdev, struct sis_memreq *req); 678*4882a593Smuzhiyun void sis_free(u32 base); 679*4882a593Smuzhiyun void sis_free_new(struct pci_dev *pdev, u32 base); 680*4882a593Smuzhiyun 681*4882a593Smuzhiyun /* Routines from init.c/init301.c */ 682*4882a593Smuzhiyun extern unsigned short SiS_GetModeID_LCD(int VGAEngine, unsigned int VBFlags, int HDisplay, 683*4882a593Smuzhiyun int VDisplay, int Depth, bool FSTN, unsigned short CustomT, 684*4882a593Smuzhiyun int LCDwith, int LCDheight, unsigned int VBFlags2); 685*4882a593Smuzhiyun extern unsigned short SiS_GetModeID_TV(int VGAEngine, unsigned int VBFlags, int HDisplay, 686*4882a593Smuzhiyun int VDisplay, int Depth, unsigned int VBFlags2); 687*4882a593Smuzhiyun extern unsigned short SiS_GetModeID_VGA2(int VGAEngine, unsigned int VBFlags, int HDisplay, 688*4882a593Smuzhiyun int VDisplay, int Depth, unsigned int VBFlags2); 689*4882a593Smuzhiyun extern void SiSRegInit(struct SiS_Private *SiS_Pr, SISIOADDRESS BaseAddr); 690*4882a593Smuzhiyun extern bool SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo); 691*4882a593Smuzhiyun extern void SiS_SetEnableDstn(struct SiS_Private *SiS_Pr, int enable); 692*4882a593Smuzhiyun extern void SiS_SetEnableFstn(struct SiS_Private *SiS_Pr, int enable); 693*4882a593Smuzhiyun 694*4882a593Smuzhiyun extern bool SiSDetermineROMLayout661(struct SiS_Private *SiS_Pr); 695*4882a593Smuzhiyun 696*4882a593Smuzhiyun extern bool sisfb_gettotalfrommode(struct SiS_Private *SiS_Pr, unsigned char modeno, 697*4882a593Smuzhiyun int *htotal, int *vtotal, unsigned char rateindex); 698*4882a593Smuzhiyun extern int sisfb_mode_rate_to_dclock(struct SiS_Private *SiS_Pr, 699*4882a593Smuzhiyun unsigned char modeno, unsigned char rateindex); 700*4882a593Smuzhiyun extern int sisfb_mode_rate_to_ddata(struct SiS_Private *SiS_Pr, unsigned char modeno, 701*4882a593Smuzhiyun unsigned char rateindex, struct fb_var_screeninfo *var); 702*4882a593Smuzhiyun 703*4882a593Smuzhiyun 704*4882a593Smuzhiyun #endif 705