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