]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Include/Library/BaseRiscVSbiLib.h
MdePkg: Add BaseRiscVSbiLib Library for RISC-V
[mirror_edk2.git] / MdePkg / Include / Library / BaseRiscVSbiLib.h
diff --git a/MdePkg/Include/Library/BaseRiscVSbiLib.h b/MdePkg/Include/Library/BaseRiscVSbiLib.h
new file mode 100644 (file)
index 0000000..e75520b
--- /dev/null
@@ -0,0 +1,154 @@
+/** @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