/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h,v 1.36 2003/01/12 03:55:47 tsi Exp $ */

/*
 * glint register file 
 *
 * Copyright by Stefan Dirsch, Dirk Hohndel, Alan Hourihane
 * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk>
 *          Dirk Hohndel, <hohndel@suse.de>
 *          Stefan Dirsch, <sndirsch@suse.de>
 *          Simon P., <sim@suse.de>
 *
 * this work is sponsored by S.u.S.E. GmbH, Fuerth, Elsa GmbH, Aachen and
 * Siemens Nixdorf Informationssysteme
 *
 */ 

#ifndef _GLINTREG_H_
#define _GLINTREG_H_

#include "compiler.h"

/* The chips we know */
#define PCI_CHIP_3DLABS_300SX					0x01
#define PCI_CHIP_3DLABS_500TX					0x02
#define PCI_CHIP_3DLABS_DELTA					0x03
#define PCI_CHIP_3DLABS_PERMEDIA				0x04
#define PCI_CHIP_3DLABS_MX					0x06
#define PCI_CHIP_3DLABS_PERMEDIA2				0x07
#define PCI_CHIP_3DLABS_GAMMA					0x08
#define PCI_CHIP_3DLABS_PERMEDIA2V				0x09
#define PCI_CHIP_3DLABS_PERMEDIA3				0x0A
#define PCI_CHIP_3DLABS_PERMEDIA4				0x0C
#define PCI_CHIP_3DLABS_R4					0x0D
#define PCI_CHIP_3DLABS_GAMMA2					0x0E

/* The boards we know */
#define IS_GLORIAXXL	((pGlint->PciInfo->subsysVendor == 0x1048) && \
			 (pGlint->PciInfo->subsysCard   == 0x0a42))

#define IS_GLORIASYNERGY ((pGlint->PciInfo->subsysVendor == 0x1048) && \
			 (pGlint->PciInfo->subsysCard   == 0x0a32))

#define IS_GMX2000	((pGlint->PciInfo->subsysVendor == 0x3d3d) && \
			 (pGlint->PciInfo->subsysCard   == 0x0106))

#define IS_J2000	((pGlint->PciInfo->subsysVendor == 0x1097) && \
			 (pGlint->PciInfo->subsysCard   == 0x3d32))

#define IS_JPRO		((pGlint->PciInfo->subsysVendor == 0x1097) && \
			 (pGlint->PciInfo->subsysCard   == 0x3db3))

/* COMPAQ OEM VX1 PCI
 *   subsys == 0x0121 if VGA is enabled
 *   subsys == 0x000a if VGA has never been enabled
 */
#define IS_PCI_QVX1	(pGlint->PciInfo->subsysVendor == 0x3d3d &&  \
                         ((pGlint->PciInfo->subsysCard == 0x0121) ||  \
			  (pGlint->PciInfo->subsysCard == 0x000a)))

/* COMPAQ OEM VX1 AGP
 *   subsys == 0x0144 if VGA is enabled
 *   subsys == 0x000c if VGA has never been enabled
 */
#define IS_AGP_QVX1	(pGlint->PciInfo->subsysVendor == 0x3d3d &&  \
			 ((pGlint->PciInfo->subsysCard == 0x0144) ||  \
			  (pGlint->PciInfo->subsysCard == 0x000c)))

#define IS_QVX1		(IS_PCI_QVX1 || IS_AGP_QVX1)

#define IS_ELSA_SYNERGY	((pGlint->PciInfo->subsysVendor == 0x1048) && \
			 (pGlint->PciInfo->subsysCard   == 0x0a32))

/* COMPAQ OEM Permedia 2V with VGA disable jumper - 0x13e9 ? */
#define IS_QPM2V	((pGlint->PciInfo->subsysVendor == 0x13e9) && \
			 ((pGlint->PciInfo->subsysCard == 0x0100) ||  \
			  (pGlint->PciInfo->subsysCard == 0x0002)))

/**********************************************
*  GLINT 500TX Configuration Region Registers *
***********************************************/

/* Device Identification */
#define CFGVendorId						0x0000
#define PCI_VENDOR_3DLABS					0x3D3D
#define PCI_VENDOR_TI						0x104C
#define CFGDeviceId						0x0002

#define CFGRevisionId						0x08
#define CFGClassCode						0x09
#define CFGHeaderType						0x0E

/* Device Control/Status */
#define CFGCommand							0x04
#define CFGStatus							0x06

/* Miscellaneous Functions */
#define CFGBist								0x0f
#define CFGLatTimer							0x0d
#define CFGCacheLine							0x0c
#define CFGMaxLat							0x3f
#define CFGMinGrant							0x3e
#define CFGIntPin							0x3d
#define CFGIntLine							0x3c

/* Base Adresses */
#define CFGBaseAddr0							0x10 
#define CFGBaseAddr1							0x14
#define CFGBaseAddr2							0x18
#define CFGBaseAddr3							0x1C
#define CFGBaseAddr4							0x20
#define CFGRomAddr							0x30



/**********************************
 * GLINT 500TX Region 0 Registers *
 **********************************/

/* Control Status Registers */
#define ResetStatus							0x0000
#define IntEnable							0x0008
#define IntFlags							0x0010
#define InFIFOSpace							0x0018
#define OutFIFOWords							0x0020
#define DMAAddress							0x0028
#define DMACount							0x0030
#define ErrorFlags							0x0038
#define VClkCtl								0x0040
#define TestRegister							0x0048
#define Aperture0							0x0050
#define Aperture1							0x0058
#define DMAControl							0x0060
#define FIFODis								0x0068

/* GLINT PerMedia Region 0 additional Registers */
#define ChipConfig							0x0070
#define   SCLK_SEL_MASK		(3 << 10)
#define   SCLK_SEL_MCLK_HALF	(3 << 10)
#define ByDMAControl							0x00D8

/* GLINT 500TX LocalBuffer Registers */
#define LBMemoryCtl							0x1000
#define   LBNumBanksMask	0x00000001
#define    LBNumBanks1		(0)
#define    LBNumBanks2		(1)
#define   LBPageSizeMask        0x00000006
#define    LBPageSize256	(0<<1)
#define    LBPageSize512	(1<<1)
#define    LBPageSize1024	(2<<1)
#define    LBPageSize2048	(3<<1)
#define   LBRASCASLowMask	0x00000018
#define    LBRASCASLow2		(0<<3)
#define    LBRASCASLow3		(1<<3)
#define    LBRASCASLow4		(2<<3)
#define    LBRASCASLow5		(3<<3)
#define   LBRASPrechargeMask	0x00000060
#define    LBRASPrecharge2	(0<<5)
#define    LBRASPrecharge3	(1<<5)
#define    LBRASPrecharge4	(2<<5)
#define    LBRASPrecharge5	(3<<5)
#define   LBCASLowMask		0x00000180
#define    LBCASLow1		(0<<7)
#define    LBCASLow2		(1<<7)
#define    LBCASLow3		(2<<7)
#define    LBCASLow4		(3<<7)
#define   LBPageModeMask	0x00000200
#define    LBPageModeEnabled	(0<<9)
#define    LBPageModeDisabled	(1<<9)
#define   LBRefreshCountMask    0x0003fc00
#define   LBRefreshCountShift   10

#define LBMemoryEDO							0x1008
#define   LBEDOMask		0x00000001
#define    LBEDODisabled	(0)
#define    LBEDOEnabled		(1)
#define   LBEDOBankSizeMask	0x0000000e
#define    LBEDOBankSizeDiabled	(0<<1)
#define    LBEDOBankSize256K	(1<<1)
#define    LBEDOBankSize512K	(2<<1)
#define    LBEDOBankSize1M	(3<<1)
#define    LBEDOBankSize2M	(4<<1)
#define    LBEDOBankSize4M	(5<<1)
#define    LBEDOBankSize8M	(6<<1)
#define    LBEDOBankSize16M	(7<<1)
#define   LBTwoPageDetectorMask	0x00000010
#define    LBSinglePageDetector	(0<<4)
#define    LBTwoPageDetector	(1<<4)

