]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg: Introduced ArmPsciResetSystemLib
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Wed, 10 Sep 2014 18:47:30 +0000 (18:47 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 10 Sep 2014 18:47:30 +0000 (18:47 +0000)
This implementation of EfiResetSystemLib uses ARM PSCI calls to perform
reboot and poweroff, using either HVC or SMC calls.

Contributed-under: TianoCore Contribution Agreement 1.0
Acked-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16089 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/ArmPkg.dec
ArmPkg/ArmPkg.dsc
ArmPkg/Library/ArmPsciResetSystemLib/ArmPsciResetSystemLib.c [new file with mode: 0644]
ArmPkg/Library/ArmPsciResetSystemLib/ArmPsciResetSystemLib.inf [new file with mode: 0644]

index 05bc1dcd6d613c042c01f304b6ee13aac5a5de9e..31427514492e54ea6d5c821d4565e42c0a036ea1 100644 (file)
   gArmTokenSpaceGuid.PcdGicDistributorBase|0|UINT32|0x0000000C\r
   gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0|UINT32|0x0000000D\r
   gArmTokenSpaceGuid.PcdGicSgiIntId|0|UINT32|0x00000025\r
+\r
+  #\r
+  # ARM PSCI function invocations can be done either through hypervisor\r
+  # calls (HVC) or secure monitor calls (SMC).\r
+  # PcdArmPsciMethod == 1 : use HVC\r
+  # PcdArmPsciMethod == 2 : use SMC\r
+  #\r
+  gArmTokenSpaceGuid.PcdArmPsciMethod|0|UINT32|0x00000042\r
index ad02281926b3e4103ea28e18dd1a296338d65b00..3af9b3b0b8e5397e7685c9d2013cf028947a9db9 100644 (file)
   ArmPkg/Library/SemiHostingSerialPortLib/SemiHostingSerialPortLib.inf\r
   ArmPkg/Library/SemihostLib/SemihostLib.inf\r
   ArmPkg/Library/UncachedMemoryAllocationLib/UncachedMemoryAllocationLib.inf\r
+  ArmPkg/Library/ArmPsciResetSystemLib/ArmPsciResetSystemLib.inf\r
 \r
   ArmPkg/Drivers/CpuDxe/CpuDxe.inf\r
   ArmPkg/Drivers/CpuPei/CpuPei.inf\r
diff --git a/ArmPkg/Library/ArmPsciResetSystemLib/ArmPsciResetSystemLib.c b/ArmPkg/Library/ArmPsciResetSystemLib/ArmPsciResetSystemLib.c
new file mode 100644 (file)
index 0000000..48c8735
--- /dev/null
@@ -0,0 +1,109 @@
+/** @file\r
+  Support ResetSystem Runtime call using PSCI calls\r
+\r
+  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
+  Copyright (c) 2013, ARM Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2014, Linaro Ltd. All rights reserved.<BR>\r
+\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiDxe.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/EfiResetSystemLib.h>\r
+#include <Library/ArmSmcLib.h>\r
+#include <Library/ArmHvcLib.h>\r
+\r
+#include <IndustryStandard/ArmStdSmc.h>\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
+\r
+**/\r
+EFI_STATUS\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
+  )\r
+{\r
+  ARM_SMC_ARGS ArmSmcArgs;\r
+  ARM_HVC_ARGS ArmHvcArgs;\r
+\r
+  switch (ResetType) {\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
+    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
+    break;\r
+  default:\r
+    ASSERT (FALSE);\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  switch (PcdGet32 (PcdArmPsciMethod)) {\r
+  case 1:\r
+    ArmCallHvc (&ArmHvcArgs);\r
+    break;\r
+\r
+  case 2:\r
+    ArmCallSmc (&ArmSmcArgs);\r
+    break;\r
+\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
+\r
+  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+LibInitializeResetSystem (\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
+  )\r
+{\r
+  return EFI_SUCCESS;\r
+}\r
diff --git a/ArmPkg/Library/ArmPsciResetSystemLib/ArmPsciResetSystemLib.inf b/ArmPkg/Library/ArmPsciResetSystemLib/ArmPsciResetSystemLib.inf
new file mode 100644 (file)
index 0000000..bcea0ae
--- /dev/null
@@ -0,0 +1,40 @@
+#/** @file\r
+# Reset System lib using PSCI hypervisor or secure monitor calls\r
+#\r
+# Copyright (c) 2008, Apple Inc. All rights reserved.<BR>\r
+# Copyright (c) 2014, Linaro Ltd. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+#\r
+#**/\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = ArmPsciResetSystemLib\r
+  FILE_GUID                      = A8F59B69-A105-41C7-8F5A-2C60DD7FD7AA\r
+  MODULE_TYPE                    = BASE\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = EfiResetSystemLib\r
+\r
+[Sources]\r
+  ArmPsciResetSystemLib.c\r
+\r
+[Packages]\r
+  ArmPkg/ArmPkg.dec\r
+  MdePkg/MdePkg.dec\r
+  EmbeddedPkg/EmbeddedPkg.dec\r
+\r
+[LibraryClasses]\r
+  DebugLib\r
+  BaseLib\r
+  ArmSmcLib\r
+  ArmHvcLib\r
+\r
+[Pcd]\r
+  gArmTokenSpaceGuid.PcdArmPsciMethod\r