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