]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.c
ArmPkg: Handle warm reboot request correctly
[mirror_edk2.git] / ArmPkg / Library / ArmSmcPsciResetSystemLib / ArmSmcPsciResetSystemLib.c
index af6738459e43d690583df4602322ed64f5a45804..dc7b9fd01951f94cbd36773884b875b887d63a56 100644 (file)
@@ -3,6 +3,7 @@
 \r
   Copyright (c) 2017 - 2018, Linaro Ltd. All rights reserved.<BR>\r
   Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2022, Arm Limited. All rights reserved.<BR>\r
 \r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
@@ -47,8 +48,24 @@ ResetWarm (
   VOID\r
   )\r
 {\r
-  // Map a warm reset into a cold reset\r
-  ResetCold ();\r
+  UINTN  Arg1;\r
+  UINTN  Ret;\r
+\r
+  Arg1 = ARM_SMC_ID_PSCI_SYSTEM_RESET2_AARCH64;\r
+\r
+  // Is SYSTEM_RESET2 supported?\r
+  Ret = ArmCallSmc0 (ARM_SMC_ID_PSCI_FEATURES, &Arg1, NULL, NULL);\r
+  if (Ret == ARM_SMC_PSCI_RET_SUCCESS) {\r
+    // Send PSCI SYSTEM_RESET2 command\r
+    ArmCallSmc0 (Arg1, NULL, NULL, NULL);\r
+  } else {\r
+    // Map a warm reset into a cold reset\r
+    DEBUG ((\r
+      DEBUG_INFO,\r
+      "Warm reboot not supported by platform, issuing cold reboot\n"\r
+      ));\r
+    ResetCold ();\r
+  }\r
 }\r
 \r
 /**\r