trident.h revision 95b296d0
1/* 2 * Copyright 1992-2003 by Alan Hourihane, North Wales, UK. 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/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/trident/trident.h,v 1.59 2003/09/05 22:07:28 alanh Exp $ */ 25/*#define VBE_INFO*/ 26 27#ifndef _TRIDENT_H_ 28#define _TRIDENT_H_ 29 30#include <stdio.h> 31#include <string.h> 32#include <math.h> 33 34#include "exa.h" 35#include "xf86Cursor.h" 36#include "xaa.h" 37#include "xf86RamDac.h" 38#include "compiler.h" 39#include "vgaHW.h" 40#include "xf86i2c.h" 41#include "xf86int10.h" 42#include "shadowfb.h" 43#include "shadow.h" 44#include "xf86xv.h" 45#include "xf86Pci.h" 46#include "vbe.h" 47 48#define PCI_CHIP_2200 0x2200 49 50typedef struct { 51 unsigned char tridentRegs3x4[0x100]; 52 unsigned char tridentRegs3CE[0x100]; 53 unsigned char tridentRegs3C4[0x100]; 54 unsigned char tridentRegsDAC[0x01]; 55 unsigned char tridentRegsClock[0x05]; 56 unsigned char DacRegs[0x300]; 57} TRIDENTRegRec, *TRIDENTRegPtr; 58 59#define VGA_REGNUM_ABOUT_TV 19 60#define TRIDENTPTR(p) ((TRIDENTPtr)((p)->driverPrivate)) 61 62typedef struct { 63 ScrnInfoPtr pScrn; 64 pciVideoPtr PciInfo; 65 PCITAG PciTag; 66 EntityInfoPtr pEnt; 67 ExaDriverPtr EXADriverPtr; 68 int useEXA; 69 int Chipset; 70 int DACtype; 71 int RamDac; 72 int ChipRev; 73 int HwBpp; 74 int BppShift; 75 CARD32 IOAddress; 76 unsigned long FbAddress; 77 unsigned char * IOBase; 78 unsigned char * FbBase; 79 long FbMapSize; 80 IOADDRESS PIOBase; 81 Bool NoAccel; 82 Bool HWCursor; 83 Bool UsePCIRetry; 84 Bool UsePCIBurst; 85 Bool NewClockCode; 86 Bool Clipping; 87 Bool DstEnable; 88 Bool ROP; 89 Bool HasSGRAM; 90 Bool MUX; 91 Bool IsCyber; 92 Bool CyberShadow; 93 Bool CyberStretch; 94 Bool NoMMIO; 95 Bool MMIOonly; 96 Bool ShadowFB; 97 Bool Linear; 98 DGAModePtr DGAModes; 99 int numDGAModes; 100 Bool DGAactive; 101 int DGAViewportStatus; 102 unsigned char * ShadowPtr; 103 int ShadowPitch; 104 RefreshAreaFuncPtr RefreshArea; 105 void (*PointerMoved)(int index, int x, int y); 106 int Rotate; 107 float frequency; 108 unsigned char REGPCIReg; 109 unsigned char REGNewMode1; 110 CARD8 SaveClock1; 111 CARD8 SaveClock2; 112 CARD8 SaveClock3; 113 int MinClock; 114 int MaxClock; 115 int MUXThreshold; 116 int currentClock; 117 int MCLK; 118 int dwords; 119 int h; 120 int x; 121 int w; 122 int y; 123 int lcdMode; 124 Bool lcdActive; 125 Bool doInit; 126#ifdef READOUT 127 Bool DontSetClock; 128#endif 129 TRIDENTRegRec SavedReg; 130 TRIDENTRegRec ModeReg; 131 I2CBusPtr DDC; 132 CARD16 EngineOperation; 133 CARD32 PatternLocation; 134 CARD32 BltScanDirection; 135 CARD32 DrawFlag; 136 CARD16 LinePattern; 137 RamDacRecPtr RamDacRec; 138 int CursorOffset; 139 xf86CursorInfoPtr CursorInfoRec; 140 xf86Int10InfoPtr Int10; 141 vbeInfoPtr pVbe; 142#ifdef VBE_INFO 143 vbeModeInfoPtr vbeModes; 144#endif 145 XAAInfoRecPtr AccelInfoRec; 146 CloseScreenProcPtr CloseScreen; 147 ScreenBlockHandlerProcPtr BlockHandler; 148 int panelWidth; 149 int panelHeight; 150 unsigned int (*ddc1Read)(ScrnInfoPtr); 151 CARD8* XAAScanlineColorExpandBuffers[2]; 152 CARD8* XAAImageScanlineBuffer[1]; 153 void (*InitializeAccelerator)(ScrnInfoPtr); 154 void (*VideoTimerCallback)(ScrnInfoPtr, Time); 155 XF86VideoAdaptorPtr adaptor; 156 int videoKey; 157 int hsync; 158 int hsync_rskew; 159 int vsync; 160 int vsync_bskew; 161 CARD32 videoFlags; 162 int keyOffset; 163 int OverrideHsync; 164 int OverrideVsync; 165 int OverrideBskew; 166 int OverrideRskew; 167 OptionInfoPtr Options; 168 Bool shadowNew; 169 int displaySize; 170 int dspOverride; 171 Bool GammaBrightnessOn; 172 int brightness; 173 double gamma; 174 int FPDelay; /* just for debugging - will go away */ 175 int TVChipset; /* 0: None 1: VT1621 2: CH7005C*/ 176 int TVSignalMode; /* 0: NTSC 1: PAL */ 177 Bool TVRegSet; /* 0: User not customer TV Reg, 1: User customer TV Reg */ 178 unsigned char TVRegUserSet[2][128]; /*[0][128] for Reg Index, [1][128] for Reg Value */ 179 unsigned char DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+0x62]; /* VGA_REGNUM_ABOUT_TV: VGA Reg, 0x62: TV Reg */ 180} TRIDENTRec, *TRIDENTPtr; 181 182typedef struct { 183 CARD8 mode; 184 int display_x; 185 int display_y; 186 int clock; 187 int shadow_0; 188 int shadow_3; 189 int shadow_4; 190 int shadow_5; 191 int shadow_6; 192 int shadow_7; 193 int shadow_10; 194 int shadow_11; 195 int shadow_16; 196 int shadow_HiOrd; 197} tridentLCD; 198 199#define LCD_ACTIVE 0x01 200#define CRT_ACTIVE 0x02 201 202extern tridentLCD LCD[]; 203 204typedef struct { 205 int x_res; 206 int y_res; 207 int mode; 208} biosMode; 209 210typedef struct { 211 int x_res; 212 int y_res; 213 CARD8 GR5a; 214 CARD8 GR5c; 215} newModes; 216 217/* Prototypes */ 218 219Bool TRIDENTClockSelect(ScrnInfoPtr pScrn, int no); 220Bool TRIDENTSwitchMode(int scrnIndex, DisplayModePtr mode, int flags); 221void TRIDENTAdjustFrame(int scrnIndex, int x, int y, int flags); 222Bool TRIDENTDGAInit(ScreenPtr pScreen); 223Bool TRIDENTI2CInit(ScreenPtr pScreen); 224void TRIDENTInitVideo(ScreenPtr pScreen); 225void TRIDENTResetVideo(ScrnInfoPtr pScrn); 226unsigned int Tridentddc1Read(ScrnInfoPtr pScrn); 227void TVGARestore(ScrnInfoPtr pScrn, TRIDENTRegPtr tridentReg); 228void TVGASave(ScrnInfoPtr pScrn, TRIDENTRegPtr tridentReg); 229Bool TVGAInit(ScrnInfoPtr pScrn, DisplayModePtr mode); 230void TridentRestore(ScrnInfoPtr pScrn, TRIDENTRegPtr tridentReg); 231void TridentSave(ScrnInfoPtr pScrn, TRIDENTRegPtr tridentReg); 232Bool TridentInit(ScrnInfoPtr pScrn, DisplayModePtr mode); 233Bool TridentAccelInit(ScreenPtr pScreen); 234Bool XPAccelInit(ScreenPtr pScreen); 235Bool XP4XaaInit(ScreenPtr pScreen); 236Bool XP4ExaInit(ScreenPtr pScreen); 237Bool ImageAccelInit(ScreenPtr pScreen); 238Bool BladeXaaInit(ScreenPtr pScreen); 239Bool BladeExaInit(ScreenPtr pScreen); 240Bool TridentHWCursorInit(ScreenPtr pScreen); 241int TridentFindMode(int xres, int yres, int depth); 242void TGUISetClock(ScrnInfoPtr pScrn, int clock, unsigned char *a, unsigned char *b); 243void TGUISetMCLK(ScrnInfoPtr pScrn, int clock, unsigned char *a, unsigned char *b); 244void tridentSetModeBIOS(ScrnInfoPtr pScrn, DisplayModePtr mode); 245void TridentOutIndReg(ScrnInfoPtr pScrn, 246 CARD32 reg, unsigned char mask, unsigned char data); 247unsigned char TridentInIndReg(ScrnInfoPtr pScrn, CARD32 reg); 248void TridentWriteAddress(ScrnInfoPtr pScrn, CARD32 index); 249void TridentReadAddress(ScrnInfoPtr pScrn, CARD32 index); 250void TridentWriteData(ScrnInfoPtr pScrn, unsigned char data); 251unsigned char TridentReadData(ScrnInfoPtr pScrn); 252void TridentLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies, LOCO *colors, VisualPtr pVisual); 253void TridentSetOverscan(ScrnInfoPtr pScrn, int overscan); 254int TGUISetRead(ScreenPtr pScreen, int bank); 255int TGUISetWrite(ScreenPtr pScreen, int bank); 256int TGUISetReadWrite(ScreenPtr pScreen, int bank); 257int TVGA8900SetRead(ScreenPtr pScreen, int bank); 258int TVGA8900SetWrite(ScreenPtr pScreen, int bank); 259int TVGA8900SetReadWrite(ScreenPtr pScreen, int bank); 260void TridentFindClock(ScrnInfoPtr pScrn, int clock); 261float CalculateMCLK(ScrnInfoPtr pScrn); 262void TRIDENTRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 263void TRIDENTShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf); 264void TRIDENTPointerMoved(int index, int x, int y); 265void TRIDENTRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 266void TRIDENTRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 267void TRIDENTRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 268void TRIDENTRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 269 270void VIA_TVInit(ScrnInfoPtr pScrn); 271void VIA_SaveTVDepentVGAReg(ScrnInfoPtr pScrn); 272void VIA_RestoreTVDependVGAReg(ScrnInfoPtr pScrn); 273void VIA_DumpReg(ScrnInfoPtr pScrn); 274 275/* 276 * Trident Chipset Definitions 277 */ 278 279/* Supported chipsets */ 280typedef enum { 281 TVGA8200LX, 282 TVGA8800BR, 283 TVGA8800CS, 284 TVGA8900B, 285 TVGA8900C, 286 TVGA8900CL, 287 TVGA8900D, 288 TVGA9000, 289 TVGA9000i, 290 TVGA9100B, 291 TVGA9200CXr, 292 TGUI9400CXi, 293 TGUI9420DGi, 294 TGUI9430DGi, 295 TGUI9440AGi, 296 CYBER9320, 297 TGUI9660, 298 TGUI9680, 299 PROVIDIA9682, 300 CYBER9382, 301 CYBER9385, 302 PROVIDIA9685, 303 CYBER9388, 304 CYBER9397, 305 CYBER9397DVD, 306 CYBER9520, 307 CYBER9525DVD, 308 IMAGE975, 309 IMAGE985, 310 BLADE3D, 311 CYBERBLADEI7, 312 CYBERBLADEI7D, 313 CYBERBLADEI1, 314 CYBERBLADEI1D, 315 CYBERBLADEAI1, 316 CYBERBLADEAI1D, 317 CYBERBLADEE4, 318 BLADEXP, 319 CYBERBLADEXPAI1, 320 CYBERBLADEXP4, 321 XP5 322} TRIDENTType; 323 324#define UseMMIO (pTrident->NoMMIO == FALSE) 325 326#define IsPciCard (pTrident->pEnt->location.type == BUS_PCI) 327 328#define IsPrimaryCard ((xf86IsPrimaryPci(pTrident->PciInfo)) || \ 329 (xf86IsPrimaryIsa())) 330 331#define HAS_DST_TRANS ((pTrident->Chipset == PROVIDIA9682) || \ 332 (pTrident->Chipset == PROVIDIA9685) || \ 333 (pTrident->Chipset == BLADEXP) || \ 334 (pTrident->Chipset == CYBERBLADEXPAI1)) 335 336#define Is3Dchip ((pTrident->Chipset == CYBER9397) || \ 337 (pTrident->Chipset == CYBER9397DVD) || \ 338 (pTrident->Chipset == CYBER9520) || \ 339 (pTrident->Chipset == CYBER9525DVD) || \ 340 (pTrident->Chipset == CYBERBLADEE4) || \ 341 (pTrident->Chipset == IMAGE975) || \ 342 (pTrident->Chipset == IMAGE985) || \ 343 (pTrident->Chipset == CYBERBLADEI7) || \ 344 (pTrident->Chipset == CYBERBLADEI7D) || \ 345 (pTrident->Chipset == CYBERBLADEI1) || \ 346 (pTrident->Chipset == CYBERBLADEI1D) || \ 347 (pTrident->Chipset == CYBERBLADEAI1) || \ 348 (pTrident->Chipset == CYBERBLADEAI1D) || \ 349 (pTrident->Chipset == BLADE3D) || \ 350 (pTrident->Chipset == CYBERBLADEXPAI1) || \ 351 (pTrident->Chipset == CYBERBLADEXP4) || \ 352 (pTrident->Chipset == XP5) || \ 353 (pTrident->Chipset == BLADEXP)) 354 355/* 356 * Trident DAC's 357 */ 358 359#define TKD8001 0 360#define TGUIDAC 1 361 362/* 363 * Video Flags 364 */ 365 366#define VID_ZOOM_INV 0x1 367#define VID_ZOOM_MINI 0x2 368#define VID_OFF_SHIFT_4 0x4 369#define VID_ZOOM_NOMINI 0x8 370#define VID_DOUBLE_LINEBUFFER_FOR_WIDE_SRC 0x10 371#endif /* _TRIDENT_H_ */ 372 373