| 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 | |
| 29 | extern _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 | */ |
| 81 | typedef 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 Atribute */ |
| 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 | |
| 94 | typedef struct _vgaHWRec *vgaHWPtr; |
| 95 | |
| 96 | typedef void (*vgaHWWriteIndexProcPtr) (vgaHWPtr hwp, CARD8 indx, CARD8 value); |
| 97 | typedef CARD8 (*vgaHWReadIndexProcPtr) (vgaHWPtr hwp, CARD8 indx); |
| 98 | typedef void (*vgaHWWriteProcPtr) (vgaHWPtr hwp, CARD8 value); |
| 99 | typedef CARD8 (*vgaHWReadProcPtr) (vgaHWPtr hwp); |
| 100 | typedef 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 | */ |
| 109 | typedef struct _vgaHWRec { |
| 110 | pointer 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 | pointer FontInfo1; /* save area for fonts in |
| 118 | plane 2 */ |
| 119 | pointer FontInfo2; /* save area for fonts in |
| 120 | plane 3 */ |
| 121 | pointer 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 | pointer 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 | #define DACDelay(hw) \ |
| 172 | do { \ |
| 173 | (hw)->readST01((hw)); \ |
| 174 | (hw)->readST01((hw)); \ |
| 175 | } while (0) |
| 176 | |
| 177 | /* Function Prototypes */ |
| 178 | |
| 179 | /* vgaHW.c */ |
| 180 | |
| 181 | typedef void vgaHWProtectProc(ScrnInfoPtr, Bool); |
| 182 | typedef void vgaHWBlankScreenProc(ScrnInfoPtr, Bool); |
| 183 | |
| 184 | extern _X_EXPORT void vgaHWSetStdFuncs(vgaHWPtr hwp); |
| 185 | extern _X_EXPORT void vgaHWSetMmioFuncs(vgaHWPtr hwp, CARD8 *base, int offset); |
| 186 | extern _X_EXPORT void vgaHWProtect(ScrnInfoPtr pScrn, Bool on); |
| 187 | extern _X_EXPORT vgaHWProtectProc *vgaHWProtectWeak(void); |
| 188 | extern _X_EXPORT Bool vgaHWSaveScreen(ScreenPtr pScreen, int mode); |
| 189 | extern _X_EXPORT void vgaHWBlankScreen(ScrnInfoPtr pScrn, Bool on); |
| 190 | extern _X_EXPORT vgaHWBlankScreenProc *vgaHWBlankScreenWeak(void); |
| 191 | extern _X_EXPORT void vgaHWSeqReset(vgaHWPtr hwp, Bool start); |
| 192 | extern _X_EXPORT void vgaHWRestoreFonts(ScrnInfoPtr scrninfp, |
| 193 | vgaRegPtr restore); |
| 194 | extern _X_EXPORT void vgaHWRestoreMode(ScrnInfoPtr scrninfp, vgaRegPtr restore); |
| 195 | extern _X_EXPORT void vgaHWRestoreColormap(ScrnInfoPtr scrninfp, |
| 196 | vgaRegPtr restore); |
| 197 | extern _X_EXPORT void vgaHWRestore(ScrnInfoPtr scrninfp, vgaRegPtr restore, |
| 198 | int flags); |
| 199 | extern _X_EXPORT void vgaHWSaveFonts(ScrnInfoPtr scrninfp, vgaRegPtr save); |
| 200 | extern _X_EXPORT void vgaHWSaveMode(ScrnInfoPtr scrninfp, vgaRegPtr save); |
| 201 | extern _X_EXPORT void vgaHWSaveColormap(ScrnInfoPtr scrninfp, vgaRegPtr save); |
| 202 | extern _X_EXPORT void vgaHWSave(ScrnInfoPtr scrninfp, vgaRegPtr save, |
| 203 | int flags); |
| 204 | extern _X_EXPORT Bool vgaHWInit(ScrnInfoPtr scrnp, DisplayModePtr mode); |
| 205 | extern _X_EXPORT Bool vgaHWSetRegCounts(ScrnInfoPtr scrp, int numCRTC, |
| 206 | int numSequencer, int numGraphics, |
| 207 | int numAttribute); |
| 208 | extern _X_EXPORT Bool vgaHWCopyReg(vgaRegPtr dst, vgaRegPtr src); |
| 209 | extern _X_EXPORT Bool vgaHWGetHWRec(ScrnInfoPtr scrp); |
| 210 | extern _X_EXPORT void vgaHWFreeHWRec(ScrnInfoPtr scrp); |
| 211 | extern _X_EXPORT Bool vgaHWMapMem(ScrnInfoPtr scrp); |
| 212 | extern _X_EXPORT void vgaHWUnmapMem(ScrnInfoPtr scrp); |
| 213 | extern _X_EXPORT void vgaHWGetIOBase(vgaHWPtr hwp); |
| 214 | extern _X_EXPORT void vgaHWLock(vgaHWPtr hwp); |
| 215 | extern _X_EXPORT void vgaHWUnlock(vgaHWPtr hwp); |
| 216 | extern _X_EXPORT void vgaHWEnable(vgaHWPtr hwp); |
| 217 | extern _X_EXPORT void vgaHWDisable(vgaHWPtr hwp); |
| 218 | extern _X_EXPORT void vgaHWDPMSSet(ScrnInfoPtr pScrn, int PowerManagementMode, |
| 219 | int flags); |
| 220 | extern _X_EXPORT Bool vgaHWHandleColormaps(ScreenPtr pScreen); |
| 221 | extern _X_EXPORT void vgaHWddc1SetSpeed(ScrnInfoPtr pScrn, xf86ddcSpeed speed); |
| 222 | extern _X_EXPORT CARD32 vgaHWHBlankKGA(DisplayModePtr mode, vgaRegPtr regp, |
| 223 | int nBits, unsigned int Flags); |
| 224 | extern _X_EXPORT CARD32 vgaHWVBlankKGA(DisplayModePtr mode, vgaRegPtr regp, |
| 225 | int nBits, unsigned int Flags); |
| 226 | extern _X_EXPORT Bool vgaHWAllocDefaultRegs(vgaRegPtr regp); |
| 227 | |
| 228 | extern _X_EXPORT DDC1SetSpeedProc vgaHWddc1SetSpeedWeak(void); |
| 229 | extern _X_EXPORT SaveScreenProcPtr vgaHWSaveScreenWeak(void); |
| 230 | extern _X_EXPORT void xf86GetClocks(ScrnInfoPtr pScrn, int num, |
| 231 | Bool (*ClockFunc) (ScrnInfoPtr, int), |
| 232 | void (*ProtectRegs) (ScrnInfoPtr, Bool), |
| 233 | void (*BlankScreen) (ScrnInfoPtr, Bool), |
| 234 | unsigned long vertsyncreg, int maskval, |
| 235 | int knownclkindex, int knownclkvalue); |
| 236 | |
| 237 | #endif /* _VGAHW_H */ |