/** @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
