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