summaryrefslogtreecommitdiffstats
path: root/OvmfPkg/Csm/BiosThunk/VideoDxe/VesaBiosExtensions.h
blob: 0c8e62c0641e95c3f8eff4f1adb59c46715944ec (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
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
/** @file

Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>

SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _VESA_BIOS_EXTENSIONS_H_
#define _VESA_BIOS_EXTENSIONS_H_

//
// Turn on byte packing of data structures
//
#pragma pack(1)
//
// VESA BIOS Extensions status codes
//
#define VESA_BIOS_EXTENSIONS_STATUS_SUCCESS  0x004f

//
// VESA BIOS Extensions Services
//
#define VESA_BIOS_EXTENSIONS_RETURN_CONTROLLER_INFORMATION  0x4f00

/*++

  Routine Description:
    Function 00 : Return Controller Information

  Arguments:
    Inputs:
      AX    = 0x4f00
      ES:DI = Pointer to buffer to place VESA_BIOS_EXTENSIONS_INFORMATION_BLOCK structure
    Outputs:
      AX    = Return Status

--*/
#define VESA_BIOS_EXTENSIONS_RETURN_MODE_INFORMATION  0x4f01

/*++

  Routine Description:
    Function 01 : Return Mode Information

  Arguments:
    Inputs:
      AX    = 0x4f01
      CX    = Mode Number
      ES:DI = Pointer to buffer to place VESA_BIOS_EXTENSIONS_MODE_INFORMATION_BLOCK structure
    Outputs:
      AX    = Return Status

--*/
#define VESA_BIOS_EXTENSIONS_SET_MODE  0x4f02

/*++

  Routine Description:
    Function 02 : Set Mode

  Arguments:
    Inputs:
      AX    = 0x4f02
      BX    = Desired mode to set
        D0-D8   = Mode Number
        D9-D10  = Reserved (must be 0)
        D11     = 0 - Use current default refresh rate
                = 1 - Use user specfieid CRTC values for refresh rate
        D12-D13 = Reserved (must be 0)
        D14     = 0 - Use windowed frame buffer model
                = 1 - Use linear/flat frame buffer model
        D15     = 0 - Clear display memory
                = 1 - Don't clear display memory
      ES:DI = Pointer to buffer to the VESA_BIOS_EXTENSIONS_CRTC_INFORMATION_BLOCK structure
    Outputs:
      AX    = Return Status

--*/
#define VESA_BIOS_EXTENSIONS_RETURN_CURRENT_MODE  0x4f03

/*++

  Routine Description:
    Function 03 : Return Current Mode

  Arguments:
    Inputs:
      AX    = 0x4f03
    Outputs:
      AX    = Return Status
      BX    = Current mode
        D0-D13  = Mode Number
        D14     = 0 - Windowed frame buffer model
                = 1 - Linear/flat frame buffer model
        D15     = 0 - Memory cleared at last mode set
                = 1 - Memory not cleared at last mode set

--*/
#define VESA_BIOS_EXTENSIONS_SAVE_RESTORE_STATE  0x4f04

/*++

  Routine Description:
    Function 04 : Save/Restore State

  Arguments:
    Inputs:
      AX    = 0x4f03
      DL    = 0x00 - Return Save/Restore State buffer size
            = 0x01 - Save State
            = 0x02 - Restore State
      CX    = Requested Status
        D0  = Save/Restore controller hardware state
        D1  = Save/Restore BIOS data state
        D2  = Save/Restore DAC state
        D3  = Save/Restore Regsiter state
      ES:BX = Pointer to buffer if DL=1 or DL=2
    Outputs:
      AX    = Return Status
      BX    = Number of 64 byte blocks to hold the state buffer if DL=0

--*/
#define VESA_BIOS_EXTENSIONS_EDID  0x4f15

/*++

  Routine Description:
    Function 15 : implement VBE/DDC service

  Arguments:
    Inputs:
      AX    = 0x4f15
      BL    = 0x00 - Report VBE/DDC Capabilities
      CX    = 0x00 - Controller unit number (00 = primary controller)
      ES:DI = Null pointer, must be 0:0 in version 1.0
    Outputs:
      AX    = Return Status
      BH    = Approx. time in seconds, rounded up, to transfer one EDID block(128 bytes)
      BL    = DDC level supported
        D0  = 0 DDC1 not supported
            = 1 DDC1 supported
        D1  = 0 DDC2 not supported
            = 1 DDC2 supported
        D2  = 0 Screen not blanked during data transfer
            = 1 Screen blanked during data transfer

    Inputs:
      AX    = 0x4f15
      BL    = 0x01 - Read EDID
      CX    = 0x00 - Controller unit number (00 = primary controller)
      DX    = 0x00 - EDID block number
      ES:DI = Pointer to buffer in which the EDID block is returned
    Outputs:
      AX    = Return Status
--*/

//
// Timing data from EDID data block
//
#define VESA_BIOS_EXTENSIONS_EDID_BLOCK_SIZE                     128
#define VESA_BIOS_EXTENSIONS_EDID_ESTABLISHED_TIMING_MAX_NUMBER  17

//
// Established Timings: 24 possible resolutions
// Standard Timings: 8 possible resolutions
// Detailed Timings: 4 possible resolutions
//
#define VESA_BIOS_EXTENSIONS_EDID_TIMING_MAX_NUMBER  36

//
// Timing data size for Established Timings, Standard Timings and Detailed Timings
//
#define VESA_BIOS_EXTENSIONS_ESTABLISHED_TIMING_SIZE               3
#define VESA_BIOS_EXTENSIONS_STANDARD_TIMING_SIZE                  16
#define VESA_BIOS_EXTENSIONS_DETAILED_TIMING_EACH_DESCRIPTOR_SIZE  18
#define VESA_BIOS_EXTENSIONS_DETAILED_TIMING_DESCRIPTOR_MAX_SIZE   72

typedef struct {
  UINT16    HorizontalResolution;
  UINT16    VerticalResolution;
  UINT16    RefreshRate;
} VESA_BIOS_EXTENSIONS_EDID_TIMING;

typedef struct {
  UINT32    ValidNumber;
  UINT32    Key[VESA_BIOS_EXTENSIONS_EDID_TIMING_MAX_NUMBER];
} VESA_BIOS_EXTENSIONS_VALID_EDID_TIMING;

typedef struct {
  UINT8     Header[8];                      // EDID header "00 FF FF FF FF FF FF 00"
  UINT16    ManufactureName;                // EISA 3-character ID
  UINT16    ProductCode;                    // Vendor assigned code
  UINT32    SerialNumber;                   // 32-bit serial number
  UINT8     WeekOfManufacture;              // Week number
  UINT8     YearOfManufacture;              // Year
  UINT8     EdidVersion;                    // EDID Structure Version
  UINT8     EdidRevision;                   // EDID Structure Revision
  UINT8     VideoInputDefinition;
  UINT8     MaxHorizontalImageSize;         // cm
  UINT8     MaxVerticalImageSize;           // cm
  UINT8     DisplayTransferCharacteristic;
  UINT8     FeatureSupport;
  UINT8     RedGreenLowBits;                // Rx1 Rx0 Ry1 Ry0 Gx1 Gx0 Gy1Gy0
  UINT8     BlueWhiteLowBits;               // Bx1 Bx0 By1 By0 Wx1 Wx0 Wy1 Wy0
  UINT8     RedX;                           // Red-x Bits 9 - 2
  UINT8     RedY;                           // Red-y Bits 9 - 2
  UINT8     GreenX;                         // Green-x Bits 9 - 2
  UINT8     GreenY;                         // Green-y Bits 9 - 2
  UINT8     BlueX;                          // Blue-x Bits 9 - 2
  UINT8     BlueY;                          // Blue-y Bits 9 - 2
  UINT8     WhiteX;                         // White-x Bits 9 - 2
  UINT8     WhiteY;                         // White-x Bits 9 - 2
  UINT8     EstablishedTimings[VESA_BIOS_EXTENSIONS_ESTABLISHED_TIMING_SIZE];
  UINT8     StandardTimingIdentification[VESA_BIOS_EXTENSIONS_STANDARD_TIMING_SIZE];
  UINT8     DetailedTimingDescriptions[VESA_BIOS_EXTENSIONS_DETAILED_TIMING_DESCRIPTOR_MAX_SIZE];
  UINT8     ExtensionFlag;                  // Number of (optional) 128-byte EDID extension blocks to follow
  UINT8     Checksum;
} VESA_BIOS_EXTENSIONS_EDID_DATA_BLOCK;

//
// Super VGA Information Block
//
typedef struct {
  UINT32    VESASignature;     // 'VESA' 4 byte signature
  UINT16    VESAVersion;       // VBE version number
  UINT32    OEMStringPtr;      // Pointer to OEM string
  UINT32    Capabilities;      // Capabilities of video card
  UINT32    VideoModePtr;      // Pointer to an array of 16-bit supported modes values terminated by 0xFFFF
  UINT16    TotalMemory;       // Number of 64kb memory blocks
  UINT16    OemSoftwareRev;    // VBE implementation Software revision
  UINT32    OemVendorNamePtr;  // VbeFarPtr to Vendor Name String
  UINT32    OemProductNamePtr; // VbeFarPtr to Product Name String
  UINT32    OemProductRevPtr;  // VbeFarPtr to Product Revision String
  UINT8     Reserved[222];     // Reserved for VBE implementation scratch area
  UINT8     OemData[256];      // Data area for OEM strings.  Pad to 512 byte block size
} VESA_BIOS_EXTENSIONS_INFORMATION_BLOCK;

//
// Super VGA Information Block VESASignature values
//
#define VESA_BIOS_EXTENSIONS_VESA_SIGNATURE  SIGNATURE_32 ('V', 'E', 'S', 'A')
#define VESA_BIOS_EXTENSIONS_VBE2_SIGNATURE  SIGNATURE_32 ('V', 'B', 'E', '2')

//
// Super VGA Information Block VESAVersion values
//
#define VESA_BIOS_EXTENSIONS_VERSION_1_2  0x0102
#define VESA_BIOS_EXTENSIONS_VERSION_2_0  0x0200
#define VESA_BIOS_EXTENSIONS_VERSION_3_0  0x0300

//
// Super VGA Information Block Capabilities field bit definitions
//
#define VESA_BIOS_EXTENSIONS_CAPABILITY_8_BIT_DAC  0x01 // 0: DAC width is fixed at 6 bits/color
// 1: DAC width switchable to 8 bits/color
//
#define VESA_BIOS_EXTENSIONS_CAPABILITY_NOT_VGA  0x02 // 0: Controller is VGA compatible
// 1: Controller is not VGA compatible
//
#define VESA_BIOS_EXTENSIONS_CAPABILITY_NOT_NORMAL_RAMDAC  0x04 // 0: Normal RAMDAC operation
// 1: Use blank bit in function 9 to program RAMDAC
//
#define VESA_BIOS_EXTENSIONS_CAPABILITY_STEREOSCOPIC  0x08  // 0: No hardware stereoscopic signal support
// 1: Hardware stereoscopic signal support
//
#define VESA_BIOS_EXTENSIONS_CAPABILITY_VESA_EVC  0x10  // 0: Stero signaling supported via external VESA stereo connector
// 1: Stero signaling supported via VESA EVC connector
//
// Super VGA mode number bite field definitions
//
#define VESA_BIOS_EXTENSIONS_MODE_NUMBER_VESA  0x0100 // 0: Not a VESA defined VBE mode
// 1: A VESA defined VBE mode
//
#define VESA_BIOS_EXTENSIONS_MODE_NUMBER_REFRESH_CONTROL_USER  0x0800 // 0: Use current BIOS default referesh rate
// 1: Use the user specified CRTC values for refresh rate
//
#define VESA_BIOS_EXTENSIONS_MODE_NUMBER_LINEAR_FRAME_BUFFER  0x4000  // 0: Use a banked/windowed frame buffer
// 1: Use a linear/flat frame buffer
//
#define VESA_BIOS_EXTENSIONS_MODE_NUMBER_PRESERVE_MEMORY  0x8000  // 0: Clear display memory
// 1: Preseve display memory
//
// Super VGA Information Block mode list terminator value
//
#define VESA_BIOS_EXTENSIONS_END_OF_MODE_LIST  0xffff

//
// Window Function
//
typedef
VOID
(*VESA_BIOS_EXTENSIONS_WINDOW_FUNCTION) (
  VOID
  );

//
// Super VGA Mode Information Block
//
typedef struct {
  //
  // Manadory fields for all VESA Bios Extensions revisions
  //
  UINT16    ModeAttributes;                               // Mode attributes
  UINT8     WinAAttributes;                               // Window A attributes
  UINT8     WinBAttributes;                               // Window B attributes
  UINT16    WinGranularity;                               // Window granularity in k
  UINT16    WinSize;                                      // Window size in k
  UINT16    WinASegment;                                  // Window A segment
  UINT16    WinBSegment;                                  // Window B segment
  UINT32    WindowFunction;                               // Pointer to window function
  UINT16    BytesPerScanLine;                             // Bytes per scanline
  //
  // Manadory fields for VESA Bios Extensions 1.2 and above
  //
  UINT16    XResolution;                                      // Horizontal resolution
  UINT16    YResolution;                                      // Vertical resolution
  UINT8     XCharSize;                                        // Character cell width
  UINT8     YCharSize;                                        // Character cell height
  UINT8     NumberOfPlanes;                                   // Number of memory planes
  UINT8     BitsPerPixel;                                     // Bits per pixel
  UINT8     NumberOfBanks;                                    // Number of CGA style banks
  UINT8     MemoryModel;                                      // Memory model type
  UINT8     BankSize;                                         // Size of CGA style banks
  UINT8     NumberOfImagePages;                               // Number of images pages
  UINT8     Reserved1;                                        // Reserved
  UINT8     RedMaskSize;                                      // Size of direct color red mask
  UINT8     RedFieldPosition;                                 // Bit posn of lsb of red mask
  UINT8     GreenMaskSize;                                    // Size of direct color green mask
  UINT8     GreenFieldPosition;                               // Bit posn of lsb of green mask
  UINT8     BlueMaskSize;                                     // Size of direct color blue mask
  UINT8     BlueFieldPosition;                                // Bit posn of lsb of blue mask
  UINT8     RsvdMaskSize;                                     // Size of direct color res mask
  UINT8     RsvdFieldPosition;                                // Bit posn of lsb of res mask
  UINT8     DirectColorModeInfo;                              // Direct color mode attributes
  //
  // Manadory fields for VESA Bios Extensions 2.0 and above
  //
  UINT32    PhysBasePtr;                              // Physical Address for flat memory frame buffer
  UINT32    Reserved2;                                // Reserved
  UINT16    Reserved3;                                // Reserved
  //
  // Manadory fields for VESA Bios Extensions 3.0 and above
  //
  UINT16    LinBytesPerScanLine;                                // Bytes/scan line for linear modes
  UINT8     BnkNumberOfImagePages;                              // Number of images for banked modes
  UINT8     LinNumberOfImagePages;                              // Number of images for linear modes
  UINT8     LinRedMaskSize;                                     // Size of direct color red mask (linear mode)
  UINT8     LinRedFieldPosition;                                // Bit posiiton of lsb of red mask (linear modes)
  UINT8     LinGreenMaskSize;                                   // Size of direct color green mask (linear mode)
  UINT8     LinGreenFieldPosition;                              // Bit posiiton of lsb of green mask (linear modes)
  UINT8     LinBlueMaskSize;                                    // Size of direct color blue mask (linear mode)
  UINT8     LinBlueFieldPosition;                               // Bit posiiton of lsb of blue mask (linear modes)
  UINT8     LinRsvdMaskSize;                                    // Size of direct color reserved mask (linear mode)
  UINT8     LinRsvdFieldPosition;                               // Bit posiiton of lsb of reserved mask (linear modes)
  UINT32    MaxPixelClock;                                      // Maximum pixel clock (in Hz) for graphics mode
  UINT8     Pad[190];                                           // Pad to 256 byte block size
} VESA_BIOS_EXTENSIONS_MODE_INFORMATION_BLOCK;

//
// Super VGA Mode Information Block ModeAttributes field bit definitions
//
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_HARDWARE  0x0001  // 0: Mode not supported in handware
// 1: Mode supported in handware
//
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_TTY  0x0004 // 0: TTY Output functions not supported by BIOS
// 1: TTY Output functions supported by BIOS
//
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_COLOR  0x0008 // 0: Monochrome mode
// 1: Color mode
//
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_GRAPHICS  0x0010  // 0: Text mode
// 1: Graphics mode
//
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_NOT_VGA  0x0020 // 0: VGA compatible mode
// 1: Not a VGA compatible mode
//
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_NOT_WINDOWED  0x0040  // 0: VGA compatible windowed memory mode
// 1: Not a VGA compatible windowed memory mode
//
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_LINEAR_FRAME_BUFFER  0x0080 // 0: No linear fram buffer mode available
// 1: Linear frame buffer mode available
//
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_DOUBLE_SCAN  0x0100 // 0: No double scan mode available
// 1: Double scan mode available
//
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_INTERLACED  0x0200  // 0: No interlaced mode is available
// 1: Interlaced mode is available
//
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_NO_TRIPPLE_BUFFER  0x0400 // 0: No hardware triple buffer mode support available
// 1: Hardware triple buffer mode support available
//
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_STEREOSCOPIC  0x0800  // 0: No hardware steroscopic display support
// 1: Hardware steroscopic display support
//
#define VESA_BIOS_EXTENSIONS_MODE_ATTRIBUTE_DUAL_DISPLAY  0x1000  // 0: No dual display start address support
// 1: Dual display start address support
//
// Super VGA Mode Information Block WinAAttribite/WinBAttributes field bit definitions
//
#define VESA_BIOS_EXTENSIONS_WINX_ATTRIBUTE_RELOCATABLE  0x01 // 0: Single non-relocatable window only
// 1: Relocatable window(s) are supported
//
#define VESA_BIOS_EXTENSIONS_WINX_ATTRIBUTE_READABLE  0x02  // 0: Window is not readable
// 1: Window is readable
//
#define VESA_BIOS_EXTENSIONS_WINX_ATTRIBUTE_WRITABLE  0x04  // 0: Window is not writable
// 1: Window is writable
//
// Super VGA Mode Information Block DirectColorMode field bit definitions
//
#define VESA_BIOS_EXTENSIONS_DIRECT_COLOR_MODE_PROG_COLOR_RAMP  0x01  // 0: Color ram is fixed
// 1: Color ramp is programmable
//
#define VESA_BIOS_EXTENSIONS_DIRECT_COLOR_MODE_RSVD_USABLE  0x02  // 0: Bits in Rsvd field are reserved
// 1: Bits in Rsdv field are usable
//
// Super VGA Memory Models
//
typedef enum {
  MemPL  = 3, // Planar memory model
  MemPK  = 4, // Packed pixel memory model
  MemRGB = 6, // Direct color RGB memory model
  MemYUV = 7  // Direct color YUV memory model
} VESA_BIOS_EXTENSIONS_MEMORY_MODELS;

//
// Super VGA CRTC Information Block
//
typedef struct {
  UINT16    HorizontalTotal;     // Horizontal total in pixels
  UINT16    HorizontalSyncStart; // Horizontal sync start in pixels
  UINT16    HorizontalSyncEnd;   // Horizontal sync end in pixels
  UINT16    VericalTotal;        // Vertical total in pixels
  UINT16    VericalSyncStart;    // Vertical sync start in pixels
  UINT16    VericalSyncEnd;      // Vertical sync end in pixels
  UINT8     Flags;               // Flags (Interlaced/DoubleScan/etc).
  UINT32    PixelClock;          // Pixel clock in units of Hz
  UINT16    RefreshRate;         // Refresh rate in units of 0.01 Hz
  UINT8     Reserved[40];        // Pad
} VESA_BIOS_EXTENSIONS_CRTC_INFORMATION_BLOCK;

#define VESA_BIOS_EXTENSIONS_CRTC_FLAGS_DOUBLE_SCAN  0x01 // 0: Graphics mode is not souble scanned
// 1: Graphics mode is double scanned
//
#define VESA_BIOS_EXTENSIONS_CRTC_FLAGSINTERLACED  0x02 // 0: Graphics mode is not interlaced
// 1: Graphics mode is interlaced
//
#define VESA_BIOS_EXTENSIONS_CRTC_HORIZONTAL_SYNC_NEGATIVE  0x04  // 0: Horizontal sync polarity is positive(+)
// 0: Horizontal sync polarity is negative(-)
//
#define VESA_BIOS_EXTENSIONS_CRTC_VERITICAL_SYNC_NEGATIVE  0x08 // 0: Verical sync polarity is positive(+)
// 0: Verical sync polarity is negative(-)
//
// Turn off byte packing of data structures
//
#pragma pack()

#endif