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