summaryrefslogtreecommitdiff
path: root/hw/xfree86/vbe/vbe.h
blob: de9237c9d6de676c17357faaa6d8a6b9c6aa6ca3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347

/*
 *                   XFree86 vbe module
 *               Copyright 2000 Egbert Eich
 *
 * The mode query/save/set/restore functions from the vesa driver 
 * have been moved here.
 * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com)
 * Authors: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> 
 */

#ifndef _VBE_H
#define _VBE_H
#include "xf86int10.h"
#include "xf86DDC.h"

typedef enum {
    DDC_UNCHECKED,
    DDC_NONE,
    DDC_1,
    DDC_2,
    DDC_1_2
}
ddc_lvl;

typedef struct {
    xf86Int10InfoPtr pInt10;
    int version;
    pointer memory;
    int real_mode_base;
    int num_pages;
    Bool init_int10;
    ddc_lvl ddc;
    Bool ddc_blank;
} vbeInfoRec, *vbeInfoPtr;

#define VBE_VERSION_MAJOR(x) *((CARD8*)(&x) + 1)
#define VBE_VERSION_MINOR(x) (CARD8)(x)

vbeInfoPtr VBEInit(xf86Int10InfoPtr pInt, int entityIndex);
vbeInfoPtr VBEExtendedInit(xf86Int10InfoPtr pInt, int entityIndex, int Flags);
void vbeFree(vbeInfoPtr pVbe);
xf86MonPtr vbeDoEDID(vbeInfoPtr pVbe, pointer pDDCModule);

#pragma pack(1)

typedef struct vbeControllerInfoBlock {
    CARD8 VbeSignature[4];
    CARD16 VbeVersion;
    CARD32 OemStringPtr;
    CARD8 Capabilities[4];
    CARD32 VideoModePtr;
    CARD16 TotalMem;
    CARD16 OemSoftwareRev;
    CARD32 OemVendorNamePtr;
    CARD32 OemProductNamePtr;
    CARD32 OemProductRevPtr;
    CARD8  Scratch[222];
    CARD8  OemData[256];
} vbeControllerInfoRec, *vbeControllerInfoPtr;

#if defined(__GNUC__) || defined(__USLC__) || defined(__SUNPRO_C)
#pragma pack()	/* All GCC versions recognise this syntax */
#else
#pragma pack(0)
#endif

#ifndef __GNUC__
#define __attribute__(a)
#endif

typedef struct _VbeInfoBlock VbeInfoBlock;
typedef struct _VbeModeInfoBlock VbeModeInfoBlock;
typedef struct _VbeCRTCInfoBlock VbeCRTCInfoBlock;

/*
 * INT 0
 */

struct _VbeInfoBlock {
    /* VESA 1.2 fields */
    CARD8 VESASignature[4];		/* VESA */
    CARD16 VESAVersion;			/* Higher byte major, lower byte minor */
    /*CARD32*/char *OEMStringPtr;	/* Pointer to OEM string */
    CARD8 Capabilities[4];		/* Capabilities of the video environment */

    /*CARD32*/CARD16 *VideoModePtr;	/* pointer to supported Super VGA modes */

    CARD16 TotalMemory;			/* Number of 64kb memory blocks on board */
    /* if not VESA 2, 236 scratch bytes follow (256 bytes total size) */

    /* VESA 2 fields */
    CARD16 OemSoftwareRev;		/* VBE implementation Software revision */
    /*CARD32*/char *OemVendorNamePtr;	/* Pointer to Vendor Name String */
    /*CARD32*/char *OemProductNamePtr;	/* Pointer to Product Name String */
    /*CARD32*/char *OemProductRevPtr;	/* Pointer to Product Revision String */
    CARD8 Reserved[222];		/* Reserved for VBE implementation */
    CARD8 OemData[256];			/* Data Area for OEM Strings */
} __attribute__((packed));

/* Return Super VGA Information */
VbeInfoBlock *VBEGetVBEInfo(vbeInfoPtr pVbe);
void VBEFreeVBEInfo(VbeInfoBlock *block);

/*
 * INT 1
 */

struct _VbeModeInfoBlock {
    CARD16 ModeAttributes;		/* mode attributes */
    CARD8 WinAAttributes;		/* window A attributes */
    CARD8 WinBAttributes;		/* window B attributes */
    CARD16 WinGranularity;		/* window granularity */
    CARD16 WinSize;			/* window size */
    CARD16 WinASegment;			/* window A start segment */
    CARD16 WinBSegment;			/* window B start segment */
    CARD32 WinFuncPtr;			/* real mode pointer to window function */
    CARD16 BytesPerScanline;		/* bytes per scanline */

