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