neo.h revision 692f60a7
1/********************************************************************** 2Copyright 1998, 1999 by Precision Insight, Inc., Cedar Park, Texas. 3 4 All Rights Reserved 5 6Permission to use, copy, modify, distribute, and sell this software and 7its documentation for any purpose is hereby granted without fee, 8provided that the above copyright notice appear in all copies and that 9both that copyright notice and this permission notice appear in 10supporting documentation, and that the name of Precision Insight not be 11used in advertising or publicity pertaining to distribution of the 12software without specific, written prior permission. Precision Insight 13and its suppliers make no representations about the suitability of this 14software for any purpose. It is provided "as is" without express or 15implied warranty. 16 17PRECISION INSIGHT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 18INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 19EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY 20SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER 21RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF 22CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 23CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 24**********************************************************************/ 25/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo.h,v 1.23tsi Exp $ */ 26 27/* 28 * The original Precision Insight driver for 29 * XFree86 v.3.3 has been sponsored by Red Hat. 30 * 31 * Authors: 32 * Jens Owen (jens@tungstengraphics.com) 33 * Kevin E. Martin (kevin@precisioninsight.com) 34 * 35 * Port to Xfree86 v.4.0 36 * 1998, 1999 by Egbert Eich (Egbert.Eich@Physik.TU-Darmstadt.DE) 37 */ 38 39#include <string.h> 40/* All drivers should typically include these */ 41#include "xf86.h" 42#include "xf86_OSproc.h" 43 44/* Everything using inb/outb, etc needs "compiler.h" */ 45#include "compiler.h" 46 47#include "xaa.h" 48#include "xaalocal.h" /* XAA internals as we replace some of XAA */ 49#include "xaaWrapper.h" 50#include "xf86Cursor.h" 51 52#include "shadowfb.h" 53 54#include "vbe.h" 55 56/* Needed by the Shadow Framebuffer */ 57#include "shadow.h" 58 59/* Drivers that need to access the PCI config space directly need this */ 60#include "xf86Pci.h" 61 62#include "xf86i2c.h" 63 64#include "xf86xv.h" 65#include <X11/extensions/Xv.h> 66 67/* 68 * Driver data structures. 69 */ 70#include "neo_reg.h" 71#include "neo_macros.h" 72 73/* Supported chipsets */ 74typedef enum { 75 NM2070, 76 NM2090, 77 NM2093, 78 NM2097, 79 NM2160, 80 NM2200, 81 NM2230, 82 NM2360, 83 NM2380 84} NEOType; 85 86/* function prototypes */ 87 88extern Bool NEOSwitchMode(int scrnIndex, DisplayModePtr mode, int flags); 89extern void NEOAdjustFrame(int scrnIndex, int x, int y, int flags); 90 91/* in neo_2070.c */ 92extern Bool Neo2070AccelInit(ScreenPtr pScreen); 93 94/* in neo_2090.c */ 95extern Bool Neo2090AccelInit(ScreenPtr pScreen); 96 97/* in neo_2097.c */ 98extern Bool Neo2097AccelInit(ScreenPtr pScreen); 99 100/* in neo_2200.c */ 101extern Bool Neo2200AccelInit(ScreenPtr pScreen); 102 103/* in neo_cursor.c */ 104extern Bool NeoCursorInit(ScreenPtr pScrn); 105extern void NeoShowCursor(ScrnInfoPtr pScrn); 106extern void NeoHideCursor(ScrnInfoPtr pScrn); 107 108/* in neo_bank.c */ 109int NEOSetReadWrite(ScreenPtr pScreen, int bank); 110int NEOSetWrite(ScreenPtr pScreen, int bank); 111int NEOSetRead(ScreenPtr pScreen, int bank); 112 113/* in neo_i2c.c */ 114extern Bool neo_I2CInit(ScrnInfoPtr pScrn); 115 116/* in neo_shadow.c */ 117void neoShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf); 118void neoPointerMoved(int index, int x, int y); 119void neoRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 120void neoRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 121void neoRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 122void neoRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 123void neoRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 124 125/* in neo_dga.c */ 126Bool NEODGAInit(ScreenPtr pScreen); 127 128/* in neo_video.c */ 129extern void NEOInitVideo(ScreenPtr pScreen); 130extern void NEOResetVideo(ScrnInfoPtr pScrn); 131 132/* shadow regs */ 133 134#define NEO_EXT_CR_MAX 0x85 135#define NEO_EXT_GR_MAX 0xC7 136typedef struct { 137 unsigned char CR[NEO_EXT_CR_MAX+1]; 138 unsigned char GR[NEO_EXT_GR_MAX+1]; 139} regSaveRec, *regSavePtr; 140 141/* registers */ 142typedef struct { 143 unsigned char GeneralLockReg; 144 unsigned char ExtCRTDispAddr; 145 unsigned char ExtCRTOffset; 146 unsigned char SysIfaceCntl1; 147 unsigned char SysIfaceCntl2; 148 unsigned char ExtColorModeSelect; 149 unsigned char SingleAddrPage; 150 unsigned char DualAddrPage; 151 unsigned char biosMode; 152 unsigned char PanelDispCntlReg1; 153 unsigned char PanelDispCntlReg2; 154 unsigned char PanelDispCntlReg3; 155 unsigned char PanelVertCenterReg1; 156 unsigned char PanelVertCenterReg2; 157 unsigned char PanelVertCenterReg3; 158 unsigned char PanelVertCenterReg4; 159 unsigned char PanelVertCenterReg5; 160 unsigned char PanelHorizCenterReg1; 161 unsigned char PanelHorizCenterReg2; 162 unsigned char PanelHorizCenterReg3; 163 unsigned char PanelHorizCenterReg4; 164 unsigned char PanelHorizCenterReg5; 165 unsigned char Sequencer1; 166 Bool ProgramVCLK; 167 unsigned char VCLK3NumeratorLow; 168 unsigned char VCLK3NumeratorHigh; 169 unsigned char VCLK3Denominator; 170 unsigned char VerticalExt; 171 regSavePtr reg; 172} NeoRegRec, *NeoRegPtr; 173 174typedef struct { 175 /* Hardware cursor address */ 176 unsigned int CursorAddress; 177 Bool UseHWCursor; 178 Bool NoCursorMode; 179 unsigned char CursTemp[1024]; 180 /* Boundaries of the pixmap cache */ 181 unsigned int cacheStart; 182 unsigned int cacheEnd; 183 /* Blitter */ 184 unsigned int tmpBltCntlFlags; 185 unsigned int BltCntlFlags; 186 unsigned int BltModeFlags; 187 unsigned int ColorShiftAmt; 188 unsigned int Pitch; 189 unsigned int PixelWidth; 190 unsigned int PlaneMask; 191 int CPUToScreenColorExpandFill_x; 192 int CPUToScreenColorExpandFill_y; 193 int CPUToScreenColorExpandFill_w; 194 int CPUToScreenColorExpandFill_h; 195 int CPUToScreenColorExpandFill_skipleft; 196} NEOACLRec, *NEOACLPtr; 197#define NEOACLPTR(p) &((NEOPtr)((p)->driverPrivate))->Accel 198 199/* globals */ 200typedef struct neoRec 201{ 202 int NeoChipset; 203 pciVideoPtr PciInfo; 204 PCITAG PciTag; 205 EntityInfoPtr pEnt; 206 XAAInfoRecPtr AccelInfoRec; 207 NEOACLRec Accel; 208 unsigned long NeoMMIOAddr; 209 unsigned long NeoLinearAddr; 210 unsigned char* NeoMMIOBase; 211 unsigned long NeoMMIOAddr2; 212 unsigned char* NeoMMIOBase2; 213 unsigned char* NeoFbBase; 214 long NeoFbMapSize; 215 unsigned long vgaIOBase; 216 DGAModePtr DGAModes; 217 int numDGAModes; 218 Bool DGAactive; 219 int DGAViewportStatus; 220 /* ??? */ 221 int NeoFifoCount; 222 /* cursor */ 223 int NeoCursorMem; 224 Bool NeoHWCursorShown; 225 Bool NeoHWCursorInitialized; 226 xf86CursorInfoPtr CursorInfo; 227 int NeoCursorOffset; 228 int NeoCursorPrevX; 229 int NeoCursorPrevY; 230 unsigned char *NeoCursorImage; 231 /* Panels size */ 232 int NeoPanelWidth; 233 int NeoPanelHeight; 234 /* options */ 235 OptionInfoPtr Options; 236 Bool noLinear; 237 Bool noAccel; 238 Bool noAccelSet; 239 Bool swCursor; 240 Bool noMMIO; 241 Bool internDisp; 242 Bool externDisp; 243 Bool noLcdStretch; 244 Bool shadowFB; 245 Bool lcdCenter; 246 Bool onPciBurst; 247 Bool progLcdRegs; 248 Bool progLcdStretch; 249 Bool progLcdStretchOpt; 250 Bool overrideValidate; 251 Bool strangeLockups; 252 /* registers */ 253 NeoRegRec NeoModeReg; 254 NeoRegRec NeoSavedReg; 255 /* proc pointer */ 256 CloseScreenProcPtr CloseScreen; 257 I2CBusPtr I2C; 258 vbeInfoPtr pVbe; 259 unsigned char * ShadowPtr; 260 int ShadowPitch; 261 RefreshAreaFuncPtr refreshArea; 262 void (*PointerMoved)(int index, int x, int y); 263 int rotate; 264 Bool showcache; 265 Bool video; 266 double videoHZoom; 267 double videoVZoom; 268 XF86VideoAdaptorPtr overlayAdaptor; 269 int overlay; 270 int overlay_offset; 271 int videoKey; 272 int interlace; 273 SyncFunc accelSync; 274} NEORec, *NEOPtr; 275 276typedef struct { 277 int x_res; 278 int y_res; 279 int mode; 280} biosMode; 281 282/* The privates of the NEO driver */ 283#define NEOPTR(p) ((NEOPtr)((p)->driverPrivate)) 284 285/* I/O register offsets */ 286#define GRAX 0x3CE 287 288/* vga IO functions */ 289#define VGArCR(index) (*hwp->readCrtc)(hwp, index) 290#define VGAwCR(index, val) (*hwp->writeCrtc)(hwp, index, val) 291#define VGArGR(index) (*hwp->readGr)(hwp, index) 292#define VGAwGR(index, val) (*hwp->writeGr)(hwp, index, val) 293#define VGArSR(index) (*hwp->readSeq)(hwp, index) 294#define VGAwSR(index, val) (*hwp->writeSeq)(hwp, index, val) 295 296/* memory mapped register access macros */ 297#define INREG8(addr) MMIO_IN8(nPtr->NeoMMIOBase, addr) 298#define INREG16(addr) MMIO_IN16(nPtr->NeoMMIOBase, addr) 299#define INREG(addr) MMIO_IN32(nPtr->NeoMMIOBase, addr) 300#define OUTREG8(addr, val) MMIO_OUT8(nPtr->NeoMMIOBase, addr, val) 301#define OUTREG16(addr, val) MMIO_OUT16(nPtr->NeoMMIOBase, addr, val) 302#define OUTREG(addr, val) MMIO_OUT32(nPtr->NeoMMIOBase, addr, val) 303 304/* This swizzle macro is to support the manipulation of cursor masks when 305 * the sprite moves off the left edge of the display. This code is 306 * platform specific, and is known to work with 32bit little endian machines 307 */ 308#define SWIZZLE32(__b) { \ 309 ((unsigned char *)&__b)[0] = byte_reversed[((unsigned char *)&__b)[0]]; \ 310 ((unsigned char *)&__b)[1] = byte_reversed[((unsigned char *)&__b)[1]]; \ 311 ((unsigned char *)&__b)[2] = byte_reversed[((unsigned char *)&__b)[2]]; \ 312 ((unsigned char *)&__b)[3] = byte_reversed[((unsigned char *)&__b)[3]]; \ 313} 314 315#define PROBED_NM2070 0x01 316#define PROBED_NM2090 0x42 317#define PROBED_NM2093 0x43 318#define PROBED_NM2097 0x83 319#define PROBED_NM2160 0x44 320#define PROBED_NM2200 0x45 321