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