1706f2543Smrg
2706f2543Smrg/*
3706f2543Smrg *                   XFree86 vbe module
4706f2543Smrg *               Copyright 2000 Egbert Eich
5706f2543Smrg *
6706f2543Smrg * The mode query/save/set/restore functions from the vesa driver
7706f2543Smrg * have been moved here.
8706f2543Smrg * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com)
9706f2543Smrg * Authors: Paulo César Pereira de Andrade <pcpa@conectiva.com.br>
10706f2543Smrg */
11706f2543Smrg
12706f2543Smrg#ifndef _VBE_H
13706f2543Smrg#define _VBE_H
14706f2543Smrg#include "xf86int10.h"
15706f2543Smrg#include "xf86DDC.h"
16706f2543Smrg
17706f2543Smrgtypedef enum {
18706f2543Smrg    DDC_UNCHECKED,
19706f2543Smrg    DDC_NONE,
20706f2543Smrg    DDC_1,
21706f2543Smrg    DDC_2,
22706f2543Smrg    DDC_1_2
23706f2543Smrg}
24706f2543Smrgddc_lvl;
25706f2543Smrg
26706f2543Smrgtypedef struct {
27706f2543Smrg    xf86Int10InfoPtr pInt10;
28706f2543Smrg    int version;
29706f2543Smrg    pointer memory;
30706f2543Smrg    int real_mode_base;
31706f2543Smrg    int num_pages;
32706f2543Smrg    Bool init_int10;
33706f2543Smrg    ddc_lvl ddc;
34706f2543Smrg    Bool ddc_blank;
35706f2543Smrg} vbeInfoRec, *vbeInfoPtr;
36706f2543Smrg
37706f2543Smrg#define VBE_VERSION_MAJOR(x) *((CARD8*)(&x) + 1)
38706f2543Smrg#define VBE_VERSION_MINOR(x) (CARD8)(x)
39706f2543Smrg
40706f2543Smrgextern _X_EXPORT vbeInfoPtr VBEInit(xf86Int10InfoPtr pInt, int entityIndex);
41706f2543Smrgextern _X_EXPORT vbeInfoPtr VBEExtendedInit(xf86Int10InfoPtr pInt, int entityIndex, int Flags);
42706f2543Smrgextern _X_EXPORT void vbeFree(vbeInfoPtr pVbe);
43706f2543Smrgextern _X_EXPORT xf86MonPtr vbeDoEDID(vbeInfoPtr pVbe, pointer pDDCModule);
44706f2543Smrg
45706f2543Smrg#pragma pack(1)
46706f2543Smrg
47706f2543Smrgtypedef struct vbeControllerInfoBlock {
48706f2543Smrg    CARD8 VbeSignature[4];
49706f2543Smrg    CARD16 VbeVersion;
50706f2543Smrg    CARD32 OemStringPtr;
51706f2543Smrg    CARD8 Capabilities[4];
52706f2543Smrg    CARD32 VideoModePtr;
53706f2543Smrg    CARD16 TotalMem;
54706f2543Smrg    CARD16 OemSoftwareRev;
55706f2543Smrg    CARD32 OemVendorNamePtr;
56706f2543Smrg    CARD32 OemProductNamePtr;
57706f2543Smrg    CARD32 OemProductRevPtr;
58706f2543Smrg    CARD8  Scratch[222];
59706f2543Smrg    CARD8  OemData[256];
60706f2543Smrg} vbeControllerInfoRec, *vbeControllerInfoPtr;
61706f2543Smrg
62706f2543Smrg#if defined(__GNUC__) || defined(__USLC__) || defined(__SUNPRO_C)
63706f2543Smrg#pragma pack()	/* All GCC versions recognise this syntax */
64706f2543Smrg#else
65706f2543Smrg#pragma pack(0)
66706f2543Smrg#endif
67706f2543Smrg
68706f2543Smrg#if !( defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) )
69706f2543Smrg#define __attribute__(a)
70706f2543Smrg#endif
71706f2543Smrg
72706f2543Smrgtypedef struct _VbeInfoBlock VbeInfoBlock;
73706f2543Smrgtypedef struct _VbeModeInfoBlock VbeModeInfoBlock;
74706f2543Smrgtypedef struct _VbeCRTCInfoBlock VbeCRTCInfoBlock;
75706f2543Smrg
76706f2543Smrg/*
77706f2543Smrg * INT 0
78706f2543Smrg */
79706f2543Smrg
80706f2543Smrgstruct _VbeInfoBlock {
81706f2543Smrg    /* VESA 1.2 fields */
82706f2543Smrg    CARD8 VESASignature[4];		/* VESA */
83706f2543Smrg    CARD16 VESAVersion;			/* Higher byte major, lower byte minor */
84706f2543Smrg    /*CARD32*/char *OEMStringPtr;	/* Pointer to OEM string */
85706f2543Smrg    CARD8 Capabilities[4];		/* Capabilities of the video environment */
86706f2543Smrg
87706f2543Smrg    /*CARD32*/CARD16 *VideoModePtr;	/* pointer to supported Super VGA modes */
88706f2543Smrg
89706f2543Smrg    CARD16 TotalMemory;			/* Number of 64kb memory blocks on board */
90706f2543Smrg    /* if not VESA 2, 236 scratch bytes follow (256 bytes total size) */
91706f2543Smrg
92706f2543Smrg    /* VESA 2 fields */
93706f2543Smrg    CARD16 OemSoftwareRev;		/* VBE implementation Software revision */
94706f2543Smrg    /*CARD32*/char *OemVendorNamePtr;	/* Pointer to Vendor Name String */
95706f2543Smrg    /*CARD32*/char *OemProductNamePtr;	/* Pointer to Product Name String */
96706f2543Smrg    /*CARD32*/char *OemProductRevPtr;	/* Pointer to Product Revision String */
97706f2543Smrg    CARD8 Reserved[222];		/* Reserved for VBE implementation */
98706f2543Smrg    CARD8 OemData[256];			/* Data Area for OEM Strings */
99706f2543Smrg} __attribute__((packed));
100706f2543Smrg
101706f2543Smrg/* Return Super VGA Information */
102706f2543Smrgextern _X_EXPORT VbeInfoBlock *VBEGetVBEInfo(vbeInfoPtr pVbe);
103706f2543Smrgextern _X_EXPORT void VBEFreeVBEInfo(VbeInfoBlock *block);
104706f2543Smrg
105706f2543Smrg/*
106706f2543Smrg * INT 1
107706f2543Smrg */
108706f2543Smrg
109706f2543Smrgstruct _VbeModeInfoBlock {
110706f2543Smrg    CARD16 ModeAttributes;		/* mode attributes */
111706f2543Smrg    CARD8 WinAAttributes;		/* window A attributes */
112706f2543Smrg    CARD8 WinBAttributes;		/* window B attributes */
113706f2543Smrg    CARD16 WinGranularity;		/* window granularity */
114706f2543Smrg    CARD16 WinSize;			/* window size */
115706f2543Smrg    CARD16 WinASegment;			/* window A start segment */
116706f2543Smrg    CARD16 WinBSegment;			/* window B start segment */
117706f2543Smrg    CARD32 WinFuncPtr;			/* real mode pointer to window function */
118706f2543Smrg    CARD16 BytesPerScanline;		/* bytes per scanline */
119706f2543Smrg
120706f2543Smrg    /* Mandatory information for VBE 1.2 and above */
121706f2543Smrg    CARD16 XResolution;			/* horizontal resolution in pixels or characters */
122706f2543Smrg    CARD16 YResolution;			/* vertical resolution in pixels or characters */
123706f2543Smrg    CARD8 XCharSize;			/* character cell width in pixels */
124706f2543Smrg    CARD8 YCharSize;			/* character cell height in pixels */
125706f2543Smrg    CARD8 NumberOfPlanes;		/* number of memory planes */
126706f2543Smrg    CARD8 BitsPerPixel;			/* bits per pixel */
127706f2543Smrg    CARD8 NumberOfBanks;		/* number of banks */
128706f2543Smrg    CARD8 MemoryModel;			/* memory model type */
129706f2543Smrg    CARD8 BankSize;			/* bank size in KB */
130706f2543Smrg    CARD8 NumberOfImages;		/* number of images */
131706f2543Smrg    CARD8 Reserved;	/* 1 */		/* reserved for page function */
132706f2543Smrg
133706f2543Smrg    /* Direct color fields (required for direct/6 and YUV/7 memory models) */
134706f2543Smrg    CARD8 RedMaskSize;			/* size of direct color red mask in bits */
135706f2543Smrg    CARD8 RedFieldPosition;		/* bit position of lsb of red mask */
136706f2543Smrg    CARD8 GreenMaskSize;		/* size of direct color green mask in bits */
137706f2543Smrg    CARD8 GreenFieldPosition;		/* bit position of lsb of green mask */
138706f2543Smrg    CARD8 BlueMaskSize;			/* size of direct color blue mask in bits */
139706f2543Smrg    CARD8 BlueFieldPosition;		/* bit position of lsb of blue mask */
140706f2543Smrg    CARD8 RsvdMaskSize;			/* size of direct color reserved mask in bits */
141706f2543Smrg    CARD8 RsvdFieldPosition;		/* bit position of lsb of reserved mask */
142706f2543Smrg    CARD8 DirectColorModeInfo;		/* direct color mode attributes */
143706f2543Smrg
144706f2543Smrg    /* Mandatory information for VBE 2.0 and above */
145706f2543Smrg    CARD32 PhysBasePtr;			/* physical address for flat memory frame buffer */
146706f2543Smrg    CARD32 Reserved32;	/* 0 */		/* Reserved - always set to 0 */
147706f2543Smrg    CARD16 Reserved16;	/* 0 */		/* Reserved - always set to 0 */
148706f2543Smrg
149706f2543Smrg    /* Mandatory information for VBE 3.0 and above */
150706f2543Smrg    CARD16 LinBytesPerScanLine;		/* bytes per scan line for linear modes */
151706f2543Smrg    CARD8 BnkNumberOfImagePages;	/* number of images for banked modes */
152706f2543Smrg    CARD8 LinNumberOfImagePages;	/* number of images for linear modes */
153706f2543Smrg    CARD8 LinRedMaskSize;		/* size of direct color red mask (linear modes) */
154706f2543Smrg    CARD8 LinRedFieldPosition;		/* bit position of lsb of red mask (linear modes) */
155706f2543Smrg    CARD8 LinGreenMaskSize;		/* size of direct color green mask (linear modes) */
156706f2543Smrg    CARD8 LinGreenFieldPosition;	/* bit position of lsb of green mask (linear modes) */
157706f2543Smrg    CARD8 LinBlueMaskSize;		/* size of direct color blue mask (linear modes) */
158706f2543Smrg    CARD8 LinBlueFieldPosition;		/* bit position of lsb of blue mask (linear modes) */
159706f2543Smrg    CARD8 LinRsvdMaskSize;		/* size of direct color reserved mask (linear modes) */
160706f2543Smrg    CARD8 LinRsvdFieldPosition;		/* bit position of lsb of reserved mask (linear modes) */
161706f2543Smrg    CARD32 MaxPixelClock;		/* maximum pixel clock (in Hz) for graphics mode */
162706f2543Smrg    CARD8 Reserved2[189];		/* remainder of VbeModeInfoBlock */
163706f2543Smrg} __attribute__((packed));
164706f2543Smrg
165706f2543Smrg/* Return VBE Mode Information */
166706f2543Smrgextern _X_EXPORT VbeModeInfoBlock *VBEGetModeInfo(vbeInfoPtr pVbe, int mode);
167706f2543Smrgextern _X_EXPORT void VBEFreeModeInfo(VbeModeInfoBlock *block);
168706f2543Smrg
169706f2543Smrg/*
170706f2543Smrg * INT2
171706f2543Smrg */
172706f2543Smrg
173706f2543Smrg#define CRTC_DBLSCAN	(1<<0)
174706f2543Smrg#define CRTC_INTERLACE	(1<<1)
175706f2543Smrg#define CRTC_NHSYNC	(1<<2)
176706f2543Smrg#define CRTC_NVSYNC	(1<<3)
177706f2543Smrg
178706f2543Smrgstruct _VbeCRTCInfoBlock {
179706f2543Smrg    CARD16 HorizontalTotal;		/* Horizontal total in pixels */
180706f2543Smrg    CARD16 HorizontalSyncStart;		/* Horizontal sync start in pixels */
181706f2543Smrg    CARD16 HorizontalSyncEnd;		/* Horizontal sync end in pixels */
182706f2543Smrg    CARD16 VerticalTotal;		/* Vertical total in lines */
183706f2543Smrg    CARD16 VerticalSyncStart;		/* Vertical sync start in lines */
184706f2543Smrg    CARD16 VerticalSyncEnd;		/* Vertical sync end in lines */
185706f2543Smrg    CARD8 Flags;			/* Flags (Interlaced, Double Scan etc) */
186706f2543Smrg    CARD32 PixelClock;			/* Pixel clock in units of Hz */
187706f2543Smrg    CARD16 RefreshRate;			/* Refresh rate in units of 0.01 Hz */
188706f2543Smrg    CARD8 Reserved[40];			/* remainder of ModeInfoBlock */
189706f2543Smrg} __attribute__((packed));
190706f2543Smrg/* VbeCRTCInfoBlock is in the VESA 3.0 specs */
191706f2543Smrg
192706f2543Smrgextern _X_EXPORT Bool VBESetVBEMode(vbeInfoPtr pVbe, int mode, VbeCRTCInfoBlock *crtc);
193706f2543Smrg
194706f2543Smrg/*
195706f2543Smrg * INT 3
196706f2543Smrg */
197706f2543Smrg
198706f2543Smrgextern _X_EXPORT Bool VBEGetVBEMode(vbeInfoPtr pVbe, int *mode);
199706f2543Smrg
200706f2543Smrg/*
201706f2543Smrg * INT 4
202706f2543Smrg */
203706f2543Smrg
204706f2543Smrg/* Save/Restore Super VGA video state */
205706f2543Smrg/* function values are (values stored in VESAPtr):
206706f2543Smrg *	0 := query & allocate amount of memory to save state
207706f2543Smrg *	1 := save state
208706f2543Smrg *	2 := restore state
209706f2543Smrg *
210706f2543Smrg *	function 0 called automatically if function 1 called without
211706f2543Smrg *	a previous call to function 0.
212706f2543Smrg */
213706f2543Smrg
214706f2543Smrgtypedef enum {
215706f2543Smrg  MODE_QUERY,
216706f2543Smrg  MODE_SAVE,
217706f2543Smrg  MODE_RESTORE
218706f2543Smrg} vbeSaveRestoreFunction;
219706f2543Smrg
220706f2543Smrgextern _X_EXPORT Bool
221706f2543SmrgVBESaveRestore(vbeInfoPtr pVbe, vbeSaveRestoreFunction fuction,
222706f2543Smrg	       pointer *memory, int *size, int *real_mode_pages);
223706f2543Smrg
224706f2543Smrg/*
225706f2543Smrg * INT 5
226706f2543Smrg */
227706f2543Smrg
228706f2543Smrgextern _X_EXPORT Bool
229706f2543SmrgVBEBankSwitch(vbeInfoPtr pVbe, unsigned int iBank, int window);
230706f2543Smrg
231706f2543Smrg/*
232706f2543Smrg * INT 6
233706f2543Smrg */
234706f2543Smrg
235706f2543Smrgtypedef enum {
236706f2543Smrg  SCANWID_SET,
237706f2543Smrg  SCANWID_GET,
238706f2543Smrg  SCANWID_SET_BYTES,
239706f2543Smrg  SCANWID_GET_MAX
240706f2543Smrg} vbeScanwidthCommand;
241706f2543Smrg
242706f2543Smrg#define VBESetLogicalScanline(pVbe, width)	\
243706f2543Smrg	VBESetGetLogicalScanlineLength(pVbe, SCANWID_SET, width, \
244706f2543Smrg					NULL, NULL, NULL)
245706f2543Smrg#define VBESetLogicalScanlineBytes(pVbe, width)	\
246706f2543Smrg	VBESetGetLogicalScanlineLength(pVbe, SCANWID_SET_BYTES, width, \
247706f2543Smrg					NULL, NULL, NULL)
248706f2543Smrg#define VBEGetLogicalScanline(pVbe, pixels, bytes, max)	\
249706f2543Smrg	VBESetGetLogicalScanlineLength(pVbe, SCANWID_GET, 0, \
250706f2543Smrg					pixels, bytes, max)
251706f2543Smrg#define VBEGetMaxLogicalScanline(pVbe, pixels, bytes, max)	\
252706f2543Smrg	VBESetGetLogicalScanlineLength(pVbe, SCANWID_GET_MAX, 0, \
253706f2543Smrg					pixels, bytes, max)
254706f2543Smrgextern _X_EXPORT Bool VBESetGetLogicalScanlineLength(vbeInfoPtr pVbe,
255706f2543Smrg				    vbeScanwidthCommand command, int width,
256706f2543Smrg				     int *pixels, int *bytes, int *max);
257706f2543Smrg
258706f2543Smrg/*
259706f2543Smrg * INT 7
260706f2543Smrg */
261706f2543Smrg
262706f2543Smrg/* 16 bit code */
263706f2543Smrgextern _X_EXPORT Bool VBESetDisplayStart(vbeInfoPtr pVbe, int x, int y, Bool wait_retrace);
264706f2543Smrgextern _X_EXPORT Bool VBEGetDisplayStart(vbeInfoPtr pVbe, int *x, int *y);
265706f2543Smrg
266706f2543Smrg/*
267706f2543Smrg * INT 8
268706f2543Smrg */
269706f2543Smrg
270706f2543Smrg/* if bits is 0, then it is a GET */
271706f2543Smrgextern _X_EXPORT int VBESetGetDACPaletteFormat(vbeInfoPtr pVbe, int bits);
272706f2543Smrg
273706f2543Smrg/*
274706f2543Smrg * INT 9
275706f2543Smrg */
276706f2543Smrg
277706f2543Smrg/*
278706f2543Smrg *  If getting a palette, the data argument is not used. It will return
279706f2543Smrg * the data.
280706f2543Smrg *  If setting a palette, it will return the pointer received on success,
281706f2543Smrg * NULL on failure.
282706f2543Smrg */
283706f2543Smrgextern _X_EXPORT CARD32 *VBESetGetPaletteData(vbeInfoPtr pVbe, Bool set, int first, int num,
284706f2543Smrg			     CARD32 *data, Bool secondary, Bool wait_retrace);
285706f2543Smrg#define VBEFreePaletteData(data)	free(data)
286706f2543Smrg
287706f2543Smrg/*
288706f2543Smrg * INT A
289706f2543Smrg */
290706f2543Smrg
291706f2543Smrgtypedef struct _VBEpmi {
292706f2543Smrg    int seg_tbl;
293706f2543Smrg    int tbl_off;
294706f2543Smrg    int tbl_len;
295706f2543Smrg} VBEpmi;
296706f2543Smrg
297706f2543Smrgextern _X_EXPORT VBEpmi *VBEGetVBEpmi(vbeInfoPtr pVbe);
298706f2543Smrg#define VESAFreeVBEpmi(pmi)	free(pmi)
299706f2543Smrg
300706f2543Smrg/* high level helper functions */
301706f2543Smrg
302706f2543Smrgtypedef struct _vbeModeInfoRec {
303706f2543Smrg    int width;
304706f2543Smrg    int height;
305706f2543Smrg    int bpp;
306706f2543Smrg    int n;
307706f2543Smrg    struct _vbeModeInfoRec *next;
308706f2543Smrg} vbeModeInfoRec, *vbeModeInfoPtr;
309706f2543Smrg
310706f2543Smrgtypedef struct {
311706f2543Smrg    CARD8 *state;
312706f2543Smrg    CARD8 *pstate;
313706f2543Smrg    int statePage;
314706f2543Smrg    int stateSize;
315706f2543Smrg    int stateMode;
316706f2543Smrg} vbeSaveRestoreRec, *vbeSaveRestorePtr;
317706f2543Smrg
318706f2543Smrgextern _X_EXPORT void
319706f2543SmrgVBEVesaSaveRestore(vbeInfoPtr pVbe, vbeSaveRestorePtr vbe_sr,
320706f2543Smrg		   vbeSaveRestoreFunction function);
321706f2543Smrg
322706f2543Smrgextern _X_EXPORT int VBEGetPixelClock(vbeInfoPtr pVbe, int mode, int Clock);
323706f2543Smrgextern _X_EXPORT Bool VBEDPMSSet(vbeInfoPtr pVbe, int mode);
324706f2543Smrg
325706f2543Smrgstruct vbePanelID {
326706f2543Smrg    short hsize;
327706f2543Smrg    short vsize;
328706f2543Smrg    short fptype;
329706f2543Smrg    char redbpp;
330706f2543Smrg    char greenbpp;
331706f2543Smrg    char bluebpp;
332706f2543Smrg    char reservedbpp;
333706f2543Smrg    int reserved_offscreen_mem_size;
334706f2543Smrg    int reserved_offscreen_mem_pointer;
335706f2543Smrg    char reserved[14];
336706f2543Smrg};
337706f2543Smrg
338706f2543Smrgextern _X_EXPORT void VBEInterpretPanelID(int scrnIndex, struct vbePanelID *data);
339706f2543Smrgextern _X_EXPORT struct vbePanelID *VBEReadPanelID(vbeInfoPtr pVbe);
340706f2543Smrg
341706f2543Smrg#endif
342