summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Romero <kcrashcore@bellsouth.net>2004-05-24 19:31:41 +0000
committerCarlos Romero <kcrashcore@bellsouth.net>2004-05-24 19:31:41 +0000
commit32d0920ef9ec3c5e61089b88dedc82ffab294276 (patch)
tree8dbad4dd1f4a0eeff6110ac3892542b966fec4ba
parent5b2211ec3545f1634f807daf84b6c4bc2c0fdecf (diff)
Initial import of Permedia2 driver
-rw-r--r--hw/kdrive/pm2/Makefile.am33
-rw-r--r--hw/kdrive/pm2/glint_regs.h1371
-rw-r--r--hw/kdrive/pm2/pm2.c294
-rw-r--r--hw/kdrive/pm2/pm2.h184
-rw-r--r--hw/kdrive/pm2/pm2_draw.c215
-rw-r--r--hw/kdrive/pm2/pm2stub.c54
6 files changed, 2151 insertions, 0 deletions
diff --git a/hw/kdrive/pm2/Makefile.am b/hw/kdrive/pm2/Makefile.am
new file mode 100644
index 000000000..4c1920467
--- /dev/null
+++ b/hw/kdrive/pm2/Makefile.am
@@ -0,0 +1,33 @@
+INCLUDES = \
+ @KDRIVE_INCS@ \
+ -I$(top_srcdir)/hw/kdrive/vesa \
+ @XSERVER_CFLAGS@
+
+bin_PROGRAMS = Xpm2
+
+if TSLIB
+TSLIB_FLAG = -lts
+endif
+
+noinst_LIBRARIES = libpm2.a
+
+libpm2_a_SOURCES = \
+ glint_regs.h \
+ pm2.c \
+ pm2_draw.c \
+ pm2.h
+
+Xpm2_SOURCES = \
+ pm2stub.c
+
+PM2_LIBS = \
+ libpm2.a \
+ $(top_builddir)/hw/kdrive/vesa/libvesa.a \
+ @KDRIVE_LIBS@
+
+Xpm2_LDADD = \
+ $(PM2_LIBS) \
+ @XSERVER_LIBS@ \
+ $(TSLIB_FLAG)
+
+Xpm2_DEPENDENCIES = $(PM2_LIBS) @KDRIVE_LIBS@
diff --git a/hw/kdrive/pm2/glint_regs.h b/hw/kdrive/pm2/glint_regs.h
new file mode 100644
index 000000000..269b05fbe
--- /dev/null
+++ b/hw/kdrive/pm2/glint_regs.h
@@ -0,0 +1,1371 @@
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/glint/glint_regs.h,v 1.36tsi 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_
+
+/* 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:*/
+ /* UNIT_DISABLE */
+# define CDDA_FlatShading 0
+# 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)
+# define GWIN_DisableLBUpdate 0x40000 /* ??? is this needed, set by permedia (2) modules */
+
+#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
+# define FBWM_Enable0 1 << 12 /* PM3 */
+
+#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
+
+#if 0
+
+#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; \
+ while(delay--){(void)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 /* 0 */
+
+#define GLINT_XY(x,y) (((x) & 0x0FFF) | (((y) & 0x0FFF) << 16))
+
+#endif
diff --git a/hw/kdrive/pm2/pm2.c b/hw/kdrive/pm2/pm2.c
new file mode 100644
index 000000000..976af45ef
--- /dev/null
+++ b/hw/kdrive/pm2/pm2.c
@@ -0,0 +1,294 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "kdrive.h"
+
+#include "pm2.h"
+
+#define PARTPROD(a,b,c) (((a)<<6) | ((b)<<3) | (c))
+
+char bppand[4] = { 0x03, /* 8bpp */
+ 0x01, /* 16bpp */
+ 0x00, /* 24bpp */
+ 0x00 /* 32bpp */};
+
+int partprodPermedia[] = {
+ -1,
+ PARTPROD(0,0,1), PARTPROD(0,1,1), PARTPROD(1,1,1), PARTPROD(1,1,2),
+ PARTPROD(1,2,2), PARTPROD(2,2,2), PARTPROD(1,2,3), PARTPROD(2,2,3),
+ PARTPROD(1,3,3), PARTPROD(2,3,3), PARTPROD(1,2,4), PARTPROD(3,3,3),
+ PARTPROD(1,3,4), PARTPROD(2,3,4), -1, PARTPROD(3,3,4),
+ PARTPROD(1,4,4), PARTPROD(2,4,4), -1, PARTPROD(3,4,4),
+ -1, PARTPROD(2,3,5), -1, PARTPROD(4,4,4),
+ PARTPROD(1,4,5), PARTPROD(2,4,5), PARTPROD(3,4,5), -1,
+ -1, -1, -1, PARTPROD(4,4,5),
+ PARTPROD(1,5,5), PARTPROD(2,5,5), -1, PARTPROD(3,5,5),
+ -1, -1, -1, PARTPROD(4,5,5),
+ -1, -1, -1, PARTPROD(3,4,6),
+ -1, -1, -1, PARTPROD(5,5,5),
+ PARTPROD(1,5,6), PARTPROD(2,5,6), -1, PARTPROD(3,5,6),
+ -1, -1, -1, PARTPROD(4,5,6),
+ -1, -1, -1, -1,
+ -1, -1, -1, PARTPROD(5,5,6),
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ 0};
+
+Bool
+pmMapReg(KdCardInfo *card, PM2CardInfo *pm2c)
+{
+ pm2c->reg_base = (CARD8 *)KdMapDevice(PM2_REG_BASE(card),
+ PM2_REG_SIZE(card));
+
+ if (pm2c->reg_base == NULL)
+ return FALSE;
+
+// pm2c->render = (PMRender *) (pm2c->reg_base + RENDER_UNIT);
+// pm2c->rect = (PMRectangle *) (pm2c->reg_base + RECT_UNIT);
+// pm2c->mode = (PMMode *) (pm2c->reg_base + MODE_UNIT);
+// pm2c->color = (PMColor *) (pm2c->reg_base + COLOR_UNIT);
+// pm2c->scissor = (PMScissor *) (pm2c->reg_base + SCISSOR_UNIT);
+
+ KdSetMappedMode(PM2_REG_BASE(card), PM2_REG_SIZE(card),
+ KD_MAPPED_MODE_REGISTERS);
+
+ return TRUE;
+}
+
+void
+pmUnmapReg(KdCardInfo *card, PM2CardInfo *pm2c)
+{
+ if (pm2c->reg_base) {
+ KdResetMappedMode(PM2_REG_BASE(card), PM2_REG_SIZE(card),
+ KD_MAPPED_MODE_REGISTERS);
+ KdUnmapDevice((void *)pm2c->reg_base, PM2_REG_SIZE(card));
+ pm2c->reg_base = 0;
+ }
+}
+
+Bool
+pmCardInit (KdCardInfo *card)
+{
+ int i;
+
+ PM2CardInfo *pm2c;
+
+ pm2c = (PM2CardInfo *) xalloc (sizeof (PM2CardInfo));
+ if (!pm2c)
+ return FALSE;
+ memset (pm2c, '\0', sizeof (PM2CardInfo));
+
+ (void) pmMapReg (card, pm2c);
+
+ if (!vesaInitialize (card, &pm2c->vesa))
+ {
+ xfree (pm2c);
+ return FALSE;
+ }
+
+ card->driver = pm2c;
+
+ return TRUE;
+}
+
+void
+pmCardFini (KdCardInfo *card)
+{
+ PM2CardInfo *pm2c = (PM2CardInfo *) card->driver;
+
+ pmUnmapReg (card, pm2c);
+ vesaCardFini (card);
+}
+
+Bool
+pmScreenInit (KdScreenInfo *screen)
+{
+ PM2CardInfo *pm2c = screen->card->driver;
+ PM2ScreenInfo *pm2s;
+ int screen_size, memory;
+
+ pm2s = (PM2ScreenInfo *) xalloc (sizeof (PM2ScreenInfo));
+ if (!pm2s)
+ return FALSE;
+ memset (pm2s, '\0', sizeof (PM2ScreenInfo));
+
+ if (!vesaScreenInitialize (screen, &pm2s->vesa))
+ {
+ xfree (pm2s);
+ return FALSE;
+ }
+
+ pm2c->pprod = partprodPermedia[screen->width >> 5];
+ pm2c->bppalign = bppand[(screen->fb[0].bitsPerPixel>>3)-1];
+
+ pm2s->screen = pm2s->vesa.fb;
+ memory = pm2s->vesa.fb_size;
+
+ screen_size = screen->fb[0].byteStride * screen->height;
+
+ if (pm2s->screen && memory >= screen_size + 2048)
+ {
+ memory -= 2048;
+ pm2s->cursor_base = pm2s->screen + memory - 2048;
+ }
+ else
+ pm2s->cursor_base = 0;
+ memory -= screen_size;
+ if (memory > screen->fb[0].byteStride)
+ {
+ pm2s->off_screen = pm2s->screen + screen_size;
+ pm2s->off_screen_size = memory;
+ }
+ else
+ {
+ pm2s->off_screen = 0;
+ pm2s->off_screen_size = 0;
+ }
+
+ screen->driver = pm2s;
+
+ return TRUE;
+}
+
+void
+pmScreenFini (KdScreenInfo *screen)
+{
+ PM2ScreenInfo *pm2s = (PM2ScreenInfo *) screen->driver;
+
+ vesaScreenFini (screen);
+ xfree (pm2s);
+ screen->driver = 0;
+}
+
+Bool
+pmInitScreen (ScreenPtr pScreen)
+{
+ return vesaInitScreen (pScreen);
+}
+
+#ifdef RANDR
+static Bool
+pmRandRSetConfig (ScreenPtr pScreen,
+ Rotation rotation,
+ int rate,
+ RRScreenSizePtr pSize)
+{
+ KdCheckSync (pScreen);
+
+ if (!vesaRandRSetConfig (pScreen, rotation, rate, pSize))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+pmRandRInit (ScreenPtr pScreen)
+{
+ rrScrPriv(pScreen);
+
+ pScrPriv->rrSetConfig = pmRandRSetConfig;
+}
+#endif
+
+Bool
+pmFinishInitScreen (ScreenPtr pScreen)
+{
+ Bool ret;
+ ret = vesaFinishInitScreen (pScreen);
+#ifdef RANDR
+ pmRandRInit (pScreen);
+#endif
+ return ret;
+}
+
+void
+pmPreserve(KdCardInfo *card)
+{
+ vesaPreserve(card);
+}
+
+static void
+pmRestore(KdCardInfo *card)
+{
+ PM2CardInfo *pm2c = card->driver;
+
+ vesaRestore (card);
+}
+
+Bool
+pmEnable (ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+ PM2CardInfo *pm2c = pScreenPriv->card->driver;
+
+ if (!vesaEnable (pScreen))
+ return FALSE;
+
+#ifdef XV
+ KdXVEnable (pScreen);
+#endif
+
+ return TRUE;
+}
+
+void
+pmDisable(ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+ PM2CardInfo *pm2c = pScreenPriv->card->driver;
+
+#ifdef XV
+ KdXVDisable (pScreen);
+#endif
+ vesaDisable (pScreen);
+}
+
+static Bool
+pmDPMS(ScreenPtr pScreen, int mode)
+{
+ return vesaDPMS (pScreen, mode);
+}
+
+KdCardFuncs PM2Funcs = {
+ pmCardInit, /* cardinit */
+ pmScreenInit, /* scrinit */
+ pmInitScreen, /* initScreen */
+ pmFinishInitScreen, /* finishInitScreen */
+ vesaCreateResources, /* createRes */
+ pmPreserve, /* preserve */
+ pmEnable, /* enable */
+ pmDPMS, /* dpms */
+ pmDisable, /* disable */
+ pmRestore, /* restore */
+ pmScreenFini, /* scrfini */
+ pmCardFini, /* cardfini */
+
+ 0, /* initCursor */
+ 0, /* enableCursor */
+ 0, /* disableCursor */
+ 0, /* finiCursor */
+ NULL, /* recolorCursor */
+
+ pmDrawInit, /* initAccel */
+ pmDrawEnable, /* enableAccel */
+ pmDrawSync, /* syncAccel */
+ pmDrawDisable, /* disableAccel */
+ pmDrawFini, /* finiAccel */
+
+ vesaGetColors, /* getColors */
+ vesaPutColors, /* putColors */
+};
diff --git a/hw/kdrive/pm2/pm2.h b/hw/kdrive/pm2/pm2.h
new file mode 100644
index 000000000..ded9978bc
--- /dev/null
+++ b/hw/kdrive/pm2/pm2.h
@@ -0,0 +1,184 @@
+#ifndef _PM2_H_
+#define _PM2_H_
+#include <vesa.h>
+#include "kxv.h"
+#include "klinux.h"
+
+#include "glint_regs.h"
+
+typedef volatile CARD8 VOL8;
+typedef volatile CARD16 VOL16;
+typedef volatile CARD32 VOL32;
+
+#if 0
+typedef struct {
+ VOL32 StartXDom;
+ VOL32 dXDom;
+ VOL32 StartXSub;
+ VOL32 dXSub;
+ VOL32 StartY;
+ VOL32 dY;
+ VOL32 GLINTCount;
+ VOL32 Render;
+ VOL32 ContinueNewLine;
+ VOL32 ContinueNewDom;
+ VOL32 ContinueNewSub;
+ VOL32 Continue;
+ VOL32 FlushSpan;
+ VOL32 BitMaskPattern;
+} PMRender;
+
+typedef struct {
+ VOL32 PointTable0;
+ VOL32 PointTable1;
+ VOL32 PointTable2;
+ VOL32 PointTable3;
+ VOL32 RasterizerMode;
+ VOL32 YLimits;
+ VOL32 ScanLineOwnership;
+ VOL32 WaitForCompletion;
+ VOL32 PixelSize;
+ VOL32 XLimits;
+ VOL32 RectangleOrigin;
+ VOL32 RectangleSize;
+} PMRectangle;
+
+typedef struct {
+ VOL32 FilterMode;
+ VOL32 StatisticMode;
+ VOL32 MinRegion;
+ VOL32 MaxRegion;
+ VOL32 ResetPickResult;
+ VOL32 MitHitRegion;
+ VOL32 MaxHitRegion;
+ VOL32 PickResult;
+ VOL32 GlintSync;
+ VOL32 reserved00;
+ VOL32 reserved01;
+ VOL32 reserved02;
+ VOL32 reserved03;
+ VOL32 FBBlockColorU;
+ VOL32 FBBlockColorL;
+ VOL32 SuspendUntilFrameBlank;
+} PMMode;
+
+typedef struct {
+ VOL32 ScissorMode;
+ VOL32 ScissorMinXY;
+ VOL32 ScissorMaxXY;
+ VOL32 ScreenSize;
+ VOL32 AreaStippleMode;
+ VOL32 LineStippleMode;
+ VOL32 LoadLineStippleCounters;
+ VOL32 UpdateLineStippleCounters;
+ VOL32 SaveLineStippleState;
+ VOL32 WindowOrigin;
+} PMScissor;
+
+typedef struct {
+ VOL32 RStart;
+ VOL32 dRdx;
+ VOL32 dRdyDom;
+ VOL32 GStart;
+ VOL32 dGdx;
+ VOL32 dGdyDom;
+ VOL32 BStart;
+ VOL32 dBdx;
+ VOL32 dBdyDom;
+ VOL32 AStart;
+ VOL32 dAdx;
+ VOL32 dAdyDom;
+ VOL32 ColorDDAMode;
+ VOL32 ConstantColor;
+ VOL32 GLINTColor;
+} PMColor;
+#endif
+
+#define PM2_REG_BASE(c) ((c)->attr.address[0] & 0xFFFFC000)
+#define PM2_REG_SIZE(c) (0x10000)
+
+#define minb(p) *(volatile CARD8 *)(pm2c->reg_base + (p))
+#define moutb(p,v) *(volatile CARD8 *)(pm2c->reg_base + (p)) = (v)
+
+
+/* Memory mapped register access macros */
+#define INREG8(addr) *(volatile CARD8 *)(pm2c->reg_base + (addr))
+#define INREG16(addr) *(volatile CARD16 *)(pm2c->reg_base + (addr))
+#define INREG(addr) *(volatile CARD32 *)(pm2c->reg_base + (addr))
+
+#define OUTREG8(addr, val) do { \
+ *(volatile CARD8 *)(pm2c->reg_base + (addr)) = (val); \
+} while (0)
+
+#define OUTREG16(addr, val) do { \
+ *(volatile CARD16 *)(pm2c->reg_base + (addr)) = (val); \
+} while (0)
+
+#define OUTREG(addr, val) do { \
+ *(volatile CARD32 *)(pm2c->reg_base + (addr)) = (val); \
+} while (0)
+
+typedef struct _PM2CardInfo {
+ VesaCardPrivRec vesa;
+ CARD8 *reg_base;
+
+ int in_fifo_space;
+ int fifo_size;
+
+ int pprod;
+ int bppalign;
+
+ int clipping_on;
+
+ int ROP;
+
+} PM2CardInfo;
+
+#define getPM2CardInfo(kd) ((PM2CardInfo *) ((kd)->card->driver))
+#define pmCardInfo(kd) PM2CardInfo *pm2c = getPM2CardInfo(kd)
+
+typedef struct _PM2ScreenInfo {
+ VesaScreenPrivRec vesa;
+ CARD8 *cursor_base;
+ CARD8 *screen;
+ CARD8 *off_screen;
+ int off_screen_size;
+ KdVideoAdaptorPtr pAdaptor;
+} PM2ScreenInfo;
+
+#define getPM2ScreenInfo(kd) ((PM2ScreenInfo *) ((kd)->screen->driver))
+#define pmScreenInfo(kd) PM2ScreenInfo *pm2s = getPM2ScreenInfo(kd)
+
+Bool
+pmCardInit (KdCardInfo *card);
+
+Bool
+pmScreenInit (KdScreenInfo *screen);
+
+Bool
+pmDrawInit(ScreenPtr);
+
+void
+pmDrawEnable (ScreenPtr);
+
+void
+pmDrawSync (ScreenPtr);
+
+void
+pmDrawDisable (ScreenPtr);
+
+void
+pmDrawFini (ScreenPtr);
+
+
+extern KdCardFuncs PM2Funcs;
+
+#define PM2R_MEM_CONFIG 0x10c0
+
+#define PM2F_MEM_CONFIG_RAM_MASK (3L<<29)
+#define PM2F_MEM_BANKS_1 0L
+#define PM2F_MEM_BANKS_2 (1L<<29)
+#define PM2F_MEM_BANKS_3 (2L<<29)
+#define PM2F_MEM_BANKS_4 (3L<<29)
+
+#endif /* _PM2_H_ */
diff --git a/hw/kdrive/pm2/pm2_draw.c b/hw/kdrive/pm2/pm2_draw.c
new file mode 100644
index 000000000..85117c8a4
--- /dev/null
+++ b/hw/kdrive/pm2/pm2_draw.c
@@ -0,0 +1,215 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "kdrive.h"
+
+#include "pm2.h"
+
+static PM2CardInfo *card;
+static VOL8 *mmio;
+
+static void pmWait (PM2CardInfo *card, int n);
+
+static void
+pmWait (PM2CardInfo *card, int n)
+{
+ if (card->in_fifo_space >= n)
+ card->in_fifo_space -= n;
+ else {
+ int tmp;
+ while((tmp = *(VOL32 *) (mmio + InFIFOSpace)) < n);
+ /* Clamp value due to bugs in PM3 */
+ if (tmp > card->fifo_size)
+ tmp = card->fifo_size;
+ card->in_fifo_space = tmp - n;
+ }
+}
+
+static Bool
+pmPrepareSolid (PixmapPtr pPixmap,
+ int alu,
+ Pixel pm,
+ Pixel fg)
+{
+ ScreenPtr pScreen = pPixmap->drawable.pScreen;
+ KdScreenPriv(pScreen);
+ pmCardInfo(pScreenPriv);
+
+ card = pm2c;
+ if (~pm & FbFullMask(pPixmap->drawable.depth))
+ return FALSE;
+
+ pmWait(card, 6);
+ *(VOL32 *) (mmio + FBHardwareWriteMask) = pm;
+ if (alu == GXcopy) {
+ *(VOL32 *) (mmio + ColorDDAMode) = UNIT_DISABLE;
+ *(VOL32 *) (mmio + FBReadMode) = card->pprod;
+ *(VOL32 *) (mmio + FBBlockColor) = fg;
+ } else {
+ *(VOL32 *) (mmio + ColorDDAMode) = UNIT_ENABLE;
+ *(VOL32 *) (mmio + ConstantColor) = fg;
+ *(VOL32 *) (mmio + FBReadMode) = card->pprod|FBRM_DstEnable|FBRM_Packed;
+ }
+ *(VOL32 *) (mmio + LogicalOpMode) = alu<<1|UNIT_ENABLE;
+ card->ROP = alu;
+
+ return TRUE;
+}
+
+static void
+pmSolid (int x1, int y1, int x2, int y2)
+{
+ int speed = 0;
+
+ if (card->ROP == GXcopy) {
+ pmWait(card, 3);
+ *(VOL32 *) (mmio + RectangleOrigin) = GLINT_XY(x1, y1);
+ *(VOL32 *) (mmio + RectangleSize) = GLINT_XY(x2-x1, y2-y1);
+ speed = FastFillEnable;
+ } else {
+ pmWait(card, 4);
+ *(VOL32 *) (mmio + RectangleOrigin) = GLINT_XY(x1, y1);
+ *(VOL32 *) (mmio + RectangleSize) = GLINT_XY((x2-x1)+7, y2-y1);
+ *(VOL32 *) (mmio + PackedDataLimits) = x1<<16|(x1+(x2-x1));
+ speed = 0;
+ }
+ *(VOL32 *) (mmio + Render) = PrimitiveRectangle | XPositive | YPositive | speed;
+}
+
+
+static void
+pmDoneSolid (void)
+{
+}
+
+static Bool
+pmPrepareCopy (PixmapPtr pSrcPixmap,
+ PixmapPtr pDstPixmap,
+ int dx,
+ int dy,
+ int alu,
+ Pixel pm)
+{
+ ScreenPtr pScreen = pDstPixmap->drawable.pScreen;
+ KdScreenPriv(pScreen);
+ pmCardInfo(pScreenPriv);
+
+ ErrorF ("pmPrepareCopy\n");
+
+ card = pm2c;
+ if (~pm & FbFullMask(pDstPixmap->drawable.depth))
+ return FALSE;
+
+ pmWait(card, 5);
+ *(VOL32 *) (mmio + FBHardwareWriteMask) = pm;
+ *(VOL32 *) (mmio + ColorDDAMode) = UNIT_DISABLE;
+ if ((alu == GXset) || (alu == GXclear)) {
+ *(VOL32 *) (mmio + FBReadMode) = card->pprod;
+ } else {
+ if ((alu == GXcopy) || (alu == GXcopyInverted)) {
+ *(VOL32 *) (mmio + FBReadMode) = card->pprod|FBRM_SrcEnable;
+ } else {
+ *(VOL32 *) (mmio + FBReadMode) = card->pprod|FBRM_SrcEnable|FBRM_DstEnable;
+ }
+ }
+ *(VOL32 *) (mmio + LogicalOpMode) = alu<<1|UNIT_ENABLE;
+ card->ROP = alu;
+
+ return TRUE;
+}
+
+static void
+pmCopy (int srcX,
+ int srcY,
+ int dstX,
+ int dstY,
+ int w,
+ int h)
+{
+ ErrorF ("pmCopy %d %d %d %d %d %d\n", srcX, srcY, dstX, dstY, w, h);
+ pmWait(card, 4);
+ *(VOL32 *) (mmio + RectangleOrigin) = GLINT_XY(dstX, dstY);
+ *(VOL32 *) (mmio + RectangleSize) = GLINT_XY(w, h);
+ *(VOL32 *) (mmio + FBSourceDelta) = ((srcY-dstY)&0x0FFF)<<16 | (srcX-dstX)&0x0FFF;
+ *(VOL32 *) (mmio + Render) = PrimitiveRectangle | XPositive | YPositive;
+}
+
+static void
+pmDoneCopy (void)
+{
+}
+
+KaaScreenInfoRec pmKaa = {
+ pmPrepareSolid,
+ pmSolid,
+ pmDoneSolid,
+
+ pmPrepareCopy,
+ pmCopy,
+ pmDoneCopy,
+};
+
+Bool
+pmDrawInit (ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+ pmCardInfo(pScreenPriv);
+ Bool ret = TRUE;
+
+ card = pm2c;
+ mmio = pm2c->reg_base;
+
+ if (pScreenPriv->screen->fb[0].depth <= 16) {
+ ErrorF ("depth(%d) <= 16 \n", pScreenPriv->screen->fb[0].depth);
+ ret = FALSE;
+ }
+ if (ret && !kaaDrawInit (pScreen, &pmKaa))
+ {
+ ErrorF ("kaaDrawInit failed\n");
+ ret = FALSE;
+ }
+
+ return ret;
+}
+
+void
+pmDrawEnable (ScreenPtr pScreen)
+{
+ KdScreenPriv(pScreen);
+ pmCardInfo(pScreenPriv);
+
+ pm2c->in_fifo_space = 0;
+
+ KdMarkSync (pScreen);
+}
+
+void
+pmDrawDisable (ScreenPtr pScreen)
+{
+}
+
+void
+pmDrawFini (ScreenPtr pScreen)
+{
+}
+
+void
+pmDrawSync (ScreenPtr pScreen)
+{
+ if (card->clipping_on) {
+ card->clipping_on = FALSE;
+ pmWait(card, 1);
+ *(VOL32 *) (mmio + ScissorMode) = 0;
+ }
+
+ while (*(VOL32 *) (mmio + DMACount) != 0);
+
+ pmWait(card, 2);
+
+ *(VOL32 *) (mmio + FilterMode) = 0x400;
+ *(VOL32 *) (mmio + GlintSync) = 0;
+
+ do {
+ while(*(VOL32 *) (mmio + OutFIFOWords) == 0);
+ } while (*(VOL32 *) (mmio + OutputFIFO) != Sync_tag);
+}
diff --git a/hw/kdrive/pm2/pm2stub.c b/hw/kdrive/pm2/pm2stub.c
new file mode 100644
index 000000000..f125466b4
--- /dev/null
+++ b/hw/kdrive/pm2/pm2stub.c
@@ -0,0 +1,54 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "kdrive.h"
+
+#include "pm2.h"
+
+static const int PM2Cards[]={ PCI_CHIP_3DLABS_PERMEDIA2, PCI_CHIP_3DLABS_PERMEDIA2V };
+
+
+#define numPM2Cards (sizeof(PM2Cards) / sizeof(PM2Cards[0]))
+
+void
+InitCard (char *name)
+{
+ KdCardAttr attr;
+ int i;
+
+ Bool LinuxFindPci(CARD16, CARD16, CARD32, KdCardAttr *);
+
+ for (i = 0; i < numPM2Cards; i++)
+ if (LinuxFindPci (0x3d3d, PM2Cards[i], 0, &attr))
+ KdCardInfoAdd (&PM2Funcs, &attr, (void *) PM2Cards[i]);
+}
+
+
+void
+InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv)
+{
+ KdInitOutput (pScreenInfo, argc, argv);
+}
+
+void
+InitInput (int argc, char **argv)
+{
+ KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+}
+
+void
+ddxUseMsg (void)
+{
+ KdUseMsg();
+ vesaUseMsg();
+}
+
+int
+ddxProcessArgument (int argc, char **argv, int i)
+{
+ int ret;
+
+ if (!(ret = vesaProcessArgument (argc, argv, i)))
+ ret = KdProcessArgument(argc, argv, i);
+ return ret;
+}