1
2/**************************************************************************
3
4Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
5Copyright © 2002 David Dawes
6
7All Rights Reserved.
8
9Permission is hereby granted, free of charge, to any person obtaining a
10copy of this software and associated documentation files (the
11"Software"), to deal in the Software without restriction, including
12without limitation the rights to use, copy, modify, merge, publish,
13distribute, sub license, and/or sell copies of the Software, and to
14permit persons to whom the Software is furnished to do so, subject to
15the following conditions:
16
17The above copyright notice and this permission notice (including the
18next paragraph) shall be included in all copies or substantial portions
19of the Software.
20
21THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
24IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
25ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27SOFTWARE 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
77typedef struct _I810Rec *I810Ptr;
78
79extern void I810SetTiledMemory(ScrnInfoPtr pScrn, int nr, unsigned start,
80			       unsigned pitch, unsigned size);
81
82typedef struct {
83   unsigned long Start;
84   unsigned long End;
85   unsigned long Size;
86} I810MemRange;
87
88typedef 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
97typedef 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
130typedef 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
256extern Bool I810DRIScreenInit(ScreenPtr pScreen);
257extern void I810DRICloseScreen(ScreenPtr pScreen);
258extern Bool I810DRIFinishScreenInit(ScreenPtr pScreen);
259extern Bool I810DRILeave(ScrnInfoPtr pScrn);
260extern Bool I810DRIEnter(ScrnInfoPtr pScrn);
261#endif
262extern Bool I810InitDma(ScrnInfoPtr pScrn);
263extern Bool I810CleanupDma(ScrnInfoPtr pScrn);
264
265#define I810PTR(p) ((I810Ptr)((p)->driverPrivate))
266#define I810REGPTR(p) (&(I810PTR(p)->ModeReg))
267
268extern Bool I810CursorInit(ScreenPtr pScreen);
269#ifdef HAVE_XAA_H
270extern Bool I810AccelInit(ScreenPtr pScreen);
271#else
272static inline  Bool I810AccelInit(ScreenPtr pScreen) { return TRUE; }
273#endif
274extern void I810SetPIOAccess(I810Ptr pI810);
275extern void I810SetMMIOAccess(I810Ptr pI810);
276extern unsigned int I810CalcWatermark(ScrnInfoPtr pScrn, double freq,
277				      Bool dcache);
278extern void I810PrintErrorState(ScrnInfoPtr pScrn);
279extern int I810WaitLpRing(ScrnInfoPtr pScrn, int n, int timeout_millis);
280extern void I810Sync(ScrnInfoPtr pScrn);
281extern unsigned long I810LocalToPhysical(ScrnInfoPtr pScrn,
282					 unsigned long local);
283extern int I810AllocLow(I810MemRange * result, I810MemRange * pool,
284			int size);
285extern int I810AllocHigh(I810MemRange * result, I810MemRange * pool,
286			int size);
287extern Bool I810AllocateFront(ScrnInfoPtr pScrn);
288
289extern int I810AllocateGARTMemory(ScrnInfoPtr pScrn);
290extern void I810FreeGARTMemory(ScrnInfoPtr pScrn);
291
292extern Bool I810BindGARTMemory(ScrnInfoPtr pScrn);
293extern Bool I810UnbindGARTMemory(ScrnInfoPtr pScrn);
294
295extern int I810CheckAvailableMemory(ScrnInfoPtr pScrn);
296
297extern Bool I810SwitchMode(SWITCH_MODE_ARGS_DECL);
298extern void I810AdjustFrame(ADJUST_FRAME_ARGS_DECL);
299
300extern void I810SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir,
301					   int ydir, int rop,
302					   unsigned int planemask,
303					   int trans_color);
304extern void I810SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int srcX,
305					     int srcY, int dstX, int dstY,
306					     int w, int h);
307extern void I810SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
308				  unsigned int planemask);
309extern void I810SubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y,
310					int w, int h);
311
312extern void I810SelectBuffer(ScrnInfoPtr pScrn, int buffer);
313
314extern void I810RefreshRing(ScrnInfoPtr pScrn);
315extern void I810EmitFlush(ScrnInfoPtr pScrn);
316
317extern Bool I810DGAInit(ScreenPtr pScreen);
318
319extern void I810InitVideo(ScreenPtr pScreen);
320extern void I810InitMC(ScreenPtr pScreen);
321
322extern const OptionInfoRec *I810AvailableOptions(int chipid, int busid);
323
324extern const int I810CopyROP[16];
325extern const int I810PatternROP[16];
326
327#endif /* _I810_H_ */
328