/** @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