via_driver.h revision d89f4815
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
528int viaOffScreenLinear(VIAMemPtr mem, ScrnInfoPtr pScrn, unsigned long size);
529void viaShowCursor(ScrnInfoPtr pScrn);
530void viaHideCursor(ScrnInfoPtr pScrn);
531Bool viaHWCursorInit(ScreenPtr pScreen);
532void ViaDisplaySetStreamOnCRT(ScrnInfoPtr pScrn, Bool primary);
533void ViaDisplaySetStreamOnDFP(ScrnInfoPtr pScrn, Bool primary);
534void ViaDisplaySetStreamOnDVO(ScrnInfoPtr pScrn, int port, Bool primary);
535void ViaDisplayEnableSimultaneous(ScrnInfoPtr pScrn);
536void ViaDisplayEnableCRT(ScrnInfoPtr pScrn);
537void ViaDisplayEnableDVO(ScrnInfoPtr pScrn, int port);
538
539#endif /* _VIA_DRIVER_H_ */
540