1 
2 /**************************************************************************
3 
4 Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
5 Copyright © 2002 David Dawes
6 
7 All Rights Reserved.
8 
9 Permission is hereby granted, free of charge, to any person obtaining a
10 copy of this software and associated documentation files (the
11 "Software"), to deal in the Software without restriction, including
12 without limitation the rights to use, copy, modify, merge, publish,
13 distribute, sub license, and/or sell copies of the Software, and to
14 permit persons to whom the Software is furnished to do so, subject to
15 the following conditions:
16 
17 The above copyright notice and this permission notice (including the
18 next paragraph) shall be included in all copies or substantial portions
19 of the Software.
20 
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
24 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
25 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 
29 **************************************************************************/
30 
31 /*
32  * Authors:
33  *   Keith Whitwell <keith@tungstengraphics.com>
34  *   David Dawes <dawes@xfree86.org>
35  *
36  */
37 
38 #ifndef _I810_H_
39 #define _I810_H_
40 
41 #include <stdint.h>
42 #include "compiler.h"
43 #include "xf86Pci.h"
44 #include "i810_reg.h"
45 #ifdef HAVE_XAA_H
46 #include "xaa.h"
47 #endif
48 #include "xf86Cursor.h"
49 #include "xf86xv.h"
50 #include "vbe.h"
51 #include "vgaHW.h"
52 
53 #include "xorg-server.h"
54 #include <pciaccess.h>
55 
56 #include "compat-api.h"
57 #ifdef HAVE_DRI1
58 #include "xf86drm.h"
59 #include "sarea.h"
60 #define _XF86DRI_SERVER_
61 #include "dri.h"
62 #include "i810_dri.h"
63 #endif
64 
65 #include "i810_common.h"
66 #include "i810_ring.h"
67 
68 #include "intel_driver.h"
69 
70 /* HWMC Surfaces */
71 #define I810_MAX_SURFACES 7
72 #define I810_MAX_SUBPICTURES 2
73 #define I810_TOTAL_SURFACES 9
74 
75 /* Globals */
76 
77 typedef struct _I810Rec *I810Ptr;
78 
79 extern void I810SetTiledMemory(ScrnInfoPtr pScrn, int nr, unsigned start,
80 			       unsigned pitch, unsigned size);
81 
82 typedef struct {
83    unsigned long Start;
84    unsigned long End;
85    unsigned long Size;
86 } I810MemRange;
87 
88 typedef struct {
89    int tail_mask;
90    I810MemRange mem;
91    unsigned char *virtual_start;
92    int head;
93    int tail;
94    int space;
95 } I810RingBuffer;
96 
97 typedef struct {
98    unsigned char DisplayControl;
99    unsigned char PixelPipeCfg0;
100    unsigned char PixelPipeCfg1;
101    unsigned char PixelPipeCfg2;
102    unsigned short VideoClk2_M;
103    unsigned short VideoClk2_N;
104    unsigned char VideoClk2_DivisorSel;
105    unsigned char AddressMapping;
106    unsigned char IOControl;
107    unsigned char BitBLTControl;
108    unsigned char ExtVertTotal;
109    unsigned char ExtVertDispEnd;
110    unsigned char ExtVertSyncStart;
111    unsigned char ExtVertBlankStart;
112    unsigned char ExtHorizTotal;
113    unsigned char ExtHorizBlank;
114    unsigned char ExtOffset;
115    unsigned char InterlaceControl;
116    unsigned int LMI_FIFO_Watermark;
117 
118    unsigned int LprbTail;
119    unsigned int LprbHead;
120    unsigned int LprbStart;
121    unsigned int LprbLen;
122 
123    unsigned int Fence[8];
124 
125    unsigned short OverlayActiveStart;
126    unsigned short OverlayActiveEnd;
127 
128 } I810RegRec, *I810RegPtr;
129 
130 typedef struct _I810Rec {
131    unsigned char *MMIOBase;
132    unsigned char *FbBase;
133    long FbMapSize;
134    long DepthOffset;
135    long BackOffset;
136    int cpp;
137    int MaxClock;
138 
139    unsigned int bufferOffset;		/* for I810SelectBuffer */
140    Bool DoneFrontAlloc;
141    BoxRec FbMemBox;
142    I810MemRange FrontBuffer;
143    I810MemRange BackBuffer;
144    I810MemRange DepthBuffer;
145    I810MemRange TexMem;
146    I810MemRange Scratch;
147    I810MemRange BufferMem;
148    I810MemRange ContextMem;
149    I810MemRange MC;
150 
151    int auxPitch;
152    int auxPitchBits;
153 
154    Bool CursorIsARGB;
155    int CursorOffset;
156    unsigned long CursorPhysical;
157    unsigned long CursorStart;
158    int CursorARGBOffset;
159    unsigned long CursorARGBPhysical;
160    unsigned long CursorARGBStart;
161    unsigned long OverlayPhysical;
162    unsigned long OverlayStart;
163    int colorKey;
164    unsigned int surfaceAllocation[I810_TOTAL_SURFACES];
165    int numSurfaces;
166 
167    DGAModePtr DGAModes;
168    int numDGAModes;
169    Bool DGAactive;
170    int DGAViewportStatus;
171 
172    int Chipset;
173    unsigned long LinearAddr;
174    unsigned long MMIOAddr;
175    EntityInfoPtr pEnt;
176    struct pci_device *PciInfo;
177 
178    I810RingBuffer *LpRing;
179    unsigned int BR[20];
180 
181    int LmFreqSel;
182 
183    int VramKey;
184    unsigned long VramOffset;
185    int DcacheKey;
186    unsigned long DcacheOffset;
187    int HwcursKey;
188    unsigned long HwcursOffset;
189    int ARGBHwcursKey;
190    unsigned long ARGBHwcursOffset;
191 
192    int GttBound;
193 
194    I810MemRange DcacheMem;
195    I810MemRange SysMem;
196 
197    I810MemRange SavedDcacheMem;
198    I810MemRange SavedSysMem;
199 
200    unsigned char **ScanlineColorExpandBuffers;
201    int NumScanlineColorExpandBuffers;
202    int nextColorExpandBuf;
203 
204    I810RegRec SavedReg;
205    I810RegRec ModeReg;
206 
207 #ifdef HAVE_XAA_H
208    XAAInfoRecPtr AccelInfoRec;
209 #endif
210    xf86CursorInfoPtr CursorInfoRec;
211    CloseScreenProcPtr CloseScreen;
212    ScreenBlockHandlerProcPtr BlockHandler;
213 
214    Bool directRenderingDisabled;        /* DRI disabled in PreInit */
215    Bool directRenderingEnabled;		/* false if XF86DRI not defined. */
216 
217 #ifdef HAVE_DRI1
218    int LockHeld;
219    DRIInfoPtr pDRIInfo;
220    int drmSubFD;
221    unsigned long dcacheHandle;
222    unsigned long backHandle;
223    unsigned long zHandle;
224    unsigned long cursorHandle;
225    unsigned long cursorARGBHandle;
226    unsigned long xvmcHandle;
227    unsigned long sysmemHandle;
228    Bool agpAcquired;
229    drm_handle_t buffer_map;
230    drm_handle_t ring_map;
231    drm_handle_t overlay_map;
232    drm_handle_t mc_map;
233    drm_handle_t xvmcContext;
234 #endif
235    Bool agpAcquired2d;
236 
237    XF86VideoAdaptorPtr adaptor;
238    OptionInfoPtr Options;
239 
240    int configured_device;
241 
242    Bool showCache;
243    Bool noAccel;
244    Bool allowPageFlip;
245    Bool have3DWindows;
246    int  drmMinor;
247 } I810Rec;
248 
249 #define I810PTR(p) ((I810Ptr)((p)->driverPrivate))
250 
251 #define I810_SELECT_FRONT	0
252 #define I810_SELECT_BACK	1
253 #define I810_SELECT_DEPTH	2
254 
255 #ifdef HAVE_DRI1
256 extern Bool I810DRIScreenInit(ScreenPtr pScreen);
257 extern void I810DRICloseScreen(ScreenPtr pScreen);
258 extern Bool I810DRIFinishScreenInit(ScreenPtr pScreen);
259 extern Bool I810DRILeave(ScrnInfoPtr pScrn);
260 extern Bool I810DRIEnter(ScrnInfoPtr pScrn);
261 #endif
262 extern Bool I810InitDma(ScrnInfoPtr pScrn);
263 extern Bool I810CleanupDma(ScrnInfoPtr pScrn);
264 
265 #define I810PTR(p) ((I810Ptr)((p)->driverPrivate))
266 #define I810REGPTR(p) (&(I810PTR(p)->ModeReg))
267 
268 extern Bool I810CursorInit(ScreenPtr pScreen);
269 #ifdef HAVE_XAA_H
270 extern Bool I810AccelInit(ScreenPtr pScreen);
271 #else
I810AccelInit(ScreenPtr pScreen)272 static inline  Bool I810AccelInit(ScreenPtr pScreen) { return TRUE; }
273 #endif
274 extern void I810SetPIOAccess(I810Ptr pI810);
275 extern void I810SetMMIOAccess(I810Ptr pI810);
276 extern unsigned int I810CalcWatermark(ScrnInfoPtr pScrn, double freq,
277 				      Bool dcache);
278 extern void I810PrintErrorState(ScrnInfoPtr pScrn);
279 extern int I810WaitLpRing(ScrnInfoPtr pScrn, int n, int timeout_millis);
280 extern void I810Sync(ScrnInfoPtr pScrn);
281 extern unsigned long I810LocalToPhysical(ScrnInfoPtr pScrn,
282 					 unsigned long local);
283 extern int I810AllocLow(I810MemRange * result, I810MemRange * pool,
284 			int size);
285 extern int I810AllocHigh(I810MemRange * result, I810MemRange * pool,
286 			int size);
287 extern Bool I810AllocateFront(ScrnInfoPtr pScrn);
288 
289 extern int I810AllocateGARTMemory(ScrnInfoPtr pScrn);
290 extern void I810FreeGARTMemory(ScrnInfoPtr pScrn);
291 
292 extern Bool I810BindGARTMemory(ScrnInfoPtr pScrn);
293 extern Bool I810UnbindGARTMemory(ScrnInfoPtr pScrn);
294 
295 extern int I810CheckAvailableMemory(ScrnInfoPtr pScrn);
296 
297 extern Bool I810SwitchMode(SWITCH_MODE_ARGS_DECL);
298 extern void I810AdjustFrame(ADJUST_FRAME_ARGS_DECL);
299 
300 extern void I810SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir,
301 					   int ydir, int rop,
302 					   unsigned int planemask,
303 					   int trans_color);
304 extern void I810SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int srcX,
305 					     int srcY, int dstX, int dstY,
306 					     int w, int h);
307 extern void I810SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
308 				  unsigned int planemask);
309 extern void I810SubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y,
310 					int w, int h);
311 
312 extern void I810SelectBuffer(ScrnInfoPtr pScrn, int buffer);
313 
314 extern void I810RefreshRing(ScrnInfoPtr pScrn);
315 extern void I810EmitFlush(ScrnInfoPtr pScrn);
316 
317 extern Bool I810DGAInit(ScreenPtr pScreen);
318 
319 extern void I810InitVideo(ScreenPtr pScreen);
320 extern void I810InitMC(ScreenPtr pScreen);
321 
322 extern const OptionInfoRec *I810AvailableOptions(int chipid, int busid);
323 
324 extern const int I810CopyROP[16];
325 extern const int I810PatternROP[16];
326 
327 #endif /* _I810_H_ */
328