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 int numVisualConfigs; 222 unsigned long dcacheHandle; 223 unsigned long backHandle; 224 unsigned long zHandle; 225 unsigned long cursorHandle; 226 unsigned long cursorARGBHandle; 227 unsigned long xvmcHandle; 228 unsigned long sysmemHandle; 229 Bool agpAcquired; 230 drm_handle_t buffer_map; 231 drm_handle_t ring_map; 232 drm_handle_t overlay_map; 233 drm_handle_t mc_map; 234 drm_handle_t xvmcContext; 235#endif 236 Bool agpAcquired2d; 237 238 XF86VideoAdaptorPtr adaptor; 239 OptionInfoPtr Options; 240 241 int configured_device; 242 243 Bool showCache; 244 Bool noAccel; 245 Bool allowPageFlip; 246 Bool have3DWindows; 247 int drmMinor; 248} I810Rec; 249 250#define I810PTR(p) ((I810Ptr)((p)->driverPrivate)) 251 252#define I810_SELECT_FRONT 0 253#define I810_SELECT_BACK 1 254#define I810_SELECT_DEPTH 2 255 256#ifdef HAVE_DRI1 257extern Bool I810DRIScreenInit(ScreenPtr pScreen); 258extern void I810DRICloseScreen(ScreenPtr pScreen); 259extern Bool I810DRIFinishScreenInit(ScreenPtr pScreen); 260extern Bool I810DRILeave(ScrnInfoPtr pScrn); 261extern Bool I810DRIEnter(ScrnInfoPtr pScrn); 262#endif 263extern Bool I810InitDma(ScrnInfoPtr pScrn); 264extern Bool I810CleanupDma(ScrnInfoPtr pScrn); 265 266#define I810PTR(p) ((I810Ptr)((p)->driverPrivate)) 267#define I810REGPTR(p) (&(I810PTR(p)->ModeReg)) 268 269extern Bool I810CursorInit(ScreenPtr pScreen); 270#ifdef HAVE_XAA_H 271extern Bool I810AccelInit(ScreenPtr pScreen); 272#else 273static inline Bool I810AccelInit(ScreenPtr pScreen) { return TRUE; } 274#endif 275extern void I810SetPIOAccess(I810Ptr pI810); 276extern void I810SetMMIOAccess(I810Ptr pI810); 277extern unsigned int I810CalcWatermark(ScrnInfoPtr pScrn, double freq, 278 Bool dcache); 279extern void I810PrintErrorState(ScrnInfoPtr pScrn); 280extern int I810WaitLpRing(ScrnInfoPtr pScrn, int n, int timeout_millis); 281extern void I810Sync(ScrnInfoPtr pScrn); 282extern unsigned long I810LocalToPhysical(ScrnInfoPtr pScrn, 283 unsigned long local); 284extern int I810AllocLow(I810MemRange * result, I810MemRange * pool, 285 int size); 286extern int I810AllocHigh(I810MemRange * result, I810MemRange * pool, 287 int size); 288extern Bool I810AllocateFront(ScrnInfoPtr pScrn); 289 290extern int I810AllocateGARTMemory(ScrnInfoPtr pScrn); 291extern void I810FreeGARTMemory(ScrnInfoPtr pScrn); 292 293extern Bool I810BindGARTMemory(ScrnInfoPtr pScrn); 294extern Bool I810UnbindGARTMemory(ScrnInfoPtr pScrn); 295 296extern int I810CheckAvailableMemory(ScrnInfoPtr pScrn); 297 298extern Bool I810SwitchMode(SWITCH_MODE_ARGS_DECL); 299extern void I810AdjustFrame(ADJUST_FRAME_ARGS_DECL); 300 301extern void I810SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, 302 int ydir, int rop, 303 unsigned int planemask, 304 int trans_color); 305extern void I810SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int srcX, 306 int srcY, int dstX, int dstY, 307 int w, int h); 308extern void I810SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, 309 unsigned int planemask); 310extern void I810SubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, 311 int w, int h); 312 313extern void I810SelectBuffer(ScrnInfoPtr pScrn, int buffer); 314 315extern void I810RefreshRing(ScrnInfoPtr pScrn); 316extern void I810EmitFlush(ScrnInfoPtr pScrn); 317 318extern Bool I810DGAInit(ScreenPtr pScreen); 319 320extern void I810InitVideo(ScreenPtr pScreen); 321extern void I810InitMC(ScreenPtr pScreen); 322 323extern const OptionInfoRec *I810AvailableOptions(int chipid, int busid); 324 325extern const int I810CopyROP[16]; 326extern const int I810PatternROP[16]; 327 328#endif /* _I810_H_ */ 329