--- /dev/null
+/** @file\r
+ SMC helper functions.\r
+\r
+ Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>\r
+\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <Library/ArmSmcLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+\r
+/** Triggers 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
+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
+ ARM_SMC_ARGS Args;\r
+ UINTN ErrorCode;\r
+\r
+ ZeroMem (&Args, sizeof (ARM_SMC_ARGS));\r
+\r
+ Args.Arg0 = Function;\r
+\r
+ if (Arg1 != NULL) {\r
+ Args.Arg1 = *Arg1;\r
+ }\r
+\r
+ if (Arg2 != NULL) {\r
+ Args.Arg2 = *Arg2;\r
+ }\r
+\r
+ if (Arg3 != NULL) {\r
+ Args.Arg3 = *Arg3;\r
+ }\r
+\r
+ ArmCallSmc (&Args);\r
+\r
+ ErrorCode = Args.Arg0;\r
+\r
+ if (Arg1 != NULL) {\r
+ *Arg1 = Args.Arg1;\r
+ }\r
+\r
+ if (Arg2 != NULL) {\r
+ *Arg2 = Args.Arg2;\r
+ }\r
+\r
+ if (Arg3 != NULL) {\r
+ *Arg3 = Args.Arg3;\r
+ }\r
+\r
+ return ErrorCode;\r
+}\r
+\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
+ return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);\r
+}\r
+\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
+ return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);\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
+ return ArmCallSmc3 (Function, Arg1, Arg2, Arg3);\r
+}\r