]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Csm/LegacyBiosDxe/LegacyCmos.c
OvmfPkg: Copy the required CSM components from framework packages
[mirror_edk2.git] / OvmfPkg / Csm / LegacyBiosDxe / LegacyCmos.c
diff --git a/OvmfPkg/Csm/LegacyBiosDxe/LegacyCmos.c b/OvmfPkg/Csm/LegacyBiosDxe/LegacyCmos.c
new file mode 100644 (file)
index 0000000..de25e06
--- /dev/null
@@ -0,0 +1,117 @@
+/** @file\r
+  This code fills in standard CMOS values and updates the standard CMOS\r
+  checksum. The Legacy16 code or LegacyBiosPlatform.c is responsible for\r
+  non-standard CMOS locations and non-standard checksums.\r
+\r
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include "LegacyBiosInterface.h"\r
+\r
+/**\r
+  Read CMOS register through index/data port.\r
+\r
+  @param[in]  Index   The index of the CMOS register to read.\r
+\r
+  @return  The data value from the CMOS register specified by Index.\r
+\r
+**/\r
+UINT8\r
+LegacyReadStandardCmos (\r
+  IN UINT8  Index\r
+  )\r
+{\r
+  IoWrite8 (PORT_70, Index);\r
+  return IoRead8 (PORT_71);\r
+}\r
+\r
+/**\r
+  Write CMOS register through index/data port.\r
+\r
+  @param[in]  Index  The index of the CMOS register to write.\r
+  @param[in]  Value  The value of CMOS register to write.\r
+\r
+  @return  The value written to the CMOS register specified by Index.\r
+\r
+**/\r
+UINT8\r
+LegacyWriteStandardCmos (\r
+  IN UINT8  Index,\r
+  IN UINT8  Value\r
+  )\r
+{\r
+  IoWrite8 (PORT_70, Index);\r
+  return IoWrite8 (PORT_71, Value);\r
+}\r
+\r
+/**\r
+  Calculate the new standard CMOS checksum and write it.\r
+\r
+  @param  Private      Legacy BIOS Instance data\r
+\r
+  @retval EFI_SUCCESS  Calculate 16-bit checksum successfully\r
+\r
+**/\r
+EFI_STATUS\r
+LegacyCalculateWriteStandardCmosChecksum (\r
+  VOID\r
+  )\r
+{\r
+  UINT8   Register;\r
+  UINT16  Checksum;\r
+\r
+  for (Checksum = 0, Register = 0x10; Register < 0x2e; Register++) {\r
+    Checksum = (UINT16)(Checksum + LegacyReadStandardCmos (Register));\r
+  }\r
+  LegacyWriteStandardCmos (CMOS_2E, (UINT8)(Checksum >> 8));\r
+  LegacyWriteStandardCmos (CMOS_2F, (UINT8)(Checksum & 0xff));\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Fill in the standard CMOS stuff before Legacy16 load\r
+\r
+  @param  Private      Legacy BIOS Instance data\r
+\r
+  @retval EFI_SUCCESS  It should always work.\r
+\r
+**/\r
+EFI_STATUS\r
+LegacyBiosInitCmos (\r
+  IN  LEGACY_BIOS_INSTANCE    *Private\r
+  )\r
+{\r
+  UINT32  Size;\r
+\r
+  //\r
+  //  Clear all errors except RTC lost power\r
+  //\r
+  LegacyWriteStandardCmos (CMOS_0E, (UINT8)(LegacyReadStandardCmos (CMOS_0E) & BIT7));\r
+\r
+  //\r
+  // Update CMOS locations 15,16,17,18,30,31 and 32\r
+  // CMOS 16,15 = 640Kb = 0x280\r
+  // CMOS 18,17 = 31,30 = 15Mb max in 1Kb increments =0x3C00 max\r
+  // CMOS 32 = 0x20\r
+  //\r
+  LegacyWriteStandardCmos (CMOS_15, 0x80);\r
+  LegacyWriteStandardCmos (CMOS_16, 0x02);\r
+\r
+  Size = 15 * SIZE_1MB;\r
+  if (Private->IntThunk->EfiToLegacy16InitTable.OsMemoryAbove1Mb < (15 * SIZE_1MB)) {\r
+    Size  = Private->IntThunk->EfiToLegacy16InitTable.OsMemoryAbove1Mb >> 10;\r
+  }\r
+\r
+  LegacyWriteStandardCmos (CMOS_17, (UINT8)(Size & 0xFF));\r
+  LegacyWriteStandardCmos (CMOS_30, (UINT8)(Size & 0xFF));\r
+  LegacyWriteStandardCmos (CMOS_18, (UINT8)(Size >> 8));\r
+  LegacyWriteStandardCmos (CMOS_31, (UINT8)(Size >> 8));\r
+\r
+  LegacyCalculateWriteStandardCmosChecksum ();\r
+\r
+  return EFI_SUCCESS;\r
+}\r