1 /*++
2 
3 Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution.  The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8 
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 
12 Module Name:
13 
14   VesaBiosExtensions.h
15 
16 Abstract:
17 
18 Revision History
19 
20 --*/
21 
22 #ifndef _VESA_BIOS_EXTENSIONS_H
23 #define _VESA_BIOS_EXTENSIONS_H
24 
25 //
26 // Turn on byte packing of data structures
27 //
28 #pragma pack(1)
29 //
30 // VESA BIOS Extensions status codes
31 //
32 #define VESA_BIOS_EXTENSIONS_STATUS_SUCCESS 0x004f
33 
34 //
35 // VESA BIOS Extensions Services
36 //
37 #define VESA_BIOS_EXTENSIONS_RETURN_CONTROLLER_INFORMATION  0x4f00
38 
39 /*++
40 
41   Routine Description:
42     Function 00 : Return Controller Information
43 
44   Arguments:
45     Inputs:
46       AX    = 0x4f00
47       ES:DI = Pointer to buffer to place VESA_BIOS_EXTENSIONS_INFORMATION_BLOCK structure
48     Outputs:
49       AX    = Return Status
50 
51 --*/
52 #define VESA_BIOS_EXTENSIONS_RETURN_MODE_INFORMATION  0x4f01
53 
54 /*++
55 
56   Routine Description:
57     Function 01 : Return Mode Information
58 
59   Arguments:
60     Inputs:
61       AX    = 0x4f01
62       CX    = Mode Number
63       ES:DI = Pointer to buffer to place VESA_BIOS_EXTENSIONS_MODE_INFORMATION_BLOCK structure
64     Outputs:
65       AX    = Return Status
66 
67 --*/
68 #define VESA_BIOS_EXTENSIONS_SET_MODE 0x4f02
69 
70 /*++
71 
72   Routine Description:
73     Function 02 : Set Mode
74 
75   Arguments:
76     Inputs:
77       AX    = 0x4f02
78       BX    = Desired mode to set
79         D0-D8   = Mode Number
80         D9-D10  = Reserved (must be 0)
81         D11     = 0 - Use current default refresh rate
82                 = 1 - Use user specfieid CRTC values for refresh rate
83         D12-D13 = Reserved (must be 0)
84         D14     = 0 - Use windowed frame buffer model
85                 = 1 - Use linear/flat frame buffer model
86         D15     = 0 - Clear display memory
87                 = 1 - Don't clear display memory
88       ES:DI = Pointer to buffer to the VESA_BIOS_EXTENSIONS_CRTC_INFORMATION_BLOCK structure
89     Outputs:
90       AX    = Return Status
91 
92 --*/
93 #define VESA_BIOS_EXTENSIONS_RETURN_CURRENT_MODE  0x4f03
94 
95 /*++
96 
97   Routine Description:
98     Function 03 : Return Current Mode
99 
100   Arguments:
101     Inputs:
102       AX    = 0x4f03
103     Outputs:
104       AX    = Return Status
105       BX    = Current mode
106         D0-D13  = Mode Number
107         D14     = 0 - Windowed frame buffer model
108                 = 1 - Linear/flat frame buffer model
109         D15     = 0 - Memory cleared at last mode set
110                 = 1 - Memory not cleared at last mode set
111 
112 --*/
113 #define VESA_BIOS_EXTENSIONS_SAVE_RESTORE_STATE 0x4f04
114 
115 /*++
116 
117   Routine Description:
118     Function 04 : Save/Restore State
119 
120   Arguments:
121     Inputs:
122       AX    = 0x4f03
123       DL    = 0x00 - Return Save/Restore State buffer size
124             = 0x01 - Save State
125             = 0x02 - Restore State
126       CX    = Requested Status
127         D0  = Save/Restore controller hardware state
128         D1  = Save/Restore BIOS data state
129         D2  = Save/Restore DAC state
130         D3  = Save/Restore Regsiter state
131       ES:BX = Pointer to buffer if DL=1 or DL=2
132     Outputs:
133       AX    = Return Status
134       BX    = Number of 64 byte blocks to hold the state buffer if DL=0
135 
136 --*/
137 #define VESA_BIOS_EXTENSIONS_EDID  0x4f15
138 
139 /*++
140 
141   Routine Description:
142     Function 15 : implement VBE/DDC service
143 
144   Arguments:
145     Inputs:
146       AX    = 0x4f15
147       BL    = 0x00 - Report VBE/DDC Capabilities
148       CX    = 0x00 - Controller unit number (00 = primary controller)
149       ES:DI = Null pointer, must be 0:0 in version 1.0
150     Outputs:
151       AX    = Return Status
152       BH    = Approx. time in seconds, rounded up, to transfer one EDID block(128 bytes)
153       BL    = DDC level supported
154         D0  = 0 DDC1 not supported
155             = 1 DDC1 supported
156         D1  = 0 DDC2 not supported
157             = 1 DDC2 supported
158         D2  = 0 Screen not blanked during data transfer
159             = 1 Screen blanked during data transfer
160 
161     Inputs:
162       AX    = 0x4f15
163       BL    = 0x01 - Read EDID
164       CX    = 0x00 - Controller unit number (00 = primary controller)
165       DX    = 0x00 - EDID block number
166       ES:DI = Pointer to buffer in which the EDID block is returned
167     Outputs:
168       AX    = Return Status
169 --*/
170 
171 //
172 // Timing data from EDID data block
173 //
174 #define VESA_BIOS_EXTENSIONS_EDID_BLOCK_SIZE                    128
175 #define VESA_BIOS_EXTENSIONS_EDID_ESTABLISHED_TIMING_MAX_NUMBER 17
176 
177 typedef struct {
178   UINT16  HorizontalResolution;
179   UINT16  VerticalResolution;
180   UINT16  RefreshRate;
181 } VESA_BIOS_EXTENSIONS_EDID_TIMING;
182 
183 typedef struct {
184   UINT32  ValidNumber;
185   UINT32  Key[VESA_BIOS_EXTENSIONS_EDID_ESTABLISHED_TIMING_MAX_NUMBER];
186 } VESA_BIOS_EXTENSIONS_VALID_EDID_TIMING;
187 
188 typedef struct {
189   UINT8   Header[8];                        //EDID header "00 FF FF FF FF FF FF 00"
190   UINT16  ManufactureName;                  //EISA 3-character ID
191   UINT16  ProductCode;                      //Vendor assigned code
192   UINT32  SerialNumber;                     //32-bit serial number
193   UINT8   WeekOfManufacture;                //Week number
194   UINT8   YearOfManufacture;                //Year
195   UINT8   EdidVersion;                      //EDID Structure Version
196   UINT8   EdidRevision;                     //EDID Structure Revision
197   UINT8   VideoInputDefinition;
198   UINT8   MaxHorizontalImageSize;           //cm
199   UINT8   MaxVerticalImageSize;             //cm
200   UINT8   DisplayTransferCharacteristic;
201   UINT8   FeatureSupport;
202   UINT8   RedGreenLowBits;                  //Rx1 Rx0 Ry1 Ry0 Gx1 Gx0 Gy1Gy0
203   UINT8   BlueWhiteLowBits;                 //Bx1 Bx0 By1 By0 Wx1 Wx0 Wy1 Wy0
204   UINT8   RedX;                             //Red-x Bits 9 - 2
205   UINT8   RedY;                             //Red-y Bits 9 - 2
206   UINT8   GreenX;                           //Green-x Bits 9 - 2
207   UINT8   GreenY;                           //Green-y Bits 9 - 2
208   UINT8   BlueX;                            //Blue-x Bits 9 - 2
209   UINT8   BlueY;                            //Blue-y Bits 9 - 2
210   UINT8   WhiteX;                           //White-x Bits 9 - 2
211   UINT8   WhiteY;                           //White-x Bits 9 - 2
212   UINT8   EstablishedTimings[3];
213   UINT8   StandardTimingIdentification[16];
214   UINT8   DetailedTimingDescriptions[72];
215   UINT8   ExtensionFlag;                    //Number of (optional) 128-byte EDID extension blocks to follow
216   UINT8   Checksum;
217 } VESA_BIOS_EXTENSIONS_EDID_DATA_BLOCK;
218 
219 //
220 // Super VGA Information Block
221 //
222 typedef struct {
223   UINT32  VESASignature;      // 'VESA' 4 byte signature
224   UINT16  VESAVersion;        // VBE version number
225   UINT32  OEMStringPtr;       // Pointer to OEM string
226   UINT32  Capabilities;       // Capabilities of video card
227   UINT32  VideoModePtr;       // Pointer to an array of 16-bit supported modes values terminated by 0xFFFF
228   UINT16  TotalMemory;        // Number of 64kb memory blocks
229   UINT16  OemSoftwareRev;     // VBE implementation Software revision
230   UINT32  OemVendorNamePtr;   // VbeFarPtr to Vendor Name String
231   UINT32  OemProductNamePtr;  // VbeFarPtr to Product Name String
232   UINT32  OemProductRevPtr;   // VbeFarPtr to Product Revision String
233   UINT8   Reserved[222];      // Reserved for VBE implementation scratch area
234   UINT8   OemData[256];       // Data area for OEM strings.  Pad to 512 byte block size
235 } VESA_BIOS_EXTENSIONS_INFORMATION_BLOCK;
236 
237 //
238 // Super VGA Information Block VESASignature values
239 //
240 #define VESA_BIOS_EXTENSIONS_VESA_SIGNATURE SIGNATURE_32 ('V', 'E', 'S', 'A')
241 #define VESA_BIOS_EXTENSIONS_VBE2_SIGNATURE SIGNATURE_32 ('V', 'B', 'E', '2')
242 
243 //
244 // Super VGA Information Block VESAVersion values
245 //
246 #define VESA_BIOS_EXTENSIONS_VERSION_1_2  0x0102
247 #define VESA_BIOS_EXTENSIONS_VERSION_2_0  0x0200
248 #define VESA_BIOS_EXTENSIONS_VERSION_3_0  0x0300
249 
250 //
251 // Super VGA Information Block Capabilities field bit defintions
252 //
253 #define VESA_BIOS_EXTENSIONS_CAPABILITY_8_BIT_DAC 0x01  // 0: DAC width is fixed at 6 bits/color
254 // 1: DAC width switchable to 8 bits/color
255 //
256 #define VESA_BIOS_EXTENSIONS_CAPABILITY_NOT_VGA 0x02  // 0: Controller is VGA compatible
257 // 1: Controller is not VGA compatible
258 //
259 #define VESA_BIOS_EXTENSIONS_CAPABILITY_NOT_NORMAL_RAMDAC 0x04  // 0: Normal RAMDAC operation
260 // 1: Use blank bit in function 9 to program RAMDAC
261 //
262 #define VESA_BIOS_EXTENSIONS_CAPABILITY_STEREOSCOPIC  0x08  // 0: No hardware stereoscopic signal support
263 // 1: Hardware stereoscopic signal support
264 //
265 #define VESA_BIOS_EXTENSIONS_CAPABILITY_VESA_EVC  0x10  // 0: Stero signaling supported via external VESA stereo connector
266 // 1: Stero signaling supported via VESA EVC connector
267 //
268 // Super VGA mode number bite field definitions
269 //
270 #define VESA_BIOS_EXTENSIONS_MODE_NUMBER_VESA 0x0100  // 0: Not a VESA defined VBE mode
271 // 1: A VESA defined VBE mode
272 //
273 #define VESA_BIOS_EXTENSIONS_MODE_NUMBER_REFRESH_CONTROL_USER 0x0800  // 0: Use current BIOS default referesh rate
274 // 1: Use the user specified CRTC values for refresh rate
275 //
276 #define VESA_BIOS_EXTENSIONS_MODE_NUMBER_LINEAR_FRAME_BUFFER  0x4000  // 0: Use a banked/windowed frame buffer
277 // 1: Use a linear/flat frame buffer
278 //
279 #define VESA_BIOS_EXTENSIONS_MODE_NUMBER_PRESERVE_MEMORY  0x8000  // 0: Clear display memory
280 // 1: Preseve display memory
281 //
282 // Super VGA Information Block mode list terminator value
283 //
284 #define VESA_BIOS_EXTENSIONS_END_OF_MODE_LIST 0xffff
285 
286 //
287 // Window Function
288 //
289 typedef
290 VOID
291 (*VESA_BIOS_EXTENSIONS_WINDOW_FUNCTION) (
292   VOID
293   );
294 
295 //
296 // Super VGA Mode Information Block
297 //
298 typedef struct {
299   //
300   // Manadory fields for all VESA Bios Extensions revisions
301   //
302   UINT16                                ModeAttributes;   // Mode attributes
303   UINT8                                 WinAAttributes;   // Window A attributes
304   UINT8                                 WinBAttributes;   // Window B attributes
305   UINT16                                WinGranularity;   // Window granularity in k
306   UINT16                                WinSize;          // Window size in k
307   UINT16                                WinASegment;      // Window A segment
308   UINT16                                WinBSegment;      // Window B segment
309   UINT32                                WindowFunction;   // Pointer to window function
310   UINT16                                BytesPerScanLine; // Bytes per scanline
311   //
312   // Manadory fields for VESA Bios Extensions 1.2 and above
313   //
314   UINT16                                XResolution;          // Horizontal resolution
315   UINT16                                YResolution;          // Vertical resolution
316   UINT8                                 XCharSize;            // Character cell width
317   UINT8                                 YCharSize;            // Character cell height
318   UINT8                                 NumberOfPlanes;       // Number of memory planes
319   UINT8                                 BitsPerPixel;         // Bits per pixel
320   UINT8                                 NumberOfBanks;        // Number of CGA style banks
321   UINT8                                 MemoryModel;          // Memory model type
322   UINT8                                 BankSize;             // Size of CGA style banks
323   UINT8                                 NumberOfImagePages;   // Number of images pages
324   UINT8                                 Reserved1;            // Reserved
325   UINT8                                 RedMaskSize;          // Size of direct color red mask
326   UINT8                                 RedFieldPosition;     // Bit posn of lsb of red mask
327   UINT8                                 GreenMaskSize;        // Size of direct color green mask
328   UINT8                                 GreenFieldPosition;   // Bit posn of lsb of green mask
329   UINT8                                 BlueMaskSize;         // Size of direct color blue mask
330   UINT8                                 BlueFieldPosition;    // Bit posn of lsb of blue mask
331   UINT8                                 RsvdMaskSize;         // Size of direct color res mask
332   UINT8                                 RsvdFieldPosition;    // Bit posn of lsb of res mask
333   UINT8                                 DirectColorModeInfo;  // Direct color mode attributes
334   //
335   // Manadory fields for VESA Bios Extensions 2.0 and above
336   //
337   UINT32                                PhysBasePtr;  // Physical Address for flat memory frame buffer
338   UINT32                                Reserved2;    // Reserved
339   UINT16                                Reserved3;    // Reserved
340   //
341   // Manadory fields for VESA Bios Extensions 3.0 and above
342   //
343   UINT16                                LinBytesPerScanLine;    // Bytes/scan line for linear modes
344   UINT8                                 BnkNumberOfImagePages;  // Number of images for banked modes
345   UINT8                                 LinNumberOfImagePages;  // Number of images for linear modes
346   UINT8                                 LinRedMaskSize;         // Size of direct color red mask (linear mode)
347   UINT8                                 LinRedFieldPosition;    // Bit posiiton of lsb of red mask (linear modes)
348   UINT8                                 LinGreenMaskSize;       // Size of direct color green mask (linear mode)
349   UINT8                                 LinGreenFieldPosition;  // Bit posiiton of lsb of green mask (linear modes)
350   UINT8                                 LinBlueMaskSize;        // Size of direct color blue mask (linear mode)
351   UINT8                                 LinBlueFieldPosition;   // Bit posiiton of lsb of blue mask (linear modes)
352   UINT8                                 LinRsvdMaskSize;        // Size of direct color reserved mask (linear mode)
353   UINT8                                 LinRsvdFieldPosition;   // Bit posiiton of lsb of reserved mask (linear modes)
354   UINT32                                MaxPixelClock;          // Maximum pixel clock (in Hz) for graphics mode
355   UINT8                                 Pad[190];               // Pad to 256 byte block size
356 } VESA_BIOS_EXTENSIONS_MODE_INFORMATION_BLOCK;
357 
358 //
359 // Super VGA Mode Information Block ModeAttributes field bit defintions
360 //
361 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_HARDWARE  0x0001  // 0: Mode not supported in handware
362 // 1: Mode supported in handware
363 //
364 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_TTY 0x0004  // 0: TTY Output functions not supported by BIOS
365 // 1: TTY Output functions supported by BIOS
366 //
367 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_COLOR 0x0008  // 0: Monochrome mode
368 // 1: Color mode
369 //
370 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_GRAPHICS  0x0010  // 0: Text mode
371 // 1: Graphics mode
372 //
373 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_NOT_VGA 0x0020  // 0: VGA compatible mode
374 // 1: Not a VGA compatible mode
375 //
376 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_NOT_WINDOWED  0x0040  // 0: VGA compatible windowed memory mode
377 // 1: Not a VGA compatible windowed memory mode
378 //
379 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER 0x0080  // 0: No linear fram buffer mode available
380 // 1: Linear frame buffer mode available
381 //
382 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_DOUBLE_SCAN 0x0100  // 0: No double scan mode available
383 // 1: Double scan mode available
384 //
385 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_INTERLACED  0x0200  // 0: No interlaced mode is available
386 // 1: Interlaced mode is available
387 //
388 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_NO_TRIPPLE_BUFFER 0x0400  // 0: No hardware triple buffer mode support available
389 // 1: Hardware triple buffer mode support available
390 //
391 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_STEREOSCOPIC  0x0800  // 0: No hardware steroscopic display support
392 // 1: Hardware steroscopic display support
393 //
394 #define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_DUAL_DISPLAY  0x1000  // 0: No dual display start address support
395 // 1: Dual display start address support
396 //
397 // Super VGA Mode Information Block WinAAttribite/WinBAttributes field bit defintions
398 //
399 #define VESA_BIOS_EXTENSIONS_WINX_ATTRIBUTE_RELOCATABLE 0x01  // 0: Single non-relocatable window only
400 // 1: Relocatable window(s) are supported
401 //
402 #define VESA_BIOS_EXTENSIONS_WINX_ATTRIBUTE_READABLE  0x02  // 0: Window is not readable
403 // 1: Window is readable
404 //
405 #define VESA_BIOS_EXTENSIONS_WINX_ATTRIBUTE_WRITABLE  0x04  // 0: Window is not writable
406 // 1: Window is writable
407 //
408 // Super VGA Mode Information Block DirectColorMode field bit defintions
409 //
410 #define VESA_BIOS_EXTENSIONS_DIRECT_COLOR_MODE_PROG_COLOR_RAMP  0x01  // 0: Color ram is fixed
411 // 1: Color ramp is programmable
412 //
413 #define VESA_BIOS_EXTENSIONS_DIRECT_COLOR_MODE_RSVD_USABLE  0x02  // 0: Bits in Rsvd field are reserved
414 // 1: Bits in Rsdv field are usable
415 //
416 // Super VGA Memory Models
417 //
418 typedef enum {
419   memPL = 3,  // Planar memory model
420   memPK = 4,  // Packed pixel memory model
421   memRGB= 6,  // Direct color RGB memory model
422   memYUV= 7   // Direct color YUV memory model
423 } VESA_BIOS_EXTENSIONS_MEMORY_MODELS;
424 
425 //
426 // Super VGA CRTC Information Block
427 //
428 typedef struct {
429   UINT16  HorizontalTotal;      // Horizontal total in pixels
430   UINT16  HorizontalSyncStart;  // Horizontal sync start in pixels
431   UINT16  HorizontalSyncEnd;    // Horizontal sync end in pixels
432   UINT16  VericalTotal;         // Vertical total in pixels
433   UINT16  VericalSyncStart;     // Vertical sync start in pixels
434   UINT16  VericalSyncEnd;       // Vertical sync end in pixels
435   UINT8   Flags;                // Flags (Interlaced/DoubleScan/etc).
436   UINT32  PixelClock;           // Pixel clock in units of Hz
437   UINT16  RefreshRate;          // Refresh rate in units of 0.01 Hz
438   UINT8   Reserved[40];         // Pad
439 } VESA_BIOS_EXTENSIONS_CRTC_INFORMATION_BLOCK;
440 
441 #define VESA_BIOS_EXTENSIONS_CRTC_FLAGS_DOUBLE_SCAN 0x01  // 0: Graphics mode is not souble scanned
442 // 1: Graphics mode is double scanned
443 //
444 #define VESA_BIOS_EXTENSIONS_CRTC_FLAGSINTERLACED 0x02  // 0: Graphics mode is not interlaced
445 // 1: Graphics mode is interlaced
446 //
447 #define VESA_BIOS_EXTENSIONS_CRTC_HORIZONTAL_SYNC_NEGATIVE  0x04  // 0: Horizontal sync polarity is positive(+)
448 // 0: Horizontal sync polarity is negative(-)
449 //
450 #define VESA_BIOS_EXTENSIONS_CRTC_VERITICAL_SYNC_NEGATIVE 0x08  // 0: Verical sync polarity is positive(+)
451 // 0: Verical sync polarity is negative(-)
452 //
453 // Turn off byte packing of data structures
454 //
455 #pragma pack()
456 
457 #endif
458