]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Parse full EDID data to get all video resolutions supported by monitors.
authorli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 22 Jan 2013 06:18:50 +0000 (06:18 +0000)
committerli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 22 Jan 2013 06:18:50 +0000 (06:18 +0000)
Signed-off-by: Li Elvin <elvin.li@intel.com>
Reviewed-by: Ni Ruiyu <ruiyu.ni@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14073 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Csm/BiosThunk/VideoDxe/BiosVideo.c
IntelFrameworkModulePkg/Csm/BiosThunk/VideoDxe/VesaBiosExtensions.h

index 21b3e872684aaa8b14debc36446e135fc9c2689c..f38c968943d0d043cee1783982c2a82edd877712 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   ConsoleOut Routines that speak VGA.\r
 \r
-Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>\r
 \r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions\r
@@ -1129,49 +1129,79 @@ ParseEdidData (
                  ((EdidDataBlock->EstablishedTimings[2] & 0x80) << 9) ;\r
     for (Index = 0; Index < VESA_BIOS_EXTENSIONS_EDID_ESTABLISHED_TIMING_MAX_NUMBER; Index ++) {\r
       if ((TimingBits & 0x1) != 0) {\r
+        DEBUG ((EFI_D_INFO, "Established Timing: %d x %d\n",\r
+        mEstablishedEdidTiming[Index].HorizontalResolution, mEstablishedEdidTiming[Index].VerticalResolution));\r
         ValidEdidTiming->Key[ValidNumber] = CalculateEdidKey (&mEstablishedEdidTiming[Index]);\r
         ValidNumber ++;\r
       }\r
       TimingBits = TimingBits >> 1;\r
     }\r
-  } else {\r
+  }\r
+\r
+  //\r
+  // Parse the standard timing data\r
+  //\r
+  BufferIndex = &EdidDataBlock->StandardTimingIdentification[0];\r
+  for (Index = 0; Index < 8; Index ++) {\r
     //\r
-    // If no Established timing data, read the standard timing data\r
+    // Check if this is a valid Standard Timing entry\r
+    // VESA documents unused fields should be set to 01h\r
     //\r
-    BufferIndex = &EdidDataBlock->StandardTimingIdentification[0];\r
-    for (Index = 0; Index < 8; Index ++) {\r
-      if ((BufferIndex[0] != 0x1) && (BufferIndex[1] != 0x1)){\r
-        //\r
-        // A valid Standard Timing\r
-        //\r
-        HorizontalResolution = (UINT16) (BufferIndex[0] * 8 + 248);\r
-        AspectRatio = (UINT8) (BufferIndex[1] >> 6);\r
-        switch (AspectRatio) {\r
-          case 0:\r
-            VerticalResolution = (UINT16) (HorizontalResolution / 16 * 10);\r
-            break;\r
-          case 1:\r
-            VerticalResolution = (UINT16) (HorizontalResolution / 4 * 3);\r
-            break;\r
-          case 2:\r
-            VerticalResolution = (UINT16) (HorizontalResolution / 5 * 4);\r
-            break;\r
-          case 3:\r
-            VerticalResolution = (UINT16) (HorizontalResolution / 16 * 9);\r
-            break;\r
-          default:\r
-            VerticalResolution = (UINT16) (HorizontalResolution / 4 * 3);\r
-            break;\r
-        }\r
-        RefreshRate = (UINT8) ((BufferIndex[1] & 0x1f) + 60);\r
-        TempTiming.HorizontalResolution = HorizontalResolution;\r
-        TempTiming.VerticalResolution = VerticalResolution;\r
-        TempTiming.RefreshRate = RefreshRate;\r
-        ValidEdidTiming->Key[ValidNumber] = CalculateEdidKey (&TempTiming);\r
-        ValidNumber ++;\r
+    if ((BufferIndex[0] != 0x1) && (BufferIndex[1] != 0x1)){\r
+      //\r
+      // A valid Standard Timing\r
+      //\r
+      HorizontalResolution = (UINT16) (BufferIndex[0] * 8 + 248);\r
+      AspectRatio = (UINT8) (BufferIndex[1] >> 6);\r
+      switch (AspectRatio) {\r
+        case 0:\r
+          VerticalResolution = (UINT16) (HorizontalResolution / 16 * 10);\r
+          break;\r
+        case 1:\r
+          VerticalResolution = (UINT16) (HorizontalResolution / 4 * 3);\r
+          break;\r
+        case 2:\r
+          VerticalResolution = (UINT16) (HorizontalResolution / 5 * 4);\r
+          break;\r
+        case 3:\r
+          VerticalResolution = (UINT16) (HorizontalResolution / 16 * 9);\r
+          break;\r
+        default:\r
+          VerticalResolution = (UINT16) (HorizontalResolution / 4 * 3);\r
+          break;\r
       }\r
-      BufferIndex += 2;\r
+      RefreshRate = (UINT8) ((BufferIndex[1] & 0x1f) + 60);\r
+      DEBUG ((EFI_D_INFO, "Standard Timing: %d x %d\n", HorizontalResolution, VerticalResolution));\r
+      TempTiming.HorizontalResolution = HorizontalResolution;\r
+      TempTiming.VerticalResolution = VerticalResolution;\r
+      TempTiming.RefreshRate = RefreshRate;\r
+      ValidEdidTiming->Key[ValidNumber] = CalculateEdidKey (&TempTiming);\r
+      ValidNumber ++;\r
     }\r
+    BufferIndex += 2;\r
+  }\r
+\r
+  //\r
+  // Parse the Detailed Timing data\r
+  //\r
+  BufferIndex = &EdidDataBlock->DetailedTimingDescriptions[0];\r
+  for (Index = 0; Index < 4; Index ++, BufferIndex += VESA_BIOS_EXTENSIONS_DETAILED_TIMING_EACH_DESCRIPTOR_SIZE) {\r
+    if ((BufferIndex[0] == 0x0) && (BufferIndex[1] == 0x0)) {\r
+      //\r
+      // Check if this is a valid Detailed Timing Descriptor\r
+      // If first 2 bytes are zero, it is monitor descriptor other than detailed timing descriptor\r
+      //\r
+      continue;\r
+    }\r
+    //\r
+    // Calculate Horizontal and Vertical resolution\r
+    //\r
+    TempTiming.HorizontalResolution = ((UINT16)(BufferIndex[4] & 0xF0) << 4) | (BufferIndex[2]);\r
+    TempTiming.VerticalResolution = ((UINT16)(BufferIndex[7] & 0xF0) << 4) | (BufferIndex[5]);\r
+    DEBUG ((EFI_D_INFO, "Detailed Timing %d: %d x %d\n",\r
+            Index, TempTiming.HorizontalResolution, TempTiming.VerticalResolution));\r
+    ValidEdidTiming->Key[ValidNumber] = CalculateEdidKey (&TempTiming);\r
+    ValidNumber ++;\r
   }\r
 \r
   ValidEdidTiming->ValidNumber = ValidNumber;\r
index dcda3fcd5a91efc6f657786767487a1f6f7162a8..25eee6921d51f18c43a05d25f4603df099142822 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>\r
 \r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions\r
@@ -168,6 +168,21 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #define VESA_BIOS_EXTENSIONS_EDID_BLOCK_SIZE                    128\r
 #define VESA_BIOS_EXTENSIONS_EDID_ESTABLISHED_TIMING_MAX_NUMBER 17\r
 \r
+//\r
+// Established Timings: 24 possible resolutions\r
+// Standard Timings: 8 possible resolutions\r
+// Detailed Timings: 4 possible resolutions\r
+//\r
+#define VESA_BIOS_EXTENSIONS_EDID_TIMING_MAX_NUMBER             36\r
+\r
+//\r
+// Timing data size for Established Timings, Standard Timings and Detailed Timings\r
+//\r
+#define VESA_BIOS_EXTENSIONS_ESTABLISHED_TIMING_SIZE                  3\r
+#define VESA_BIOS_EXTENSIONS_STANDARD_TIMING_SIZE                     16\r
+#define VESA_BIOS_EXTENSIONS_DETAILED_TIMING_EACH_DESCRIPTOR_SIZE     18\r
+#define VESA_BIOS_EXTENSIONS_DETAILED_TIMING_DESCRIPTOR_MAX_SIZE      72\r
+\r
 typedef struct {\r
   UINT16  HorizontalResolution;\r
   UINT16  VerticalResolution;\r
@@ -176,7 +191,7 @@ typedef struct {
 \r
 typedef struct {\r
   UINT32  ValidNumber;\r
-  UINT32  Key[VESA_BIOS_EXTENSIONS_EDID_ESTABLISHED_TIMING_MAX_NUMBER];\r
+  UINT32  Key[VESA_BIOS_EXTENSIONS_EDID_TIMING_MAX_NUMBER];\r
 } VESA_BIOS_EXTENSIONS_VALID_EDID_TIMING;\r
 \r
 typedef struct {\r
@@ -203,9 +218,9 @@ typedef struct {
   UINT8   BlueY;                            //Blue-y Bits 9 - 2\r
   UINT8   WhiteX;                           //White-x Bits 9 - 2\r
   UINT8   WhiteY;                           //White-x Bits 9 - 2\r
-  UINT8   EstablishedTimings[3];\r
-  UINT8   StandardTimingIdentification[16];\r
-  UINT8   DetailedTimingDescriptions[72];\r
+  UINT8   EstablishedTimings[VESA_BIOS_EXTENSIONS_ESTABLISHED_TIMING_SIZE];\r
+  UINT8   StandardTimingIdentification[VESA_BIOS_EXTENSIONS_STANDARD_TIMING_SIZE];\r
+  UINT8   DetailedTimingDescriptions[VESA_BIOS_EXTENSIONS_DETAILED_TIMING_DESCRIPTOR_MAX_SIZE];\r
   UINT8   ExtensionFlag;                    //Number of (optional) 128-byte EDID extension blocks to follow\r
   UINT8   Checksum;\r
 } VESA_BIOS_EXTENSIONS_EDID_DATA_BLOCK;\r