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]650/651/[M]661[F|M]X/740/[M]741[GX]/330/[M]760[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 * 2D acceleration part 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Based on the X driver's sis300_accel.h which is 11*4882a593Smuzhiyun * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria 12*4882a593Smuzhiyun * and sis310_accel.h which is 13*4882a593Smuzhiyun * Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * Author: Thomas Winischhofer <thomas@winischhofer.net>: 16*4882a593Smuzhiyun * (see http://www.winischhofer.net/ 17*4882a593Smuzhiyun * for more information and updates) 18*4882a593Smuzhiyun */ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #ifndef _SISFB_ACCEL_H 21*4882a593Smuzhiyun #define _SISFB_ACCEL_H 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* Guard accelerator accesses with spin_lock_irqsave? Works well without. */ 24*4882a593Smuzhiyun #undef SISFB_USE_SPINLOCKS 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #ifdef SISFB_USE_SPINLOCKS 27*4882a593Smuzhiyun #include <linux/spinlock.h> 28*4882a593Smuzhiyun #define CRITBEGIN spin_lock_irqsave(&ivideo->lockaccel, critflags); 29*4882a593Smuzhiyun #define CRITEND spin_unlock_irqrestore(&ivideo->lockaccel, critflags); 30*4882a593Smuzhiyun #define CRITFLAGS unsigned long critflags; 31*4882a593Smuzhiyun #else 32*4882a593Smuzhiyun #define CRITBEGIN 33*4882a593Smuzhiyun #define CRITEND 34*4882a593Smuzhiyun #define CRITFLAGS 35*4882a593Smuzhiyun #endif 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* Definitions for the SIS engine communication. */ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define PATREGSIZE 384 /* Pattern register size. 384 bytes @ 0x8300 */ 40*4882a593Smuzhiyun #define BR(x) (0x8200 | (x) << 2) 41*4882a593Smuzhiyun #define PBR(x) (0x8300 | (x) << 2) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* SiS300 engine commands */ 44*4882a593Smuzhiyun #define BITBLT 0x00000000 /* Blit */ 45*4882a593Smuzhiyun #define COLOREXP 0x00000001 /* Color expand */ 46*4882a593Smuzhiyun #define ENCOLOREXP 0x00000002 /* Enhanced color expand */ 47*4882a593Smuzhiyun #define MULTIPLE_SCANLINE 0x00000003 /* ? */ 48*4882a593Smuzhiyun #define LINE 0x00000004 /* Draw line */ 49*4882a593Smuzhiyun #define TRAPAZOID_FILL 0x00000005 /* Fill trapezoid */ 50*4882a593Smuzhiyun #define TRANSPARENT_BITBLT 0x00000006 /* Transparent Blit */ 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* Additional engine commands for 315 */ 53*4882a593Smuzhiyun #define ALPHA_BLEND 0x00000007 /* Alpha blend ? */ 54*4882a593Smuzhiyun #define A3D_FUNCTION 0x00000008 /* 3D command ? */ 55*4882a593Smuzhiyun #define CLEAR_Z_BUFFER 0x00000009 /* ? */ 56*4882a593Smuzhiyun #define GRADIENT_FILL 0x0000000A /* Gradient fill */ 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* source select */ 59*4882a593Smuzhiyun #define SRCVIDEO 0x00000000 /* source is video RAM */ 60*4882a593Smuzhiyun #define SRCSYSTEM 0x00000010 /* source is system memory */ 61*4882a593Smuzhiyun #define SRCCPUBLITBUF SRCSYSTEM /* source is CPU-driven BitBuffer (for color expand) */ 62*4882a593Smuzhiyun #define SRCAGP 0x00000020 /* source is AGP memory (?) */ 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /* Pattern flags */ 65*4882a593Smuzhiyun #define PATFG 0x00000000 /* foreground color */ 66*4882a593Smuzhiyun #define PATPATREG 0x00000040 /* pattern in pattern buffer (0x8300) */ 67*4882a593Smuzhiyun #define PATMONO 0x00000080 /* mono pattern */ 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* blitting direction (300 series only) */ 70*4882a593Smuzhiyun #define X_INC 0x00010000 71*4882a593Smuzhiyun #define X_DEC 0x00000000 72*4882a593Smuzhiyun #define Y_INC 0x00020000 73*4882a593Smuzhiyun #define Y_DEC 0x00000000 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* Clipping flags */ 76*4882a593Smuzhiyun #define NOCLIP 0x00000000 77*4882a593Smuzhiyun #define NOMERGECLIP 0x04000000 78*4882a593Smuzhiyun #define CLIPENABLE 0x00040000 79*4882a593Smuzhiyun #define CLIPWITHOUTMERGE 0x04040000 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /* Transparency */ 82*4882a593Smuzhiyun #define OPAQUE 0x00000000 83*4882a593Smuzhiyun #define TRANSPARENT 0x00100000 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* ? */ 86*4882a593Smuzhiyun #define DSTAGP 0x02000000 87*4882a593Smuzhiyun #define DSTVIDEO 0x02000000 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* Subfunctions for Color/Enhanced Color Expansion (315 only) */ 90*4882a593Smuzhiyun #define COLOR_TO_MONO 0x00100000 91*4882a593Smuzhiyun #define AA_TEXT 0x00200000 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* Some general registers for 315 series */ 94*4882a593Smuzhiyun #define SRC_ADDR 0x8200 95*4882a593Smuzhiyun #define SRC_PITCH 0x8204 96*4882a593Smuzhiyun #define AGP_BASE 0x8206 /* color-depth dependent value */ 97*4882a593Smuzhiyun #define SRC_Y 0x8208 98*4882a593Smuzhiyun #define SRC_X 0x820A 99*4882a593Smuzhiyun #define DST_Y 0x820C 100*4882a593Smuzhiyun #define DST_X 0x820E 101*4882a593Smuzhiyun #define DST_ADDR 0x8210 102*4882a593Smuzhiyun #define DST_PITCH 0x8214 103*4882a593Smuzhiyun #define DST_HEIGHT 0x8216 104*4882a593Smuzhiyun #define RECT_WIDTH 0x8218 105*4882a593Smuzhiyun #define RECT_HEIGHT 0x821A 106*4882a593Smuzhiyun #define PAT_FGCOLOR 0x821C 107*4882a593Smuzhiyun #define PAT_BGCOLOR 0x8220 108*4882a593Smuzhiyun #define SRC_FGCOLOR 0x8224 109*4882a593Smuzhiyun #define SRC_BGCOLOR 0x8228 110*4882a593Smuzhiyun #define MONO_MASK 0x822C 111*4882a593Smuzhiyun #define LEFT_CLIP 0x8234 112*4882a593Smuzhiyun #define TOP_CLIP 0x8236 113*4882a593Smuzhiyun #define RIGHT_CLIP 0x8238 114*4882a593Smuzhiyun #define BOTTOM_CLIP 0x823A 115*4882a593Smuzhiyun #define COMMAND_READY 0x823C 116*4882a593Smuzhiyun #define FIRE_TRIGGER 0x8240 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #define PATTERN_REG 0x8300 /* 384 bytes pattern buffer */ 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* Transparent bitblit registers */ 121*4882a593Smuzhiyun #define TRANS_DST_KEY_HIGH PAT_FGCOLOR 122*4882a593Smuzhiyun #define TRANS_DST_KEY_LOW PAT_BGCOLOR 123*4882a593Smuzhiyun #define TRANS_SRC_KEY_HIGH SRC_FGCOLOR 124*4882a593Smuzhiyun #define TRANS_SRC_KEY_LOW SRC_BGCOLOR 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* Store queue length in par */ 127*4882a593Smuzhiyun #define CmdQueLen ivideo->cmdqueuelength 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* ------------- SiS 300 series -------------- */ 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* BR(16) (0x8240): 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun bit 31 2D engine: 1 is idle, 134*4882a593Smuzhiyun bit 30 3D engine: 1 is idle, 135*4882a593Smuzhiyun bit 29 Command queue: 1 is empty 136*4882a593Smuzhiyun bits 28:24: Current CPU driven BitBlt buffer stage bit[4:0] 137*4882a593Smuzhiyun bits 15:0: Current command queue length 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun */ 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun #define SiS300Idle \ 142*4882a593Smuzhiyun { \ 143*4882a593Smuzhiyun while((MMIO_IN16(ivideo->mmio_vbase, BR(16)+2) & 0xE000) != 0xE000){}; \ 144*4882a593Smuzhiyun while((MMIO_IN16(ivideo->mmio_vbase, BR(16)+2) & 0xE000) != 0xE000){}; \ 145*4882a593Smuzhiyun while((MMIO_IN16(ivideo->mmio_vbase, BR(16)+2) & 0xE000) != 0xE000){}; \ 146*4882a593Smuzhiyun CmdQueLen = MMIO_IN16(ivideo->mmio_vbase, 0x8240); \ 147*4882a593Smuzhiyun } 148*4882a593Smuzhiyun /* (do three times, because 2D engine seems quite unsure about whether or not it's idle) */ 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define SiS300SetupSRCBase(base) \ 151*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 152*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(0), base);\ 153*4882a593Smuzhiyun CmdQueLen--; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun #define SiS300SetupSRCPitch(pitch) \ 156*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 157*4882a593Smuzhiyun MMIO_OUT16(ivideo->mmio_vbase, BR(1), pitch);\ 158*4882a593Smuzhiyun CmdQueLen--; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #define SiS300SetupSRCXY(x,y) \ 161*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 162*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(2), (x)<<16 | (y) );\ 163*4882a593Smuzhiyun CmdQueLen--; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun #define SiS300SetupDSTBase(base) \ 166*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 167*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(4), base);\ 168*4882a593Smuzhiyun CmdQueLen--; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #define SiS300SetupDSTXY(x,y) \ 171*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 172*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(3), (x)<<16 | (y) );\ 173*4882a593Smuzhiyun CmdQueLen--; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun #define SiS300SetupDSTRect(x,y) \ 176*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 177*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(5), (y)<<16 | (x) );\ 178*4882a593Smuzhiyun CmdQueLen--; 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun #define SiS300SetupDSTColorDepth(bpp) \ 181*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 182*4882a593Smuzhiyun MMIO_OUT16(ivideo->mmio_vbase, BR(1)+2, bpp);\ 183*4882a593Smuzhiyun CmdQueLen--; 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun #define SiS300SetupRect(w,h) \ 186*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 187*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(6), (h)<<16 | (w) );\ 188*4882a593Smuzhiyun CmdQueLen--; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun #define SiS300SetupPATFG(color) \ 191*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 192*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(7), color);\ 193*4882a593Smuzhiyun CmdQueLen--; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun #define SiS300SetupPATBG(color) \ 196*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 197*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(8), color);\ 198*4882a593Smuzhiyun CmdQueLen--; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun #define SiS300SetupSRCFG(color) \ 201*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 202*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(9), color);\ 203*4882a593Smuzhiyun CmdQueLen--; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun #define SiS300SetupSRCBG(color) \ 206*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 207*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(10), color);\ 208*4882a593Smuzhiyun CmdQueLen--; 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun /* 0x8224 src colorkey high */ 211*4882a593Smuzhiyun /* 0x8228 src colorkey low */ 212*4882a593Smuzhiyun /* 0x821c dest colorkey high */ 213*4882a593Smuzhiyun /* 0x8220 dest colorkey low */ 214*4882a593Smuzhiyun #define SiS300SetupSRCTrans(color) \ 215*4882a593Smuzhiyun if(CmdQueLen <= 1) SiS300Idle;\ 216*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, 0x8224, color);\ 217*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, 0x8228, color);\ 218*4882a593Smuzhiyun CmdQueLen -= 2; 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun #define SiS300SetupDSTTrans(color) \ 221*4882a593Smuzhiyun if(CmdQueLen <= 1) SiS300Idle;\ 222*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, 0x821C, color); \ 223*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, 0x8220, color); \ 224*4882a593Smuzhiyun CmdQueLen -= 2; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #define SiS300SetupMONOPAT(p0,p1) \ 227*4882a593Smuzhiyun if(CmdQueLen <= 1) SiS300Idle;\ 228*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(11), p0);\ 229*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(12), p1);\ 230*4882a593Smuzhiyun CmdQueLen -= 2; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun #define SiS300SetupClipLT(left,top) \ 233*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 234*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(13), ((left) & 0xFFFF) | (top)<<16 );\ 235*4882a593Smuzhiyun CmdQueLen--; 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun #define SiS300SetupClipRB(right,bottom) \ 238*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS300Idle;\ 239*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(14), ((right) & 0xFFFF) | (bottom)<<16 );\ 240*4882a593Smuzhiyun CmdQueLen--; 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun /* General */ 243*4882a593Smuzhiyun #define SiS300SetupROP(rop) \ 244*4882a593Smuzhiyun ivideo->CommandReg = (rop) << 8; 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun #define SiS300SetupCMDFlag(flags) \ 247*4882a593Smuzhiyun ivideo->CommandReg |= (flags); 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun #define SiS300DoCMD \ 250*4882a593Smuzhiyun if(CmdQueLen <= 1) SiS300Idle;\ 251*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(15), ivideo->CommandReg); \ 252*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, BR(16), 0);\ 253*4882a593Smuzhiyun CmdQueLen -= 2; 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun /* -------------- SiS 315/330 series --------------- */ 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun /* Q_STATUS: 258*4882a593Smuzhiyun bit 31 = 1: All engines idle and all queues empty 259*4882a593Smuzhiyun bit 30 = 1: Hardware Queue (=HW CQ, 2D queue, 3D queue) empty 260*4882a593Smuzhiyun bit 29 = 1: 2D engine is idle 261*4882a593Smuzhiyun bit 28 = 1: 3D engine is idle 262*4882a593Smuzhiyun bit 27 = 1: HW command queue empty 263*4882a593Smuzhiyun bit 26 = 1: 2D queue empty 264*4882a593Smuzhiyun bit 25 = 1: 3D queue empty 265*4882a593Smuzhiyun bit 24 = 1: SW command queue empty 266*4882a593Smuzhiyun bits 23:16: 2D counter 3 267*4882a593Smuzhiyun bits 15:8: 2D counter 2 268*4882a593Smuzhiyun bits 7:0: 2D counter 1 269*4882a593Smuzhiyun */ 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun #define SiS310Idle \ 272*4882a593Smuzhiyun { \ 273*4882a593Smuzhiyun while( (MMIO_IN16(ivideo->mmio_vbase, Q_STATUS+2) & 0x8000) != 0x8000){}; \ 274*4882a593Smuzhiyun while( (MMIO_IN16(ivideo->mmio_vbase, Q_STATUS+2) & 0x8000) != 0x8000){}; \ 275*4882a593Smuzhiyun while( (MMIO_IN16(ivideo->mmio_vbase, Q_STATUS+2) & 0x8000) != 0x8000){}; \ 276*4882a593Smuzhiyun while( (MMIO_IN16(ivideo->mmio_vbase, Q_STATUS+2) & 0x8000) != 0x8000){}; \ 277*4882a593Smuzhiyun CmdQueLen = 0; \ 278*4882a593Smuzhiyun } 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun #define SiS310SetupSRCBase(base) \ 281*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 282*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, SRC_ADDR, base);\ 283*4882a593Smuzhiyun CmdQueLen--; 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun #define SiS310SetupSRCPitch(pitch) \ 286*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 287*4882a593Smuzhiyun MMIO_OUT16(ivideo->mmio_vbase, SRC_PITCH, pitch);\ 288*4882a593Smuzhiyun CmdQueLen--; 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun #define SiS310SetupSRCXY(x,y) \ 291*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 292*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, SRC_Y, (x)<<16 | (y) );\ 293*4882a593Smuzhiyun CmdQueLen--; 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #define SiS310SetupDSTBase(base) \ 296*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 297*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, DST_ADDR, base);\ 298*4882a593Smuzhiyun CmdQueLen--; 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun #define SiS310SetupDSTXY(x,y) \ 301*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 302*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, DST_Y, (x)<<16 | (y) );\ 303*4882a593Smuzhiyun CmdQueLen--; 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun #define SiS310SetupDSTRect(x,y) \ 306*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 307*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, DST_PITCH, (y)<<16 | (x) );\ 308*4882a593Smuzhiyun CmdQueLen--; 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun #define SiS310SetupDSTColorDepth(bpp) \ 311*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 312*4882a593Smuzhiyun MMIO_OUT16(ivideo->mmio_vbase, AGP_BASE, bpp);\ 313*4882a593Smuzhiyun CmdQueLen--; 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun #define SiS310SetupRect(w,h) \ 316*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 317*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, RECT_WIDTH, (h)<<16 | (w) );\ 318*4882a593Smuzhiyun CmdQueLen--; 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun #define SiS310SetupPATFG(color) \ 321*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 322*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, PAT_FGCOLOR, color);\ 323*4882a593Smuzhiyun CmdQueLen--; 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun #define SiS310SetupPATBG(color) \ 326*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 327*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, PAT_BGCOLOR, color);\ 328*4882a593Smuzhiyun CmdQueLen--; 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun #define SiS310SetupSRCFG(color) \ 331*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 332*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, SRC_FGCOLOR, color);\ 333*4882a593Smuzhiyun CmdQueLen--; 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun #define SiS310SetupSRCBG(color) \ 336*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 337*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, SRC_BGCOLOR, color);\ 338*4882a593Smuzhiyun CmdQueLen--; 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun #define SiS310SetupSRCTrans(color) \ 341*4882a593Smuzhiyun if(CmdQueLen <= 1) SiS310Idle;\ 342*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, TRANS_SRC_KEY_HIGH, color);\ 343*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, TRANS_SRC_KEY_LOW, color);\ 344*4882a593Smuzhiyun CmdQueLen -= 2; 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun #define SiS310SetupDSTTrans(color) \ 347*4882a593Smuzhiyun if(CmdQueLen <= 1) SiS310Idle;\ 348*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, TRANS_DST_KEY_HIGH, color); \ 349*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, TRANS_DST_KEY_LOW, color); \ 350*4882a593Smuzhiyun CmdQueLen -= 2; 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun #define SiS310SetupMONOPAT(p0,p1) \ 353*4882a593Smuzhiyun if(CmdQueLen <= 1) SiS310Idle;\ 354*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, MONO_MASK, p0);\ 355*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, MONO_MASK+4, p1);\ 356*4882a593Smuzhiyun CmdQueLen -= 2; 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun #define SiS310SetupClipLT(left,top) \ 359*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 360*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, LEFT_CLIP, ((left) & 0xFFFF) | (top)<<16 );\ 361*4882a593Smuzhiyun CmdQueLen--; 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun #define SiS310SetupClipRB(right,bottom) \ 364*4882a593Smuzhiyun if(CmdQueLen <= 0) SiS310Idle;\ 365*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, RIGHT_CLIP, ((right) & 0xFFFF) | (bottom)<<16 );\ 366*4882a593Smuzhiyun CmdQueLen--; 367*4882a593Smuzhiyun 368*4882a593Smuzhiyun #define SiS310SetupROP(rop) \ 369*4882a593Smuzhiyun ivideo->CommandReg = (rop) << 8; 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun #define SiS310SetupCMDFlag(flags) \ 372*4882a593Smuzhiyun ivideo->CommandReg |= (flags); 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun #define SiS310DoCMD \ 375*4882a593Smuzhiyun if(CmdQueLen <= 1) SiS310Idle;\ 376*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, COMMAND_READY, ivideo->CommandReg); \ 377*4882a593Smuzhiyun MMIO_OUT32(ivideo->mmio_vbase, FIRE_TRIGGER, 0); \ 378*4882a593Smuzhiyun CmdQueLen -= 2; 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun int sisfb_initaccel(struct sis_video_info *ivideo); 381*4882a593Smuzhiyun void sisfb_syncaccel(struct sis_video_info *ivideo); 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun int fbcon_sis_sync(struct fb_info *info); 384*4882a593Smuzhiyun void fbcon_sis_fillrect(struct fb_info *info, const struct fb_fillrect *rect); 385*4882a593Smuzhiyun void fbcon_sis_copyarea(struct fb_info *info, const struct fb_copyarea *area); 386*4882a593Smuzhiyun 387*4882a593Smuzhiyun #endif 388