    /* Mandatory information for VBE 1.2 and above */
    CARD16 XResolution;			/* horizontal resolution in pixels or characters */
    CARD16 YResolution;			/* vertical resolution in pixels or characters */
    CARD8 XCharSize;			/* character cell width in pixels */
    CARD8 YCharSize;			/* character cell height in pixels */
    CARD8 NumberOfPlanes;		/* number of memory planes */
    CARD8 BitsPerPixel;			/* bits per pixel */
    CARD8 NumberOfBanks;		/* number of banks */
    CARD8 MemoryModel;			/* memory model type */
    CARD8 BankSize;			/* bank size in KB */
    CARD8 NumberOfImages;		/* number of images */
    CARD8 Reserved;	/* 1 */		/* reserved for page function */

    /* Direct color fields (required for direct/6 and YUV/7 memory models) */
    CARD8 RedMaskSize;			/* size of direct color red mask in bits */
    CARD8 RedFieldPosition;		/* bit position of lsb of red mask */
    CARD8 GreenMaskSize;		/* size of direct color green mask in bits */
    CARD8 GreenFieldPosition;		/* bit position of lsb of green mask */
    CARD8 BlueMaskSize;			/* size of direct color blue mask in bits */
    CARD8 BlueFieldPosition;		/* bit position of lsb of blue mask */
    CARD8 RsvdMaskSize;			/* size of direct color reserved mask in bits */
    CARD8 RsvdFieldPosition;		/* bit position of lsb of reserved mask */
    CARD8 DirectColorModeInfo;		/* direct color mode attributes */

    /* Mandatory information for VBE 2.0 and above */
    CARD32 PhysBasePtr;			/* physical address for flat memory frame buffer */
    CARD32 Reserved32;	/* 0 */		/* Reserved - always set to 0 */
    CARD16 Reserved16;	/* 0 */		/* Reserved - always set to 0 */

    /* Mandatory information for VBE 3.0 and above */
    CARD16 LinBytesPerScanLine;		/* bytes per scan line for linear modes */
    CARD8 BnkNumberOfImagePages;	/* number of images for banked modes */
    CARD8 LinNumberOfImagePages;	/* number of images for linear modes */
    CARD8 LinRedMaskSize;		/* size of direct color red mask (linear modes) */
    CARD8 LinRedFieldPosition;		/* bit position of lsb of red mask (linear modes) */
    CARD8 LinGreenMaskSize;		/* size of direct color green mask (linear modes) */
    CARD8 LinGreenFieldPosition;	/* bit position of lsb of green mask (linear modes) */
    CARD8 LinBlueMaskSize;		/* size of direct color blue mask (linear modes) */
    CARD8 LinBlueFieldPosition;		/* bit position of lsb of blue mask (linear modes) */
    CARD8 LinRsvdMaskSize;		/* size of direct color reserved mask (linear modes) */
    CARD8 LinRsvdFieldPosition;		/* bit position of lsb of reserved mask (linear modes) */
    CARD32 MaxPixelClock;		/* maximum pixel clock (in Hz) for graphics mode */
    CARD8 Reserved2[189];		/* remainder of VbeModeInfoBlock */
} __attribute__((packed));

/* Return VBE Mode Information */
VbeModeInfoBlock *VBEGetModeInfo(vbeInfoPtr pVbe, int mode);
void VBEFreeModeInfo(VbeModeInfoBlock *block);

/*
 * INT2
 */

#define CRTC_DBLSCAN	(1<<0)
#define CRTC_INTERLACE	(1<<1)
#define CRTC_NHSYNC	(1<<2)
#define CRTC_NVSYNC	(1<<3)

struct _VbeCRTCInfoBlock {
    CARD16 HorizontalTotal;		/* Horizontal total in pixels */
    CARD16 HorizontalSyncStart;		/* Horizontal sync start in pixels */
    CARD16 HorizontalSyncEnd;		/* Horizontal sync end in pixels */
    CARD16 VerticalTotal;		/* Vertical total in lines */
    CARD16 VerticalSyncStart;		/* Vertical sync start in lines */
    CARD16 VerticalSyncEnd;		/* Vertical sync end in lines */
    CARD8 Flags;			/* Flags (Interlaced, Double Scan etc) */
    CARD32 PixelClock;			/* Pixel clock in units of Hz */
    CARD16 RefreshRate;			/* Refresh rate in units of 0.01 Hz */
    CARD8 Reserved[40];			/* remainder of ModeInfoBlock */
} __attribute__((packed));
/* VbeCRTCInfoBlock is in the VESA 3.0 specs */

Bool VBESetVBEMode(vbeInfoPtr pVbe, int mode, VbeCRTCInfoBlock *crtc);

/*
 * INT 3
 */

Bool VBEGetVBEMode(vbeInfoPtr pVbe, int *mode);

