]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Acpi/S3SaveStateDxe/S3SaveState.c
MdeModulePkg/Universal: Fix typos in comments
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / S3SaveStateDxe / S3SaveState.c
index 249fb8caff85196266859acfdec24996fac1bd9d..32263c96c56be3e7279f6cf5f084ef4b40ed5304 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Implementation for S3 Boot Script Saver state driver.\r
 \r
-  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2016, 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
@@ -248,7 +248,7 @@ BootScriptWritePciCfg2ReadWrite (
   return S3BootScriptSavePciCfg2ReadWrite (Width, Segment, Address, Data, DataMask);\r
 }\r
 /**\r
-  Internal function to add smbus excute opcode to the table.\r
+  Internal function to add smbus execute opcode to the table.\r
 \r
   @param  Marker                The variable argument list to get the opcode\r
                                 and associated attributes.\r
@@ -344,16 +344,33 @@ BootScriptWriteMemPoll (
   VOID                      *Data;                                    \r
   VOID                      *DataMask;                                  \r
   UINTN                     Delay;                                   \r
-                                                                         \r
+  UINTN                     LoopTimes;\r
+  UINT32                    Remainder;\r
+\r
   Width    = VA_ARG (Marker, S3_BOOT_SCRIPT_LIB_WIDTH);                  \r
   Address  = VA_ARG (Marker, UINT64);                                    \r
   Data     = VA_ARG (Marker, VOID *);                                    \r
   DataMask = VA_ARG (Marker, VOID *);                                    \r
   Delay    = (UINTN)VA_ARG (Marker, UINT64);                            \r
   //\r
-  // According to the spec, the interval between 2 pools is 100ns\r
-  //                                                                       \r
-  return S3BootScriptSaveMemPoll (Width, Address, DataMask, Data, 100, Delay); \r
+  // According to the spec, the interval between 2 polls is 100ns,\r
+  // but the unit of Duration for S3BootScriptSaveMemPoll() is microsecond(1000ns).\r
+  // Duration * 1000ns * LoopTimes = Delay * 100ns\r
+  // Duration will be minimum 1(microsecond) to be minimum deviation,\r
+  // so LoopTimes = Delay / 10.\r
+  //\r
+  LoopTimes = (UINTN) DivU64x32Remainder (\r
+                Delay,\r
+                10,\r
+                &Remainder\r
+                );\r
+  if (Remainder != 0) {\r
+    //\r
+    // If Remainder is not zero, LoopTimes will be rounded up by 1.\r
+    //\r
+    LoopTimes +=1;\r
+  }\r
+  return S3BootScriptSaveMemPoll (Width, Address, DataMask, Data, 1, LoopTimes);\r
 \r
 }\r
 \r
@@ -889,7 +906,22 @@ InitializeS3SaveState (
   IN EFI_SYSTEM_TABLE     *SystemTable\r
   )\r
 {\r
+  EFI_STATUS    Status;\r
+  EFI_EVENT     EndOfDxeEvent;\r
 \r
+  if (!PcdGetBool (PcdAcpiS3Enable)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Status = gBS->CreateEventEx (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_CALLBACK,\r
+                  AcpiS3ContextSaveOnEndOfDxe,\r
+                  NULL,\r
+                  &gEfiEndOfDxeEventGroupGuid,\r
+                  &EndOfDxeEvent\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   return  gBS->InstallProtocolInterface (\r
                   &mHandle,\r