1 /* 2 Voodoo Banshee driver version 1.0.2 3 4 Author: Daryll Strauss 5 6 Copyright: 1998,1999 7 */ 8 9 #ifdef HAVE_CONFIG_H 10 #include "config.h" 11 #endif 12 13 #include "xf86.h" 14 #include "xf86_OSproc.h" 15 #include "xf86fbman.h" 16 17 #include "tdfx.h" 18 19 static void TDFXLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src); 20 static void TDFXShowCursor(ScrnInfoPtr pScrn); 21 static void TDFXHideCursor(ScrnInfoPtr pScrn); 22 static void TDFXSetCursorPosition(ScrnInfoPtr pScrn, int x, int y); 23 static void TDFXSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg); 24 static Bool TDFXUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs); 25 26 Bool 27 TDFXCursorInit(ScreenPtr pScreen) 28 { 29 ScrnInfoPtr pScrn; 30 TDFXPtr pTDFX; 31 xf86CursorInfoPtr infoPtr; 32 33 TDFXTRACECURS("TDFXCursorInit start\n"); 34 pScrn = xf86ScreenToScrn(pScreen); 35 pTDFX = TDFXPTR(pScrn); 36 pTDFX->CursorInfoRec = infoPtr = xf86CreateCursorInfoRec(); 37 if (!infoPtr) return FALSE; 38 39 infoPtr->MaxWidth = 64; 40 infoPtr->MaxHeight = 64; 41 42 infoPtr->Flags = 43 #if X_BYTE_ORDER == X_LITTLE_ENDIAN 44 HARDWARE_CURSOR_BIT_ORDER_MSBFIRST | 45 #endif 46 HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK| 47 HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 | 48 HARDWARE_CURSOR_TRUECOLOR_AT_8BPP; 49 infoPtr->SetCursorColors = TDFXSetCursorColors; 50 infoPtr->SetCursorPosition = TDFXSetCursorPosition; 51 infoPtr->LoadCursorImage = TDFXLoadCursorImage; 52 infoPtr->HideCursor = TDFXHideCursor; 53 infoPtr->ShowCursor = TDFXShowCursor; 54 infoPtr->UseHWCursor = TDFXUseHWCursor; 55 56 pTDFX->ModeReg.cursloc = pTDFX->cursorOffset; 57 pTDFX->writeLong(pTDFX, HWCURPATADDR, pTDFX->cursorOffset); 58 59 return xf86InitCursor(pScreen, infoPtr); 60 } 61 62 #if X_BYTE_ORDER == X_BIG_ENDIAN 63 static unsigned int TDFXSwap(TDFXPtr pTDFX, unsigned int val) { 64 switch (pTDFX->cpp) { 65 default: 66 return val; 67 case 2: 68 return ((val & 0x00ff00ff) << 8) | 69 ((val & 0xff00ff00) >> 8); 70 case 3: 71 case 4: 72 return BE_BSWAP32(val); 73 } 74 } 75 #endif 76 77 static void 78 TDFXLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) 79 { 80 TDFXPtr pTDFX; 81 82 TDFXTRACECURS("TDFXLoadCursorImage start\n"); 83 pTDFX = TDFXPTR(pScrn); 84 #if X_BYTE_ORDER == X_BIG_ENDIAN 85 { 86 int i; 87 unsigned int *ptr=(unsigned int *)(pTDFX->FbBase+pTDFX->cursorOffset); 88 89 for (i=0; i<256; i++) { 90 unsigned int val = ((unsigned int *)src)[i]; 91 *ptr++ = TDFXSwap(pTDFX, val); 92 } 93 } 94 #else 95 memcpy(pTDFX->FbBase+pTDFX->cursorOffset, src, 1024); 96 #endif 97 } 98 99 static void 100 TDFXShowCursor(ScrnInfoPtr pScrn) 101 { 102 TDFXPtr pTDFX; 103 104 TDFXTRACECURS("TDFXShowCursor start\n"); 105 pTDFX = TDFXPTR(pScrn); 106 pTDFX->ModeReg.vidcfg|=BIT(27); 107 pTDFX->writeLong(pTDFX, VIDPROCCFG, pTDFX->ModeReg.vidcfg); 108 } 109 110 void 111 TDFXHideCursor(ScrnInfoPtr pScrn) 112 { 113 TDFXPtr pTDFX; 114 115 TDFXTRACECURS("TDFXHideCursor start\n"); 116 pTDFX = TDFXPTR(pScrn); 117 pTDFX->ModeReg.vidcfg&=~BIT(27); 118 pTDFX->writeLong(pTDFX, VIDPROCCFG, pTDFX->ModeReg.vidcfg); 119 } 120 121 static void 122 TDFXSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) 123 { 124 TDFXPtr pTDFX; 125 126 /* TDFXTRACECURS("TDFXSetCursorPosition start\n"); */ 127 pTDFX = TDFXPTR(pScrn); 128 pTDFX->writeLong(pTDFX, HWCURLOC, ((y+64)<<16)|(x+64)); 129 } 130 131 static void 132 TDFXSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) 133 { 134 TDFXPtr pTDFX; 135 136 TDFXTRACECURS("TDFXSetCursorColors start\n"); 137 pTDFX = TDFXPTR(pScrn); 138 pTDFX->writeLong(pTDFX, HWCURC0, bg); 139 pTDFX->writeLong(pTDFX, HWCURC1, fg); 140 } 141 142 static Bool 143 TDFXUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs) 144 { 145 ScrnInfoPtr pScrn; 146 TDFXPtr pTDFX; 147 148 TDFXTRACECURS("TDFXUseHWCursor start\n"); 149 pScrn = xf86ScreenToScrn(pScreen); 150 pTDFX = TDFXPTR(pScrn); 151 if (pScrn->currentMode->Flags&V_DBLSCAN) 152 return FALSE; 153 if (!pTDFX->CursorInfoRec) return FALSE; 154 return TRUE; 155 } 156