/*
 * INT 4
 */

/* Save/Restore Super VGA video state */
/* function values are (values stored in VESAPtr):
 *	0 := query & allocate amount of memory to save state
 *	1 := save state
 *	2 := restore state
 *
 *	function 0 called automatically if function 1 called without
 *	a previous call to function 0.
 */

typedef enum {
  MODE_QUERY,
  MODE_SAVE,
  MODE_RESTORE
} vbeSaveRestoreFunction;

Bool
VBESaveRestore(vbeInfoPtr pVbe, vbeSaveRestoreFunction fuction, 
	       pointer *memory, int *size, int *real_mode_pages);

/*
 * INT 5
 */

Bool
VBEBankSwitch(vbeInfoPtr pVbe, unsigned int iBank, int window);

/*
 * INT 6
 */

typedef enum {
  SCANWID_SET,
  SCANWID_GET,
  SCANWID_SET_BYTES,
  SCANWID_GET_MAX
} vbeScanwidthCommand;

#define VBESetLogicalScanline(pVbe, width)	\
	VBESetGetLogicalScanlineLength(pVbe, SCANWID_SET, width, \
					NULL, NULL, NULL)
#define VBESetLogicalScanlineBytes(pVbe, width)	\
	VBESetGetLogicalScanlineLength(pVbe, SCANWID_SET_BYTES, width, \
					NULL, NULL, NULL)
#define VBEGetLogicalScanline(pVbe, pixels, bytes, max)	\
	VBESetGetLogicalScanlineLength(pVbe, SCANWID_GET, 0, \
					pixels, bytes, max)
#define VBEGetMaxLogicalScanline(pVbe, pixels, bytes, max)	\
	VBESetGetLogicalScanlineLength(pVbe, SCANWID_GET_MAX, 0, \
					pixels, bytes, max)
Bool VBESetGetLogicalScanlineLength(vbeInfoPtr pVbe, 
				    vbeScanwidthCommand command, int width,
				     int *pixels, int *bytes, int *max);

/*
 * INT 7
 */

/* 16 bit code */
Bool VBESetDisplayStart(vbeInfoPtr pVbe, int x, int y, Bool wait_retrace);
Bool VBEGetDisplayStart(vbeInfoPtr pVbe, int *x, int *y);

/*
 * INT 8
 */

/* if bits is 0, then it is a GET */
int VBESetGetDACPaletteFormat(vbeInfoPtr pVbe, int bits);

/*
 * INT 9
 */

/*
 *  If getting a palette, the data argument is not used. It will return
 * the data.
 *  If setting a palette, it will return the pointer received on success,
 * NULL on failure.
 */
CARD32 *VBESetGetPaletteData(vbeInfoPtr pVbe, Bool set, int first, int num,
			     CARD32 *data, Bool secondary, Bool wait_retrace);
#define VBEFreePaletteData(data)	xfree(data)

/*
 * INT A
 */

typedef struct _VBEpmi {
    int seg_tbl;
    int tbl_off;
    int tbl_len;
} VBEpmi;

VBEpmi *VBEGetVBEpmi(vbeInfoPtr pVbe);
#define VESAFreeVBEpmi(pmi)	xfree(pmi)

/* high level helper functions */

typedef struct _vbeModeInfoRec {
    int width;
    int height;
    int bpp;
    int n;
    struct _vbeModeInfoRec *next;
} vbeModeInfoRec, *vbeModeInfoPtr;

vbeModeInfoPtr    VBEBuildVbeModeList(vbeInfoPtr pVbe, 
			    VbeInfoBlock *vbe);

unsigned short VBECalcVbeModeIndex(vbeModeInfoPtr m, 
				   DisplayModePtr mode, int bpp);

typedef struct {
    CARD8 *state;
    CARD8 *pstate;
    int statePage;
    int stateSize;
    int stateMode;
} vbeSaveRestoreRec, *vbeSaveRestorePtr;

void
VBEVesaSaveRestore(vbeInfoPtr pVbe, vbeSaveRestorePtr vbe_sr,
		   vbeSaveRestoreFunction function);

int VBEGetPixelClock(vbeInfoPtr pVbe, int mode, int Clock);
Bool VBEDPMSSet(vbeInfoPtr pVbe, int mode);

struct vbePanelID {
    short hsize;
    short vsize;
    short fptype;
    char redbpp;
    char greenbpp;
    char bluebpp;
    char reservedbpp;
    int reserved_offscreen_mem_size;
    int reserved_offscreen_mem_pointer;
    char reserved[14];
};

void VBEInterpretPanelID(int scrnIndex, struct vbePanelID *data);
struct vbePanelID *VBEReadPanelID(vbeInfoPtr pVbe);

#endif