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