1
2/*
3 *                   XFree86 vbe module
4 *               Copyright 2000 Egbert Eich
5 *
6 * The mode query/save/set/restore functions from the vesa driver
7 * have been moved here.
8 * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com)
9 * Authors: Paulo César Pereira de Andrade <pcpa@conectiva.com.br>
10 */
11
12#ifndef _VBE_H
13#define _VBE_H
14#include "xf86int10.h"
15#include "xf86DDC.h"
16
17typedef enum {
18    DDC_UNCHECKED,
19    DDC_NONE,
20    DDC_1,
21    DDC_2,
22    DDC_1_2
23}
24ddc_lvl;
25
26typedef struct {
27    xf86Int10InfoPtr pInt10;
28    int version;
29    pointer memory;
30    int real_mode_base;
31    int num_pages;
32    Bool init_int10;
33    ddc_lvl ddc;
34    Bool ddc_blank;
35} vbeInfoRec, *vbeInfoPtr;
36
37#define VBE_VERSION_MAJOR(x) *((CARD8*)(&x) + 1)
38#define VBE_VERSION_MINOR(x) (CARD8)(x)
39
40extern _X_EXPORT vbeInfoPtr VBEInit(xf86Int10InfoPtr pInt, int entityIndex);
41extern _X_EXPORT vbeInfoPtr VBEExtendedInit(xf86Int10InfoPtr pInt, int entityIndex, int Flags);
42extern _X_EXPORT void vbeFree(vbeInfoPtr pVbe);
43extern _X_EXPORT xf86MonPtr vbeDoEDID(vbeInfoPtr pVbe, pointer pDDCModule);
44
45#pragma pack(1)
46
47typedef struct vbeControllerInfoBlock {
48    CARD8 VbeSignature[4];
49    CARD16 VbeVersion;
50    CARD32 OemStringPtr;
51    CARD8 Capabilities[4];
52    CARD32 VideoModePtr;
53    CARD16 TotalMem;
54    CARD16 OemSoftwareRev;
55    CARD32 OemVendorNamePtr;
56    CARD32 OemProductNamePtr;
57    CARD32 OemProductRevPtr;
58    CARD8  Scratch[222];
59    CARD8  OemData[256];
60} vbeControllerInfoRec, *vbeControllerInfoPtr;
61
62#if defined(__GNUC__) || defined(__USLC__) || defined(__SUNPRO_C)
63#pragma pack()	/* All GCC versions recognise this syntax */
64#else
65#pragma pack(0)
66#endif
67
68#if !( defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) )
69#define __attribute__(a)
70#endif
71
72typedef struct _VbeInfoBlock VbeInfoBlock;
73typedef struct _VbeModeInfoBlock VbeModeInfoBlock;
74typedef struct _VbeCRTCInfoBlock VbeCRTCInfoBlock;
75
76/*
77 * INT 0
78 */
79
80struct _VbeInfoBlock {
81    /* VESA 1.2 fields */
82    CARD8 VESASignature[4];		/* VESA */
83    CARD16 VESAVersion;			/* Higher byte major, lower byte minor */
84    /*CARD32*/char *OEMStringPtr;	/* Pointer to OEM string */
85    CARD8 Capabilities[4];		/* Capabilities of the video environment */
86
87    /*CARD32*/CARD16 *VideoModePtr;	/* pointer to supported Super VGA modes */
88
89    CARD16 TotalMemory;			/* Number of 64kb memory blocks on board */
90    /* if not VESA 2, 236 scratch bytes follow (256 bytes total size) */
91
92    /* VESA 2 fields */
93    CARD16 OemSoftwareRev;		/* VBE implementation Software revision */
94    /*CARD32*/char *OemVendorNamePtr;	/* Pointer to Vendor Name String */
95    /*CARD32*/char *OemProductNamePtr;	/* Pointer to Product Name String */
96    /*CARD32*/char *OemProductRevPtr;	/* Pointer to Product Revision String */
97    CARD8 Reserved[222];		/* Reserved for VBE implementation */
98    CARD8 OemData[256];			/* Data Area for OEM Strings */
99} __attribute__((packed));
100
101/* Return Super VGA Information */
102extern _X_EXPORT VbeInfoBlock *VBEGetVBEInfo(vbeInfoPtr pVbe);
103extern _X_EXPORT void VBEFreeVBEInfo(VbeInfoBlock *block);
104
105/*
106 * INT 1
107 */
108
109struct _VbeModeInfoBlock {
110    CARD16 ModeAttributes;		/* mode attributes */
111    CARD8 WinAAttributes;		/* window A attributes */
112    CARD8 WinBAttributes;		/* window B attributes */
113    CARD16 WinGranularity;		/* window granularity */
114    CARD16 WinSize;			/* window size */
115    CARD16 WinASegment;			/* window A start segment */
116    CARD16 WinBSegment;			/* window B start segment */
117    CARD32 WinFuncPtr;			/* real mode pointer to window function */
118    CARD16 BytesPerScanline;		/* bytes per scanline */
119
120    /* Mandatory information for VBE 1.2 and above */
121    CARD16 XResolution;			/* horizontal resolution in pixels or characters */
122    CARD16 YResolution;			/* vertical resolution in pixels or characters */
123    CARD8 XCharSize;			/* character cell width in pixels */
124    CARD8 YCharSize;			/* character cell height in pixels */
125    CARD8 NumberOfPlanes;		/* number of memory planes */
126    CARD8 BitsPerPixel;			/* bits per pixel */
127    CARD8 NumberOfBanks;		/* number of banks */
128    CARD8 MemoryModel;			/* memory model type */
129    CARD8 BankSize;			/* bank size in KB */
130    CARD8 NumberOfImages;		/* number of images */
131    CARD8 Reserved;	/* 1 */		/* reserved for page function */
132
133    /* Direct color fields (required for direct/6 and YUV/7 memory models) */
134    CARD8 RedMaskSize;			/* size of direct color red mask in bits */
135    CARD8 RedFieldPosition;		/* bit position of lsb of red mask */
136    CARD8 GreenMaskSize;		/* size of direct color green mask in bits */
137    CARD8 GreenFieldPosition;		/* bit position of lsb of green mask */
138    CARD8 BlueMaskSize;			/* size of direct color blue mask in bits */
139    CARD8 BlueFieldPosition;		/* bit position of lsb of blue mask */
140    CARD8 RsvdMaskSize;			/* size of direct color reserved mask in bits */
141    CARD8 RsvdFieldPosition;		/* bit position of lsb of reserved mask */
142    CARD8 DirectColorModeInfo;		/* direct color mode attributes */
143
144    /* Mandatory information for VBE 2.0 and above */
145    CARD32 PhysBasePtr;			/* physical address for flat memory frame buffer */
146    CARD32 Reserved32;	/* 0 */		/* Reserved - always set to 0 */
147    CARD16 Reserved16;	/* 0 */		/* Reserved - always set to 0 */
148
149    /* Mandatory information for VBE 3.0 and above */
150    CARD16 LinBytesPerScanLine;		/* bytes per scan line for linear modes */
151    CARD8 BnkNumberOfImagePages;	/* number of images for banked modes */
152    CARD8 LinNumberOfImagePages;	/* number of images for linear modes */
153    CARD8 LinRedMaskSize;		/* size of direct color red mask (linear modes) */
154    CARD8 LinRedFieldPosition;		/* bit position of lsb of red mask (linear modes) */
155    CARD8 LinGreenMaskSize;		/* size of direct color green mask (linear modes) */
156    CARD8 LinGreenFieldPosition;	/* bit position of lsb of green mask (linear modes) */
157    CARD8 LinBlueMaskSize;		/* size of direct color blue mask (linear modes) */
158    CARD8 LinBlueFieldPosition;		/* bit position of lsb of blue mask (linear modes) */
159    CARD8 LinRsvdMaskSize;		/* size of direct color reserved mask (linear modes) */
160    CARD8 LinRsvdFieldPosition;		/* bit position of lsb of reserved mask (linear modes) */
161    CARD32 MaxPixelClock;		/* maximum pixel clock (in Hz) for graphics mode */
162    CARD8 Reserved2[189];		/* remainder of VbeModeInfoBlock */
163} __attribute__((packed));
164
165/* Return VBE Mode Information */
166extern _X_EXPORT VbeModeInfoBlock *VBEGetModeInfo(vbeInfoPtr pVbe, int mode);
167extern _X_EXPORT void VBEFreeModeInfo(VbeModeInfoBlock *block);
168
169/*
170 * INT2
171 */
172
173#define CRTC_DBLSCAN	(1<<0)
174#define CRTC_INTERLACE	(1<<1)
175#define CRTC_NHSYNC	(1<<2)
176#define CRTC_NVSYNC	(1<<3)
177
178struct _VbeCRTCInfoBlock {
179    CARD16 HorizontalTotal;		/* Horizontal total in pixels */
180    CARD16 HorizontalSyncStart;		/* Horizontal sync start in pixels */
181    CARD16 HorizontalSyncEnd;		/* Horizontal sync end in pixels */
182    CARD16 VerticalTotal;		/* Vertical total in lines */
183    CARD16 VerticalSyncStart;		/* Vertical sync start in lines */
184    CARD16 VerticalSyncEnd;		/* Vertical sync end in lines */
185    CARD8 Flags;			/* Flags (Interlaced, Double Scan etc) */
186    CARD32 PixelClock;			/* Pixel clock in units of Hz */
187    CARD16 RefreshRate;			/* Refresh rate in units of 0.01 Hz */
188    CARD8 Reserved[40];			/* remainder of ModeInfoBlock */
189} __attribute__((packed));
190/* VbeCRTCInfoBlock is in the VESA 3.0 specs */
191
192extern _X_EXPORT Bool VBESetVBEMode(vbeInfoPtr pVbe, int mode, VbeCRTCInfoBlock *crtc);
193
194/*
195 * INT 3
196 */
197
198extern _X_EXPORT Bool VBEGetVBEMode(vbeInfoPtr pVbe, int *mode);
199
200/*
201 * INT 4
202 */
203
204/* Save/Restore Super VGA video state */
205/* function values are (values stored in VESAPtr):
206 *	0 := query & allocate amount of memory to save state
207 *	1 := save state
208 *	2 := restore state
209 *
210 *	function 0 called automatically if function 1 called without
211 *	a previous call to function 0.
212 */
213
214typedef enum {
215  MODE_QUERY,
216  MODE_SAVE,
217  MODE_RESTORE
218} vbeSaveRestoreFunction;
219
220extern _X_EXPORT Bool
221VBESaveRestore(vbeInfoPtr pVbe, vbeSaveRestoreFunction fuction,
222	       pointer *memory, int *size, int *real_mode_pages);
223
224/*
225 * INT 5
226 */
227
228extern _X_EXPORT Bool
229VBEBankSwitch(vbeInfoPtr pVbe, unsigned int iBank, int window);
230
231/*
232 * INT 6
233 */
234
235typedef enum {
236  SCANWID_SET,
237  SCANWID_GET,
238  SCANWID_SET_BYTES,
239  SCANWID_GET_MAX
240} vbeScanwidthCommand;
241
242#define VBESetLogicalScanline(pVbe, width)	\
243	VBESetGetLogicalScanlineLength(pVbe, SCANWID_SET, width, \
244					NULL, NULL, NULL)
245#define VBESetLogicalScanlineBytes(pVbe, width)	\
246	VBESetGetLogicalScanlineLength(pVbe, SCANWID_SET_BYTES, width, \
247					NULL, NULL, NULL)
248#define VBEGetLogicalScanline(pVbe, pixels, bytes, max)	\
249	VBESetGetLogicalScanlineLength(pVbe, SCANWID_GET, 0, \
250					pixels, bytes, max)
251#define VBEGetMaxLogicalScanline(pVbe, pixels, bytes, max)	\
252	VBESetGetLogicalScanlineLength(pVbe, SCANWID_GET_MAX, 0, \
253					pixels, bytes, max)
254extern _X_EXPORT Bool VBESetGetLogicalScanlineLength(vbeInfoPtr pVbe,
255				    vbeScanwidthCommand command, int width,
256				     int *pixels, int *bytes, int *max);
257
258/*
259 * INT 7
260 */
261
262/* 16 bit code */
263extern _X_EXPORT Bool VBESetDisplayStart(vbeInfoPtr pVbe, int x, int y, Bool wait_retrace);
264extern _X_EXPORT Bool VBEGetDisplayStart(vbeInfoPtr pVbe, int *x, int *y);
265
266/*
267 * INT 8
268 */
269
270/* if bits is 0, then it is a GET */
271extern _X_EXPORT int VBESetGetDACPaletteFormat(vbeInfoPtr pVbe, int bits);
272
273/*
274 * INT 9
275 */
276
277/*
278 *  If getting a palette, the data argument is not used. It will return
279 * the data.
280 *  If setting a palette, it will return the pointer received on success,
281 * NULL on failure.
282 */
283extern _X_EXPORT CARD32 *VBESetGetPaletteData(vbeInfoPtr pVbe, Bool set, int first, int num,
284			     CARD32 *data, Bool secondary, Bool wait_retrace);
285#define VBEFreePaletteData(data)	free(data)
286
287/*
288 * INT A
289 */
290
291typedef struct _VBEpmi {
292    int seg_tbl;
293    int tbl_off;
294    int tbl_len;
295} VBEpmi;
296
297extern _X_EXPORT VBEpmi *VBEGetVBEpmi(vbeInfoPtr pVbe);
298#define VESAFreeVBEpmi(pmi)	free(pmi)
299
300/* high level helper functions */
301
302typedef struct _vbeModeInfoRec {
303    int width;
304    int height;
305    int bpp;
306    int n;
307    struct _vbeModeInfoRec *next;
308} vbeModeInfoRec, *vbeModeInfoPtr;
309
310typedef struct {
311    CARD8 *state;
312    CARD8 *pstate;
313    int statePage;
314    int stateSize;
315    int stateMode;
316} vbeSaveRestoreRec, *vbeSaveRestorePtr;
317
318extern _X_EXPORT void
319VBEVesaSaveRestore(vbeInfoPtr pVbe, vbeSaveRestorePtr vbe_sr,
320		   vbeSaveRestoreFunction function);
321
322extern _X_EXPORT int VBEGetPixelClock(vbeInfoPtr pVbe, int mode, int Clock);
323extern _X_EXPORT Bool VBEDPMSSet(vbeInfoPtr pVbe, int mode);
324
325struct vbePanelID {
326    short hsize;
327    short vsize;
328    short fptype;
329    char redbpp;
330    char greenbpp;
331    char bluebpp;
332    char reservedbpp;
333    int reserved_offscreen_mem_size;
334    int reserved_offscreen_mem_pointer;
335    char reserved[14];
336};
337
338extern _X_EXPORT void VBEInterpretPanelID(int scrnIndex, struct vbePanelID *data);
339extern _X_EXPORT struct vbePanelID *VBEReadPanelID(vbeInfoPtr pVbe);
340
341#endif
342