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