/* GLINT PerMedia Memory Control Registers */
#define PMReboot							0x1000
#define PMRomControl							0x1040
#define PMBootAddress							0x1080
#define PMMemConfig							0x10C0
#    define RowCharge8    1 << 10
#    define TimeRCD8      1 <<  7
#    define TimeRC8       0x6 << 3
#    define TimeRP8       1
#    define CAS3Latency8  0 << 16
#    define BootAdress8   0x10
#    define NumberBanks8  0x3 << 29
#    define RefreshCount8 0x41 << 21
#    define TimeRASMin8   1 << 13
#    define DeadCycle8    1 << 17
#    define BankDelay8    0 << 18
#    define Burst1Cycle8  1 << 31
#    define SDRAM8        0 << 4

#    define RowCharge6    1 << 10
#    define TimeRCD6      1 <<  7
#    define TimeRC6       0x6 << 3
#    define TimeRP6       0x2
#    define CAS3Latency6  1 << 16
#    define BootAdress6   0x60
#    define NumberBanks6  0x2 << 29
#    define RefreshCount6 0x41 << 21
#    define TimeRASMin6   1 << 13
#    define DeadCycle6    1 << 17
#    define BankDelay6    0 << 18
#    define Burst1Cycle6  1 << 31
#    define SDRAM6        0 << 4

#    define RowCharge4    0 << 10
#    define TimeRCD4      0 <<  7
#    define TimeRC4       0x4 << 3
#    define TimeRP4       1 
#    define CAS3Latency4  0 << 16
#    define BootAdress4   0x10
#    define NumberBanks4  1 << 29
#    define RefreshCount4 0x30 << 21
#    define TimeRASMin4   1 << 13
#    define DeadCycle4    0 << 17
#    define BankDelay4    0 << 18
#    define Burst1Cycle4  1 << 31
#    define SDRAM4        0 << 4

/* Permedia 2 Control */
#define MemControl							0x1040

#define PMBypassWriteMask						0x1100
#define PMFramebufferWriteMask					        0x1140
#define PMCount								0x1180

/* Framebuffer Registers */
#define FBMemoryCtl							0x1800
#define FBModeSel							0x1808
#define FBGCWrMask							0x1810
#define FBGCColorLower							0x1818
#define FBTXMemCtl							0x1820
#define FBWrMaskk							0x1830
#define FBGCColorUpper							0x1838

/* Core FIFO */
#define OutputFIFO							0x2000

/* 500TX Internal Video Registers */
#define VTGHLimit							0x3000
#define VTGHSyncStart							0x3008
#define VTGHSyncEnd							0x3010
#define VTGHBlankEnd							0x3018
#define VTGVLimit							0x3020
#define VTGVSyncStart							0x3028
#define VTGVSyncEnd							0x3030
#define VTGVBlankEnd							0x3038
#define VTGHGateStart							0x3040
#define VTGHGateEnd							0x3048
#define VTGVGateStart							0x3050
#define VTGVGateEnd							0x3058
#define VTGPolarity							0x3060
#define VTGFrameRowAddr							0x3068
#define VTGVLineNumber							0x3070
#define VTGSerialClk							0x3078
#define VTGModeCtl							0x3080

/* Permedia Video Control Registers */
#define PMScreenBase							0x3000
#define PMScreenStride							0x3008
#define PMHTotal							0x3010
#define PMHgEnd								0x3018
#define PMHbEnd								0x3020
#define PMHsStart							0x3028
#define PMHsEnd								0x3030
#define PMVTotal							0x3038
#define PMVbEnd								0x3040
#define PMVsStart							0x3048
#define PMVsEnd								0x3050
#define PMVideoControl							0x3058
#define PMInterruptLine							0x3060
#define PMDDCData							0x3068
#define   DataIn             						(1<<0)
#define   ClkIn              						(1<<1)
#define   DataOut            						(1<<2)
#define   ClkOut             						(1<<3)
#define PMLineCount							0x3070
#define PMFifoControl							0x3078

/* Permedia 2 RAMDAC Registers */
#define PM2DACWriteAddress						0x4000
#define PM2DACIndexReg							0x4000
#define PM2DACData							0x4008
#define PM2DACReadMask							0x4010
#define PM2DACReadAddress						0x4018
#define PM2DACCursorColorAddress				        0x4020
#define PM2DACCursorColorData					        0x4028
#define PM2DACIndexData							0x4050
#define PM2DACCursorData						0x4058
#define PM2DACCursorXLsb						0x4060
#define PM2DACCursorXMsb						0x4068
#define PM2DACCursorYLsb						0x4070
#define PM2DACCursorYMsb						0x4078
#define PM2DACCursorControl						0x06
#define PM2DACIndexCMR							0x18
#define   PM2DAC_TRUECOLOR				0x80
#define   PM2DAC_RGB					0x20
#define   PM2DAC_GRAPHICS				0x10
#define   PM2DAC_PACKED					0x09
#define   PM2DAC_8888					0x08
#define   PM2DAC_565					0x06
#define   PM2DAC_4444					0x05
#define   PM2DAC_5551					0x04
#define   PM2DAC_2321					0x03
#define   PM2DAC_2320					0x02
#define   PM2DAC_332					0x01
#define   PM2DAC_CI8					0x00
#define PM2DACIndexMDCR							0x19
#define PM2DACIndexPalettePage					        0x1c
#define PM2DACIndexMCR							0x1e
#define PM2DACIndexClockAM						0x20
#define PM2DACIndexClockAN						0x21
#define PM2DACIndexClockAP						0x22
#define PM2DACIndexClockBM						0x23
#define PM2DACIndexClockBN						0x24
#define PM2DACIndexClockBP						0x25
#define PM2DACIndexClockCM						0x26
#define PM2DACIndexClockCN						0x27
#define PM2DACIndexClockCP						0x28
#define PM2DACIndexClockStatus						0x29
#define PM2DACIndexMemClockM						0x30
#define PM2DACIndexMemClockN						0x31
#define PM2DACIndexMemClockP						0x32
#define PM2DACIndexMemClockStatus					0x33
#define PM2DACIndexColorKeyControl					0x40
#define PM2DACIndexColorKeyOverlay					0x41
#define PM2DACIndexColorKeyRed						0x42
#define PM2DACIndexColorKeyGreen					0x43
#define PM2DACIndexColorKeyBlue						0x44

/* Permedia 2V extensions */
#define PM2VDACRDMiscControl						0x000
#define PM2VDACRDSyncControl						0x001
#define PM2VDACRDDACControl						0x002
#define PM2VDACRDPixelSize						0x003
#define PM2VDACRDColorFormat						0x004
#define PM2VDACRDCursorMode						0x005
#define PM2VDACRDCursorXLow						0x007
#define PM2VDACRDCursorXHigh						0x008
#define PM2VDACRDCursorYLow						0x009
#define PM2VDACRDCursorYHigh						0x00A
#define PM2VDACRDCursorHotSpotX						0x00B
#define PM2VDACRDCursorHotSpotY						0x00C
#define PM2VDACRDOverlayKey						0x00D
#define PM2VDACRDPan							0x00E
#define PM2VDACRDSense							0x00F
#define PM2VDACRDCheckControl						0x018
#define PM2VDACIndexClockControl					0x200
#define PM2VDACRDDClk0PreScale						0x201
#define PM2VDACRDDClk0FeedbackScale					0x202
#define PM2VDACRDDClk0PostScale						0x203
#define PM2VDACRDDClk1PreScale						0x204
#define PM2VDACRDDClk1FeedbackScale					0x205
#define PM2VDACRDDClk1PostScale						0x206
#define PM2VDACRDMClkControl						0x20D
#define PM2VDACRDMClkPreScale						0x20E
#define PM2VDACRDMClkFeedbackScale					0x20F
#define PM2VDACRDMClkPostScale						0x210
#define PM2VDACRDCursorPalette						0x303
#define PM2VDACRDCursorPattern						0x400
#define PM2VDACIndexRegLow						0x4020
#define PM2VDACIndexRegHigh						0x4028
#define PM2VDACIndexData						0x4030
#define PM2VDACRDIndexControl						0x4038

