]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmVirtPkg/Library/ArmVirtPsciResetSystemLib/ArmVirtPsciResetSystemLib.c
ArmVirtPkg: switch to generic ResetSystemRuntimeDxe
[mirror_edk2.git] / ArmVirtPkg / Library / ArmVirtPsciResetSystemLib / ArmVirtPsciResetSystemLib.c
index b94d1b0090c69a3a5f743869d2b907b2aef4ff8a..4b0db206e92030c160286f90ca7f17531d376e4c 100644 (file)
@@ -23,7 +23,7 @@
 \r
 #include <Library/BaseLib.h>\r
 #include <Library/DebugLib.h>\r
-#include <Library/EfiResetSystemLib.h>\r
+#include <Library/ResetSystemLib.h>\r
 #include <Library/ArmSmcLib.h>\r
 #include <Library/ArmHvcLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
@@ -67,48 +67,74 @@ ArmPsciResetSystemLibConstructor (
 }\r
 \r
 /**\r
-  Resets the entire platform.\r
-\r
-  @param  ResetType             The type of reset to perform.\r
-  @param  ResetStatus           The status code for the reset.\r
-  @param  DataSize              The size, in bytes, of WatchdogData.\r
-  @param  ResetData             For a ResetType of EfiResetCold, EfiResetWarm, or\r
-                                EfiResetShutdown the data buffer starts with a Null-terminated\r
-                                Unicode string, optionally followed by additional binary data.\r
+  This function causes a system-wide reset (cold reset), in which\r
+  all circuitry within the system returns to its initial state. This type of reset\r
+  is asynchronous to system operation and operates without regard to\r
+  cycle boundaries.\r
 \r
+  If this function returns, it means that the system does not support cold reset.\r
 **/\r
-EFI_STATUS\r
+VOID\r
 EFIAPI\r
-LibResetSystem (\r
-  IN EFI_RESET_TYPE   ResetType,\r
-  IN EFI_STATUS       ResetStatus,\r
-  IN UINTN            DataSize,\r
-  IN CHAR16           *ResetData OPTIONAL\r
+ResetCold (\r
+  VOID\r
   )\r
 {\r
   ARM_SMC_ARGS ArmSmcArgs;\r
   ARM_HVC_ARGS ArmHvcArgs;\r
 \r
-  switch (ResetType) {\r
+  // Send a PSCI 0.2 SYSTEM_RESET command\r
+  ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_RESET;\r
+  ArmHvcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_RESET;\r
 \r
-  case EfiResetPlatformSpecific:\r
-    // Map the platform specific reset as reboot\r
-  case EfiResetWarm:\r
-    // Map a warm reset into a cold reset\r
-  case EfiResetCold:\r
-    // Send a PSCI 0.2 SYSTEM_RESET command\r
-    ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_RESET;\r
-    ArmHvcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_RESET;\r
+  switch (mArmPsciMethod) {\r
+  case 1:\r
+    ArmCallHvc (&ArmHvcArgs);\r
     break;\r
-  case EfiResetShutdown:\r
-    // Send a PSCI 0.2 SYSTEM_OFF command\r
-    ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_OFF;\r
-    ArmHvcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_OFF;\r
+\r
+  case 2:\r
+    ArmCallSmc (&ArmSmcArgs);\r
     break;\r
+\r
   default:\r
-    ASSERT (FALSE);\r
-    return EFI_UNSUPPORTED;\r
+    DEBUG ((EFI_D_ERROR, "%a: no PSCI method defined\n", __FUNCTION__));\r
   }\r
+}\r
+\r
+/**\r
+  This function causes a system-wide initialization (warm reset), in which all processors\r
+  are set to their initial state. Pending cycles are not corrupted.\r
+\r
+  If this function returns, it means that the system does not support warm reset.\r
+**/\r
+VOID\r
+EFIAPI\r
+ResetWarm (\r
+  VOID\r
+  )\r
+{\r
+  // Map a warm reset into a cold reset\r
+  ResetCold ();\r
+}\r
+\r
+/**\r
+  This function causes the system to enter a power state equivalent\r
+  to the ACPI G2/S5 or G3 states.\r
+\r
+  If this function returns, it means that the system does not support shutdown reset.\r
+**/\r
+VOID\r
+EFIAPI\r
+ResetShutdown (\r
+  VOID\r
+  )\r
+{\r
+  ARM_SMC_ARGS ArmSmcArgs;\r
+  ARM_HVC_ARGS ArmHvcArgs;\r
+\r
+  // Send a PSCI 0.2 SYSTEM_OFF command\r
+  ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_OFF;\r
+  ArmHvcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_OFF;\r
 \r
   switch (mArmPsciMethod) {\r
   case 1:\r
@@ -121,30 +147,41 @@ LibResetSystem (
 \r
   default:\r
     DEBUG ((EFI_D_ERROR, "%a: no PSCI method defined\n", __FUNCTION__));\r
-    return EFI_UNSUPPORTED;\r
   }\r
-\r
-  // We should never be here\r
-  DEBUG ((EFI_D_ERROR, "%a: PSCI Reset failed\n", __FUNCTION__));\r
-  CpuDeadLoop ();\r
-  return EFI_UNSUPPORTED;\r
 }\r
 \r
 /**\r
-  Initialize any infrastructure required for LibResetSystem () to function.\r
-\r
-  @param  ImageHandle   The firmware allocated handle for the EFI image.\r
-  @param  SystemTable   A pointer to the EFI System Table.\r
+  This function causes the system to enter S3 and then wake up immediately.\r
 \r
-  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.\r
+  If this function returns, it means that the system does not support S3 feature.\r
+**/\r
+VOID\r
+EFIAPI\r
+EnterS3WithImmediateWake (\r
+  VOID\r
+  )\r
+{\r
+  // not implemented\r
+}\r
 \r
+/**\r
+  This function causes a systemwide reset. The exact type of the reset is\r
+  defined by the EFI_GUID that follows the Null-terminated Unicode string passed\r
+  into ResetData. If the platform does not recognize the EFI_GUID in ResetData\r
+  the platform must pick a supported reset type to perform.The platform may\r
+  optionally log the parameters from any non-normal reset that occurs.\r
+\r
+  @param[in]  DataSize   The size, in bytes, of ResetData.\r
+  @param[in]  ResetData  The data buffer starts with a Null-terminated string,\r
+                         followed by the EFI_GUID.\r
 **/\r
-EFI_STATUS\r
+VOID\r
 EFIAPI\r
-LibInitializeResetSystem (\r
-  IN EFI_HANDLE        ImageHandle,\r
-  IN EFI_SYSTEM_TABLE  *SystemTable\r
+ResetPlatformSpecific (\r
+  IN UINTN   DataSize,\r
+  IN VOID    *ResetData\r
   )\r
 {\r
-  return EFI_SUCCESS;\r
+  // Map the platform specific reset as reboot\r
+  ResetCold ();\r
 }\r