195b296d0Smrg/* 295b296d0Smrg * Copyright 1992-2003 by Alan Hourihane, North Wales, UK. 395b296d0Smrg * 495b296d0Smrg * Permission to use, copy, modify, distribute, and sell this software and its 595b296d0Smrg * documentation for any purpose is hereby granted without fee, provided that 695b296d0Smrg * the above copyright notice appear in all copies and that both that 795b296d0Smrg * copyright notice and this permission notice appear in supporting 895b296d0Smrg * documentation, and that the name of Alan Hourihane not be used in 995b296d0Smrg * advertising or publicity pertaining to distribution of the software without 1095b296d0Smrg * specific, written prior permission. Alan Hourihane makes no representations 1195b296d0Smrg * about the suitability of this software for any purpose. It is provided 1295b296d0Smrg * "as is" without express or implied warranty. 1395b296d0Smrg * 1495b296d0Smrg * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 1595b296d0Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 1695b296d0Smrg * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR 1795b296d0Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 1895b296d0Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 1995b296d0Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 2095b296d0Smrg * PERFORMANCE OF THIS SOFTWARE. 2195b296d0Smrg * 2295b296d0Smrg * Author: Alan Hourihane, alanh@fairlite.demon.co.uk 2395b296d0Smrg */ 2495b296d0Smrg 2595b296d0Smrg#define DEBUG 1 2695b296d0Smrg 2795b296d0Smrg#define NTSC 14.31818 2895b296d0Smrg#define PAL 17.73448 2995b296d0Smrg 3095b296d0Smrg/* General Registers */ 3195b296d0Smrg#define SPR 0x1F /* Software Programming Register (videoram) */ 3295b296d0Smrg 3395b296d0Smrg/* 3C4 */ 3495b296d0Smrg#define RevisionID 0x09 3595b296d0Smrg#define ConfPort1 0x0C 3695b296d0Smrg#define ConfPort2 0x0C 3795b296d0Smrg#define NewMode2 0x0D 3895b296d0Smrg#define OldMode2 0x00 /* Should be 0x0D - dealt with in trident_dac.c */ 3995b296d0Smrg#define OldMode1 0x0E 4095b296d0Smrg#define NewMode1 0x0E 4195b296d0Smrg#define Protection 0x11 4295b296d0Smrg#define Threshold 0x12 4395b296d0Smrg#define MCLKLow 0x16 4495b296d0Smrg#define MCLKHigh 0x17 4595b296d0Smrg#define ClockLow 0x18 4695b296d0Smrg#define ClockHigh 0x19 4795b296d0Smrg#define SSetup 0x20 4895b296d0Smrg#define SKey 0x37 4995b296d0Smrg#define SPKey 0x57 5095b296d0Smrg#define GBslope1 0xB4 5195b296d0Smrg#define GBslope2 0xB5 5295b296d0Smrg#define GBslope3 0xB6 5395b296d0Smrg#define GBslope4 0xB7 5495b296d0Smrg#define GBintercept1 0xB8 5595b296d0Smrg#define GBintercept2 0xB9 5695b296d0Smrg#define GBintercept3 0xBA 5795b296d0Smrg#define GBintercept4 0xBB 5895b296d0Smrg 5995b296d0Smrg/* 3x4 */ 6095b296d0Smrg#define Offset 0x13 6195b296d0Smrg#define Underline 0x14 6295b296d0Smrg#define CRTCMode 0x17 6395b296d0Smrg#define CRTCModuleTest 0x1E 6495b296d0Smrg#define FIFOControl 0x20 6595b296d0Smrg#define LinearAddReg 0x21 6695b296d0Smrg#define DRAMTiming 0x23 6795b296d0Smrg#define New32 0x23 6895b296d0Smrg#define RAMDACTiming 0x25 6995b296d0Smrg#define CRTHiOrd 0x27 7095b296d0Smrg#define AddColReg 0x29 7195b296d0Smrg#define InterfaceSel 0x2A 7295b296d0Smrg#define HorizOverflow 0x2B 7395b296d0Smrg#define GETest 0x2D 7495b296d0Smrg#define Performance 0x2F 7595b296d0Smrg#define GraphEngReg 0x36 7695b296d0Smrg#define I2C 0x37 7795b296d0Smrg#define PixelBusReg 0x38 7895b296d0Smrg#define PCIReg 0x39 7995b296d0Smrg#define DRAMControl 0x3A 8095b296d0Smrg#define MiscContReg 0x3C 8195b296d0Smrg#define CursorXLow 0x40 8295b296d0Smrg#define CursorXHigh 0x41 8395b296d0Smrg#define CursorYLow 0x42 8495b296d0Smrg#define CursorYHigh 0x43 8595b296d0Smrg#define CursorLocLow 0x44 8695b296d0Smrg#define CursorLocHigh 0x45 8795b296d0Smrg#define CursorXOffset 0x46 8895b296d0Smrg#define CursorYOffset 0x47 8995b296d0Smrg#define CursorFG1 0x48 9095b296d0Smrg#define CursorFG2 0x49 9195b296d0Smrg#define CursorFG3 0x4A 9295b296d0Smrg#define CursorFG4 0x4B 9395b296d0Smrg#define CursorBG1 0x4C 9495b296d0Smrg#define CursorBG2 0x4D 9595b296d0Smrg#define CursorBG3 0x4E 9695b296d0Smrg#define CursorBG4 0x4F 9795b296d0Smrg#define CursorControl 0x50 9895b296d0Smrg#define PCIRetry 0x55 9995b296d0Smrg#define PreEndControl 0x56 10095b296d0Smrg#define PreEndFetch 0x57 10195b296d0Smrg#define PCIMaster 0x60 10295b296d0Smrg#define Enhancement0 0x62 10395b296d0Smrg#define NewEDO 0x64 10495b296d0Smrg#define TVinterface 0xC0 10595b296d0Smrg#define TVMode 0xC1 10695b296d0Smrg#define ClockControl 0xCF 10795b296d0Smrg 10895b296d0Smrg 10995b296d0Smrg/* 3CE */ 11095b296d0Smrg#define MiscExtFunc 0x0F 11195b296d0Smrg#define MiscIntContReg 0x2F 11295b296d0Smrg#define CyberControl 0x30 11395b296d0Smrg#define CyberEnhance 0x31 11495b296d0Smrg#define FPConfig 0x33 11595b296d0Smrg#define VertStretch 0x52 11695b296d0Smrg#define HorStretch 0x53 11795b296d0Smrg#define BiosMode 0x5c 11895b296d0Smrg#define BiosNewMode1 0x5a 11995b296d0Smrg#define BiosNewMode2 0x5c 12095b296d0Smrg#define BiosReg 0x5d 12195b296d0Smrg#define DisplayEngCont 0xD1 12295b296d0Smrg 12395b296d0Smrg/* Graphics Engine for 9420/9430 */ 12495b296d0Smrg 12595b296d0Smrg#define GER_INDEX 0x210A 12695b296d0Smrg#define GER_BYTE0 0x210C 12795b296d0Smrg#define GER_BYTE1 0x210D 12895b296d0Smrg#define GER_BYTE2 0x210E 12995b296d0Smrg#define GER_BYTE3 0x210F 13095b296d0Smrg#define MMIOBASE 0x7C 13195b296d0Smrg#define OLDGER_STATUS 0x90 13295b296d0Smrg#define OLDGER_MWIDTH 0xB8 13395b296d0Smrg#define OLDGER_MFORMAT 0xBC 13495b296d0Smrg#define OLDGER_STYLE 0xC4 13595b296d0Smrg#define OLDGER_FMIX 0xC8 13695b296d0Smrg#define OLDGER_BMIX 0xC8 13795b296d0Smrg#define OLDGER_FCOLOUR 0xD8 13895b296d0Smrg#define OLDGER_BCOLOUR 0xDC 13995b296d0Smrg#define OLDGER_DIMXY 0xE0 14095b296d0Smrg#define OLDGER_DESTLINEAR 0xE4 14195b296d0Smrg#define OLDGER_DESTXY 0xF8 14295b296d0Smrg#define OLDGER_COMMAND 0xFC 14395b296d0Smrg#define OLDGE_FILL 0x000A0000 /* Area Fill */ 14495b296d0Smrg 14595b296d0Smrg/* Graphics Engine for 9440/9660/9680 */ 14695b296d0Smrg 14795b296d0Smrg#define GER_STATUS 0x2120 14895b296d0Smrg#define GE_BUSY 0x80 14995b296d0Smrg#define GER_OPERMODE 0x2122 /* Byte for 9440, Word for 96xx */ 15095b296d0Smrg#define DST_ENABLE 0x200 /* Destination Transparency */ 15195b296d0Smrg#define GER_COMMAND 0x2124 15295b296d0Smrg#define GE_NOP 0x00 /* No Operation */ 15395b296d0Smrg#define GE_BLT 0x01 /* BitBLT ROP3 only */ 15495b296d0Smrg#define GE_BLT_ROP4 0x02 /* BitBLT ROP4 (96xx only) */ 15595b296d0Smrg#define GE_SCANLINE 0x03 /* Scan Line */ 15695b296d0Smrg#define GE_BRESLINE 0x04 /* Bresenham Line */ 15795b296d0Smrg#define GE_SHVECTOR 0x05 /* Short Vector */ 15895b296d0Smrg#define GE_FASTLINE 0x06 /* Fast Line (96xx only) */ 15995b296d0Smrg#define GE_TRAPEZ 0x07 /* Trapezoidal fill (96xx only) */ 16095b296d0Smrg#define GE_ELLIPSE 0x08 /* Ellipse (96xx only) (RES) */ 16195b296d0Smrg#define GE_ELLIP_FILL 0x09 /* Ellipse Fill (96xx only) (RES)*/ 16295b296d0Smrg#define GER_FMIX 0x2127 16395b296d0Smrg#define GER_DRAWFLAG 0x2128 /* long */ 16495b296d0Smrg#define FASTMODE 1<<28 16595b296d0Smrg#define STENCIL 0x8000 16695b296d0Smrg#define SOLIDFILL 0x4000 16795b296d0Smrg#define TRANS_ENABLE 0x1000 16895b296d0Smrg#define TRANS_REVERSE 0x2000 16995b296d0Smrg#define YMAJ 0x0400 17095b296d0Smrg#define XNEG 0x0200 17195b296d0Smrg#define YNEG 0x0100 17295b296d0Smrg#define SRCMONO 0x0040 17395b296d0Smrg#define PATMONO 0x0020 17495b296d0Smrg#define SCR2SCR 0x0004 17595b296d0Smrg#define PAT2SCR 0x0002 17695b296d0Smrg#define GER_FCOLOUR 0x212C /* Word for 9440, long for 96xx */ 17795b296d0Smrg#define GER_BCOLOUR 0x2130 /* Word for 9440, long for 96xx */ 17895b296d0Smrg#define GER_PATLOC 0x2134 /* Word */ 17995b296d0Smrg#define GER_DEST_XY 0x2138 18095b296d0Smrg#define GER_DEST_X 0x2138 /* Word */ 18195b296d0Smrg#define GER_DEST_Y 0x213A /* Word */ 18295b296d0Smrg#define GER_SRC_XY 0x213C 18395b296d0Smrg#define GER_SRC_X 0x213C /* Word */ 18495b296d0Smrg#define GER_SRC_Y 0x213E /* Word */ 18595b296d0Smrg#define GER_DIM_XY 0x2140 18695b296d0Smrg#define GER_DIM_X 0x2140 /* Word */ 18795b296d0Smrg#define GER_DIM_Y 0x2142 /* Word */ 18895b296d0Smrg#define GER_STYLE 0x2144 /* Long */ 18995b296d0Smrg#define GER_CKEY 0x2168 /* Long */ 19095b296d0Smrg#define GER_FPATCOL 0x2178 19195b296d0Smrg#define GER_BPATCOL 0x217C 19295b296d0Smrg#define GER_PATTERN 0x2180 /* from 0x2180 to 0x21FF */ 19395b296d0Smrg 19495b296d0Smrg/* Additional - Graphics Engine for 96xx */ 19595b296d0Smrg#define GER_SRCCLIP_XY 0x2148 19695b296d0Smrg#define GER_SRCCLIP_X 0x2148 /* Word */ 19795b296d0Smrg#define GER_SRCCLIP_Y 0x214A /* Word */ 19895b296d0Smrg#define GER_DSTCLIP_XY 0x214C 19995b296d0Smrg#define GER_DSTCLIP_X 0x214C /* Word */ 20095b296d0Smrg#define GER_DSTCLIP_Y 0x214E /* Word */ 20195b296d0Smrg 20295b296d0Smrg/* Graphics Engine for Cyberblade/i1 */ 20395b296d0Smrg#define GER_SRC1 0x2100 20495b296d0Smrg#define GER_SRC2 0x2104 20595b296d0Smrg#define GER_DST1 0x2108 20695b296d0Smrg#define GER_DST2 0x210C 20795b296d0Smrg#define GER_CONTROL 0x2124 20895b296d0Smrg#define GER_CTL_RESET (1 << 7) 20995b296d0Smrg#define GER_CTL_RESUME 0 21095b296d0Smrg#define GER_DRAW_CMD 0x2144 21195b296d0Smrg#define GER_OP_NULL 0 21295b296d0Smrg#define GER_OP_RSVD1 (1 << 28) 21395b296d0Smrg#define GER_OP_LINE (2 << 28) 21495b296d0Smrg#define GER_OP_RSVD2 (3 << 28) 21595b296d0Smrg#define GER_OP_RSVD3 (4 << 28) 21695b296d0Smrg#define GER_OP_RSVD4 (5 << 28) 21795b296d0Smrg#define GER_OP_RSVD5 (6 << 28) 21895b296d0Smrg#define GER_OP_RSVD6 (7 << 28) 21995b296d0Smrg#define GER_OP_BLT_FB (8 << 28) 22095b296d0Smrg#define GER_OP_TXT_FB (9 << 28) 22195b296d0Smrg#define GER_OP_BLT_HOST (0xA << 28) 22295b296d0Smrg#define GER_OP_TRAP_POLY1 (0xB<< 28) 22395b296d0Smrg#define GER_OP_BLT_RE (0xC << 28) 22495b296d0Smrg#define GER_OP_TXT_RE (0xD << 28) 22595b296d0Smrg#define GER_OP_TRAP_POLY (0xE << 28) 22695b296d0Smrg#define GER_OP_RSVD7 (0xF << 28) 22795b296d0Smrg 22895b296d0Smrg/* Op args */ 22995b296d0Smrg#define GER_DRAW_SRC_COLOR (1 << 19) 23095b296d0Smrg#define GER_ROP_ENABLE (1 << 4) 23195b296d0Smrg 23295b296d0Smrg/* Blt, line & poly op operation sources */ 23395b296d0Smrg#define GER_BLT_SRC_HOST (0 << 2) 23495b296d0Smrg#define GER_BLT_SRC_FB (1 << 2) 23595b296d0Smrg#define GER_SRC_CONST (2 << 2) 23695b296d0Smrg#define GER_BLK_WRITE (3 << 2) 23795b296d0Smrg 23895b296d0Smrg#define GER_ROP 0x2148 23995b296d0Smrg#define GER_CLIP0 0x2154 24095b296d0Smrg#define GER_CLIP1 0x2158 24195b296d0Smrg#define GER_FGCOLOR 0x2160 24295b296d0Smrg#define GER_BITMASK 0x2184 24395b296d0Smrg#define GER_PATSTYLE 0x216C 24495b296d0Smrg#define GER_DSTBASE0 0x21B8 24595b296d0Smrg#define GER_DSTBASE1 0x21BC 24695b296d0Smrg#define GER_DSTBASE2 0x21C0 24795b296d0Smrg#define GER_DSTBASE3 0x21C4 24895b296d0Smrg#define GER_SRCBASE0 0x21C8 24995b296d0Smrg#define GER_SRCBASE1 0x21CC 25095b296d0Smrg#define GER_SRCBASE2 0x21D0 25195b296d0Smrg#define GER_SRCBASE3 0x21C4 25295b296d0Smrg 25395b296d0Smrg/* Wait for VSync */ 25495b296d0Smrg#define WAITFORVSYNC \ 25595b296d0Smrg { \ 25695b296d0Smrg while (hwp->readST01(hwp)&0x8) {}; \ 25795b296d0Smrg while (!(hwp->readST01(hwp)&0x8)) {}; \ 25895b296d0Smrg } 25995b296d0Smrg 26095b296d0Smrg/* Defines for IMAGE Graphics Engine */ 26195b296d0Smrg#define IMAGE_GE_STATUS 0x2164 26295b296d0Smrg#define IMAGE_GE_DRAWENV 0x2120 26395b296d0Smrg 26495b296d0Smrg/* Defines for BLADE Graphics Engine */ 26595b296d0Smrg#define BLADE_GE_STATUS 0x2120 26695b296d0Smrg#define BLADE_XP_GER_OPERMODE 0x2125 26795b296d0Smrg 26895b296d0Smrg#define REPLICATE(r) \ 26995b296d0Smrg{ \ 27095b296d0Smrg if (pScrn->bitsPerPixel == 16) { \ 27195b296d0Smrg r = ((r & 0xFFFF) << 16) | (r & 0xFFFF); \ 27295b296d0Smrg } else \ 27395b296d0Smrg if (pScrn->bitsPerPixel == 8) { \ 27495b296d0Smrg r &= 0xFF; \ 27595b296d0Smrg r |= (r<<8); \ 27695b296d0Smrg r |= (r<<16); \ 27795b296d0Smrg } \ 27895b296d0Smrg} 27995b296d0Smrg 28095b296d0Smrg#define CHECKCLIPPING \ 28195b296d0Smrg if (pTrident->Clipping) { \ 28295b296d0Smrg pTrident->Clipping = FALSE; \ 28395b296d0Smrg if (pTrident->Chipset < PROVIDIA9682) { \ 28495b296d0Smrg TGUI_SRCCLIP_XY(0,0); \ 28595b296d0Smrg TGUI_DSTCLIP_XY(4095,2047); \ 28695b296d0Smrg } \ 28795b296d0Smrg } 28895b296d0Smrg 28995b296d0Smrg 29095b296d0Smrg/* Merge XY */ 29195b296d0Smrg#define XY_MERGE(x,y) \ 29295b296d0Smrg ((((CARD32)(y)&0xFFFF) << 16) | ((CARD32)(x) & 0xffff)) 29395b296d0Smrg#define XP_XY_MERGE(y,x) \ 29495b296d0Smrg ((((CARD32)(y)&0xFFFF) << 16) | ((CARD32)(x) & 0xffff)) 29595b296d0Smrg 29695b296d0Smrg#define TRIDENT_WRITE_REG(v,r) \ 29795b296d0Smrg MMIO_OUT32(pTrident->IOBase,(r),(v)) 29895b296d0Smrg 29995b296d0Smrg#define TRIDENT_READ_REG(r) \ 30095b296d0Smrg MMIO_IN32(pTrident->IOBase,(r)) 30195b296d0Smrg 30295b296d0Smrg#define OUTB(addr, data) \ 30395b296d0Smrg{ \ 30495b296d0Smrg if (IsPciCard && UseMMIO) { \ 30595b296d0Smrg MMIO_OUT8(pTrident->IOBase, addr, data); \ 30695b296d0Smrg } else { \ 30795b296d0Smrg outb(pTrident->PIOBase + (addr), data); \ 30895b296d0Smrg } \ 30995b296d0Smrg} 31095b296d0Smrg#define OUTW(addr, data) \ 31195b296d0Smrg{ \ 31295b296d0Smrg if (IsPciCard && UseMMIO) { \ 31395b296d0Smrg MMIO_OUT16(pTrident->IOBase, addr, data); \ 31495b296d0Smrg } else { \ 31595b296d0Smrg outw(pTrident->PIOBase + (addr), data); \ 31695b296d0Smrg } \ 31795b296d0Smrg} 31895b296d0Smrg#define INB(addr) \ 31995b296d0Smrg( \ 32095b296d0Smrg (IsPciCard && UseMMIO) ? \ 32195b296d0Smrg MMIO_IN8(pTrident->IOBase, addr) : \ 32295b296d0Smrg inb(pTrident->PIOBase + (addr)) \ 32395b296d0Smrg) 32495b296d0Smrg 32595b296d0Smrg#define OUTW_3C4(reg) \ 32695b296d0Smrg OUTW(0x3C4, (tridentReg->tridentRegs3C4[reg])<<8 | (reg)) 32795b296d0Smrg#define OUTW_3CE(reg) \ 32895b296d0Smrg OUTW(0x3CE, (tridentReg->tridentRegs3CE[reg])<<8 | (reg)) 32995b296d0Smrg#define OUTW_3x4(reg) \ 33095b296d0Smrg OUTW(vgaIOBase + 4, (tridentReg->tridentRegs3x4[reg])<<8 | (reg)) 33195b296d0Smrg#define INB_3x4(reg) \ 33295b296d0Smrg OUTB(vgaIOBase + 4, reg); \ 33395b296d0Smrg tridentReg->tridentRegs3x4[reg] = INB(vgaIOBase + 5) 33495b296d0Smrg#define INB_3C4(reg) \ 33595b296d0Smrg OUTB(0x3C4, reg); \ 33695b296d0Smrg tridentReg->tridentRegs3C4[reg] = INB(0x3C5); 33795b296d0Smrg#define INB_3CE(reg) \ 33895b296d0Smrg OUTB(0x3CE, reg); \ 33995b296d0Smrg tridentReg->tridentRegs3CE[reg] = INB(0x3CF); 34095b296d0Smrg 34195b296d0Smrg#define VIDEOOUT(val,reg) \ 34295b296d0Smrg if (pTrident->Chipset >= CYBER9397) { \ 34395b296d0Smrg OUTW(0x3C4, (val << 8) | reg); \ 34495b296d0Smrg } else { \ 34595b296d0Smrg OUTB(0x83C8, reg); \ 34695b296d0Smrg OUTB(0x83C6, val); \ 34795b296d0Smrg } 34895b296d0Smrg 34995b296d0Smrg 35095b296d0Smrg#define BLTBUSY(b) \ 35195b296d0Smrg (b = MMIO_IN8(pTrident->IOBase,GER_STATUS) & GE_BUSY) 35295b296d0Smrg#define OLDBLTBUSY(b) \ 35395b296d0Smrg (b = MMIO_IN8(pTrident->IOBase,OLDGER_STATUS) & GE_BUSY) 35495b296d0Smrg#define IMAGE_STATUS(c) \ 35595b296d0Smrg MMIO_OUT32(pTrident->IOBase, IMAGE_GE_STATUS, (c)) 35695b296d0Smrg#define TGUI_STATUS(c) \ 35795b296d0Smrg MMIO_OUT8(pTrident->IOBase, GER_STATUS, (c)) 35895b296d0Smrg#define OLDTGUI_STATUS(c) \ 35995b296d0Smrg MMIO_OUT8(pTrident->IOBase, OLDGER_STATUS, (c)) 36095b296d0Smrg#define TGUI_OPERMODE(c) \ 36195b296d0Smrg MMIO_OUT16(pTrident->IOBase, GER_OPERMODE, (c)) 36295b296d0Smrg#define BLADE_XP_OPERMODE(c) \ 36395b296d0Smrg MMIO_OUT8(pTrident->IOBase, BLADE_XP_GER_OPERMODE, (c)) 36495b296d0Smrg/* XXX */ 36595b296d0Smrg#define OLDTGUI_OPERMODE(c) \ 36695b296d0Smrg { \ 36795b296d0Smrg MMIO_OUT16(pTrident->IOBase, OLDGER_MWIDTH, \ 36895b296d0Smrg vga256InfoRec.displayWidth - 1); \ 36995b296d0Smrg MMIO_OUT8(pTrident->IOBase, OLDGER_MFORMAT, (c)); \ 37095b296d0Smrg } 37195b296d0Smrg#define TGUI_FCOLOUR(c) \ 37295b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_FCOLOUR, (c)) 37395b296d0Smrg#define TGUI_FPATCOL(c) \ 37495b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_FPATCOL, (c)) 37595b296d0Smrg#define OLDTGUI_FCOLOUR(c) \ 37695b296d0Smrg MMIO_OUT32(pTrident->IOBase, OLDGER_FCOLOUR, (c)) 37795b296d0Smrg#define TGUI_BCOLOUR(c) \ 37895b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_BCOLOUR, (c)) 37995b296d0Smrg#define TGUI_BPATCOL(c) \ 38095b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_BPATCOL, (c)) 38195b296d0Smrg#define OLDTGUI_BCOLOUR(c) \ 38295b296d0Smrg MMIO_OUT32(pTrident->IOBase, OLDGER_BCOLOUR, (c)) 38395b296d0Smrg#define IMAGE_DRAWENV(c) \ 38495b296d0Smrg MMIO_OUT32(pTrident->IOBase, IMAGE_GE_DRAWENV, (c)) 38595b296d0Smrg#define TGUI_DRAWFLAG(c) \ 38695b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_DRAWFLAG, (c)) 38795b296d0Smrg#define OLDTGUI_STYLE(c) \ 38895b296d0Smrg MMIO_OUT16(pTrident->IOBase, OLDGER_STYLE, (c)) 38995b296d0Smrg#define TGUI_FMIX(c) \ 39095b296d0Smrg MMIO_OUT8(pTrident->IOBase, GER_FMIX, (c)) 39195b296d0Smrg#define OLDTGUI_FMIX(c) \ 39295b296d0Smrg MMIO_OUT8(pTrident->IOBase, OLDGER_FMIX, (c)) 39395b296d0Smrg#define OLDTGUI_BMIX(c) \ 39495b296d0Smrg MMIO_OUT8(pTrident->IOBase, OLDGER_BMIX, (c)) 39595b296d0Smrg#define TGUI_DIM_XY(w,h) \ 39695b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_DIM_XY, XY_MERGE((w)-1,(h)-1)) 39795b296d0Smrg#define XP_DIM_XY(w,h) \ 39895b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_DIM_XY, XY_MERGE((h),(w))) 39995b296d0Smrg#define TGUI_STYLE(c) \ 40095b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_STYLE, (c)) 40195b296d0Smrg#define OLDTGUI_DIMXY(w,h) \ 40295b296d0Smrg MMIO_OUT32(pTrident->IOBase, OLDGER_DIMXY, XY_MERGE((w)-1,(h)-1)) 40395b296d0Smrg#define TGUI_SRC_XY(x,y) \ 40495b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_SRC_XY, XY_MERGE(x,y)) 40595b296d0Smrg#define XP_SRC_XY(x,y) \ 40695b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_SRC_XY, XP_XY_MERGE(x,y)) 40795b296d0Smrg#define TGUI_DEST_XY(x,y) \ 40895b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_DEST_XY, XY_MERGE(x,y)) 40995b296d0Smrg#define XP_DEST_XY(x,y) \ 41095b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_DEST_XY, XP_XY_MERGE(x,y)) 41195b296d0Smrg#define OLDTGUI_DESTXY(x,y) \ 41295b296d0Smrg MMIO_OUT32(pTrident->IOBase, OLDGER_DESTXY, XY_MERGE(x,y)) 41395b296d0Smrg#define OLDTGUI_DESTLINEAR(c) \ 41495b296d0Smrg MMIO_OUT32(pTrident->IOBase, OLDGER_DESTLINEAR, (c)) 41595b296d0Smrg#define TGUI_SRCCLIP_XY(x,y) \ 41695b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_SRCCLIP_XY, XY_MERGE(x,y)) 41795b296d0Smrg#define TGUI_DSTCLIP_XY(x,y) \ 41895b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_DSTCLIP_XY, XY_MERGE(x,y)) 41995b296d0Smrg#define TGUI_PATLOC(addr) \ 42095b296d0Smrg MMIO_OUT16(pTrident->IOBase, GER_PATLOC, (addr)) 42195b296d0Smrg#define TGUI_CKEY(c) \ 42295b296d0Smrg MMIO_OUT32(pTrident->IOBase, GER_CKEY, (c)) 42395b296d0Smrg#define IMAGEBUSY(b) \ 42495b296d0Smrg (b = MMIO_IN32(pTrident->IOBase,IMAGE_GE_STATUS) & 0xF0000000) 42595b296d0Smrg#define BLADEBUSY(b) \ 42695b296d0Smrg (b = MMIO_IN32(pTrident->IOBase,BLADE_GE_STATUS) & 0xFA800000) 42795b296d0Smrg#define IMAGE_OUT(addr, c) \ 42895b296d0Smrg MMIO_OUT32(pTrident->IOBase, addr, (c)) 42995b296d0Smrg#define BLADE_OUT(addr, c) \ 43095b296d0Smrg MMIO_OUT32(pTrident->IOBase, addr, (c)) 43195b296d0Smrg#define TGUI_OUTL(addr, c) \ 43295b296d0Smrg MMIO_OUT32(pTrident->IOBase, addr, (c)) 43395b296d0Smrg#define TGUI_COMMAND(c) \ 43495b296d0Smrg MMIO_OUT8(pTrident->IOBase, GER_COMMAND, (c)) 43595b296d0Smrg#define OLDTGUI_COMMAND(c) \ 43695b296d0Smrg do { \ 43795b296d0Smrg OLDTGUI_OPERMODE(GE_OP); \ 43895b296d0Smrg OLDTGUISync(); \ 43995b296d0Smrg MMIO_OUT32(pTrident->IOBase, OLDGER_COMMAND, (c)); \ 44095b296d0Smrg } while (0) 44195b296d0Smrg 44295b296d0Smrg/* Cyber FP support */ 44395b296d0Smrg#define SHADOW_ENABLE(oldval) \ 44495b296d0Smrg do {\ 44595b296d0Smrg OUTB(0x3CE, CyberControl); \ 44695b296d0Smrg oldval = INB(0x3CF);\ 44795b296d0Smrg OUTB(0x3CF,oldval | (1 << 6));\ 44895b296d0Smrg } while (0) 44995b296d0Smrg#define SHADOW_RESTORE(val) \ 45095b296d0Smrg do {\ 45195b296d0Smrg OUTB(0x3CE, CyberControl); \ 45295b296d0Smrg OUTB(0x3CF,val); \ 45395b296d0Smrg } while (0); 454