/* Permedia 2 Video Streams Unit Registers */
#define   VSBIntFlag            					(1<<8)
#define   VSAIntFlag            					(1<<9)

#define VSConfiguration							0x5800
#define   VS_UnitMode_ROM						0
#define   VS_UnitMode_AB8						3
#define   VS_UnitMode_Mask						7
#define   VS_GPBusMode_A        					(1<<3)
#define   VS_HRefPolarityA      					(1<<9)
#define   VS_VRefPolarityA      					(1<<10)
#define   VS_VActivePolarityA   					(1<<11)
#define   VS_UseFieldA          					(1<<12)
#define   VS_FieldPolarityA						(1<<13)
#define   VS_FieldEdgeA         					(1<<14)
#define   VS_VActiveVBIA						(1<<15)
#define   VS_InterlaceA         					(1<<16)
#define   VS_ReverseDataA       					(1<<17)
#define   VS_HRefPolarityB      					(1<<18)
#define   VS_VRefPolarityB      					(1<<19)
#define   VS_VActivePolarityB   					(1<<20)
#define   VS_UseFieldB							(1<<21)
#define   VS_FieldPolarityB						(1<<22)
#define   VS_FieldEdgeB							(1<<23)
#define   VS_VActiveVBIB						(1<<24)
#define   VS_InterlaceB							(1<<25)
#define   VS_ColorSpaceB_RGB						(1<<26)
#define   VS_ReverseDataB						(1<<27)
#define   VS_DoubleEdgeB						(1<<28)

#define VSStatus							0x5808
#define   VS_FieldOne0A							(1<<9)
#define   VS_FieldOne1A							(1<<10)
#define   VS_FieldOne2A							(1<<11)
#define   VS_InvalidInterlaceA						(1<<12)
#define   VS_FieldOne0B							(1<<17)
#define   VS_FieldOne1B							(1<<18)
#define   VS_FieldOne2B							(1<<19)
#define   VS_InvalidInterlaceB						(1<<20)

#define VSSerialBusControl						0x5810

#define VSABase          						0x5900
#define   VSA_Video             					(1<<0)
#define   VSA_VBI               					(1<<1)
#define   VSA_BufferCtl         					(1<<2)
#define   VSA_MirrorX           					(1<<7)
#define   VSA_MirrorY           					(1<<8)
#define   VSA_Discard_None      					(0<<9)
#define   VSA_Discard_FieldOne  					(1<<9)
#define   VSA_Discard_FieldTwo  					(2<<9)
#define   VSA_CombineFields     					(1<<11)
#define   VSA_LockToStreamB     					(1<<12)
#define VSBBase								0x5A00
#define   VSB_Video             					(1<<0)
#define   VSB_VBI               					(1<<1)
#define   VSB_BufferCtl         					(1<<2)
#define   VSB_CombineFields     					(1<<3)
#define   VSB_RGBOrder          					(1<<11)
#define   VSB_GammaCorrect      					(1<<12)
#define   VSB_LockToStreamA     					(1<<13)

#define VSControl							0x0000
#define VSInterrupt            						0x0008
#define VSCurrentLine          						0x0010
#define VSVideoAddressHost     						0x0018
#define VSVideoAddressIndex    						0x0020
#define VSVideoAddress0        						0x0028
#define VSVideoAddress1        						0x0030
#define VSVideoAddress2        						0x0038
#define VSVideoStride          						0x0040
#define VSVideoStartLine       						0x0048
#define VSVideoEndLine     						0x0050
#define VSVideoStartData       						0x0058
#define VSVideoEndData         						0x0060
#define VSVBIAddressHost       						0x0068
#define VSVBIAddressIndex      						0x0070
#define VSVBIAddress0          						0x0078
#define VSVBIAddress1          						0x0080
#define VSVBIAddress2          						0x0088
#define VSVBIStride            						0x0090
#define VSVBIStartLine         						0x0098
#define VSVBIEndLine           						0x00A0
#define VSVBIStartData         						0x00A8
#define VSVBIEndData           						0x00B0
#define VSFifoControl          						0x00B8

/**********************************
 * GLINT Delta Region 0 Registers *
 **********************************/

/* Control Status Registers */
#define DResetStatus							0x0800
#define DIntEnable							0x0808
#define DIntFlags							0x0810
#define DErrorFlags							0x0838
#define DTestRegister							0x0848
#define DFIFODis							0x0868



/**********************************
 * GLINT Gamma Region 0 Registers *
 **********************************/

/* Control Status Registers */
#define GInFIFOSpace							0x0018
#define GDMAAddress							0x0028
#define GDMACount							0x0030
#define GDMAControl							0x0060
#define GOutDMA								0x0080
#define GOutDMACount							0x0088
#define GResetStatus							0x0800
#define GIntEnable							0x0808
#define GIntFlags							0x0810
#define GErrorFlags							0x0838
#define GTestRegister							0x0848
#define GFIFODis							0x0868

#define GChipConfig							0x0870
#define   GChipAGPCapable		1 << 0
#define   GChipAGPSideband		1 << 1
#define   GChipMultiGLINTApMask		3 << 19
#define   GChipMultiGLINTAp_0M		0 << 19
#define   GChipMultiGLINTAp_16M		1 << 19
#define   GChipMultiGLINTAp_32M		2 << 19
#define   GChipMultiGLINTAp_64M		3 << 19

#define GCSRAperture							0x0878
#define   GCSRSecondaryGLINTMapEn	1 << 0
#define   GCSRBitSwap			1 << 1

#define GPageTableAddr							0x0c00
#define GPageTableLength						0x0c08
#define GDelayTimer							0x0c38
#define GCommandMode							0x0c40
#define GCommandIntEnable						0x0c48
#define GCommandIntFlags						0x0c50
#define GCommandErrorFlags						0x0c58
#define GCommandStatus							0x0c60
#define GCommandFaultingAddr						0x0c68
#define GVertexFaultingAddr						0x0c70
#define GWriteFaultingAddr						0x0c88
#define GFeedbackSelectCount						0x0c98
#define GGammaProcessorMode						0x0cb8
#define GVGAShadow							0x0d00
#define GMultGLINTAperture						0x0d08
#define GMultGLINT1							0x0d10
#define GMultGLINT2							0x0d18

/************************
 * GLINT Core Registers *
 ************************/

#define GLINT_TAG(major,offset)			(((major) << 7) | ((offset) << 3)) 
#define GLINT_TAG_ADDR(major,offset)	(0x8000 | GLINT_TAG((major),(offset)))

#define UNIT_DISABLE							0
#define UNIT_ENABLE							1

#define StartXDom							GLINT_TAG_ADDR(0x00,0x00)
#define dXDom								GLINT_TAG_ADDR(0x00,0x01)
#define StartXSub							GLINT_TAG_ADDR(0x00,0x02)
#define dXSub								GLINT_TAG_ADDR(0x00,0x03)
#define StartY								GLINT_TAG_ADDR(0x00,0x04)
#define dY									GLINT_TAG_ADDR(0x00,0x05)
#define GLINTCount							GLINT_TAG_ADDR(0x00,0x06)
#define Render								GLINT_TAG_ADDR(0x00,0x07)
#	define AreaStippleEnable					0x00001
#	define LineStippleEnable					0x00002
#	define ResetLineStipple					0x00004
#	define FastFillEnable						0x00008
#	define PrimitiveLine						0
#	define PrimitiveTrapezoid					0x00040
#	define PrimitivePoint						0x00080
#	define PrimitiveRectangle					0x000C0
#	define AntialiasEnable         				0x00100
#	define AntialiasingQuality     				0x00200
#	define UsePointTable						0x00400
#	define SyncOnBitMask						0x00800
#	define SyncOnHostData						0x01000
#	define TextureEnable           				0x02000
#	define FogEnable               				0x04000
#	define CoverageEnable						0x08000
#	define SubPixelCorrectionEnable				0x10000
#	define SpanOperation						0x40000
#	define XPositive			1<<21
#	define YPositive			1<<22


