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