via_driver.h revision 7e6fb56f
1/* 2 * Copyright 2004-2005 The Unichrome Project [unichrome.sf.net] 3 * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. 4 * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sub license, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial portions 15 * of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 * DEALINGS IN THE SOFTWARE. 24 */ 25 26#ifndef _VIA_DRIVER_H_ 27#define _VIA_DRIVER_H_ 1 28 29#define HAVE_DEBUG 1 30 31#ifdef HAVE_DEBUG 32#define DEBUG(x) x 33#else 34#define DEBUG(x) 35#endif 36 37#include "vgaHW.h" 38#include "xf86.h" 39 40#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 41#include "xf86Resources.h" 42#endif 43 44#include "xf86Pci.h" 45#include "xf86PciInfo.h" 46#include "xf86_OSproc.h" 47#include "compiler.h" 48#include "xf86Cursor.h" 49#include "mipointer.h" 50#include "micmap.h" 51#include "fourcc.h" 52 53#define USE_FB 54#ifdef USE_FB 55#include "fb.h" 56#else 57#include "cfb.h" 58#include "cfb16.h" 59#include "cfb32.h" 60#endif 61 62#include "xf86cmap.h" 63#include "vbe.h" 64#include "xaa.h" 65 66#include "via_regs.h" 67#include "via_bios.h" 68#include "via_priv.h" 69#include "via_swov.h" 70#include "via_dmabuffer.h" 71#include "via_3d.h" 72#include "via_video.h" 73 74#ifdef XSERVER_LIBPCIACCESS 75#include <pciaccess.h> 76#endif 77 78#ifdef XF86DRI 79#define _XF86DRI_SERVER_ 80#include "sarea.h" 81#include "dri.h" 82#include "GL/glxint.h" 83#include "via_dri.h" 84#endif 85 86#include "exa.h" 87#define VIA_AGP_UPL_SIZE (1024*128) 88#define VIA_DMA_DL_SIZE (1024*128) 89#define VIA_SCRATCH_SIZE (4*1024*1024) 90 91/* 92 * Pixmap sizes below which we don't try to do hw accel. 93 */ 94 95#define VIA_MIN_COMPOSITE 400 96#define VIA_MIN_UPLOAD 4000 97#define VIA_MIN_TEX_UPLOAD 200 98#define VIA_MIN_DOWNLOAD 200 99 100#define AGP_PAGE_SIZE 4096 101#define AGP_PAGES 8192 102#define AGP_SIZE (AGP_PAGE_SIZE * AGP_PAGES) 103 104#define DRIVER_NAME "openchrome" 105#define VERSION_MAJOR 0 106#define VERSION_MINOR 2 107#define PATCHLEVEL 904 108#define VIA_VERSION ((VERSION_MAJOR<<24) | (VERSION_MINOR<<16) | PATCHLEVEL) 109 110#define VIA_VQ_SIZE (256 * 1024) 111 112#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 113#define VIA_RES_SHARED RES_SHARED_VGA 114#define VIA_RES_UNDEF RES_UNDEFINED 115#else 116#define VIA_RES_SHARED NULL 117#define VIA_RES_UNDEF NULL 118#endif 119 120typedef struct { 121 CARD8 SR08, SR0A, SR0F; 122 123 /* extended Sequencer registers */ 124 CARD8 SR10, SR11, SR12, SR13,SR14,SR15,SR16; 125 CARD8 SR17, SR18, SR19, SR1A,SR1B,SR1C,SR1D,SR1E; 126 CARD8 SR1F, SR20, SR21, SR22,SR23,SR24,SR25,SR26; 127 CARD8 SR27, SR28, SR29, SR2A,SR2B,SR2C,SR2D,SR2E; 128 CARD8 SR2F, SR30, SR31, SR32,SR33,SR34,SR40,SR41; 129 CARD8 SR42, SR43, SR44, SR45,SR46,SR47,SR48,SR49; 130 CARD8 SR4A, SR4B, SR4C; 131 132 /* extended CRTC registers */ 133 CARD8 CR13, CR30, CR31, CR32, CR33, CR34, CR35, CR36; 134 CARD8 CR37, CR38, CR39, CR3A, CR40, CR41, CR42, CR43; 135 CARD8 CR44, CR45, CR46, CR47, CR48, CR49, CR4A; 136 CARD8 CR97, CR99, CR9B, CR9F, CRA0, CRA1, CRA2; 137 CARD8 CRTCRegs[68]; 138/* CARD8 LCDRegs[0x40];*/ 139 140 /* TMDS/LVDS Control */ 141 CARD8 CRD2; 142} VIARegRec, *VIARegPtr; 143 144/* 145 * varables that need to be shared among different screens. 146 */ 147typedef struct { 148 Bool b3DRegsInitialized; 149} ViaSharedRec, *ViaSharedPtr; 150 151#ifdef XF86DRI 152 153#define VIA_XVMC_MAX_BUFFERS 2 154#define VIA_XVMC_MAX_CONTEXTS 4 155#define VIA_XVMC_MAX_SURFACES 20 156 157 158typedef struct { 159 VIAMem memory_ref; 160 unsigned long offsets[VIA_XVMC_MAX_BUFFERS]; 161} ViaXvMCSurfacePriv; 162 163typedef struct { 164 drm_context_t drmCtx; 165} ViaXvMCContextPriv; 166 167typedef struct { 168 XID contexts[VIA_XVMC_MAX_CONTEXTS]; 169 XID surfaces[VIA_XVMC_MAX_SURFACES]; 170 ViaXvMCSurfacePriv *sPrivs[VIA_XVMC_MAX_SURFACES]; 171 ViaXvMCContextPriv *cPrivs[VIA_XVMC_MAX_CONTEXTS]; 172 int nContexts,nSurfaces; 173 drm_handle_t mmioBase,fbBase,sAreaBase; 174 unsigned sAreaSize; 175 drmAddress sAreaAddr; 176 unsigned activePorts; 177}ViaXvMC, *ViaXvMCPtr; 178 179#endif 180 181typedef struct _twodContext { 182 CARD32 mode; 183 CARD32 cmd; 184 CARD32 fgColor; 185 CARD32 bgColor; 186 CARD32 pattern0; 187 CARD32 pattern1; 188 CARD32 patternAddr; 189 CARD32 keyControl; 190 unsigned srcOffset; 191 unsigned srcPitch; 192 unsigned Bpp; 193 unsigned bytesPPShift; 194 Bool clipping; 195 Bool dashed; 196 int clipX1; 197 int clipX2; 198 int clipY1; 199 int clipY2; 200} ViaTwodContext; 201 202typedef struct{ 203 /* textMode */ 204 CARD8 *state, *pstate; /* SVGA state */ 205 int statePage, stateSize, stateMode; 206 207 /* vbe version */ 208 int major, minor; 209} ViaVbeModeInfo; 210 211typedef struct _VIA { 212 VIARegRec SavedReg; 213 xf86CursorInfoPtr CursorInfoRec; 214 int Bpp, Bpl; 215 216 Bool FirstInit; 217 unsigned long videoRambytes; 218 int videoRamKbytes; 219 int FBFreeStart; 220 int FBFreeEnd; 221 int driSize; 222 int maxDriSize; 223 int VQStart; 224 int VQEnd; 225 226 /* These are physical addresses. */ 227 unsigned long FrameBufferBase; 228 unsigned long MmioBase; 229 230 /* These are linear addresses. */ 231 unsigned char* MapBase; 232 unsigned char* VidMapBase; 233 unsigned char* MpegMapBase; 234 unsigned char* BltBase; 235 unsigned char* MapBaseDense; 236 unsigned char* FBBase; 237 CARD8 MemClk; 238 239 /* Here are all the Options */ 240 Bool VQEnable; 241 Bool hwcursor; 242 Bool NoAccel; 243 Bool shadowFB; 244 Rotation rotate; 245 Bool vbeSR; 246 int agpMem; 247 248 CloseScreenProcPtr CloseScreen; 249#ifdef XSERVER_LIBPCIACCESS 250 struct pci_device *PciInfo; 251 int mmio_bar; 252 int fb_bar; 253 PCITAG PciTag; 254#else 255 pciVideoPtr PciInfo; 256 PCITAG PciTag; 257#endif 258 int Chipset; 259 int ChipId; 260 int ChipRev; 261 int EntityIndex; 262 263 /* vbe */ 264 vbeInfoPtr pVbe; 265 ViaVbeModeInfo vbeMode; 266 Bool useVBEModes; 267 Bool useLegacyVBE; 268 269 /* Support for shadowFB and rotation */ 270 unsigned char* ShadowPtr; 271 int ShadowPitch; 272 void (*PointerMoved)(int index, int x, int y); 273 274 /* Support for XAA acceleration */ 275 XAAInfoRecPtr AccelInfoRec; 276 ViaTwodContext td; 277 Via3DState v3d; 278 Via3DState *lastToUpload; 279 ViaCommandBuffer cb; 280 int accelMarker; 281 CARD32 markerOffset; 282 CARD32 *markerBuf; 283 CARD32 curMarker; 284 CARD32 lastMarkerRead; 285 Bool agpDMA; 286 Bool nPOT[VIA_NUM_TEXUNITS]; 287 const unsigned *TwodRegs; 288 ExaDriverPtr exaDriverPtr; 289 ExaOffscreenArea *exa_scratch; 290 unsigned int exa_scratch_next; 291 Bool useEXA; 292 void *maskP; 293 CARD32 maskFormat; 294 Bool componentAlpha; 295 void *srcP; 296 CARD32 srcFormat; 297 ExaOffscreenArea *scratchFBBuffer; 298 unsigned scratchOffset; 299 int exaScratchSize; 300 char * scratchAddr; 301 Bool noComposite; 302#ifdef XF86DRI 303 drm_via_mem_t scratchAGPBuffer; 304 drm_via_mem_t texAGPBuffer; 305 unsigned texOffset; 306 char * texAddr; 307 char * dBounce; 308#endif 309 310 /* Rotation */ 311 Bool RandRRotation; 312 313 /* BIOS Info Ptr */ 314 VIABIOSInfoPtr pBIOSInfo; 315 struct ViaCardIdStruct* Id; 316 317 /* Support for DGA */ 318 int numDGAModes; 319 DGAModePtr DGAModes; 320 Bool DGAactive; 321 int DGAViewportStatus; 322 int DGAOldDisplayWidth; 323 int DGAOldBitsPerPixel; 324 int DGAOldDepth; 325 326 /* I2C & DDC */ 327 I2CBusPtr pI2CBus1; 328 I2CBusPtr pI2CBus2; 329 I2CBusPtr pI2CBus3; 330 xf86MonPtr DDC1; 331 xf86MonPtr DDC2; 332 333 /* MHS */ 334 Bool IsSecondary; 335 Bool HasSecondary; 336 Bool SAMM; 337 338#ifdef XF86DRI 339 Bool directRenderingEnabled; 340 Bool XvMCEnabled; 341 DRIInfoPtr pDRIInfo; 342 int drmFD; 343 int numVisualConfigs; 344 __GLXvisualConfig* pVisualConfigs; 345 VIAConfigPrivPtr pVisualConfigsPriv; 346 drm_handle_t agpHandle; 347 drm_handle_t registerHandle; 348 drm_handle_t frameBufferHandle; 349 unsigned long agpAddr; 350 drmAddress agpMappedAddr; 351 unsigned char *agpBase; 352 unsigned int agpSize; 353 Bool IsPCI; 354 ViaXvMC xvmc; 355 int drmVerMajor; 356 int drmVerMinor; 357 int drmVerPL; 358 VIAMem driOffScreenMem; 359 void * driOffScreenSave; 360#endif 361 Bool DRIIrqEnable; 362 Bool agpEnable; 363 Bool dma2d; 364 Bool dmaXV; 365 366 CARD8 ActiveDevice; /* Option */ 367 368 unsigned char *CursorImage; 369 CARD32 CursorFG; 370 CARD32 CursorBG; 371 Bool CursorARGB; 372 Bool CursorARGBSupported; 373 CARD8 CursorPipe; 374 int CursorStart; 375 int CursorMaxWidth; 376 int CursorMaxHeight; 377 int CursorSize; 378 379 CARD32 CursorRegControl; 380 CARD32 CursorRegBase; 381 CARD32 CursorRegPos; 382 CARD32 CursorRegOffset; 383 CARD32 CursorRegFifo; 384 CARD32 CursorRegTransKey; 385 386 CARD32 CursorControl0; 387 CARD32 CursorControl1; 388 CARD32 CursorFifo; 389 CARD32 CursorTransparentKey; 390 CARD32 CursorPrimHiInvtColor; 391 CARD32 CursorV327HiInvtColor; 392 393 /* Video */ 394 int VideoEngine; 395 swovRec swov; 396 CARD32 VideoStatus; 397 VIAHWDiff HWDiff; 398 unsigned long dwV1, dwV3; 399 unsigned long OverlaySupported; 400 unsigned long dwFrameNum; 401 402 CARD32* VidRegBuffer; /* Temporary buffer for video overlay registers. */ 403 unsigned long VidRegCursor; /* Write cursor for VidRegBuffer. */ 404 405 unsigned long old_dwUseExtendedFIFO; 406 407 ViaSharedPtr sharedData; 408 Bool useDmaBlit; 409 410 void *displayMap; 411 CARD32 displayOffset; 412 void *cursorMap; 413 CARD32 cursorOffset; 414 415#ifdef HAVE_DEBUG 416 Bool disableXvBWCheck; 417 Bool DumpVGAROM; 418 Bool PrintVGARegs; 419 Bool PrintTVRegs; 420 Bool I2CScan; 421 422 Bool UseLegacyModeSwitch ; 423 video_via_regs* VideoRegs ; 424#endif /* HAVE_DEBUG */ 425} VIARec, *VIAPtr; 426 427#define VIAPTR(p) ((VIAPtr)((p)->driverPrivate)) 428 429typedef struct 430{ 431 Bool IsDRIEnabled; 432 433 Bool HasSecondary; 434 Bool BypassSecondary; 435 /*These two registers are used to make sure the CRTC2 is 436 retored before CRTC_EXT, otherwise it could lead to blank screen.*/ 437 Bool IsSecondaryRestored; 438 Bool RestorePrimary; 439 440 ScrnInfoPtr pSecondaryScrn; 441 ScrnInfoPtr pPrimaryScrn; 442} VIAEntRec, *VIAEntPtr; 443 444/* Prototypes. */ 445void VIAInitialize3DEngine(ScrnInfoPtr pScrn); 446 447/* In via_cursor.c. */ 448Bool viaCursorHWInit(ScreenPtr pScreen); 449void viaCursorShow(ScrnInfoPtr); 450void viaCursorHide(ScrnInfoPtr); 451void viaCursorStore(ScrnInfoPtr pScrn); 452void viaCursorRestore(ScrnInfoPtr pScrn); 453Bool viaCursorRecInit(ScrnInfoPtr pScrn); 454void viaCursorRecDestroy(ScrnInfoPtr pScrn); 455void viaCursorSetFB(ScrnInfoPtr pScrn); 456 457/* In via_accel.c. */ 458Bool viaInitAccel(ScreenPtr); 459void viaInitialize2DEngine(ScrnInfoPtr); 460void viaAccelSync(ScrnInfoPtr); 461void viaDisableVQ(ScrnInfoPtr); 462void viaExitAccel(ScreenPtr); 463void viaAccelBlitRect(ScrnInfoPtr, int, int, int, int, int, int); 464void viaAccelFillRect(ScrnInfoPtr, int, int, int, int, unsigned long); 465void viaAccelSyncMarker(ScrnInfoPtr); 466void viaFinishInitAccel(ScreenPtr); 467void viaAccelWaitMarker(ScreenPtr, int); 468int viaAccelMarkSync(ScreenPtr); 469void viaAccelFillPixmap(ScrnInfoPtr, unsigned long, unsigned long, 470 int, int, int, int, int, unsigned long); 471void viaAccelTextureBlit(ScrnInfoPtr, unsigned long, unsigned, unsigned, 472 unsigned, unsigned, unsigned, unsigned, 473 unsigned long, unsigned, unsigned, 474 unsigned, unsigned, int); 475 476 477 478/* In via_shadow.c */ 479void ViaShadowFBInit(ScrnInfoPtr pScrn, ScreenPtr pScreen); 480 481/* In via_dga.c */ 482Bool VIADGAInit(ScreenPtr); 483 484/*In via_video.c*/ 485void viaInitVideo(ScreenPtr pScreen); 486void viaExitVideo(ScrnInfoPtr pScrn); 487void viaSaveVideo(ScrnInfoPtr pScrn); 488void viaRestoreVideo(ScrnInfoPtr pScrn); 489void viaSetColorSpace(VIAPtr pVia, int hue, int saturation, int brightness, int contrast, 490 Bool reset); 491void VIAVidAdjustFrame(ScrnInfoPtr pScrn, int x, int y); 492 493/* In via_memory.c */ 494void VIAFreeLinear(VIAMemPtr); 495int VIAAllocLinear(VIAMemPtr, ScrnInfoPtr, unsigned long); 496int viaOffscreenLinear(VIAMemPtr, ScrnInfoPtr, unsigned long); 497void VIAInitLinear(ScreenPtr pScreen); 498 499/* In via_xwmc.c */ 500 501#ifdef XF86DRI 502/* Basic init and exit functions */ 503void ViaInitXVMC(ScreenPtr pScreen); 504void ViaCleanupXVMC(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr *XvAdaptors, int XvAdaptorCount); 505int viaXvMCInitXv(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr XvAdapt); 506 507/* Returns the size of the fake Xv Image used as XvMC command buffer to the X server*/ 508unsigned long viaXvMCPutImageSize(ScrnInfoPtr pScrn); 509 510 511 512#endif 513 514/* via_i2c.c */ 515void ViaI2CInit(ScrnInfoPtr pScrn); 516 517#ifdef XF86DRI 518Bool VIADRIScreenInit(ScreenPtr pScreen); 519void VIADRICloseScreen(ScreenPtr pScreen); 520Bool VIADRIFinishScreenInit(ScreenPtr pScreen); 521void VIADRIRingBufferCleanup(ScrnInfoPtr pScrn); 522Bool VIADRIRingBufferInit(ScrnInfoPtr pScrn); 523void viaDRIOffscreenRestore(ScrnInfoPtr pScrn); 524void viaDRIOffscreenSave(ScrnInfoPtr pScrn); 525 526#endif /* XF86DRI */ 527 528#endif /* _VIA_DRIVER_H_ */ 529