#define ContinueNewLine							GLINT_TAG_ADDR(0x00,0x08)
#define ContinueNewDom							GLINT_TAG_ADDR(0x00,0x09)
#define ContinueNewSub							GLINT_TAG_ADDR(0x00,0x0a)
#define Continue							GLINT_TAG_ADDR(0x00,0x0b)
#define FlushSpan							GLINT_TAG_ADDR(0x00,0x0c)
#define BitMaskPattern							GLINT_TAG_ADDR(0x00,0x0d)

#define PointTable0							GLINT_TAG_ADDR(0x01,0x00)
#define PointTable1							GLINT_TAG_ADDR(0x01,0x01)
#define PointTable2							GLINT_TAG_ADDR(0x01,0x02)
#define PointTable3							GLINT_TAG_ADDR(0x01,0x03)
#define RasterizerMode							GLINT_TAG_ADDR(0x01,0x04)
#define		RMMultiGLINT			1<<17
#define		BitMaskPackingEachScanline	1<<9
#define		ForceBackgroundColor		1<<6
#define		InvertBitMask			1<<1
#define YLimits								GLINT_TAG_ADDR(0x01,0x05)
#define ScanLineOwnership						GLINT_TAG_ADDR(0x01,0x06)
#define WaitForCompletion						GLINT_TAG_ADDR(0x01,0x07)
#define PixelSize							GLINT_TAG_ADDR(0x01,0x08)
#define XLimits								GLINT_TAG_ADDR(0x01,0x09) /* PM only */

#define RectangleOrigin							GLINT_TAG_ADDR(0x01,0x0A) /* PM2 only */
#define RectangleSize							GLINT_TAG_ADDR(0x01,0x0B) /* PM2 only */

#define PackedDataLimits						GLINT_TAG_ADDR(0x02,0x0a) /* PM only */

#define ScissorMode							GLINT_TAG_ADDR(0x03,0x00)
#	define                                    	        SCI_USER          0x01
#	define                                                 SCI_SCREEN        0x02
#	define                                                 SCI_USERANDSCREEN 0x03

#define ScissorMinXY						GLINT_TAG_ADDR(0x03,0x01)
#define ScissorMaxXY						GLINT_TAG_ADDR(0x03,0x02)
#define ScreenSize						GLINT_TAG_ADDR(0x03,0x03)
#define AreaStippleMode						GLINT_TAG_ADDR(0x03,0x04)
	/* 0:				*/
	/* NoMirrorY			*/
	/* NoMirrorX			*/
	/* NoInvertPattern		*/
	/* YAddress_1bit		*/
	/* XAddress_1bit		*/
	/* UNIT_DISABLE			*/

#	define ASM_XAddress_2bit					1 << 1
#	define ASM_XAddress_3bit					2 << 1
#	define ASM_XAddress_4bit					3 << 1
#	define ASM_XAddress_5bit					4 << 1
#	define ASM_YAddress_2bit					1 << 4
#	define ASM_YAddress_3bit					2 << 4
#	define ASM_YAddress_4bit					3 << 4
#	define ASM_YAddress_5bit					4 << 4
#	define ASM_InvertPattern					1 << 17
#	define ASM_MirrorX						1 << 18
#	define ASM_MirrorY						1 << 19

#define LineStippleMode						GLINT_TAG_ADDR(0x03,0x05)
#define LoadLineStippleCounters					GLINT_TAG_ADDR(0x03,0x06)
#define UpdateLineStippleCounters				GLINT_TAG_ADDR(0x03,0x07)
#define SaveLineStippleState					GLINT_TAG_ADDR(0x03,0x08)
#define WindowOrigin						GLINT_TAG_ADDR(0x03,0x09)

#define AreaStipplePattern0					GLINT_TAG_ADDR(0x04,0x00)
#define AreaStipplePattern1					GLINT_TAG_ADDR(0x04,0x01)
#define AreaStipplePattern2					GLINT_TAG_ADDR(0x04,0x02)
#define AreaStipplePattern3					GLINT_TAG_ADDR(0x04,0x03)
#define AreaStipplePattern4					GLINT_TAG_ADDR(0x04,0x04)
#define AreaStipplePattern5					GLINT_TAG_ADDR(0x04,0x05)
#define AreaStipplePattern6					GLINT_TAG_ADDR(0x04,0x06)
#define AreaStipplePattern7					GLINT_TAG_ADDR(0x04,0x07)

#define TextureAddressMode					GLINT_TAG_ADDR(0x07,0x00)
#define SStart							GLINT_TAG_ADDR(0x07,0x01)
#define dSdx							GLINT_TAG_ADDR(0x07,0x02)
#define dSdyDom							GLINT_TAG_ADDR(0x07,0x03)
#define TStart							GLINT_TAG_ADDR(0x07,0x04)
#define dTdx							GLINT_TAG_ADDR(0x07,0x05)
#define dTdyDom							GLINT_TAG_ADDR(0x07,0x06)
#define QStart							GLINT_TAG_ADDR(0x07,0x07)
#define dQdx							GLINT_TAG_ADDR(0x07,0x08)
#define dQdyDom							GLINT_TAG_ADDR(0x07,0x09)
#define LOD							GLINT_TAG_ADDR(0x07,0x0A)
#define dSdy							GLINT_TAG_ADDR(0x07,0x0B)
#define dTdy							GLINT_TAG_ADDR(0x07,0x0C)
#define dQdy							GLINT_TAG_ADDR(0x07,0x0D)

#define TextureReadMode						GLINT_TAG_ADDR(0x09,0x00)
#define TextureFormat						GLINT_TAG_ADDR(0x09,0x01)
#  define Texture_4_Components 3 << 3
#  define Texture_Texel        0

#define TextureCacheControl					GLINT_TAG_ADDR(0x09,0x02)
#  define TextureCacheControlEnable     2
#  define TextureCacheControlInvalidate 1

#define GLINTBorderColor					GLINT_TAG_ADDR(0x09,0x05)

#define TexelLUTIndex						GLINT_TAG_ADDR(0x09,0x08)
#define TexelLUTData						GLINT_TAG_ADDR(0x09,0x09)
#define TexelLUTAddress						GLINT_TAG_ADDR(0x09,0x0A)
#define TexelLUTTransfer					GLINT_TAG_ADDR(0x09,0x0B)
#define TextureFilterMode					GLINT_TAG_ADDR(0x09,0x0C)
#define TextureChromaUpper					GLINT_TAG_ADDR(0x09,0x0D)
#define TextureChromaLower					GLINT_TAG_ADDR(0x09,0x0E)

#define TxBaseAddr0						GLINT_TAG_ADDR(0x0A,0x00)
#define TxBaseAddr1						GLINT_TAG_ADDR(0x0A,0x01)
#define TxBaseAddr2						GLINT_TAG_ADDR(0x0A,0x02)
#define TxBaseAddr3						GLINT_TAG_ADDR(0x0A,0x03)
#define TxBaseAddr4						GLINT_TAG_ADDR(0x0A,0x04)
#define TxBaseAddr5						GLINT_TAG_ADDR(0x0A,0x05)
#define TxBaseAddr6						GLINT_TAG_ADDR(0x0A,0x06)
#define TxBaseAddr7						GLINT_TAG_ADDR(0x0A,0x07)
#define TxBaseAddr8						GLINT_TAG_ADDR(0x0A,0x08)
#define TxBaseAddr9						GLINT_TAG_ADDR(0x0A,0x09)
#define TxBaseAddr10						GLINT_TAG_ADDR(0x0A,0x0A)
#define TxBaseAddr11						GLINT_TAG_ADDR(0x0A,0x0B)

#define PMTextureBaseAddress					GLINT_TAG_ADDR(0x0b,0x00)
#define PMTextureMapFormat					GLINT_TAG_ADDR(0x0b,0x01)
#define PMTextureDataFormat					GLINT_TAG_ADDR(0x0b,0x02)

