Home | History | Annotate | Line # | Download | only in src
      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 
    127 static int gVIAEntityIndex = -1;
    128 
    129 typedef 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  */
    137 typedef struct {
    138     Bool b3DRegsInitialized;
    139 } ViaSharedRec, *ViaSharedPtr;
    140 
    141 enum 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 
    153 typedef struct {
    154     struct buffer_object *memory_ref;
    155     unsigned long offsets[VIA_XVMC_MAX_BUFFERS];
    156 } ViaXvMCSurfacePriv;
    157 
    158 typedef struct {
    159     drm_context_t drmCtx;
    160 } ViaXvMCContextPriv;
    161 
    162 typedef 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 
    176 typedef 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 
    197 typedef 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 
    380 typedef 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. */
    397 extern const xf86CrtcFuncsRec iga1_crtc_funcs;
    398 extern const xf86CrtcFuncsRec iga2_crtc_funcs;
    399 
    400 /* In via_exa.c. */
    401 Bool viaInitExa(ScreenPtr pScreen);
    402 Bool viaAccelSetMode(int bpp, ViaTwodContext * tdc);
    403 void viaAccelSync(ScrnInfoPtr);
    404 void viaExitAccel(ScreenPtr);
    405 void viaFinishInitAccel(ScreenPtr);
    406 Bool viaOrder(CARD32 val, CARD32 * shift);
    407 CARD32 viaBitExpandHelper(CARD32 pixel, CARD32 bits);
    408 Bool viaCheckUpload(ScrnInfoPtr pScrn, Via3DState * v3d);
    409 void viaPixelARGB8888(unsigned format, void *pixelP, CARD32 * argb8888);
    410 Bool viaExpandablePixel(int format);
    411 void viaAccelFillPixmap(ScrnInfoPtr, unsigned long, unsigned long,
    412 			int, int, int, int, int, unsigned long);
    413 void 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
    418 void viaExaCompositePictDesc(PicturePtr pict, char *string, int n);
    419 void viaExaPrintCompositeInfo(char *info, CARD8 op, PicturePtr pSrc, PicturePtr pMask,
    420                             PicturePtr pDst);
    421 #endif
    422 
    423 /* In via_exa_h2.c */
    424 Bool viaExaPrepareSolid_H2(PixmapPtr pPixmap, int alu, Pixel planeMask,
    425                         Pixel fg);
    426 void viaExaSolid_H2(PixmapPtr pPixmap, int x1, int y1, int x2, int y2);
    427 void viaExaDoneSolidCopy_H2(PixmapPtr pPixmap);
    428 Bool viaExaPrepareCopy_H2(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap,
    429                             int xdir, int ydir, int alu, Pixel planeMask);
    430 void viaExaCopy_H2(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX,
    431                     int dstY, int width, int height);
    432 Bool viaExaCheckComposite_H2(int op, PicturePtr pSrcPicture,
    433                             PicturePtr pMaskPicture, PicturePtr pDstPicture);
    434 Bool viaExaPrepareComposite_H2(int op, PicturePtr pSrcPicture,
    435                             PicturePtr pMaskPicture, PicturePtr pDstPicture,
    436                             PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst);
    437 void viaExaComposite_H2(PixmapPtr pDst, int srcX, int srcY,
    438                         int maskX, int maskY, int dstX, int dstY,
    439                         int width, int height);
    440 int viaAccelMarkSync_H2(ScreenPtr);
    441 
    442 /* In via_exa_h6.c */
    443 Bool viaExaPrepareSolid_H6(PixmapPtr pPixmap, int alu, Pixel planeMask,
    444                         Pixel fg);
    445 void viaExaSolid_H6(PixmapPtr pPixmap, int x1, int y1, int x2, int y2);
    446 void viaExaDoneSolidCopy_H6(PixmapPtr pPixmap);
    447 Bool viaExaPrepareCopy_H6(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap,
    448                             int xdir, int ydir, int alu, Pixel planeMask);
    449 void viaExaCopy_H6(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX,
    450                     int dstY, int width, int height);
    451 Bool viaExaCheckComposite_H6(int op, PicturePtr pSrcPicture,
    452                             PicturePtr pMaskPicture, PicturePtr pDstPicture);
    453 Bool viaExaPrepareComposite_H6(int op, PicturePtr pSrcPicture,
    454                             PicturePtr pMaskPicture, PicturePtr pDstPicture,
    455                             PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst);
    456 void viaExaComposite_H6(PixmapPtr pDst, int srcX, int srcY,
    457                         int maskX, int maskY, int dstX, int dstY,
    458                         int width, int height);
    459 int viaAccelMarkSync_H6(ScreenPtr);
    460 
    461 /* In via_xv.c */
    462 void viaInitVideo(ScreenPtr pScreen);
    463 void viaExitVideo(ScrnInfoPtr pScrn);
    464 void viaSaveVideo(ScrnInfoPtr pScrn);
    465 void viaRestoreVideo(ScrnInfoPtr pScrn);
    466 void viaSetColorSpace(VIAPtr pVia, int hue, int saturation, int brightness, int contrast,
    467 		      Bool reset);
    468 
    469 
    470 /* In via_xv.c */
    471 void viaInitVideo(ScreenPtr pScreen);
    472 void viaExitVideo(ScrnInfoPtr pScrn);
    473 void viaSaveVideo(ScrnInfoPtr pScrn);
    474 void viaRestoreVideo(ScrnInfoPtr pScrn);
    475 void viaSetColorSpace(VIAPtr pVia, int hue, int saturation, int brightness, int contrast,
    476 		      Bool reset);
    477 void VIAVidAdjustFrame(ScrnInfoPtr pScrn, int x, int y);
    478 
    479 /* In via_memcpy.c */
    480 typedef void (*vidCopyFunc)(unsigned char *, const unsigned char *,
    481                             int, int, int, int);
    482 extern vidCopyFunc viaVidCopyInit( char *copyType, ScreenPtr pScreen );
    483 
    484 /* In via_xwmc.c */
    485 
    486 #ifdef HAVE_DRI
    487 /* Basic init and exit functions */
    488 void ViaInitXVMC(ScreenPtr pScreen);
    489 void ViaCleanupXVMC(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr *XvAdaptors, int XvAdaptorCount);
    490 int viaXvMCInitXv(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr XvAdapt);
    491 
    492 /* Returns the size of the fake Xv Image used as XvMC command buffer to the X server*/
    493 unsigned long viaXvMCPutImageSize(ScrnInfoPtr pScrn);
    494 #endif
    495 
    496 /* via_i2c.c */
    497 void ViaI2CInit(ScrnInfoPtr pScrn);
    498 Bool xf86I2CMaskByte(I2CDevPtr d, I2CByte subaddr,
    499                         I2CByte value, I2CByte mask);
    500 
    501 #ifdef HAVE_DRI
    502 Bool VIADRI1ScreenInit(ScreenPtr pScreen);
    503 void VIADRICloseScreen(ScreenPtr pScreen);
    504 Bool VIADRIFinishScreenInit(ScreenPtr pScreen);
    505 void VIADRIRingBufferCleanup(ScrnInfoPtr pScrn);
    506 Bool VIADRIRingBufferInit(ScrnInfoPtr pScrn);
    507 void viaDRIOffscreenRestore(ScrnInfoPtr pScrn);
    508 void viaDRIOffscreenSave(ScrnInfoPtr pScrn);
    509 Bool VIADRIBufferInit(ScrnInfoPtr pScrn);
    510 
    511 #endif /* HAVE_DRI */
    512 
    513 int viaOffScreenLinear(struct buffer_object *obj, ScrnInfoPtr pScrn, unsigned long size);
    514 void viaShowCursor(ScrnInfoPtr pScrn);
    515 void viaHideCursor(ScrnInfoPtr pScrn);
    516 Bool viaHWCursorInit(ScreenPtr pScreen);
    517 void ViaDisplaySetStreamOnCRT(ScrnInfoPtr pScrn, Bool primary);
    518 void ViaDisplaySetStreamOnDFP(ScrnInfoPtr pScrn, Bool primary);
    519 
    520 #endif /* _VIA_DRIVER_H_ */
    521