]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Include/Library/ArmSmcLib.h
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ArmPkg / Include / Library / ArmSmcLib.h
index ff946f2deaa96728ccd5ef246c81170ff92b6e5f..beef0175c35ce86aac9e465f9062bf8052b08dfb 100644 (file)
 /** @file\r
 *\r
-*  Copyright (c) 2012, ARM Limited. All rights reserved.\r
+*  Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>\r
+*  Copyright (c) 2012-2014, ARM Limited. All rights reserved.\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
+*  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 *\r
 **/\r
 \r
-#ifndef __ARM_SMC_LIB__\r
-#define __ARM_SMC_LIB__\r
+#ifndef ARM_SMC_LIB_H_\r
+#define ARM_SMC_LIB_H_\r
+\r
+/**\r
+ * The size of the SMC arguments are different between AArch64 and AArch32.\r
+ * The native size is used for the arguments.\r
+ */\r
+typedef struct {\r
+  UINTN    Arg0;\r
+  UINTN    Arg1;\r
+  UINTN    Arg2;\r
+  UINTN    Arg3;\r
+  UINTN    Arg4;\r
+  UINTN    Arg5;\r
+  UINTN    Arg6;\r
+  UINTN    Arg7;\r
+} ARM_SMC_ARGS;\r
+\r
+/**\r
+  Trigger an SMC call\r
+\r
+  SMC calls can take up to 7 arguments and return up to 4 return values.\r
+  Therefore, the 4 first fields in the ARM_SMC_ARGS structure are used\r
+  for both input and output values.\r
 \r
+**/\r
 VOID\r
 ArmCallSmc (\r
-  IN OUT UINTN *Rx\r
+  IN OUT ARM_SMC_ARGS  *Args\r
   );\r
 \r
-VOID\r
-ArmCallSmcArg1 (\r
-  IN OUT UINTN *Rx,\r
-  IN OUT UINTN *Arg1\r
+/** Trigger an SMC call with 3 arguments.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Argument/result.\r
+  @param Arg2     Argument/result.\r
+  @param Arg3     Argument/result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc3 (\r
+  IN     UINTN  Function,\r
+  IN OUT UINTN  *Arg1 OPTIONAL,\r
+  IN OUT UINTN  *Arg2 OPTIONAL,\r
+  IN OUT UINTN  *Arg3 OPTIONAL\r
   );\r
 \r
-VOID\r
-ArmCallSmcArg2 (\r
-  IN OUT UINTN *Rx,\r
-  IN OUT UINTN *Arg1,\r
-  IN OUT UINTN *Arg2\r
+/** Trigger an SMC call with 2 arguments.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Argument/result.\r
+  @param Arg2     Argument/result.\r
+  @param Arg3     Result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc2 (\r
+  IN     UINTN  Function,\r
+  IN OUT UINTN  *Arg1 OPTIONAL,\r
+  IN OUT UINTN  *Arg2 OPTIONAL,\r
+  OUT UINTN     *Arg3 OPTIONAL\r
   );\r
 \r
-VOID\r
-ArmCallSmcArg3 (\r
-  IN OUT UINTN *Rx,\r
-  IN OUT UINTN *Arg1,\r
-  IN OUT UINTN *Arg2,\r
-  IN OUT UINTN *Arg3\r
+/** Trigger an SMC call with 1 argument.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Argument/result.\r
+  @param Arg2     Result.\r
+  @param Arg3     Result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc1 (\r
+  IN     UINTN  Function,\r
+  IN OUT UINTN  *Arg1 OPTIONAL,\r
+  OUT UINTN     *Arg2 OPTIONAL,\r
+  OUT UINTN     *Arg3 OPTIONAL\r
+  );\r
+\r
+/** Trigger an SMC call with 0 arguments.\r
+\r
+  @param Function The SMC function.\r
+  @param Arg1     Result.\r
+  @param Arg2     Result.\r
+  @param Arg3     Result.\r
+\r
+  @return The SMC error code.\r
+\r
+**/\r
+UINTN\r
+ArmCallSmc0 (\r
+  IN     UINTN  Function,\r
+  OUT UINTN     *Arg1 OPTIONAL,\r
+  OUT UINTN     *Arg2 OPTIONAL,\r
+  OUT UINTN     *Arg3 OPTIONAL\r
   );\r
 \r
-#endif\r
+#endif // ARM_SMC_LIB_H_\r