#define Texel0							GLINT_TAG_ADDR(0x0c,0x00)
#define Texel1							GLINT_TAG_ADDR(0x0c,0x01)
#define Texel2							GLINT_TAG_ADDR(0x0c,0x02)
#define Texel3							GLINT_TAG_ADDR(0x0c,0x03)
#define Texel4							GLINT_TAG_ADDR(0x0c,0x04)
#define Texel5							GLINT_TAG_ADDR(0x0c,0x05)
#define Texel6							GLINT_TAG_ADDR(0x0c,0x06)
#define Texel7							GLINT_TAG_ADDR(0x0c,0x07)
#define Interp0							GLINT_TAG_ADDR(0x0c,0x08)
#define Interp1							GLINT_TAG_ADDR(0x0c,0x09)
#define Interp2							GLINT_TAG_ADDR(0x0c,0x0a)
#define Interp3							GLINT_TAG_ADDR(0x0c,0x0b)
#define Interp4							GLINT_TAG_ADDR(0x0c,0x0c)
#define TextureFilter						GLINT_TAG_ADDR(0x0c,0x0d)
#define PMTextureReadMode					GLINT_TAG_ADDR(0x0c,0x0e)
#define TexelLUTMode						GLINT_TAG_ADDR(0x0c,0x0f)

#define TextureColorMode					GLINT_TAG_ADDR(0x0d,0x00)
#  define TextureTypeOpenGL 0
#  define TextureTypeApple  1 << 4
#  define TextureKsDDA      1 << 5 /* only Apple-Mode */
#  define TextureKdDDA      1 << 6 /* only Apple-Mode */

#define TextureEnvColor						GLINT_TAG_ADDR(0x0d,0x01)
#define FogMode							GLINT_TAG_ADDR(0x0d,0x02)
	/* 0:				*/
	/* FOG RGBA			*/
	/* UNIT_DISABLE			*/

#	define FOG_CI							0x0002

#define FogColor							GLINT_TAG_ADDR(0x0d,0x03)
#define FStart								GLINT_TAG_ADDR(0x0d,0x04)
#define dFdx								GLINT_TAG_ADDR(0x0d,0x05)
#define dFdyDom								GLINT_TAG_ADDR(0x0d,0x06)
#define KsStart								GLINT_TAG_ADDR(0x0d,0x09)
#define dKsdx								GLINT_TAG_ADDR(0x0d,0x0a)
#define dKsdyDom							GLINT_TAG_ADDR(0x0d,0x0b)
#define KdStart								GLINT_TAG_ADDR(0x0d,0x0c)
#define dKdStart							GLINT_TAG_ADDR(0x0d,0x0d)
#define dKddyDom							GLINT_TAG_ADDR(0x0d,0x0e)

#define RStart								GLINT_TAG_ADDR(0x0f,0x00)
#define dRdx								GLINT_TAG_ADDR(0x0f,0x01)
#define dRdyDom								GLINT_TAG_ADDR(0x0f,0x02)
#define GStart								GLINT_TAG_ADDR(0x0f,0x03)
#define dGdx								GLINT_TAG_ADDR(0x0f,0x04)
#define dGdyDom								GLINT_TAG_ADDR(0x0f,0x05)
#define BStart								GLINT_TAG_ADDR(0x0f,0x06)
#define dBdx								GLINT_TAG_ADDR(0x0f,0x07)
#define dBdyDom								GLINT_TAG_ADDR(0x0f,0x08)
#define AStart								GLINT_TAG_ADDR(0x0f,0x09)
#define dAdx								GLINT_TAG_ADDR(0x0f,0x0a)
#define dAdyDom								GLINT_TAG_ADDR(0x0f,0x0b)
#define ColorDDAMode							GLINT_TAG_ADDR(0x0f,0x0c)
	/* 0:					*/
#	define CDDA_FlatShading			                0
	/* UNIT_DISABLE			*/
#	define CDDA_GouraudShading					0x0002
        

#define ConstantColor						GLINT_TAG_ADDR(0x0f,0x0d)
#define GLINTColor						GLINT_TAG_ADDR(0x0f,0x0e)
#define AlphaTestMode						GLINT_TAG_ADDR(0x10,0x00)
#define AntialiasMode						GLINT_TAG_ADDR(0x10,0x01)
#define AlphaBlendMode						GLINT_TAG_ADDR(0x10,0x02)
	/* 0:					*/
	/* SrcZERO				*/
	/* DstZERO				*/
	/* ColorFormat8888			*/
	/* AlphaBuffer present			*/
	/* ColorOrderBGR			*/
	/* TypeOpenGL				*/
	/* DstFBData				*/
	/* UNIT_DISABLE				*/

#	define ABM_SrcONE					1 << 1
#	define ABM_SrcDST_COLOR				2 << 1
#	define ABM_SrcONE_MINUS_DST_COLOR			3 << 1
#	define ABM_SrcSRC_ALPHA				4 << 1
#	define ABM_SrcONE_MINUS_SRC_ALPHA			5 << 1
#	define ABM_SrcDST_ALPHA				6 << 1
#	define ABM_SrcONE_MINUS_DST_ALPHA			7 << 1
#	define ABM_SrcSRC_ALPHA_SATURATE			8 << 1
#	define ABM_DstONE					1 << 5
#	define ABM_DstSRC_COLOR				2 << 5
#	define ABM_DstONE_MINUS_SRC_COLOR			3 << 5
#	define ABM_DstSRC_ALPHA				4 << 5
#	define ABM_DstONE_MINUS_SRC_ALPHA			5 << 5
#	define ABM_DstDST_ALPHA				6 << 5
#	define ABM_DstONE_MINUS_DST_ALPHA			7 << 5
#	define ABM_ColorFormat5555				1 << 8
#	define ABM_ColorFormat4444				2 << 8
#	define ABM_ColorFormat4444_Front			3 << 8
#	define ABM_ColorFormat4444_Back			4 << 8
#	define ABM_ColorFormat332_Front			5 << 8
#	define ABM_ColorFormat332_Back				6 << 8
#	define ABM_ColorFormat121_Front			7 << 8
#	define ABM_ColorFormat121_Back				8 << 8
#	define ABM_ColorFormat555_Back				13 << 8
#	define ABM_ColorFormat_CI8				14 << 8
#	define ABM_ColorFormat_CI4				15 << 8
#	define ABM_NoAlphaBuffer				0x1000
#	define ABM_ColorOrderRGB				0x2000
#	define ABM_TypeQuickDraw3D				0x4000
#	define ABM_DstFBSourceData				0x8000

#define DitherMode						GLINT_TAG_ADDR(0x10,0x03)
	/* 0:					*/
	/* ColorOrder BGR		*/
	/* AlphaDitherDefault	*/
	/* ColorFormat8888		*/
	/* TruncateMode 		*/
	/* DitherDisable		*/
	/* UNIT_DISABLE			*/

#	define DTM_DitherEnable				1 << 1
#	define DTM_ColorFormat5555				1 << 2
#	define DTM_ColorFormat4444				2 << 2
#	define DTM_ColorFormat4444_Front			3 << 2
#	define DTM_ColorFormat4444_Back			4 << 2
#	define DTM_ColorFormat332_Front			5 << 2
#	define DTM_ColorFormat332_Back				6 << 2
#	define DTM_ColorFormat121_Front			7 << 2
#	define DTM_ColorFormat121_Back				8 << 2
#	define DTM_ColorFormat555_Back				13 << 2
#	define DTM_ColorFormat_CI8				14 << 2
#	define DTM_ColorFormat_CI4				15 << 2
#	define DTM_ColorOrderRGB				1 << 10
#	define DTM_NoAlphaDither				1 << 14
#	define DTM_RoundMode					1 << 15

#define FBSoftwareWriteMask					GLINT_TAG_ADDR(0x10,0x04)
#define LogicalOpMode						GLINT_TAG_ADDR(0x10,0x05)
#	define Use_ConstantFBWriteData 0x40


#define FBWriteData						GLINT_TAG_ADDR(0x10,0x06)
#define RouterMode						GLINT_TAG_ADDR(0x10,0x08)
#	define ROUTER_Depth_Texture 1
#	define ROUTER_Texture_Depth 0


#define LBReadMode						GLINT_TAG_ADDR(0x11,0x00)
	/* 0:				*/
	/* SrcNoRead			*/
	/* DstNoRead			*/
	/* DataLBDefault		*/
	/* WinTopLeft			*/
	/* NoPatch			*/
	/* ScanlineInterval1 		*/

