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