TIramdac.c revision 1fb744b4
1/* 2 * Copyright 1998-2001 by Alan Hourihane, Wigan, England. 3 * 4 * Permission to use, copy, modify, distribute, and sell this software and its 5 * documentation for any purpose is hereby granted without fee, provided that 6 * the above copyright notice appear in all copies and that both that 7 * copyright notice and this permission notice appear in supporting 8 * documentation, and that the name of Alan Hourihane not be used in 9 * advertising or publicity pertaining to distribution of the software without 10 * specific, written prior permission. Alan Hourihane makes no representations 11 * about the suitability of this software for any purpose. It is provided 12 * "as is" without express or implied warranty. 13 * 14 * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16 * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 20 * PERFORMANCE OF THIS SOFTWARE. 21 * 22 * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk> 23 * 24 * Modified from IBMramdac.c to support TI RAMDAC routines 25 * by Jens Owen, <jens@tungstengraphics.com>. 26 * 27 * glintOutTIIndReg() and glintInTIIndReg() are used to access 28 * the indirect TI RAMDAC registers only. 29 */ 30 31#ifdef HAVE_CONFIG_H 32#include "config.h" 33#endif 34 35#include "xf86.h" 36#include "xf86_OSproc.h" 37 38#include "xf86Pci.h" 39 40#include "TI.h" 41#include "glint_regs.h" 42#include "glint.h" 43 44#define TI_WRITE_ADDR 0x4000 45#define TI_RAMDAC_DATA 0x4008 46#define TI_PIXEL_MASK 0x4010 47#define TI_READ_ADDR 0x4018 48#define TI_CURS_COLOR_WRITE_ADDR 0x4020 49#define TI_CURS_COLOR_DATA 0x4028 50#define TI_CURS_COLOR_READ_ADDR 0x4038 51#define TI_DIRECT_CURS_CTRL 0x4048 52#define TI_INDEX_DATA 0x4050 53#define TI_CURS_RAM_DATA 0x4058 54#define TI_CURS_X_LOW 0x4060 55#define TI_CURS_X_HIGH 0x4068 56#define TI_CURS_Y_LOW 0x4070 57#define TI_CURS_Y_HIGH 0x4078 58 59void 60glintOutTIIndReg(ScrnInfoPtr pScrn, 61 CARD32 reg, unsigned char mask, unsigned char data) 62{ 63 GLINTPtr pGlint = GLINTPTR(pScrn); 64 unsigned char tmp = 0x00; 65 int offset; 66 67 if ((reg & 0xf0) == 0xa0) { /* this is really a direct register write */ 68 offset = TI_WRITE_ADDR + ((reg & 0xf) << 3); 69 if (mask != 0x00) 70 tmp = GLINT_READ_REG(offset) & mask; 71 72 GLINT_SLOW_WRITE_REG(tmp | data, offset); 73 } 74 else { /* normal indirect access */ 75 GLINT_SLOW_WRITE_REG(reg & 0xFF, TI_WRITE_ADDR); 76 77 if (mask != 0x00) 78 tmp = GLINT_READ_REG(TI_INDEX_DATA) & mask; 79 80 GLINT_SLOW_WRITE_REG(tmp | data, TI_INDEX_DATA); 81 } 82} 83 84unsigned char 85glintInTIIndReg (ScrnInfoPtr pScrn, CARD32 reg) 86{ 87 GLINTPtr pGlint = GLINTPTR(pScrn); 88 unsigned char ret; 89 int offset; 90 91 if ((reg & 0xf0) == 0xa0) { /* this is really a direct register write */ 92 offset = TI_WRITE_ADDR + ((reg & 0xf) << 3); 93 ret = GLINT_READ_REG(offset); 94 } 95 else { /* normal indirect access */ 96 GLINT_SLOW_WRITE_REG(reg & 0xFF, TI_WRITE_ADDR); 97 ret = GLINT_READ_REG(TI_INDEX_DATA); 98 } 99 100 return (ret); 101} 102 103void 104glintTIWriteAddress (ScrnInfoPtr pScrn, CARD32 index) 105{ 106 GLINTPtr pGlint = GLINTPTR(pScrn); 107 108 GLINT_SLOW_WRITE_REG(index, TI_WRITE_ADDR); 109} 110 111void 112glintTIWriteData (ScrnInfoPtr pScrn, unsigned char data) 113{ 114 GLINTPtr pGlint = GLINTPTR(pScrn); 115 116 GLINT_SLOW_WRITE_REG(data, TI_RAMDAC_DATA); 117} 118 119void 120glintTIReadAddress (ScrnInfoPtr pScrn, CARD32 index) 121{ 122 GLINTPtr pGlint = GLINTPTR(pScrn); 123 124 GLINT_SLOW_WRITE_REG(0xFF, TI_PIXEL_MASK); 125 GLINT_SLOW_WRITE_REG(index, TI_READ_ADDR); 126} 127 128unsigned char 129glintTIReadData (ScrnInfoPtr pScrn) 130{ 131 GLINTPtr pGlint = GLINTPTR(pScrn); 132 133 return(GLINT_READ_REG(TI_RAMDAC_DATA)); 134} 135 136Bool 137glintTIHWCursorInit(ScreenPtr pScreen) 138{ 139 ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); 140 GLINTPtr pGlint = GLINTPTR(pScrn); 141 xf86CursorInfoPtr infoPtr; 142 143 infoPtr = xf86CreateCursorInfoRec(); 144 if(!infoPtr) return FALSE; 145 146 pGlint->CursorInfoRec = infoPtr; 147 148 (*pGlint->RamDac->HWCursorInit)(infoPtr); 149 150 return(xf86InitCursor(pScreen, infoPtr)); 151} 152 153/* Special cases */ 154 155/* GMX2000 */ 156void 157GMX2000OutIndReg(ScrnInfoPtr pScrn, 158 CARD32 reg, unsigned char mask, unsigned char data) 159{ 160 GLINTPtr pGlint = GLINTPTR(pScrn); 161 162 ACCESSCHIP2(); 163 164 glintOutTIIndReg(pScrn, reg, mask, data); 165 166 ACCESSCHIP1(); 167} 168 169unsigned char 170GMX2000InIndReg (ScrnInfoPtr pScrn, CARD32 reg) 171{ 172 GLINTPtr pGlint = GLINTPTR(pScrn); 173 unsigned char ret; 174 175 ACCESSCHIP2(); 176 177 ret = glintInTIIndReg(pScrn, reg); 178 179 ACCESSCHIP1(); 180 181 return (ret); 182} 183 184void 185GMX2000WriteAddress (ScrnInfoPtr pScrn, CARD32 index) 186{ 187 GLINTPtr pGlint = GLINTPTR(pScrn); 188 189 ACCESSCHIP2(); 190 191 glintTIWriteAddress(pScrn, index); 192 193 ACCESSCHIP1(); 194} 195 196void 197GMX2000WriteData (ScrnInfoPtr pScrn, unsigned char data) 198{ 199 GLINTPtr pGlint = GLINTPTR(pScrn); 200 201 ACCESSCHIP2(); 202 203 glintTIWriteData(pScrn, data); 204 205 ACCESSCHIP1(); 206} 207 208void 209GMX2000ReadAddress (ScrnInfoPtr pScrn, CARD32 index) 210{ 211 GLINTPtr pGlint = GLINTPTR(pScrn); 212 213 ACCESSCHIP2(); 214 215 glintTIReadAddress(pScrn, index); 216 217 ACCESSCHIP1(); 218} 219 220unsigned char 221GMX2000ReadData (ScrnInfoPtr pScrn) 222{ 223 GLINTPtr pGlint = GLINTPTR(pScrn); 224 unsigned char ret; 225 226 ACCESSCHIP2(); 227 228 ret = glintTIReadData(pScrn); 229 230 ACCESSCHIP1(); 231 232 return (ret); 233} 234