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 "xf86PciInfo.h"
44#include "xf86Pci.h"
45#include "i810_reg.h"
46#include "xaa.h"
47#include "xf86Cursor.h"
48#include "xf86xv.h"
49#include "vbe.h"
50#include "vgaHW.h"
51
52#include "xorg-server.h"
53#include <pciaccess.h>
54
55#ifdef XF86DRI
56#include "xf86drm.h"
57#include "sarea.h"
58#define _XF86DRI_SERVER_
59#include "dri.h"
60#include "GL/glxint.h"
61#include "i810_dri.h"
62#endif
63
64#include "common.h"
65#include "i810_ring.h"
66
67#define I810_VERSION 4000
68#define I810_NAME "intel"
69#define I810_DRIVER_NAME "intel"
70
71#define INTEL_VERSION_MAJOR PACKAGE_VERSION_MAJOR
72#define INTEL_VERSION_MINOR PACKAGE_VERSION_MINOR
73#define INTEL_VERSION_PATCH PACKAGE_VERSION_PATCHLEVEL
74
75/* HWMC Surfaces */
76#define I810_MAX_SURFACES 7
77#define I810_MAX_SUBPICTURES 2
78#define I810_TOTAL_SURFACES 9
79
80/* Globals */
81
82typedef struct _I810Rec *I810Ptr;
83
84typedef void (*I810WriteIndexedByteFunc)(I810Ptr pI810, IOADDRESS addr,
85					 uint8_t index, uint8_t value);
86typedef uint8_t(*I810ReadIndexedByteFunc)(I810Ptr pI810, IOADDRESS addr,
87					  uint8_t index);
88typedef void (*I810WriteByteFunc)(I810Ptr pI810, IOADDRESS addr,
89				  uint8_t value);
90typedef uint8_t(*I810ReadByteFunc)(I810Ptr pI810, IOADDRESS addr);
91
92extern void I810SetTiledMemory(ScrnInfoPtr pScrn, int nr, unsigned start,
93			       unsigned pitch, unsigned size);
94
95typedef struct {
96   unsigned long Start;
97   unsigned long End;
98   unsigned long Size;
99} I810MemRange;
100
101typedef struct {
102   int tail_mask;
103   I810MemRange mem;
104   unsigned char *virtual_start;
105   int head;
106   int tail;
107   int space;
108} I810RingBuffer;
109
110typedef struct {
111   unsigned char DisplayControl;
112   unsigned char PixelPipeCfg0;
113   unsigned char PixelPipeCfg1;
114   unsigned char PixelPipeCfg2;
115   unsigned short VideoClk2_M;
116   unsigned short VideoClk2_N;
117   unsigned char VideoClk2_DivisorSel;
118   unsigned char AddressMapping;
119   unsigned char IOControl;
120   unsigned char BitBLTControl;
121   unsigned char ExtVertTotal;
122   unsigned char ExtVertDispEnd;
123   unsigned char ExtVertSyncStart;
124   unsigned char ExtVertBlankStart;
125   unsigned char ExtHorizTotal;
126   unsigned char ExtHorizBlank;
127   unsigned char ExtOffset;
128   unsigned char InterlaceControl;
129   unsigned int LMI_FIFO_Watermark;
130
131   unsigned int LprbTail;
132   unsigned int LprbHead;
133   unsigned int LprbStart;
134   unsigned int LprbLen;
135
136   unsigned int Fence[8];
137
138   unsigned short OverlayActiveStart;
139   unsigned short OverlayActiveEnd;
140
141} I810RegRec, *I810RegPtr;
142
143typedef struct _I810Rec {
144   unsigned char *MMIOBase;
145   unsigned char *FbBase;
146   long FbMapSize;
147   long DepthOffset;
148   long BackOffset;
149   int cpp;
150   int MaxClock;
151
152   unsigned int bufferOffset;		/* for I810SelectBuffer */
153   Bool DoneFrontAlloc;
154   BoxRec FbMemBox;
155   I810MemRange FrontBuffer;
156   I810MemRange BackBuffer;
157   I810MemRange DepthBuffer;
158   I810MemRange TexMem;
159   I810MemRange Scratch;
160   I810MemRange BufferMem;
161   I810MemRange ContextMem;
162   I810MemRange MC;
163
164   int auxPitch;
165   int auxPitchBits;
166
167   Bool CursorIsARGB;
168   int CursorOffset;
169   unsigned long CursorPhysical;
170   unsigned long CursorStart;
171   int CursorARGBOffset;
172   unsigned long CursorARGBPhysical;
173   unsigned long CursorARGBStart;
174   unsigned long OverlayPhysical;
175   unsigned long OverlayStart;
176   int colorKey;
177   unsigned int surfaceAllocation[I810_TOTAL_SURFACES];
178   int numSurfaces;
179
180   DGAModePtr DGAModes;
181   int numDGAModes;
182   Bool DGAactive;
183   int DGAViewportStatus;
184
185   int Chipset;
186   unsigned long LinearAddr;
187   unsigned long MMIOAddr;
188   IOADDRESS ioBase;
189   EntityInfoPtr pEnt;
190   struct pci_device *PciInfo;
191
192   I810RingBuffer *LpRing;
193   unsigned int BR[20];
194
195   int LmFreqSel;
196
197   int VramKey;
198   unsigned long VramOffset;
199   int DcacheKey;
200   unsigned long DcacheOffset;
201   int HwcursKey;
202   unsigned long HwcursOffset;
203   int ARGBHwcursKey;
204   unsigned long ARGBHwcursOffset;
205
206   int GttBound;
207
208   I810MemRange DcacheMem;
209   I810MemRange SysMem;
210
211   I810MemRange SavedDcacheMem;
212   I810MemRange SavedSysMem;
213
214   unsigned char **ScanlineColorExpandBuffers;
215   int NumScanlineColorExpandBuffers;
216   int nextColorExpandBuf;
217
218   I810RegRec SavedReg;
219   I810RegRec ModeReg;
220
221   XAAInfoRecPtr AccelInfoRec;
222   xf86CursorInfoPtr CursorInfoRec;
223   CloseScreenProcPtr CloseScreen;
224   ScreenBlockHandlerProcPtr BlockHandler;
225
226   I810WriteIndexedByteFunc writeControl;
227   I810ReadIndexedByteFunc readControl;
228   I810WriteByteFunc writeStandard;
229   I810ReadByteFunc readStandard;
230
231   Bool directRenderingDisabled;        /* DRI disabled in PreInit */
232   Bool directRenderingEnabled;		/* false if XF86DRI not defined. */
233
234#ifdef XF86DRI
235   int LockHeld;
236   DRIInfoPtr pDRIInfo;
237   int drmSubFD;
238   int numVisualConfigs;
239   __GLXvisualConfig *pVisualConfigs;
240   I810ConfigPrivPtr pVisualConfigsPriv;
241   unsigned long dcacheHandle;
242   unsigned long backHandle;
243   unsigned long zHandle;
244   unsigned long cursorHandle;
245   unsigned long cursorARGBHandle;
246   unsigned long xvmcHandle;
247   unsigned long sysmemHandle;
248   Bool agpAcquired;
249   drm_handle_t buffer_map;
250   drm_handle_t ring_map;
251   drm_handle_t overlay_map;
252   drm_handle_t mc_map;
253   drm_handle_t xvmcContext;
254#endif
255   Bool agpAcquired2d;
256
257   XF86VideoAdaptorPtr adaptor;
258   OptionInfoPtr Options;
259
260   int configured_device;
261
262   Bool showCache;
263   Bool noAccel;
264   Bool allowPageFlip;
265   Bool have3DWindows;
266   int  drmMinor;
267} I810Rec;
268
269#define I810PTR(p) ((I810Ptr)((p)->driverPrivate))
270
271#define I810_SELECT_FRONT	0
272#define I810_SELECT_BACK	1
273#define I810_SELECT_DEPTH	2
274
275#ifdef XF86DRI
276extern Bool I810DRIScreenInit(ScreenPtr pScreen);
277extern void I810DRICloseScreen(ScreenPtr pScreen);
278extern Bool I810DRIFinishScreenInit(ScreenPtr pScreen);
279extern Bool I810DRILeave(ScrnInfoPtr pScrn);
280extern Bool I810DRIEnter(ScrnInfoPtr pScrn);
281#endif
282extern Bool I810InitDma(ScrnInfoPtr pScrn);
283extern Bool I810CleanupDma(ScrnInfoPtr pScrn);
284
285#define I810PTR(p) ((I810Ptr)((p)->driverPrivate))
286#define I810REGPTR(p) (&(I810PTR(p)->ModeReg))
287
288extern Bool I810CursorInit(ScreenPtr pScreen);
289extern Bool I810AccelInit(ScreenPtr pScreen);
290extern void I810SetPIOAccess(I810Ptr pI810);
291extern void I810SetMMIOAccess(I810Ptr pI810);
292extern unsigned int I810CalcWatermark(ScrnInfoPtr pScrn, double freq,
293				      Bool dcache);
294extern void I810PrintErrorState(ScrnInfoPtr pScrn);
295extern int I810WaitLpRing(ScrnInfoPtr pScrn, int n, int timeout_millis);
296extern void I810Sync(ScrnInfoPtr pScrn);
297extern unsigned long I810LocalToPhysical(ScrnInfoPtr pScrn,
298					 unsigned long local);
299extern int I810AllocLow(I810MemRange * result, I810MemRange * pool,
300			int size);
301extern int I810AllocHigh(I810MemRange * result, I810MemRange * pool,
302			int size);
303extern Bool I810AllocateFront(ScrnInfoPtr pScrn);
304
305extern int I810AllocateGARTMemory(ScrnInfoPtr pScrn);
306extern void I810FreeGARTMemory(ScrnInfoPtr pScrn);
307
308extern Bool I810BindGARTMemory(ScrnInfoPtr pScrn);
309extern Bool I810UnbindGARTMemory(ScrnInfoPtr pScrn);
310
311extern int I810CheckAvailableMemory(ScrnInfoPtr pScrn);
312
313extern Bool I810SwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
314extern void I810AdjustFrame(int scrnIndex, int x, int y, int flags);
315
316extern void I810SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir,
317					   int ydir, int rop,
318					   unsigned int planemask,
319					   int trans_color);
320extern void I810SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int srcX,
321					     int srcY, int dstX, int dstY,
322					     int w, int h);
323extern void I810SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
324				  unsigned int planemask);
325extern void I810SubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y,
326					int w, int h);
327
328extern void I810SelectBuffer(ScrnInfoPtr pScrn, int buffer);
329
330extern void I810RefreshRing(ScrnInfoPtr pScrn);
331extern void I810EmitFlush(ScrnInfoPtr pScrn);
332extern void I810EmitInvarientState(ScrnInfoPtr pScrn);
333
334extern Bool I810DGAInit(ScreenPtr pScreen);
335
336extern void I810InitVideo(ScreenPtr pScreen);
337extern void I810InitMC(ScreenPtr pScreen);
338
339extern const OptionInfoRec *I810AvailableOptions(int chipid, int busid);
340
341#endif /* _I810_H_ */
342