ct_driver.h revision d51ac6bd
1c06b6b69Smrg/* 2c06b6b69Smrg * Modified 1996 by Egbert Eich <eich@xfree86.org> 3c06b6b69Smrg * Modified 1996 by David Bateman <dbateman@club-internet.fr> 4c06b6b69Smrg * 5c06b6b69Smrg * Permission to use, copy, modify, distribute, and sell this software and its 6c06b6b69Smrg * documentation for any purpose is hereby granted without fee, provided that 7c06b6b69Smrg * the above copyright notice appear in all copies and that both that 8c06b6b69Smrg * copyright notice and this permission notice appear in supporting 9c06b6b69Smrg * documentation, and that the name of the authors not be used in 10c06b6b69Smrg * advertising or publicity pertaining to distribution of the software without 11c06b6b69Smrg * specific, written prior permission. The authors makes no representations 12c06b6b69Smrg * about the suitability of this software for any purpose. It is provided 13c06b6b69Smrg * "as is" without express or implied warranty. 14c06b6b69Smrg * 15c06b6b69Smrg * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 16c06b6b69Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 17c06b6b69Smrg * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 18c06b6b69Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 19c06b6b69Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 20c06b6b69Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 21c06b6b69Smrg * PERFORMANCE OF THIS SOFTWARE. 22c06b6b69Smrg */ 23c06b6b69Smrg 24c06b6b69Smrg 25c06b6b69Smrg 26c06b6b69Smrg#ifndef _CT_DRIVER_H_ 27c06b6b69Smrg#define _CT_DRIVER_H_ 28c06b6b69Smrg 299f4658d1Smrg#include "ct_pcirename.h" 30d51ac6bdSmrg#ifdef HAVE_XAA_H 31c06b6b69Smrg#include "xaa.h" 32c06b6b69Smrg#include "xaalocal.h" /* XAA internals as we replace some of XAA */ 33d51ac6bdSmrg#endif 34d51ac6bdSmrg#include "vbe.h" 35c06b6b69Smrg#include "xf86Cursor.h" 36c06b6b69Smrg#include "xf86i2c.h" 37c06b6b69Smrg#include "xf86DDC.h" 38c06b6b69Smrg#include "xf86xv.h" 39c06b6b69Smrg#include "vgaHW.h" 40c06b6b69Smrg#include <string.h> 419f4658d1Smrg#include <unistd.h> 42c06b6b69Smrg 43d51ac6bdSmrg#include "compat-api.h" 44d51ac6bdSmrg 45c06b6b69Smrg/* Supported chipsets */ 46c06b6b69Smrgtypedef enum { 47c06b6b69Smrg CHIPS_CT65520, 48c06b6b69Smrg CHIPS_CT65525, 49c06b6b69Smrg CHIPS_CT65530, 50c06b6b69Smrg CHIPS_CT65535, 51c06b6b69Smrg CHIPS_CT65540, 52c06b6b69Smrg CHIPS_CT65545, 53c06b6b69Smrg CHIPS_CT65546, 54c06b6b69Smrg CHIPS_CT65548, 55c06b6b69Smrg CHIPS_CT65550, 56c06b6b69Smrg CHIPS_CT65554, 57c06b6b69Smrg CHIPS_CT65555, 58c06b6b69Smrg CHIPS_CT68554, 59c06b6b69Smrg CHIPS_CT69000, 60c06b6b69Smrg CHIPS_CT69030, 61c06b6b69Smrg CHIPS_CT64200, 62c06b6b69Smrg CHIPS_CT64300 63c06b6b69Smrg} CHIPSType; 64c06b6b69Smrg 65c06b6b69Smrg/* Clock related */ 66c06b6b69Smrgtypedef struct { 67c06b6b69Smrg unsigned char msr; /* Dot Clock Related */ 68c06b6b69Smrg unsigned char fcr; 69c06b6b69Smrg unsigned char xr02; 70c06b6b69Smrg unsigned char xr03; 71c06b6b69Smrg unsigned char xr33; 72c06b6b69Smrg unsigned char xr54; 73c06b6b69Smrg unsigned char fr03; 74c06b6b69Smrg int Clock; 75c06b6b69Smrg int FPClock; 76c06b6b69Smrg} CHIPSClockReg, *CHIPSClockPtr; 77c06b6b69Smrg 78c06b6b69Smrgtypedef struct { 79c06b6b69Smrg unsigned int ProbedClk; 80c06b6b69Smrg unsigned int Max; /* Memory Clock Related */ 81c06b6b69Smrg unsigned int Clk; 82c06b6b69Smrg unsigned char M; 83c06b6b69Smrg unsigned char N; 84c06b6b69Smrg unsigned char P; 85c06b6b69Smrg unsigned char PSN; 86c06b6b69Smrg unsigned char xrCC; 87c06b6b69Smrg unsigned char xrCD; 88c06b6b69Smrg unsigned char xrCE; 89c06b6b69Smrg} CHIPSMemClockReg, *CHIPSMemClockPtr; 90c06b6b69Smrg 91c06b6b69Smrg#define TYPE_HW 0x01 92c06b6b69Smrg#define TYPE_PROGRAMMABLE 0x02 93c06b6b69Smrg#define GET_TYPE 0x0F 94c06b6b69Smrg#define OLD_STYLE 0x10 95c06b6b69Smrg#define NEW_STYLE 0x20 96c06b6b69Smrg#define HiQV_STYLE 0x30 97c06b6b69Smrg#define WINGINE_1_STYLE 0x40 /* 64300: external clock; 4 clocks */ 98c06b6b69Smrg#define WINGINE_2_STYLE 0x50 /* 64300: internal clock; 2 hw-clocks */ 99c06b6b69Smrg#define GET_STYLE 0xF0 100c06b6b69Smrg#define LCD_TEXT_CLK_FREQ 25000 /* lcd textclock if TYPE_PROGRAMMABLE */ 101c06b6b69Smrg#define CRT_TEXT_CLK_FREQ 28322 /* crt textclock if TYPE_PROGRAMMABLE */ 102c06b6b69Smrg#define Fref 14318180 /* The reference clock in Hertz */ 103c06b6b69Smrg 104c06b6b69Smrg/* The capability flags for the C&T chipsets */ 105c06b6b69Smrg#define ChipsLinearSupport 0x00000001 106c06b6b69Smrg#define ChipsAccelSupport 0x00000002 107c06b6b69Smrg#define ChipsFullMMIOSupport 0x00000004 108c06b6b69Smrg#define ChipsMMIOSupport 0x00000008 109c06b6b69Smrg#define ChipsHDepthSupport 0x00000010 110c06b6b69Smrg#define ChipsDPMSSupport 0x00000020 111c06b6b69Smrg#define ChipsTMEDSupport 0x00000040 112c06b6b69Smrg#define ChipsGammaSupport 0x00000080 113c06b6b69Smrg#define ChipsVideoSupport 0x00000100 114c06b6b69Smrg#define ChipsDualChannelSupport 0x00000200 115c06b6b69Smrg#define ChipsDualRefresh 0x00000400 116c06b6b69Smrg#define Chips64BitMemory 0x00000800 117c06b6b69Smrg 118c06b6b69Smrg/* Options flags for the C&T chipsets */ 119c06b6b69Smrg#define ChipsHWCursor 0x00001000 120c06b6b69Smrg#define ChipsShadowFB 0x00002000 121c06b6b69Smrg#define ChipsUseNewFB 0x00008000 122c06b6b69Smrg 123c06b6b69Smrg/* Architecture type flags */ 124c06b6b69Smrg#define ChipsHiQV 0x00010000 125c06b6b69Smrg#define ChipsWingine 0x00020000 126c06b6b69Smrg#define IS_Wingine(x) ((x->Flags) & ChipsWingine) 127c06b6b69Smrg#define IS_HiQV(x) ((x->Flags) & ChipsHiQV) 128c06b6b69Smrg 129c06b6b69Smrg/* Acceleration flags for the C&T chipsets */ 130c06b6b69Smrg#define ChipsColorTransparency 0x0100000 131c06b6b69Smrg#define ChipsImageReadSupport 0x0200000 132c06b6b69Smrg 133c06b6b69Smrg/* Overlay Transparency Key */ 134c06b6b69Smrg#define TRANSPARENCY_KEY 255 135c06b6b69Smrg 136c06b6b69Smrg/* Flag Bus Types */ 137c06b6b69Smrg#define ChipsUnknown 0 138c06b6b69Smrg#define ChipsISA 1 139c06b6b69Smrg#define ChipsVLB 2 140c06b6b69Smrg#define ChipsPCI 3 141c06b6b69Smrg#define ChipsCPUDirect 4 142c06b6b69Smrg#define ChipsPIB 5 143c06b6b69Smrg#define ChipsMCB 6 144c06b6b69Smrg 145c06b6b69Smrg/* Macro's to select the 32 bit acceleration registers */ 146c06b6b69Smrg#define DR(x) cPtr->Regs32[x] /* For CT655xx naming scheme */ 147c06b6b69Smrg#define MR(x) cPtr->Regs32[x] /* CT655xx MMIO naming scheme */ 148c06b6b69Smrg#define BR(x) cPtr->Regs32[x] /* For HiQV naming scheme */ 149c06b6b69Smrg#define MMIOmeml(x) *(CARD32 *)(cPtr->MMIOBase + (x)) 150c06b6b69Smrg#if 0 151c06b6b69Smrg#define MMIOmemw(x) *(CARD16 *)(cPtr->MMIOBase + (x)) 152c06b6b69Smrg#endif 153c06b6b69Smrg/* Monitor or flat panel type flags */ 154c06b6b69Smrg#define ChipsCRT 0x0010 155c06b6b69Smrg#define ChipsLCD 0x1000 156c06b6b69Smrg#define ChipsLCDProbed 0x2000 157c06b6b69Smrg#define ChipsTFT 0x0100 158c06b6b69Smrg#define ChipsDS 0x0200 159c06b6b69Smrg#define ChipsDD 0x0400 160c06b6b69Smrg#define ChipsSS 0x0800 161c06b6b69Smrg#define IS_STN(x) ((x) & 0xE00) 162c06b6b69Smrg 163c06b6b69Smrg/* Dual channel register enable masks */ 164c06b6b69Smrg#define IOSS_MASK 0xE0 165c06b6b69Smrg#define IOSS_BOTH 0x13 166c06b6b69Smrg#define IOSS_PIPE_A 0x11 167c06b6b69Smrg#define IOSS_PIPE_B 0x1E 168c06b6b69Smrg#define MSS_MASK 0xF0 169c06b6b69Smrg#define MSS_BOTH 0x0B 170c06b6b69Smrg#define MSS_PIPE_A 0x02 171c06b6b69Smrg#define MSS_PIPE_B 0x05 172c06b6b69Smrg/* Aggregate value of MSS shadow bits -GHB */ 173c06b6b69Smrg#define MSS_SHADOW 0x07 174c06b6b69Smrg 175c06b6b69Smrg/* Storage for the registers of the C&T chipsets */ 176c06b6b69Smrgtypedef struct { 177c06b6b69Smrg unsigned char XR[0xFF]; 178c06b6b69Smrg unsigned char CR[0x80]; 179c06b6b69Smrg unsigned char FR[0x80]; 180c06b6b69Smrg unsigned char MR[0x80]; 181c06b6b69Smrg CHIPSClockReg Clock; 182c06b6b69Smrg} CHIPSRegRec, *CHIPSRegPtr; 183c06b6b69Smrg 184c06b6b69Smrg/* Storage for the flat panel size */ 185c06b6b69Smrgtypedef struct { 186c06b6b69Smrg int HDisplay; 187c06b6b69Smrg int HRetraceStart; 188c06b6b69Smrg int HRetraceEnd; 189c06b6b69Smrg int HTotal; 190c06b6b69Smrg int VDisplay; 191c06b6b69Smrg int VRetraceStart; 192c06b6b69Smrg int VTotal; 193c06b6b69Smrg} CHIPSPanelSizeRec, *CHIPSPanelSizePtr; 194c06b6b69Smrg 195c06b6b69Smrg/* Some variables needed in the XAA acceleration */ 196c06b6b69Smrgtypedef struct { 197c06b6b69Smrg /* General variable */ 198c06b6b69Smrg unsigned int CommandFlags; 199c06b6b69Smrg unsigned int BytesPerPixel; 200c06b6b69Smrg unsigned int BitsPerPixel; 201c06b6b69Smrg unsigned int FbOffset; 202c06b6b69Smrg unsigned int PitchInBytes; 203c06b6b69Smrg unsigned int ScratchAddress; 204c06b6b69Smrg /* 64k for color expansion and imagewrites */ 205c06b6b69Smrg unsigned char * BltDataWindow; 206c06b6b69Smrg /* Hardware cursor address */ 207c06b6b69Smrg unsigned int CursorAddress; 208c06b6b69Smrg Bool UseHWCursor; 209c06b6b69Smrg /* Boundaries of the pixmap cache */ 210c06b6b69Smrg unsigned int CacheStart; 211c06b6b69Smrg unsigned int CacheEnd; 212c06b6b69Smrg /* Storage for pattern mask */ 213c06b6b69Smrg int planemask; 214c06b6b69Smrg /* Storage for foreground and background color */ 215c06b6b69Smrg int fgColor; 216c06b6b69Smrg int bgColor; 217c06b6b69Smrg /* For the 8x8 pattern fills */ 218c06b6b69Smrg int patternyrot; 219c06b6b69Smrg /* For cached stipple fills */ 220c06b6b69Smrg int SlotWidth; 221c06b6b69Smrg /* Variables for the 24bpp fill */ 222c06b6b69Smrg unsigned char fgpixel; 223c06b6b69Smrg unsigned char bgpixel; 224c06b6b69Smrg unsigned char xorpixel; 225c06b6b69Smrg Bool fastfill; 226c06b6b69Smrg Bool rgb24equal; 227c06b6b69Smrg int fillindex; 228c06b6b69Smrg unsigned int width24bpp; 229c06b6b69Smrg unsigned int color24bpp; 230c06b6b69Smrg unsigned int rop24bpp; 231c06b6b69Smrg} CHIPSACLRec, *CHIPSACLPtr; 232c06b6b69Smrg#define CHIPSACLPTR(p) &((CHIPSPtr)((p)->driverPrivate))->Accel 233c06b6b69Smrg 234c06b6b69Smrg/* Storage for some register values that are messed up by suspend/resumes */ 235c06b6b69Smrgtypedef struct { 236c06b6b69Smrg unsigned char xr02; 237c06b6b69Smrg unsigned char xr03; 238c06b6b69Smrg unsigned char xr14; 239c06b6b69Smrg unsigned char xr15; 240c06b6b69Smrg unsigned char vgaIOBaseFlag; 241c06b6b69Smrg} CHIPSSuspendHackRec, *CHIPSSuspendHackPtr; 242c06b6b69Smrg 243c06b6b69Smrg/* The functions to access the C&T extended registers */ 244c06b6b69Smrgtypedef struct _CHIPSRec *CHIPSPtr; 245c06b6b69Smrgtypedef CARD8 (*chipsReadXRPtr)(CHIPSPtr cPtr, CARD8 index); 246c06b6b69Smrgtypedef void (*chipsWriteXRPtr)(CHIPSPtr cPtr, CARD8 index, CARD8 value); 247c06b6b69Smrgtypedef CARD8 (*chipsReadFRPtr)(CHIPSPtr cPtr, CARD8 index); 248c06b6b69Smrgtypedef void (*chipsWriteFRPtr)(CHIPSPtr cPtr, CARD8 index, CARD8 value); 249c06b6b69Smrgtypedef CARD8 (*chipsReadMRPtr)(CHIPSPtr cPtr, CARD8 index); 250c06b6b69Smrgtypedef void (*chipsWriteMRPtr)(CHIPSPtr cPtr, CARD8 index, CARD8 value); 251c06b6b69Smrgtypedef CARD8 (*chipsReadMSSPtr)(CHIPSPtr cPtr); 252c06b6b69Smrgtypedef void (*chipsWriteMSSPtr)(CHIPSPtr cPtr, vgaHWPtr hwp, CARD8 value); 253c06b6b69Smrgtypedef CARD8 (*chipsReadIOSSPtr)(CHIPSPtr cPtr); 254c06b6b69Smrgtypedef void (*chipsWriteIOSSPtr)(CHIPSPtr cPtr, CARD8 value); 255c06b6b69Smrg 256c06b6b69Smrg/* The privates of the C&T driver */ 257c06b6b69Smrg#define CHIPSPTR(p) ((CHIPSPtr)((p)->driverPrivate)) 258c06b6b69Smrg 259c06b6b69Smrg 260c06b6b69Smrgtypedef struct { 261c06b6b69Smrg int lastInstance; 262c06b6b69Smrg int refCount; 263c06b6b69Smrg CARD32 masterFbAddress; 264c06b6b69Smrg long masterFbMapSize; 265c06b6b69Smrg CARD32 slaveFbAddress; 266c06b6b69Smrg long slaveFbMapSize; 267c06b6b69Smrg int mastervideoRam; 268c06b6b69Smrg int slavevideoRam; 269c06b6b69Smrg Bool masterOpen; 270c06b6b69Smrg Bool slaveOpen; 271c06b6b69Smrg Bool masterActive; 272c06b6b69Smrg Bool slaveActive; 273c06b6b69Smrg} CHIPSEntRec, *CHIPSEntPtr; 274c06b6b69Smrg 275c06b6b69Smrg 276c06b6b69Smrgtypedef struct _CHIPSRec { 277c06b6b69Smrg pciVideoPtr PciInfo; 278d51ac6bdSmrg#ifndef XSERVER_LIBPCIACCESS 279c06b6b69Smrg PCITAG PciTag; 280d51ac6bdSmrg#endif 281c06b6b69Smrg int Chipset; 282c06b6b69Smrg EntityInfoPtr pEnt; 283d51ac6bdSmrg unsigned long PIOBase; 284d51ac6bdSmrg unsigned long IOAddress; 285c06b6b69Smrg unsigned long FbAddress; 286c06b6b69Smrg unsigned int IOBase; 287c06b6b69Smrg unsigned char * FbBase; 288c06b6b69Smrg unsigned char * MMIOBase; 289c06b6b69Smrg unsigned char * MMIOBaseVGA; 290c06b6b69Smrg unsigned char * MMIOBasePipeA; 291c06b6b69Smrg unsigned char * MMIOBasePipeB; 292c06b6b69Smrg long FbMapSize; 293c06b6b69Smrg unsigned char * ShadowPtr; 294c06b6b69Smrg int ShadowPitch; 295c06b6b69Smrg int Rotate; 296d51ac6bdSmrg void (*PointerMoved)(SCRN_ARG_TYPE arg, int x, int y); 297c06b6b69Smrg int FbOffset16; 298c06b6b69Smrg int FbSize16; 299c06b6b69Smrg OptionInfoPtr Options; 300c06b6b69Smrg CHIPSPanelSizeRec PanelSize; 301c06b6b69Smrg int FrameBufferSize; 302c06b6b69Smrg Bool SyncResetIgn; 303c06b6b69Smrg Bool UseMMIO; 304c06b6b69Smrg Bool UseFullMMIO; 305c06b6b69Smrg Bool UseDualChannel; 306c06b6b69Smrg int Monitor; 307c06b6b69Smrg int MinClock; 308c06b6b69Smrg int MaxClock; 309c06b6b69Smrg CHIPSClockReg SaveClock; /* Storage for ClockSelect */ 310c06b6b69Smrg CHIPSMemClockReg MemClock; 311c06b6b69Smrg unsigned char ClockType; 312c06b6b69Smrg unsigned char CRTClk[4]; 313c06b6b69Smrg unsigned char FPClk[4]; 314c06b6b69Smrg int FPclock; 315c06b6b69Smrg int FPclkInx; 316c06b6b69Smrg int CRTclkInx; 317c06b6b69Smrg Bool FPClkModified; 318c06b6b69Smrg int ClockMulFactor; 319c06b6b69Smrg int Rounding; 320c06b6b69Smrg CHIPSSuspendHackRec SuspendHack; 321c06b6b69Smrg CARD32 PanelType; 322c06b6b69Smrg CHIPSRegRec ModeReg; 323c06b6b69Smrg CHIPSRegRec SavedReg; 324c06b6b69Smrg CHIPSRegRec SavedReg2; 325c06b6b69Smrg vgaRegRec VgaSavedReg2; 326c06b6b69Smrg unsigned int * Regs32; 327c06b6b69Smrg unsigned int Flags; 328c06b6b69Smrg CARD32 Bus; 329d51ac6bdSmrg#ifdef HAVE_XAA_H 330c06b6b69Smrg XAAInfoRecPtr AccelInfoRec; 331d51ac6bdSmrg#endif 332c06b6b69Smrg xf86CursorInfoPtr CursorInfoRec; 333c06b6b69Smrg CHIPSACLRec Accel; 334c06b6b69Smrg unsigned int HWCursorContents; 335c06b6b69Smrg Bool HWCursorShown; 336c06b6b69Smrg DGAModePtr DGAModes; 337c06b6b69Smrg int numDGAModes; 338c06b6b69Smrg Bool DGAactive; 339c06b6b69Smrg int DGAViewportStatus; 340c06b6b69Smrg CloseScreenProcPtr CloseScreen; 341c06b6b69Smrg ScreenBlockHandlerProcPtr BlockHandler; 342c06b6b69Smrg void (*VideoTimerCallback)(ScrnInfoPtr, Time); 343c06b6b69Smrg int videoKey; 344c06b6b69Smrg XF86VideoAdaptorPtr adaptor; 345c06b6b69Smrg int OverlaySkewX; 346c06b6b69Smrg int OverlaySkewY; 347c06b6b69Smrg int VideoZoomMax; 348c06b6b69Smrg Bool SecondCrtc; 349c06b6b69Smrg CHIPSEntPtr entityPrivate; 350c06b6b69Smrg unsigned char storeMSS; 351c06b6b69Smrg unsigned char storeIOSS; 3524cac844dSmacallan#ifdef __arm__ 353c06b6b69Smrg#ifdef __NetBSD__ 354c06b6b69Smrg int TVMode; 355c06b6b69Smrg#endif 356c06b6b69Smrg int Bank; 357c06b6b69Smrg#endif 358c06b6b69Smrg unsigned char ddc_mask; 359c06b6b69Smrg I2CBusPtr I2C; 360c06b6b69Smrg vbeInfoPtr pVbe; 361c06b6b69Smrg chipsReadXRPtr readXR; 362c06b6b69Smrg chipsWriteXRPtr writeXR; 363c06b6b69Smrg chipsReadFRPtr readFR; 364c06b6b69Smrg chipsWriteFRPtr writeFR; 365c06b6b69Smrg chipsReadMRPtr readMR; 366c06b6b69Smrg chipsWriteMRPtr writeMR; 367c06b6b69Smrg chipsReadMSSPtr readMSS; 368c06b6b69Smrg chipsWriteMSSPtr writeMSS; 369c06b6b69Smrg chipsReadIOSSPtr readIOSS; 370c06b6b69Smrg chipsWriteIOSSPtr writeIOSS; 371c06b6b69Smrg Bool cursorDelay; 372c06b6b69Smrg unsigned int viewportMask; 373c06b6b69Smrg Bool dualEndianAp; 374c06b6b69Smrg} CHIPSRec; 375c06b6b69Smrg 376c06b6b69Smrgtypedef struct _CHIPSi2c { 377c06b6b69Smrg unsigned char i2cClockBit; 378c06b6b69Smrg unsigned char i2cDataBit; 379c06b6b69Smrg CHIPSPtr cPtr; 380c06b6b69Smrg} CHIPSI2CRec, *CHIPSI2CPtr; 381c06b6b69Smrg 382c06b6b69Smrg/* External variables */ 383c06b6b69Smrgextern int ChipsAluConv[]; 384c06b6b69Smrgextern int ChipsAluConv2[]; 385c06b6b69Smrgextern int ChipsAluConv3[]; 386c06b6b69Smrgextern unsigned int ChipsReg32[]; 387c06b6b69Smrgextern unsigned int ChipsReg32HiQV[]; 388c06b6b69Smrg 389c06b6b69Smrg/* Prototypes */ 390c06b6b69Smrg 391d51ac6bdSmrgvoid CHIPSAdjustFrame(ADJUST_FRAME_ARGS_DECL); 392d51ac6bdSmrgBool CHIPSSwitchMode(SWITCH_MODE_ARGS_DECL); 393c06b6b69Smrg 394c06b6b69Smrg/* video */ 395c06b6b69Smrgvoid CHIPSInitVideo(ScreenPtr pScreen); 396c06b6b69Smrgvoid CHIPSResetVideo(ScrnInfoPtr pScrn); 397c06b6b69Smrg 398c06b6b69Smrg/* banking */ 399c06b6b69Smrgint CHIPSSetRead(ScreenPtr pScreen, int bank); 400c06b6b69Smrgint CHIPSSetWrite(ScreenPtr pScreen, int bank); 401c06b6b69Smrgint CHIPSSetReadWrite(ScreenPtr pScreen, int bank); 402c06b6b69Smrgint CHIPSSetReadPlanar(ScreenPtr pScreen, int bank); 403c06b6b69Smrgint CHIPSSetWritePlanar(ScreenPtr pScreen, int bank); 404c06b6b69Smrgint CHIPSSetReadWritePlanar(ScreenPtr pScreen, int bank); 405c06b6b69Smrgint CHIPSWINSetRead(ScreenPtr pScreen, int bank); 406c06b6b69Smrgint CHIPSWINSetWrite(ScreenPtr pScreen, int bank); 407c06b6b69Smrgint CHIPSWINSetReadWrite(ScreenPtr pScreen, int bank); 408c06b6b69Smrgint CHIPSWINSetReadPlanar(ScreenPtr pScreen, int bank); 409c06b6b69Smrgint CHIPSWINSetWritePlanar(ScreenPtr pScreen, int bank); 410c06b6b69Smrgint CHIPSWINSetReadWritePlanar(ScreenPtr pScreen, int bank); 411c06b6b69Smrgint CHIPSHiQVSetReadWrite(ScreenPtr pScreen, int bank); 412c06b6b69Smrgint CHIPSHiQVSetReadWritePlanar(ScreenPtr pScreen, int bank); 413c06b6b69Smrg 414c06b6b69Smrg/* acceleration */ 415c06b6b69SmrgBool CHIPSAccelInit(ScreenPtr pScreen); 416c06b6b69Smrgvoid CHIPSSync(ScrnInfoPtr pScrn); 417c06b6b69SmrgBool CHIPSMMIOAccelInit(ScreenPtr pScreen); 418c06b6b69Smrgvoid CHIPSMMIOSync(ScrnInfoPtr pScrn); 419c06b6b69SmrgBool CHIPSHiQVAccelInit(ScreenPtr pScreen); 420c06b6b69Smrgvoid CHIPSHiQVSync(ScrnInfoPtr pScrn); 421c06b6b69SmrgBool CHIPSCursorInit(ScreenPtr pScreen); 422c06b6b69Smrg 423c06b6b69Smrg/* register access functions */ 424c06b6b69Smrgvoid CHIPSSetStdExtFuncs(CHIPSPtr cPtr); 425c06b6b69Smrgvoid CHIPSSetMmioExtFuncs(CHIPSPtr cPtr); 426c06b6b69Smrgvoid CHIPSHWSetMmioFuncs(ScrnInfoPtr pScrn, CARD8 *base, int offset); 427c06b6b69Smrg 428c06b6b69Smrg/* ddc */ 429c06b6b69Smrgextern void chips_ddc1(ScrnInfoPtr pScrn); 430c06b6b69Smrgextern Bool chips_i2cInit(ScrnInfoPtr pScrn); 431c06b6b69Smrg 432c06b6b69Smrg/* dga */ 433c06b6b69SmrgBool CHIPSDGAInit(ScreenPtr pScreen); 434c06b6b69Smrg 435c06b6b69Smrg/* shadow fb */ 436c06b6b69Smrgvoid chipsRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 437c06b6b69Smrgvoid chipsRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 438c06b6b69Smrgvoid chipsRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 439c06b6b69Smrgvoid chipsRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 440c06b6b69Smrgvoid chipsRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 441d51ac6bdSmrgvoid chipsPointerMoved(SCRN_ARG_TYPE arg, int x, int y); 442c06b6b69Smrg 443c06b6b69Smrg#if X_BYTE_ORDER == X_BIG_ENDIAN 444c06b6b69Smrg# define BE_SWAP_APRETURE(pScrn,cPtr) \ 445c06b6b69Smrg ((pScrn->bitsPerPixel == 16) && cPtr->dualEndianAp) 446c06b6b69Smrg#endif 447c06b6b69Smrg 448c06b6b69Smrg/* 449c06b6b69Smrg * Some macros for switching display channels. NOTE... It appears that we 450c06b6b69Smrg * can't write to both display channels at the same time, and so the options 451c06b6b69Smrg * MSS_BOTH and IOSS_BOTH should not be used. Need to get around this by set 452c06b6b69Smrg * dual channel mode to pipe A by default and handling multiple channel writes 453c06b6b69Smrg * in ModeInit.. 454c06b6b69Smrg */ 455c06b6b69Smrg 456c06b6b69Smrg#define DUALOPEN \ 457c06b6b69Smrg { \ 458c06b6b69Smrg /* Set the IOSS/MSS registers to point to the right register set */ \ 459c06b6b69Smrg if (xf86IsEntityShared(pScrn->entityList[0])) { \ 460c06b6b69Smrg if (cPtr->SecondCrtc == TRUE) { \ 461c06b6b69Smrg cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) | \ 462c06b6b69Smrg IOSS_PIPE_B)); \ 463c06b6b69Smrg cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS & \ 464c06b6b69Smrg MSS_MASK) | MSS_PIPE_B)); \ 465c06b6b69Smrg cPtrEnt->slaveOpen = TRUE; \ 466c06b6b69Smrg cPtrEnt->slaveActive = TRUE; \ 467c06b6b69Smrg cPtrEnt->masterActive = FALSE; \ 468c06b6b69Smrg } else { \ 469c06b6b69Smrg cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) | \ 470c06b6b69Smrg IOSS_PIPE_A)); \ 471c06b6b69Smrg cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS & \ 472c06b6b69Smrg MSS_MASK) | MSS_PIPE_A)); \ 473c06b6b69Smrg cPtrEnt->masterOpen = TRUE; \ 474c06b6b69Smrg cPtrEnt->masterActive = TRUE; \ 475c06b6b69Smrg cPtrEnt->slaveActive = FALSE; \ 476c06b6b69Smrg } \ 477c06b6b69Smrg } else { \ 478c06b6b69Smrg cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) | \ 479c06b6b69Smrg IOSS_PIPE_A)); \ 480c06b6b69Smrg cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS & \ 481c06b6b69Smrg MSS_MASK) | MSS_PIPE_A)); \ 482c06b6b69Smrg } \ 483c06b6b69Smrg } 484c06b6b69Smrg 485c06b6b69Smrg#define DUALREOPEN \ 486c06b6b69Smrg { \ 487c06b6b69Smrg if (xf86IsEntityShared(pScrn->entityList[0])) { \ 488c06b6b69Smrg if (cPtr->SecondCrtc == TRUE) { \ 489c06b6b69Smrg if (! cPtrEnt->slaveActive) { \ 490c06b6b69Smrg cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) | \ 491c06b6b69Smrg IOSS_PIPE_B)); \ 492c06b6b69Smrg cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS & \ 493c06b6b69Smrg MSS_MASK) | MSS_PIPE_B)); \ 494c06b6b69Smrg cPtrEnt->slaveOpen = TRUE; \ 495c06b6b69Smrg cPtrEnt->slaveActive = TRUE; \ 496c06b6b69Smrg cPtrEnt->masterActive = FALSE; \ 497c06b6b69Smrg } \ 498c06b6b69Smrg } else { \ 499c06b6b69Smrg if (! cPtrEnt->masterActive) { \ 500c06b6b69Smrg cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) | \ 501c06b6b69Smrg IOSS_PIPE_A)); \ 502c06b6b69Smrg cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS & \ 503c06b6b69Smrg MSS_MASK) | MSS_PIPE_A)); \ 504c06b6b69Smrg cPtrEnt->masterOpen = TRUE; \ 505c06b6b69Smrg cPtrEnt->masterActive = TRUE; \ 506c06b6b69Smrg cPtrEnt->slaveActive = FALSE; \ 507c06b6b69Smrg } \ 508c06b6b69Smrg } \ 509c06b6b69Smrg } \ 510c06b6b69Smrg } 511c06b6b69Smrg 512c06b6b69Smrg#define DUALCLOSE \ 513c06b6b69Smrg { \ 514c06b6b69Smrg if (! xf86IsEntityShared(pScrn->entityList[0])) { \ 515c06b6b69Smrg cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) | \ 516c06b6b69Smrg IOSS_PIPE_A)); \ 517c06b6b69Smrg cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS & \ 518c06b6b69Smrg MSS_MASK) | MSS_PIPE_A)); \ 519c06b6b69Smrg chipsHWCursorOff(cPtr, pScrn); \ 520c06b6b69Smrg chipsRestore(pScrn, &(VGAHWPTR(pScrn))->SavedReg, \ 521c06b6b69Smrg &cPtr->SavedReg, TRUE); \ 522c06b6b69Smrg chipsLock(pScrn); \ 523c06b6b69Smrg cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) | \ 524c06b6b69Smrg IOSS_PIPE_B)); \ 525c06b6b69Smrg cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS & \ 526c06b6b69Smrg MSS_MASK) | MSS_PIPE_B)); \ 527c06b6b69Smrg chipsHWCursorOff(cPtr, pScrn); \ 528c06b6b69Smrg chipsRestore(pScrn, &cPtr->VgaSavedReg2, &cPtr->SavedReg2, TRUE); \ 529c06b6b69Smrg cPtr->writeIOSS(cPtr, cPtr->storeIOSS); \ 530c06b6b69Smrg cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), cPtr->storeMSS); \ 531c06b6b69Smrg chipsLock(pScrn); \ 532c06b6b69Smrg } else { \ 533c06b6b69Smrg chipsHWCursorOff(cPtr, pScrn); \ 534c06b6b69Smrg chipsRestore(pScrn, &(VGAHWPTR(pScrn))->SavedReg, &cPtr->SavedReg,\ 535c06b6b69Smrg TRUE); \ 536c06b6b69Smrg if (cPtr->SecondCrtc == TRUE) { \ 537c06b6b69Smrg cPtrEnt->slaveActive = FALSE; \ 538c06b6b69Smrg cPtrEnt->slaveOpen = FALSE; \ 539c06b6b69Smrg if (! cPtrEnt->masterActive) { \ 540c06b6b69Smrg cPtr->writeIOSS(cPtr, cPtr->storeIOSS); \ 541c06b6b69Smrg cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), cPtr->storeMSS); \ 542c06b6b69Smrg chipsLock(pScrn); \ 543c06b6b69Smrg } \ 544c06b6b69Smrg } else { \ 545c06b6b69Smrg cPtrEnt->masterActive = FALSE; \ 546c06b6b69Smrg cPtrEnt->masterOpen = FALSE; \ 547c06b6b69Smrg if (! cPtrEnt->slaveActive) { \ 548c06b6b69Smrg cPtr->writeIOSS(cPtr, cPtr->storeIOSS); \ 549c06b6b69Smrg cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), cPtr->storeMSS); \ 550c06b6b69Smrg chipsLock(pScrn); \ 551c06b6b69Smrg } \ 552c06b6b69Smrg } \ 553c06b6b69Smrg } \ 554c06b6b69Smrg } 555c06b6b69Smrg 556c06b6b69Smrg 557c06b6b69Smrg/* To aid debugging of 32 bit register access we make the following defines */ 558c06b6b69Smrg/* 559c06b6b69Smrg#define DEBUG 560c06b6b69Smrg#define CT_HW_DEBUG 561c06b6b69Smrg*/ 562c06b6b69Smrg#if defined(DEBUG) & defined(CT_HW_DEBUG) 563c06b6b69Smrg#define HW_DEBUG(x) {usleep(500000); ErrorF("Register/Address: 0x%X\n",x);} 564c06b6b69Smrg#else 565c06b6b69Smrg#define HW_DEBUG(x) 566c06b6b69Smrg#endif 567c06b6b69Smrg#endif 568