via_driver.h revision ad01e365
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 VIA_DEBUG_COMPOSITE 1 30#define HAVE_DEBUG 1 31 32#ifdef HAVE_DEBUG 33#define DEBUG(x) x 34#else 35#define DEBUG(x) 36#endif 37 38#include "vgaHW.h" 39#include "xf86.h" 40 41#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 42#include "xf86Resources.h" 43#endif 44 45#include "xf86Pci.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#include "fb.h" 53 54#include "xf86Crtc.h" 55#include "xf86fbman.h" 56#include "xf86RandR12.h" 57#include "xf86cmap.h" 58 59#ifdef HAVE_DRI 60#define _XF86DRI_SERVER_ 61#include "xf86dri.h" 62#include "sarea.h" 63#include "dri.h" 64#include "drm_fourcc.h" 65#include "GL/glxint.h" 66#include "via_dri.h" 67#include "via_drmclient.h" 68#include "via_drm.h" 69#endif 70#include "exa.h" 71#include "via_memmgr.h" 72 73#include "via_regs.h" 74#include "via_kms.h" 75#include "via_ums.h" 76#include "via_dmabuffer.h" 77#include "via_3d.h" 78#include "via_xv.h" 79#include "via_xv_overlay.h" 80#include "via_eng_regs.h" 81 82#ifdef HAVE_PCIACCESS 83#include <pciaccess.h> 84#else 85#include "xf86PciInfo.h" 86#endif 87#include <errno.h> 88 89#include "via_vt1632.h" 90 91#include "compat-api.h" 92#define VIA_AGP_UPL_SIZE (1024*128) 93#define VIA_DMA_DL_SIZE (1024*128) 94#define VIA_SCRATCH_SIZE (4*1024*1024) 95 96/* 97 * Pixmap sizes below which we don't try to do hw accel. 98 */ 99 100#define VIA_MIN_COMPOSITE 400 101#define VIA_MIN_UPLOAD 4000 102#define VIA_MIN_TEX_UPLOAD 200 103#define VIA_MIN_DOWNLOAD 200 104 105#define AGP_PAGE_SIZE 4096 106#define AGP_PAGES 8192 107#define AGP_SIZE (AGP_PAGE_SIZE * AGP_PAGES) 108 109#define DRIVER_NAME "openchrome" 110#define VIA_VERSION ((VIA_MAJOR_VERSION << 24) | (VIA_MINOR_VERSION << 16) | VIA_PATCHLEVEL) 111 112#define VIA_VQ_SIZE (256 * 1024) 113 114#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 115#define VIA_RES_SHARED RES_SHARED_VGA 116#define VIA_RES_UNDEF RES_UNDEFINED 117#else 118#define VIA_RES_SHARED NULL 119#define VIA_RES_UNDEF NULL 120#endif 121 122/* Video Engines */ 123#define VIDEO_ENGINE_UNK 0 /* Unknown video engine */ 124#define VIDEO_ENGINE_CLE 1 /* CLE First generation video engine */ 125#define VIDEO_ENGINE_CME 2 /* CME Second generation video engine */ 126 127static int gVIAEntityIndex = -1; 128 129typedef struct { 130 CARD8 SR[256]; 131 CARD8 CR[256]; 132} VIARegRec, *VIARegPtr; 133 134/* 135 * variables that need to be shared among different screens. 136 */ 137typedef struct { 138 Bool b3DRegsInitialized; 139} ViaSharedRec, *ViaSharedPtr; 140 141enum dri_type { 142 DRI_NONE, 143 DRI_1, 144 DRI_2 145}; 146 147#ifdef HAVE_DRI 148 149#define VIA_XVMC_MAX_BUFFERS 2 150#define VIA_XVMC_MAX_CONTEXTS 4 151#define VIA_XVMC_MAX_SURFACES 20 152 153typedef struct { 154 struct buffer_object *memory_ref; 155 unsigned long offsets[VIA_XVMC_MAX_BUFFERS]; 156} ViaXvMCSurfacePriv; 157 158typedef struct { 159 drm_context_t drmCtx; 160} ViaXvMCContextPriv; 161 162typedef struct { 163 XID contexts[VIA_XVMC_MAX_CONTEXTS]; 164 XID surfaces[VIA_XVMC_MAX_SURFACES]; 165 ViaXvMCSurfacePriv *sPrivs[VIA_XVMC_MAX_SURFACES]; 166 ViaXvMCContextPriv *cPrivs[VIA_XVMC_MAX_CONTEXTS]; 167 int nContexts,nSurfaces; 168 drm_handle_t mmioBase,fbBase,sAreaBase; 169 unsigned sAreaSize; 170 drmAddress sAreaAddr; 171 unsigned activePorts; 172}ViaXvMC, *ViaXvMCPtr; 173 174#endif 175 176typedef struct _twodContext { 177 CARD32 mode; 178 CARD32 cmd; 179 CARD32 fgColor; 180 CARD32 bgColor; 181 CARD32 pattern0; 182 CARD32 pattern1; 183 CARD32 patternAddr; 184 CARD32 keyControl; 185 unsigned srcOffset; 186 unsigned srcPitch; 187 unsigned Bpp; 188 unsigned bytesPPShift; 189 Bool clipping; 190 Bool dashed; 191 int clipX1; 192 int clipX2; 193 int clipY1; 194 int clipY2; 195} ViaTwodContext; 196 197typedef struct _VIA { 198 VIARegRec SavedReg; 199 int Bpp, Bpl; 200 201 Bool KMS; 202 Bool FirstInit; 203 unsigned long videoRambytes; 204 int FBFreeStart; 205 int FBFreeEnd; 206 int driSize; 207 int maxDriSize; 208 struct buffer_object *vq_bo; 209 int VQStart; 210 int VQEnd; 211 212 /* These are physical addresses. */ 213 unsigned long FrameBufferBase; 214 unsigned long MmioBase; 215 216 /* These are linear addresses. */ 217 unsigned char* MapBase; 218 unsigned char* MpegMapBase; 219 unsigned char* BltBase; 220 unsigned char* MapBaseDense; 221 unsigned char* FBBase; 222 CARD8 MemClk; 223 224 /* Here are all the Options */ 225 Bool VQEnable; 226 Bool NoAccel; 227 Bool shadowFB; 228 Rotation rotate; 229 int agpMem; 230 231 CreateScreenResourcesProcPtr CreateScreenResources; 232 CloseScreenProcPtr CloseScreen; 233#ifdef HAVE_PCIACCESS 234 struct pci_device *PciInfo; 235#else 236 pciVideoPtr PciInfo; 237 PCITAG PciTag; 238#endif 239 int Chipset; 240 int ChipId; 241 int ChipRev; 242 int EntityIndex; 243 244 /* Support for shadowFB and rotation */ 245 unsigned char* ShadowPtr; 246 247 /* Support for EXA acceleration */ 248 ViaTwodContext td; 249 Via3DState v3d; 250 Via3DState *lastToUpload; 251 ViaCommandBuffer cb; 252 int accelMarker; 253 struct buffer_object *exa_sync_bo; 254 struct buffer_object *exaMem; 255 CARD32 markerOffset; 256 void *markerBuf; 257 CARD32 curMarker; 258 CARD32 lastMarkerRead; 259 Bool agpDMA; 260 Bool nPOT[VIA_NUM_TEXUNITS]; 261 const unsigned *HqvCmeRegs; 262 ExaDriverPtr exaDriverPtr; 263 ExaOffscreenArea *exa_scratch; 264 unsigned int exa_scratch_next; 265 Bool useEXA; 266 void *maskP; 267 CARD32 maskFormat; 268 Bool componentAlpha; 269 void *srcP; 270 CARD32 srcFormat; 271 unsigned scratchOffset; 272 int exaScratchSize; 273 char * scratchAddr; 274 Bool noComposite; 275 struct buffer_object *scratchBuffer; 276#ifdef HAVE_DRI 277 struct buffer_object *texAGPBuffer; 278 char * dBounce; 279#endif 280 281 /* Rotation */ 282 Bool RandRRotation; 283 284 /* BIOS Info Ptr */ 285 VIABIOSInfoPtr pBIOSInfo; 286 287 /* VIA Technologies NanoBook reference design. 288 Examples include Everex CloudBook and Sylvania g netbook. 289 It is also called FIC CE260 and CE261 by its ODM (Original 290 Design Manufacturer) name. */ 291 Bool isVIANanoBook; 292 293 /* OLPC XO-1.5 */ 294 Bool IsOLPCXO15; 295 296 /* I2C & DDC */ 297 I2CBusPtr pI2CBus1; 298 I2CBusPtr pI2CBus2; 299 I2CBusPtr pI2CBus3; 300 301 /* MHS */ 302 Bool IsSecondary; 303 Bool HasSecondary; 304 Bool SAMM; 305 306 drmmode_rec drmmode; 307 enum dri_type directRenderingType; 308#ifdef HAVE_DRI 309 Bool XvMCEnabled; 310 DRIInfoPtr pDRIInfo; 311 int numVisualConfigs; 312 __GLXvisualConfig* pVisualConfigs; 313 VIAConfigPrivPtr pVisualConfigsPriv; 314 drm_handle_t agpHandle; 315 drm_handle_t registerHandle; 316 drm_handle_t frameBufferHandle; 317 unsigned long agpAddr; 318 drmAddress agpMappedAddr; 319 unsigned int agpSize; 320 Bool IsPCI; 321 ViaXvMC xvmc; 322 int drmVerMajor; 323 int drmVerMinor; 324 int drmVerPL; 325 struct buffer_object *driOffScreenMem; 326 void * driOffScreenSave; 327#endif 328 Bool DRIIrqEnable; 329 Bool agpEnable; 330 Bool dma2d; 331 Bool dmaXV; 332 333 /* Video */ 334 int VideoEngine; 335 swovRec swov; 336 CARD32 VideoStatus; 337 VIAHWDiff HWDiff; 338 unsigned long dwV1, dwV3; 339 unsigned long dwFrameNum; 340 341 CARD32* VidRegBuffer; /* Temporary buffer for video overlay registers. */ 342 unsigned long VidRegCursor; /* Write cursor for VidRegBuffer. */ 343 344 unsigned long old_dwUseExtendedFIFO; 345 346 ViaSharedPtr sharedData; 347 Bool useDmaBlit; 348 349 void *displayMap; 350 CARD32 displayOffset; 351 352 CARD8 I2CDevices; /* Option */ 353 354#ifdef HAVE_DEBUG 355 Bool disableXvBWCheck; 356 Bool DumpVGAROM; 357 Bool PrintVGARegs; 358 Bool PrintTVRegs; 359 Bool I2CScan; 360#endif /* HAVE_DEBUG */ 361 362 video_via_regs* VideoRegs; 363 364 /* Keeping track of the number of analog VGA connectors. */ 365 unsigned int numberVGA; 366 367 /* Keeping track of the number of DVI connectors. */ 368 unsigned int numberDVI; 369 370 /* Keeping track of the number of FP (Flat Panel) connectors. */ 371 unsigned int numberFP; 372 373 /* Shadow copy of CR3B through CR3F. */ 374 CARD8 originalCR3B, originalCR3C, originalCR3D, 375 originalCR3E, originalCR3F; 376} VIARec, *VIAPtr; 377 378#define VIAPTR(p) ((VIAPtr)((p)->driverPrivate)) 379 380typedef struct 381{ 382 Bool IsDRIEnabled; 383 384 Bool HasSecondary; 385 Bool BypassSecondary; 386 /*These two registers are used to make sure the CRTC2 is 387 restored before CRTC_EXT, otherwise it could lead to blank screen.*/ 388 Bool IsSecondaryRestored; 389 Bool RestorePrimary; 390 391 ScrnInfoPtr pSecondaryScrn; 392 ScrnInfoPtr pPrimaryScrn; 393} VIAEntRec, *VIAEntPtr; 394 395 396/* In via_display.c. */ 397extern const xf86CrtcFuncsRec iga1_crtc_funcs; 398extern const xf86CrtcFuncsRec iga2_crtc_funcs; 399 400/* In via_exa.c. */ 401Bool viaInitExa(ScreenPtr pScreen); 402Bool viaAccelSetMode(int bpp, ViaTwodContext * tdc); 403void viaAccelSync(ScrnInfoPtr); 404void viaExitAccel(ScreenPtr); 405void viaFinishInitAccel(ScreenPtr); 406Bool viaOrder(CARD32 val, CARD32 * shift); 407CARD32 viaBitExpandHelper(CARD32 pixel, CARD32 bits); 408Bool viaCheckUpload(ScrnInfoPtr pScrn, Via3DState * v3d); 409void viaPixelARGB8888(unsigned format, void *pixelP, CARD32 * argb8888); 410Bool viaExpandablePixel(int format); 411void viaAccelFillPixmap(ScrnInfoPtr, unsigned long, unsigned long, 412 int, int, int, int, int, unsigned long); 413void viaAccelTextureBlit(ScrnInfoPtr, unsigned long, unsigned, unsigned, 414 unsigned, unsigned, unsigned, unsigned, 415 unsigned long, unsigned, unsigned, 416 unsigned, unsigned, int); 417#ifdef VIA_DEBUG_COMPOSITE 418void viaExaCompositePictDesc(PicturePtr pict, char *string, int n); 419void viaExaPrintCompositeInfo(char *info, CARD8 op, PicturePtr pSrc, PicturePtr pMask, 420 PicturePtr pDst); 421#endif 422 423/* In via_exa_h2.c */ 424Bool viaExaPrepareSolid_H2(PixmapPtr pPixmap, int alu, Pixel planeMask, 425 Pixel fg); 426void viaExaSolid_H2(PixmapPtr pPixmap, int x1, int y1, int x2, int y2); 427void viaExaDoneSolidCopy_H2(PixmapPtr pPixmap); 428Bool viaExaPrepareCopy_H2(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, 429 int xdir, int ydir, int alu, Pixel planeMask); 430void viaExaCopy_H2(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, 431 int dstY, int width, int height); 432Bool viaExaCheckComposite_H2(int op, PicturePtr pSrcPicture, 433 PicturePtr pMaskPicture, PicturePtr pDstPicture); 434Bool viaExaPrepareComposite_H2(int op, PicturePtr pSrcPicture, 435 PicturePtr pMaskPicture, PicturePtr pDstPicture, 436 PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst); 437void viaExaComposite_H2(PixmapPtr pDst, int srcX, int srcY, 438 int maskX, int maskY, int dstX, int dstY, 439 int width, int height); 440int viaAccelMarkSync_H2(ScreenPtr); 441 442/* In via_exa_h6.c */ 443Bool viaExaPrepareSolid_H6(PixmapPtr pPixmap, int alu, Pixel planeMask, 444 Pixel fg); 445void viaExaSolid_H6(PixmapPtr pPixmap, int x1, int y1, int x2, int y2); 446void viaExaDoneSolidCopy_H6(PixmapPtr pPixmap); 447Bool viaExaPrepareCopy_H6(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, 448 int xdir, int ydir, int alu, Pixel planeMask); 449void viaExaCopy_H6(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, 450 int dstY, int width, int height); 451Bool viaExaCheckComposite_H6(int op, PicturePtr pSrcPicture, 452 PicturePtr pMaskPicture, PicturePtr pDstPicture); 453Bool viaExaPrepareComposite_H6(int op, PicturePtr pSrcPicture, 454 PicturePtr pMaskPicture, PicturePtr pDstPicture, 455 PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst); 456void viaExaComposite_H6(PixmapPtr pDst, int srcX, int srcY, 457 int maskX, int maskY, int dstX, int dstY, 458 int width, int height); 459int viaAccelMarkSync_H6(ScreenPtr); 460 461/* In via_xv.c */ 462void viaInitVideo(ScreenPtr pScreen); 463void viaExitVideo(ScrnInfoPtr pScrn); 464void viaSaveVideo(ScrnInfoPtr pScrn); 465void viaRestoreVideo(ScrnInfoPtr pScrn); 466void viaSetColorSpace(VIAPtr pVia, int hue, int saturation, int brightness, int contrast, 467 Bool reset); 468 469 470/* In via_xv.c */ 471void viaInitVideo(ScreenPtr pScreen); 472void viaExitVideo(ScrnInfoPtr pScrn); 473void viaSaveVideo(ScrnInfoPtr pScrn); 474void viaRestoreVideo(ScrnInfoPtr pScrn); 475void viaSetColorSpace(VIAPtr pVia, int hue, int saturation, int brightness, int contrast, 476 Bool reset); 477void VIAVidAdjustFrame(ScrnInfoPtr pScrn, int x, int y); 478 479/* In via_memcpy.c */ 480typedef void (*vidCopyFunc)(unsigned char *, const unsigned char *, 481 int, int, int, int); 482extern vidCopyFunc viaVidCopyInit( char *copyType, ScreenPtr pScreen ); 483 484/* In via_xwmc.c */ 485 486#ifdef HAVE_DRI 487/* Basic init and exit functions */ 488void ViaInitXVMC(ScreenPtr pScreen); 489void ViaCleanupXVMC(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr *XvAdaptors, int XvAdaptorCount); 490int viaXvMCInitXv(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr XvAdapt); 491 492/* Returns the size of the fake Xv Image used as XvMC command buffer to the X server*/ 493unsigned long viaXvMCPutImageSize(ScrnInfoPtr pScrn); 494#endif 495 496/* via_i2c.c */ 497void ViaI2CInit(ScrnInfoPtr pScrn); 498Bool xf86I2CMaskByte(I2CDevPtr d, I2CByte subaddr, 499 I2CByte value, I2CByte mask); 500 501#ifdef HAVE_DRI 502Bool VIADRI1ScreenInit(ScreenPtr pScreen); 503void VIADRICloseScreen(ScreenPtr pScreen); 504Bool VIADRIFinishScreenInit(ScreenPtr pScreen); 505void VIADRIRingBufferCleanup(ScrnInfoPtr pScrn); 506Bool VIADRIRingBufferInit(ScrnInfoPtr pScrn); 507void viaDRIOffscreenRestore(ScrnInfoPtr pScrn); 508void viaDRIOffscreenSave(ScrnInfoPtr pScrn); 509Bool VIADRIBufferInit(ScrnInfoPtr pScrn); 510 511#endif /* HAVE_DRI */ 512 513int viaOffScreenLinear(struct buffer_object *obj, ScrnInfoPtr pScrn, unsigned long size); 514void viaShowCursor(ScrnInfoPtr pScrn); 515void viaHideCursor(ScrnInfoPtr pScrn); 516Bool viaHWCursorInit(ScreenPtr pScreen); 517void ViaDisplaySetStreamOnCRT(ScrnInfoPtr pScrn, Bool primary); 518void ViaDisplaySetStreamOnDFP(ScrnInfoPtr pScrn, Bool primary); 519 520#endif /* _VIA_DRIVER_H_ */ 521