#	define LBRM_SrcEnable						1 << 9
#	define LBRM_DstEnable						1 << 10
#	define LBRM_DataLBStencil					1 << 16
#	define LBRM_DataLBDepth					2 << 16
#	define LBRM_WinBottomLeft					1 << 18
#	define LBRM_DoPatch						1 << 19

#	define LBRM_ScanlineInt2					1 << 20
#	define LBRM_ScanlineInt4					2 << 20
#	define LBRM_ScanlineInt8					3 << 20


#define LBReadFormat						GLINT_TAG_ADDR(0x11,0x01)
#	define LBRF_DepthWidth15   0x03  /* only permedia */
#	define LBRF_DepthWidth16   0x00
#	define LBRF_DepthWidth24   0x01
#	define LBRF_DepthWidth32   0x02

#	define LBRF_StencilWidth0  (0 << 2)
#	define LBRF_StencilWidth4  (1 << 2)
#	define LBRF_StencilWidth8  (2 << 2)

#	define LBRF_StencilPos16   (0 << 4)
#	define LBRF_StencilPos20   (1 << 4)
#	define LBRF_StencilPos24   (2 << 4)
#	define LBRF_StencilPos28   (3 << 4)
#	define LBRF_StencilPos32   (4 << 4)

#	define LBRF_FrameCount0    (0 << 7)
#	define LBRF_FrameCount4    (1 << 7)
#	define LBRF_FrameCount8    (2 << 7)

#	define LBRF_FrameCountPos16  (0 << 9)
#	define LBRF_FrameCountPos20  (1 << 9)
#	define LBRF_FrameCountPos24  (2 << 9)
#	define LBRF_FrameCountPos28  (3 << 9)
#	define LBRF_FrameCountPos32  (4 << 9)
#	define LBRF_FrameCountPos36  (5 << 9)
#	define LBRF_FrameCountPos40  (6 << 9)

#	define LBRF_GIDWidth0 (0 << 12)
#	define LBRF_GIDWidth4 (1 << 12)

#	define LBRF_GIDPos16  (0 << 13)
#	define LBRF_GIDPos20  (1 << 13)
#	define LBRF_GIDPos24  (2 << 13)
#	define LBRF_GIDPos28  (3 << 13)
#	define LBRF_GIDPos32  (4 << 13)
#	define LBRF_GIDPos36  (5 << 13)
#	define LBRF_GIDPos40  (6 << 13)
#	define LBRF_GIDPos44  (7 << 13)
#	define LBRF_GIDPos48  (8 << 13)

#	define LBRF_Compact32  (1 << 17)



#define LBSourceOffset						GLINT_TAG_ADDR(0x11,0x02)
#define LBStencil						GLINT_TAG_ADDR(0x11,0x05)
#define LBDepth							GLINT_TAG_ADDR(0x11,0x06)
#define LBWindowBase						GLINT_TAG_ADDR(0x11,0x07)
#define LBWriteMode						GLINT_TAG_ADDR(0x11,0x08)
#	define LBWM_WriteEnable				0x1
#	define LBWM_UpLoad_LBDepth				0x2
#	define LBWM_UpLoad_LBStencil				0x4

#define LBWriteFormat						GLINT_TAG_ADDR(0x11,0x09)


#define TextureData						GLINT_TAG_ADDR(0x11,0x0d)
#define TextureDownloadOffset					GLINT_TAG_ADDR(0x11,0x0e)
#define LBWindowOffset						GLINT_TAG_ADDR(0x11,0x0f)

#define GLINTWindow						GLINT_TAG_ADDR(0x13,0x00)
#	define GWIN_UnitEnable          (1 << 0)
#	define GWIN_ForceLBUpdate       (1 << 3)
#	define GWIN_LBUpdateSourceREG   (1 << 4)
#	define GWIN_LBUpdateSourceLB    (0 << 4)
#	define GWIN_StencilFCP          (1 << 17)
#	define GWIN_DepthFCP            (1 << 18)
#	define GWIN_OverrideWriteFilter (1 << 19)

	/* ??? is this needed, set by permedia (2) modules */
#	define GWIN_DisableLBUpdate    0x40000 

#define StencilMode						GLINT_TAG_ADDR(0x13,0x01)
#define StencilData						GLINT_TAG_ADDR(0x13,0x02)
#define GLINTStencil						GLINT_TAG_ADDR(0x13,0x03)
#define DepthMode						GLINT_TAG_ADDR(0x13,0x04)
	/* 0:				*/
	/* WriteDisable			*/
	/* SrcCompFragment		*/
	/* CompFuncNEVER		*/
	/* UNIT_DISABLE			*/

#	define DPM_WriteEnable					1 << 1
#	define DPM_SrcCompLBData				1 << 2
#	define DPM_SrcCompDregister				2 << 2
#	define DPM_SrcCompLBSourceData				3 << 2
#	define DPM_CompFuncLESS				1 << 4
#	define DPM_CompFuncEQUAL				2 << 4
#	define DPM_CompFuncLESS_OR_EQ				3 << 4
#	define DPM_CompFuncGREATER				4 << 4
#	define DPM_CompFuncNOT_EQ				5 << 4
#	define DPM_CompFuncGREATER_OR_EQ			6 << 4
#	define DPM_CompFuncALWAYS				7 << 4

#define GLINTDepth						GLINT_TAG_ADDR(0x13,0x05)
#define ZStartU							GLINT_TAG_ADDR(0x13,0x06)
#define ZStartL							GLINT_TAG_ADDR(0x13,0x07)
#define dZdxU							GLINT_TAG_ADDR(0x13,0x08)
#define dZdxL							GLINT_TAG_ADDR(0x13,0x09)
#define dZdyDomU						GLINT_TAG_ADDR(0x13,0x0a)
#define dZdyDomL						GLINT_TAG_ADDR(0x13,0x0b)
#define FastClearDepth						GLINT_TAG_ADDR(0x13,0x0c)

#define FBReadMode						GLINT_TAG_ADDR(0x15,0x00)
	/* 0:				*/
	/* SrcNoRead			*/
	/* DstNoRead			*/
	/* DataFBDefault		*/
	/* WinTopLeft			*/
	/* ScanlineInterval1 		*/

#	define FBRM_SrcEnable					1 << 9
#	define FBRM_DstEnable					1 << 10
#	define FBRM_DataFBColor				1 << 15
#	define FBRM_WinBottomLeft				1 << 16
#	define FBRM_Packed					1 << 19
#	define FBRM_ScanlineInt2				1 << 23
#	define FBRM_ScanlineInt4				2 << 23
#	define FBRM_ScanlineInt8				3 << 23


#define FBSourceOffset						GLINT_TAG_ADDR(0x15,0x01)
#define FBPixelOffset						GLINT_TAG_ADDR(0x15,0x02)
#define FBColor							GLINT_TAG_ADDR(0x15,0x03)
#define FBData							GLINT_TAG_ADDR(0x15,0x04)
#define FBSourceData						GLINT_TAG_ADDR(0x15,0x05)

#define FBWindowBase						GLINT_TAG_ADDR(0x15,0x06)
#define FBWriteMode						GLINT_TAG_ADDR(0x15,0x07)
	/* 0:			*/
	/* FBWM_NoColorUpload	*/
	/* FBWM_WriteDisable	*/
#	define FBWM_WriteEnable				1
#	define FBWM_UploadColor				1 << 3
/* Permedia3 extensions */
#	define FBWM_Enable0					1 << 12

#define FBHardwareWriteMask					GLINT_TAG_ADDR(0x15,0x08)
#define FBBlockColor						GLINT_TAG_ADDR(0x15,0x09)
#define FBReadPixel						GLINT_TAG_ADDR(0x15,0x0a) /* PM */
#define PatternRamMode						GLINT_TAG_ADDR(0x15,0x0f)

