--- /dev/null
+/** @file\r
+ Library to call the RISC-V SBI ecalls\r
+\r
+ Copyright (c) 2021-2022, Hewlett Packard Development LP. All rights reserved.<BR>\r
+\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+ @par Glossary:\r
+ - Hart - Hardware Thread, similar to a CPU core\r
+\r
+ Currently, EDK2 needs to call SBI only to set the time and to do system reset.\r
+\r
+**/\r
+\r
+#ifndef RISCV_SBI_LIB_H_\r
+#define RISCV_SBI_LIB_H_\r
+\r
+#include <Uefi.h>\r
+\r
+/* SBI Extension IDs */\r
+#define SBI_EXT_TIME 0x54494D45\r
+#define SBI_EXT_SRST 0x53525354\r
+\r
+/* SBI function IDs for TIME extension*/\r
+#define SBI_EXT_TIME_SET_TIMER 0x0\r
+\r
+/* SBI function IDs for SRST extension */\r
+#define SBI_EXT_SRST_RESET 0x0\r
+\r
+#define SBI_SRST_RESET_TYPE_SHUTDOWN 0x0\r
+#define SBI_SRST_RESET_TYPE_COLD_REBOOT 0x1\r
+#define SBI_SRST_RESET_TYPE_WARM_REBOOT 0x2\r
+\r
+#define SBI_SRST_RESET_REASON_NONE 0x0\r
+#define SBI_SRST_RESET_REASON_SYSFAIL 0x1\r
+\r
+/* SBI return error codes */\r
+#define SBI_SUCCESS 0\r
+#define SBI_ERR_FAILED -1\r
+#define SBI_ERR_NOT_SUPPORTED -2\r
+#define SBI_ERR_INVALID_PARAM -3\r
+#define SBI_ERR_DENIED -4\r
+#define SBI_ERR_INVALID_ADDRESS -5\r
+#define SBI_ERR_ALREADY_AVAILABLE -6\r
+#define SBI_ERR_ALREADY_STARTED -7\r
+#define SBI_ERR_ALREADY_STOPPED -8\r
+\r
+#define SBI_LAST_ERR SBI_ERR_ALREADY_STOPPED\r
+\r
+typedef struct {\r
+ UINT64 BootHartId;\r
+ VOID *PeiServiceTable; // PEI Service table\r
+ VOID *PrePiHobList; // Pre PI Hob List\r
+ UINT64 FlattenedDeviceTree; // Pointer to Flattened Device tree\r
+} EFI_RISCV_FIRMWARE_CONTEXT;\r
+\r
+//\r
+// EDK2 OpenSBI firmware extension return status.\r
+//\r
+typedef struct {\r
+ UINTN Error; ///< SBI status code\r
+ UINTN Value; ///< Value returned\r
+} SBI_RET;\r
+\r
+VOID\r
+EFIAPI\r
+SbiSetTimer (\r
+ IN UINT64 Time\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+SbiSystemReset (\r
+ IN UINTN ResetType,\r
+ IN UINTN ResetReason\r
+ );\r
+\r
+/**\r
+ Get firmware context of the calling hart.\r
+\r
+ @param[out] FirmwareContext The firmware context pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+GetFirmwareContext (\r
+ OUT EFI_RISCV_FIRMWARE_CONTEXT **FirmwareContext\r
+ );\r
+\r
+/**\r
+ Set firmware context of the calling hart.\r
+\r
+ @param[in] FirmwareContext The firmware context pointer.\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFirmwareContext (\r
+ IN EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContext\r
+ );\r
+\r
+/**\r
+ Get pointer to OpenSBI Firmware Context\r
+\r
+ Get the pointer of firmware context.\r
+\r
+ @param FirmwareContextPtr Pointer to retrieve pointer to the\r
+ Firmware Context.\r
+**/\r
+VOID\r
+EFIAPI\r
+GetFirmwareContextPointer (\r
+ IN OUT EFI_RISCV_FIRMWARE_CONTEXT **FirmwareContextPtr\r
+ );\r
+\r
+/**\r
+ Set pointer to OpenSBI Firmware Context\r
+\r
+ Set the pointer of firmware context.\r
+\r
+ @param FirmwareContextPtr Pointer to Firmware Context.\r
+**/\r
+VOID\r
+EFIAPI\r
+SetFirmwareContextPointer (\r
+ IN EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContextPtr\r
+ );\r
+\r
+/**\r
+ Make ECALL in assembly\r
+\r
+ Switch to M-mode\r
+\r
+ @param[in,out] Arg0\r
+ @param[in,out] Arg1\r
+ @param[in] Arg2\r
+ @param[in] Arg3\r
+ @param[in] Arg4\r
+ @param[in] Arg5\r
+ @param[in] FID\r
+ @param[in] EXT\r
+**/\r
+VOID\r
+EFIAPI\r
+RiscVSbiEcall (\r
+ IN OUT UINTN *Arg0,\r
+ IN OUT UINTN *Arg1,\r
+ IN UINTN Arg2,\r
+ IN UINTN Arg3,\r
+ IN UINTN Arg4,\r
+ IN UINTN Arg5,\r
+ IN UINTN Fid,\r
+ IN UINTN Ext\r
+ );\r
+\r
+#endif\r