1 2/* 3 * Copyright (c) 1997,1998 The XFree86 Project, Inc. 4 * 5 * Loosely based on code bearing the following copyright: 6 * 7 * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany. 8 * 9 * Author: Dirk Hohndel 10 */ 11 12#ifndef _VGAHW_H 13#define _VGAHW_H 14 15#include <X11/X.h> 16#include "misc.h" 17#include "input.h" 18#include "scrnintstr.h" 19#include "colormapst.h" 20 21#include "xf86str.h" 22#include "xf86Pci.h" 23 24#include "xf86DDC.h" 25 26#include "globals.h" 27#include <X11/extensions/dpmsconst.h> 28 29extern _X_EXPORT int vgaHWGetIndex(void); 30 31/* 32 * access macro 33 */ 34#define VGAHWPTR(p) ((vgaHWPtr)((p)->privates[vgaHWGetIndex()].ptr)) 35 36/* Standard VGA registers */ 37#define VGA_ATTR_INDEX 0x3C0 38#define VGA_ATTR_DATA_W 0x3C0 39#define VGA_ATTR_DATA_R 0x3C1 40#define VGA_IN_STAT_0 0x3C2 /* read */ 41#define VGA_MISC_OUT_W 0x3C2 /* write */ 42#define VGA_ENABLE 0x3C3 43#define VGA_SEQ_INDEX 0x3C4 44#define VGA_SEQ_DATA 0x3C5 45#define VGA_DAC_MASK 0x3C6 46#define VGA_DAC_READ_ADDR 0x3C7 47#define VGA_DAC_WRITE_ADDR 0x3C8 48#define VGA_DAC_DATA 0x3C9 49#define VGA_FEATURE_R 0x3CA /* read */ 50#define VGA_MISC_OUT_R 0x3CC /* read */ 51#define VGA_GRAPH_INDEX 0x3CE 52#define VGA_GRAPH_DATA 0x3CF 53 54#define VGA_IOBASE_MONO 0x3B0 55#define VGA_IOBASE_COLOR 0x3D0 56 57#define VGA_CRTC_INDEX_OFFSET 0x04 58#define VGA_CRTC_DATA_OFFSET 0x05 59#define VGA_IN_STAT_1_OFFSET 0x0A /* read */ 60#define VGA_FEATURE_W_OFFSET 0x0A /* write */ 61 62/* default number of VGA registers stored internally */ 63#define VGA_NUM_CRTC 25 64#define VGA_NUM_SEQ 5 65#define VGA_NUM_GFX 9 66#define VGA_NUM_ATTR 21 67 68/* Flags for vgaHWSave() and vgaHWRestore() */ 69#define VGA_SR_MODE 0x01 70#define VGA_SR_FONTS 0x02 71#define VGA_SR_CMAP 0x04 72#define VGA_SR_ALL (VGA_SR_MODE | VGA_SR_FONTS | VGA_SR_CMAP) 73 74/* Defaults for the VGA memory window */ 75#define VGA_DEFAULT_PHYS_ADDR 0xA0000 76#define VGA_DEFAULT_MEM_SIZE (64 * 1024) 77 78/* 79 * vgaRegRec contains settings of standard VGA registers. 80 */ 81typedef struct { 82 unsigned char MiscOutReg; /* */ 83 unsigned char *CRTC; /* Crtc Controller */ 84 unsigned char *Sequencer; /* Video Sequencer */ 85 unsigned char *Graphics; /* Video Graphics */ 86 unsigned char *Attribute; /* Video Attribute */ 87 unsigned char DAC[768]; /* Internal Colorlookuptable */ 88 unsigned char numCRTC; /* number of CRTC registers, def=VGA_NUM_CRTC */ 89 unsigned char numSequencer; /* number of seq registers, def=VGA_NUM_SEQ */ 90 unsigned char numGraphics; /* number of gfx registers, def=VGA_NUM_GFX */ 91 unsigned char numAttribute; /* number of attr registers, def=VGA_NUM_ATTR */ 92} vgaRegRec, *vgaRegPtr; 93 94typedef struct _vgaHWRec *vgaHWPtr; 95 96typedef void (*vgaHWWriteIndexProcPtr) (vgaHWPtr hwp, CARD8 indx, CARD8 value); 97typedef CARD8 (*vgaHWReadIndexProcPtr) (vgaHWPtr hwp, CARD8 indx); 98typedef void (*vgaHWWriteProcPtr) (vgaHWPtr hwp, CARD8 value); 99typedef CARD8 (*vgaHWReadProcPtr) (vgaHWPtr hwp); 100typedef void (*vgaHWMiscProcPtr) (vgaHWPtr hwp); 101 102/* 103 * vgaHWRec contains per-screen information required by the vgahw module. 104 * 105 * Note, the palette referred to by the paletteEnabled, enablePalette and 106 * disablePalette is the 16-entry (+overscan) EGA-compatible palette accessed 107 * via the first 17 attribute registers and not the main 8-bit palette. 108 */ 109typedef struct _vgaHWRec { 110 void *Base; /* Address of "VGA" memory */ 111 int MapSize; /* Size of "VGA" memory */ 112 unsigned long MapPhys; /* phys location of VGA mem */ 113 int IOBase; /* I/O Base address */ 114 CARD8 *MMIOBase; /* Pointer to MMIO start */ 115 int MMIOOffset; /* base + offset + vgareg 116 = mmioreg */ 117 void *FontInfo1; /* save area for fonts in 118 plane 2 */ 119 void *FontInfo2; /* save area for fonts in 120 plane 3 */ 121 void *TextInfo; /* save area for text */ 122 vgaRegRec SavedReg; /* saved registers */ 123 vgaRegRec ModeReg; /* register settings for 124 current mode */ 125 Bool ShowOverscan; 126 Bool paletteEnabled; 127 Bool cmapSaved; 128 ScrnInfoPtr pScrn; 129 vgaHWWriteIndexProcPtr writeCrtc; 130 vgaHWReadIndexProcPtr readCrtc; 131 vgaHWWriteIndexProcPtr writeGr; 132 vgaHWReadIndexProcPtr readGr; 133 vgaHWReadProcPtr readST00; 134 vgaHWReadProcPtr readST01; 135 vgaHWReadProcPtr readFCR; 136 vgaHWWriteProcPtr writeFCR; 137 vgaHWWriteIndexProcPtr writeAttr; 138 vgaHWReadIndexProcPtr readAttr; 139 vgaHWWriteIndexProcPtr writeSeq; 140 vgaHWReadIndexProcPtr readSeq; 141 vgaHWWriteProcPtr writeMiscOut; 142 vgaHWReadProcPtr readMiscOut; 143 vgaHWMiscProcPtr enablePalette; 144 vgaHWMiscProcPtr disablePalette; 145 vgaHWWriteProcPtr writeDacMask; 146 vgaHWReadProcPtr readDacMask; 147 vgaHWWriteProcPtr writeDacWriteAddr; 148 vgaHWWriteProcPtr writeDacReadAddr; 149 vgaHWWriteProcPtr writeDacData; 150 vgaHWReadProcPtr readDacData; 151 void *ddc; 152 struct pci_io_handle *io; 153 vgaHWReadProcPtr readEnable; 154 vgaHWWriteProcPtr writeEnable; 155 struct pci_device *dev; 156} vgaHWRec; 157 158/* Some macros that VGA drivers can use in their ChipProbe() function */ 159#define OVERSCAN 0x11 /* Index of OverScan register */ 160 161/* Flags that define how overscan correction should take place */ 162#define KGA_FIX_OVERSCAN 1 /* overcan correction required */ 163#define KGA_ENABLE_ON_ZERO 2 /* if possible enable display at beginning */ 164 /* of next scanline/frame */ 165#define KGA_BE_TOT_DEC 4 /* always fix problem by setting blank end */ 166 /* to total - 1 */ 167#define BIT_PLANE 3 /* Which plane we write to in mono mode */ 168#define BITS_PER_GUN 6 169#define COLORMAP_SIZE 256 170 171#if defined(__powerpc__) || defined(__arm__) || defined(__mips__) || defined(__s390__) || defined(__nds32__) 172#define DACDelay(hw) /* No legacy VGA support */ 173#else 174#define DACDelay(hw) \ 175 do { \ 176 (hw)->readST01((hw)); \ 177 (hw)->readST01((hw)); \ 178 } while (0) 179#endif 180 181/* Function Prototypes */ 182 183/* vgaHW.c */ 184 185typedef void vgaHWProtectProc(ScrnInfoPtr, Bool); 186typedef void vgaHWBlankScreenProc(ScrnInfoPtr, Bool); 187 188extern _X_EXPORT void vgaHWSetStdFuncs(vgaHWPtr hwp); 189extern _X_EXPORT void vgaHWSetMmioFuncs(vgaHWPtr hwp, CARD8 *base, int offset); 190extern _X_EXPORT void vgaHWProtect(ScrnInfoPtr pScrn, Bool on); 191extern _X_EXPORT vgaHWProtectProc *vgaHWProtectWeak(void); 192extern _X_EXPORT Bool vgaHWSaveScreen(ScreenPtr pScreen, int mode); 193extern _X_EXPORT void vgaHWBlankScreen(ScrnInfoPtr pScrn, Bool on); 194extern _X_EXPORT vgaHWBlankScreenProc *vgaHWBlankScreenWeak(void); 195extern _X_EXPORT void vgaHWSeqReset(vgaHWPtr hwp, Bool start); 196extern _X_EXPORT void vgaHWRestoreFonts(ScrnInfoPtr scrninfp, 197 vgaRegPtr restore); 198extern _X_EXPORT void vgaHWRestoreMode(ScrnInfoPtr scrninfp, vgaRegPtr restore); 199extern _X_EXPORT void vgaHWRestoreColormap(ScrnInfoPtr scrninfp, 200 vgaRegPtr restore); 201extern _X_EXPORT void vgaHWRestore(ScrnInfoPtr scrninfp, vgaRegPtr restore, 202 int flags); 203extern _X_EXPORT void vgaHWSaveFonts(ScrnInfoPtr scrninfp, vgaRegPtr save); 204extern _X_EXPORT void vgaHWSaveMode(ScrnInfoPtr scrninfp, vgaRegPtr save); 205extern _X_EXPORT void vgaHWSaveColormap(ScrnInfoPtr scrninfp, vgaRegPtr save); 206extern _X_EXPORT void vgaHWSave(ScrnInfoPtr scrninfp, vgaRegPtr save, 207 int flags); 208extern _X_EXPORT Bool vgaHWInit(ScrnInfoPtr scrnp, DisplayModePtr mode); 209extern _X_EXPORT Bool vgaHWSetRegCounts(ScrnInfoPtr scrp, int numCRTC, 210 int numSequencer, int numGraphics, 211 int numAttribute); 212extern _X_EXPORT Bool vgaHWCopyReg(vgaRegPtr dst, vgaRegPtr src); 213extern _X_EXPORT Bool vgaHWGetHWRec(ScrnInfoPtr scrp); 214extern _X_EXPORT void vgaHWFreeHWRec(ScrnInfoPtr scrp); 215extern _X_EXPORT Bool vgaHWMapMem(ScrnInfoPtr scrp); 216extern _X_EXPORT void vgaHWUnmapMem(ScrnInfoPtr scrp); 217extern _X_EXPORT void vgaHWGetIOBase(vgaHWPtr hwp); 218extern _X_EXPORT void vgaHWLock(vgaHWPtr hwp); 219extern _X_EXPORT void vgaHWUnlock(vgaHWPtr hwp); 220extern _X_EXPORT void vgaHWEnable(vgaHWPtr hwp); 221extern _X_EXPORT void vgaHWDisable(vgaHWPtr hwp); 222extern _X_EXPORT void vgaHWDPMSSet(ScrnInfoPtr pScrn, int PowerManagementMode, 223 int flags); 224extern _X_EXPORT Bool vgaHWHandleColormaps(ScreenPtr pScreen); 225extern _X_EXPORT void vgaHWddc1SetSpeed(ScrnInfoPtr pScrn, xf86ddcSpeed speed); 226extern _X_EXPORT CARD32 vgaHWHBlankKGA(DisplayModePtr mode, vgaRegPtr regp, 227 int nBits, unsigned int Flags); 228extern _X_EXPORT CARD32 vgaHWVBlankKGA(DisplayModePtr mode, vgaRegPtr regp, 229 int nBits, unsigned int Flags); 230extern _X_EXPORT Bool vgaHWAllocDefaultRegs(vgaRegPtr regp); 231 232extern _X_EXPORT DDC1SetSpeedProc vgaHWddc1SetSpeedWeak(void); 233extern _X_EXPORT SaveScreenProcPtr vgaHWSaveScreenWeak(void); 234extern _X_EXPORT void xf86GetClocks(ScrnInfoPtr pScrn, int num, 235 Bool (*ClockFunc) (ScrnInfoPtr, int), 236 void (*ProtectRegs) (ScrnInfoPtr, Bool), 237 void (*BlankScreen) (ScrnInfoPtr, Bool), 238 unsigned long vertsyncreg, int maskval, 239 int knownclkindex, int knownclkvalue); 240 241#endif /* _VGAHW_H */ 242