#define PatternRamData0						GLINT_TAG_ADDR(0x16,0x00)
#define PatternRamData1						GLINT_TAG_ADDR(0x16,0x01)
#define PatternRamData2						GLINT_TAG_ADDR(0x16,0x02)
#define PatternRamData3						GLINT_TAG_ADDR(0x16,0x03)
#define PatternRamData4						GLINT_TAG_ADDR(0x16,0x04)
#define PatternRamData5						GLINT_TAG_ADDR(0x16,0x05)
#define PatternRamData6						GLINT_TAG_ADDR(0x16,0x06)
#define PatternRamData7						GLINT_TAG_ADDR(0x16,0x07)

#define FilterMode						GLINT_TAG_ADDR(0x18,0x00)
	/* 0:				*/
	/* CullDepthTags		*/
	/* CullDepthData		*/
	/* CullStencilTags		*/
	/* CullStencilData		*/
	/* CullColorTag			*/
	/* CullColorData		*/
	/* CullSyncTag			*/
	/* CullSyncData			*/
	/* CullStatisticTag		*/
	/* CullStatisticData		*/

#	define FM_PassDepthTags					0x0010
#	define FM_PassDepthData					0x0020
#	define FM_PassStencilTags					0x0040
#	define FM_PassStencilData					0x0080
#	define FM_PassColorTag						0x0100
#	define FM_PassColorData					0x0200
#	define FM_PassSyncTag						0x0400
#	define FM_PassSyncData						0x0800
#	define FM_PassStatisticTag					0x1000
#	define FM_PassStatisticData					0x2000

#define	Sync_tag							0x0188

#define StatisticMode						GLINT_TAG_ADDR(0x18,0x01)
#define MinRegion						GLINT_TAG_ADDR(0x18,0x02)
#define MaxRegion						GLINT_TAG_ADDR(0x18,0x03)
#define ResetPickResult						GLINT_TAG_ADDR(0x18,0x04)
#define MitHitRegion						GLINT_TAG_ADDR(0x18,0x05)
#define MaxHitRegion						GLINT_TAG_ADDR(0x18,0x06)
#define PickResult						GLINT_TAG_ADDR(0x18,0x07)
#define GlintSync						GLINT_TAG_ADDR(0x18,0x08)

#define FBBlockColorU						GLINT_TAG_ADDR(0x18,0x0d)
#define FBBlockColorL						GLINT_TAG_ADDR(0x18,0x0e)
#define SuspendUntilFrameBlank					GLINT_TAG_ADDR(0x18,0x0f)

#define KsRStart						GLINT_TAG_ADDR(0x19,0x00)
#define dKsRdx							GLINT_TAG_ADDR(0x19,0x01)
#define dKsRdyDom						GLINT_TAG_ADDR(0x19,0x02)
#define KsGStart						GLINT_TAG_ADDR(0x19,0x03)
#define dKsGdx							GLINT_TAG_ADDR(0x19,0x04)
#define dKsGdyDom						GLINT_TAG_ADDR(0x19,0x05)
#define KsBStart						GLINT_TAG_ADDR(0x19,0x06)
#define dKsBdx							GLINT_TAG_ADDR(0x19,0x07)
#define dKsBdyDom						GLINT_TAG_ADDR(0x19,0x08)

#define KdRStart						GLINT_TAG_ADDR(0x1A,0x00)
#define dKdRdx							GLINT_TAG_ADDR(0x1A,0x01)
#define dKdRdyDom						GLINT_TAG_ADDR(0x1A,0x02)
#define KdGStart						GLINT_TAG_ADDR(0x1A,0x03)
#define dKdGdx							GLINT_TAG_ADDR(0x1A,0x04)
#define dKdGdyDom						GLINT_TAG_ADDR(0x1A,0x05)
#define KdBStart						GLINT_TAG_ADDR(0x1A,0x06)
#define dKdBdx							GLINT_TAG_ADDR(0x1A,0x07)
#define dKdBdyDom						GLINT_TAG_ADDR(0x1A,0x08)

#define FBSourceBase						GLINT_TAG_ADDR(0x1B,0x00)
#define FBSourceDelta						GLINT_TAG_ADDR(0x1B,0x01)
#define Config							GLINT_TAG_ADDR(0x1B,0x02)
#define		CFBRM_SrcEnable		1<<0
#define		CFBRM_DstEnable		1<<1
#define		CFBRM_Packed		1<<2
#define		CWM_Enable		1<<3
#define		CCDDA_Enable		1<<4
#define		CLogOp_Enable		1<<5
#define ContextDump                                             GLINT_TAG_ADDR(0x1B,0x08)
#define ContextRestore                                          GLINT_TAG_ADDR(0x1B,0x09)
#define ContextData                                             GLINT_TAG_ADDR(0x1B,0x0a)

#define TexelLUT0						GLINT_TAG_ADDR(0x1D,0x00)
#define TexelLUT1						GLINT_TAG_ADDR(0x1D,0x01)
#define TexelLUT2						GLINT_TAG_ADDR(0x1D,0x02)
#define TexelLUT3						GLINT_TAG_ADDR(0x1D,0x03)
#define TexelLUT4						GLINT_TAG_ADDR(0x1D,0x04)
#define TexelLUT5						GLINT_TAG_ADDR(0x1D,0x05)
#define TexelLUT6						GLINT_TAG_ADDR(0x1D,0x06)
#define TexelLUT7						GLINT_TAG_ADDR(0x1D,0x07)
#define TexelLUT8						GLINT_TAG_ADDR(0x1D,0x08)
#define TexelLUT9						GLINT_TAG_ADDR(0x1D,0x09)
#define TexelLUT10						GLINT_TAG_ADDR(0x1D,0x0A)
#define TexelLUT11						GLINT_TAG_ADDR(0x1D,0x0B)
#define TexelLUT12						GLINT_TAG_ADDR(0x1D,0x0C)
#define TexelLUT13						GLINT_TAG_ADDR(0x1D,0x0D)
#define TexelLUT14						GLINT_TAG_ADDR(0x1D,0x0E)
#define TexelLUT15						GLINT_TAG_ADDR(0x1D,0x0F)

#define YUVMode                                                 GLINT_TAG_ADDR(0x1E,0x00)
#define ChromaUpper                                             GLINT_TAG_ADDR(0x1E,0x01)
#define ChromaLower                                             GLINT_TAG_ADDR(0x1E,0x02)
#define ChromaTestMode                                          GLINT_TAG_ADDR(0x1E,0x03)


/******************************
 * GLINT Delta Core Registers *
 ******************************/

#define V0FixedTag	GLINT_TAG_ADDR(0x20,0x00)
#define V1FixedTag	GLINT_TAG_ADDR(0x21,0x00)
#define V2FixedTag	GLINT_TAG_ADDR(0x22,0x00)
#define V0FloatTag	GLINT_TAG_ADDR(0x23,0x00)
#define V1FloatTag	GLINT_TAG_ADDR(0x24,0x00)
#define V2FloatTag	GLINT_TAG_ADDR(0x25,0x00)

#define VPAR_s		0x00
#define VPAR_t		0x08
#define VPAR_q		0x10
#define VPAR_Ks		0x18
#define VPAR_Kd		0x20

/* have changed colors in ramdac !
#define VPAR_R		0x28
#define VPAR_G		0x30
#define VPAR_B		0x38
#define VPAR_A		0x40
*/
#define VPAR_B		0x28
#define VPAR_G		0x30
#define VPAR_R		0x38
#define VPAR_A		0x40

#define VPAR_f		0x48

#define VPAR_x		0x50
#define VPAR_y		0x58
#define VPAR_z		0x60

#define DeltaModeTag						GLINT_TAG_ADDR(0x26,0x00)
	/* 0:				*/
	/* GLINT_300SX			*/

	/* DeltaMode Register Bit Field Assignments */
#	define DM_GLINT_300SX					0x0000
#	define DM_GLINT_500TX					0x0001
#	define DM_PERMEDIA					0x0002
#	define DM_Depth_16BPP					(1 << 2)
#	define DM_Depth_24BPP					(2 << 2)
#	define DM_Depth_32BPP					(3 << 2)
#	define DM_FogEnable					0x0010
#	define DM_TextureEnable				0x0020
#	define DM_SmoothShadingEnable				0x0040
#	define DM_DepthEnable					0x0080
#	define DM_SpecularTextureEnable			0x0100
#	define DM_DiffuseTextureEnable				0x0200
#	define DM_SubPixelCorrectionEnable			0x0400
#	define DM_DiamondExit					0x0800
#	define DM_NoDraw					0x1000
#	define DM_ClampEnable					0x2000
#	define DM_ClampedTexParMode				0x4000 
#	define DM_NormalizedTexParMode				0xC000 


#	define DDCMD_AreaStrippleEnable                        0x0001
#	define DDCMD_LineStrippleEnable                        0x0002
#	define DDCMD_ResetLineStripple                         1 << 2
#	define DDCMD_FastFillEnable                            1 << 3
        /*  2 Bits reserved */
#	define DDCMD_PrimitiveType_Point                       2 << 6
#	define DDCMD_PrimitiveType_Line                        0 << 6
#	define DDCMD_PrimitiveType_Trapezoid                   1 << 6
#	define DDCMD_AntialiasEnable				1 << 8
#	define DDCMD_AntialiasingQuality			1 << 9
#	define DDCMD_UsePointTable                             1 << 10
#	define DDCMD_SyncOnBitMask                             1 << 11
#	define DDCMD_SyncOnHostDate                            1 << 12
#	define DDCMD_TextureEnable			        1 << 13
#	define DDCMD_FogEnable                                 1 << 14
#	define DDCMD_CoverageEnable                            1 << 15
#	define DDCMD_SubPixelCorrectionEnable                  1 << 16



#define DrawTriangle						GLINT_TAG_ADDR(0x26,0x01)
#define RepeatTriangle						GLINT_TAG_ADDR(0x26,0x02)
#define DrawLine01						GLINT_TAG_ADDR(0x26,0x03)
#define DrawLine10						GLINT_TAG_ADDR(0x26,0x04)
#define RepeatLine						GLINT_TAG_ADDR(0x26,0x05)
#define BroadcastMask						GLINT_TAG_ADDR(0x26,0x0F)

/* Permedia 3 - Accelerator Extensions */
#define FillRectanglePosition					0x8348
#define FillRender2D						0x8350
#define FBDstReadBufAddr0					0xAE80
#define FBDstReadBufOffset0					0xAEA0
#define FBDstReadBufWidth0					0xAEC0
#define FBDstReadMode						0xAEE0
#define		FBDRM_Enable0		1<<8
#define		FBDRM_Blocking		1<<24
#define FBDstReadEnables					0xAEE8
#define FBSrcReadMode						0xAF00
#define		FBSRM_Blocking		1<<11
#define FBSrcReadBufAddr					0xAF08
#define FBSrcReadBufOffset0					0xAF10
#define FBSrcReadBufWidth					0xAF18
#define FBWriteBufAddr0						0xB000
#define FBWriteBufOffset0					0xB020
#define FBWriteBufWidth0					0xB040
#define FBBlockColorBack					0xB0A0
#define ForegroundColor						0xB0C0
#define BackgroundColor						0xB0C8
#define RectanglePosition					0xB600
#define Render2D						0xB640

/*  Colorformats */
#define BGR555  1
#define BGR565  16
#define CI8     14
#define CI4     15

#ifdef DEBUG
#define GLINT_WRITE_REG(v,r)					\
	GLINT_VERB_WRITE_REG(pGlint,v,r,__FILE__,__LINE__)
#define GLINT_READ_REG(r)					\
	GLINT_VERB_READ_REG(pGlint,r,__FILE__,__LINE__)
#else

#define GLINT_WRITE_REG(v,r) \
	MMIO_OUT32(pGlint->IOBase + pGlint->IOOffset,(unsigned long)(r), (v))
#define GLINT_READ_REG(r) \
	MMIO_IN32(pGlint->IOBase + pGlint->IOOffset,(unsigned long)(r))

#endif /* DEBUG */

#define GLINT_WAIT(n)						\
do{								\
	if (pGlint->InFifoSpace>=(n))				\
	    pGlint->InFifoSpace -= (n);				\
	else {							\
	    int tmp;						\
	    while((tmp=GLINT_READ_REG(InFIFOSpace))<(n));	\
	    /* Clamp value due to bugs in PM3 */		\
	    if (tmp > pGlint->FIFOSize)				\
		tmp = pGlint->FIFOSize;				\
	    pGlint->InFifoSpace = tmp - (n);			\
	}							\
}while(0)

#define GLINTDACDelay(x) do {                                   \
        int delay = x;                                          \
        unsigned char tmp;                                      \
	while(delay--){tmp = GLINT_READ_REG(InFIFOSpace);};     \
	} while(0)
        
#define GLINT_MASK_WRITE_REG(v,m,r)				\
	GLINT_WRITE_REG((GLINT_READ_REG(r)&(m))|(v),r)

#define GLINT_SLOW_WRITE_REG(v,r)				\
do{								\
	mem_barrier();						\
	GLINT_WAIT(pGlint->FIFOSize);		     		\
	mem_barrier();						\
        GLINT_WRITE_REG(v,r);					\
}while(0)

#define GLINT_SET_INDEX(index)					\
do{								\
	GLINT_SLOW_WRITE_REG(((index)>>8)&0xff,PM2VDACIndexRegHigh);	\
	GLINT_SLOW_WRITE_REG((index)&0xff,PM2VDACIndexRegLow);	\
} while(0)

#define REPLICATE(r)						\
{								\
	if (pScrn->bitsPerPixel == 16) {			\
		r &= 0xFFFF;					\
		r |= (r<<16);					\
	} else							\
	if (pScrn->bitsPerPixel == 8) { 			\
		r &= 0xFF;					\
		r |= (r<<8);					\
		r |= (r<<16);					\
	}							\
}

#ifndef XF86DRI
#define LOADROP(rop)						\
{								\
	if (pGlint->ROP != rop)	{				\
		GLINT_WRITE_REG(rop<<1|UNIT_ENABLE, LogicalOpMode);	\
		pGlint->ROP = rop;				\
	}							\
}
#else
#define LOADROP(rop) \
	{				\
		GLINT_WRITE_REG(rop<<1|UNIT_ENABLE, LogicalOpMode);	\
		pGlint->ROP = rop;				\
	}
#endif
	
#define CHECKCLIPPING						\
{								\
	if (pGlint->ClippingOn) {				\
		pGlint->ClippingOn = FALSE;			\
		GLINT_WAIT(1);					\
		GLINT_WRITE_REG(0, ScissorMode);		\
	}							\
}

#ifndef XF86DRI
#define DO_PLANEMASK(planemask)					\
{ 								\
	if (planemask != pGlint->planemask) {			\
		pGlint->planemask = planemask;			\
		REPLICATE(planemask); 				\
		GLINT_WRITE_REG(planemask, FBHardwareWriteMask);\
	}							\
} 
#else
#define DO_PLANEMASK(planemask)					\
	{							\
		pGlint->planemask = planemask;			\
		REPLICATE(planemask); 				\
		GLINT_WRITE_REG(planemask, FBHardwareWriteMask);\
	}
#endif

/* Permedia Save/Restore functions */

#define STOREREG(address,value) 				\
    	pReg->glintRegs[address >> 3] = value;

#define SAVEREG(address) 					\
    	pReg->glintRegs[address >> 3] = GLINT_READ_REG(address);

#define RESTOREREG(address) 					\
    	GLINT_SLOW_WRITE_REG(pReg->glintRegs[address >> 3], address);

#define STOREDAC(address,value)					\
    	pReg->DacRegs[address] = value;

#define P2VOUT(address)						\
    Permedia2vOutIndReg(pScrn, address, 0x00, pReg->DacRegs[address]);

#define P2VIN(address)						\
    pReg->DacRegs[address] = Permedia2vInIndReg(pScrn, address);

/* RamDac Save/Restore functions, used by external DAC's */

#define STORERAMDAC(address,value)				\
    	ramdacReg->DacRegs[address] = value;

/* Multi Chip access */

#define ACCESSCHIP1()						\
    pGlint->IOOffset = 0;

#define ACCESSCHIP2()						\
    pGlint->IOOffset = 0x10000;

#endif
