]>
Commit | Line | Data |
---|---|---|
76e95654 S |
1 | /** @file\r |
2 | Library to call the RISC-V SBI ecalls\r | |
3 | \r | |
4 | Copyright (c) 2021-2022, Hewlett Packard Development LP. All rights reserved.<BR>\r | |
5 | \r | |
6 | SPDX-License-Identifier: BSD-2-Clause-Patent\r | |
7 | \r | |
8 | @par Glossary:\r | |
9 | - Hart - Hardware Thread, similar to a CPU core\r | |
10 | \r | |
11 | Currently, EDK2 needs to call SBI only to set the time and to do system reset.\r | |
12 | \r | |
13 | **/\r | |
14 | \r | |
15 | #ifndef RISCV_SBI_LIB_H_\r | |
16 | #define RISCV_SBI_LIB_H_\r | |
17 | \r | |
18 | #include <Uefi.h>\r | |
19 | \r | |
20 | /* SBI Extension IDs */\r | |
21 | #define SBI_EXT_TIME 0x54494D45\r | |
22 | #define SBI_EXT_SRST 0x53525354\r | |
23 | \r | |
24 | /* SBI function IDs for TIME extension*/\r | |
25 | #define SBI_EXT_TIME_SET_TIMER 0x0\r | |
26 | \r | |
27 | /* SBI function IDs for SRST extension */\r | |
28 | #define SBI_EXT_SRST_RESET 0x0\r | |
29 | \r | |
30 | #define SBI_SRST_RESET_TYPE_SHUTDOWN 0x0\r | |
31 | #define SBI_SRST_RESET_TYPE_COLD_REBOOT 0x1\r | |
32 | #define SBI_SRST_RESET_TYPE_WARM_REBOOT 0x2\r | |
33 | \r | |
34 | #define SBI_SRST_RESET_REASON_NONE 0x0\r | |
35 | #define SBI_SRST_RESET_REASON_SYSFAIL 0x1\r | |
36 | \r | |
37 | /* SBI return error codes */\r | |
38 | #define SBI_SUCCESS 0\r | |
39 | #define SBI_ERR_FAILED -1\r | |
40 | #define SBI_ERR_NOT_SUPPORTED -2\r | |
41 | #define SBI_ERR_INVALID_PARAM -3\r | |
42 | #define SBI_ERR_DENIED -4\r | |
43 | #define SBI_ERR_INVALID_ADDRESS -5\r | |
44 | #define SBI_ERR_ALREADY_AVAILABLE -6\r | |
45 | #define SBI_ERR_ALREADY_STARTED -7\r | |
46 | #define SBI_ERR_ALREADY_STOPPED -8\r | |
47 | \r | |
48 | #define SBI_LAST_ERR SBI_ERR_ALREADY_STOPPED\r | |
49 | \r | |
50 | typedef struct {\r | |
51 | UINT64 BootHartId;\r | |
52 | VOID *PeiServiceTable; // PEI Service table\r | |
53 | VOID *PrePiHobList; // Pre PI Hob List\r | |
54 | UINT64 FlattenedDeviceTree; // Pointer to Flattened Device tree\r | |
55 | } EFI_RISCV_FIRMWARE_CONTEXT;\r | |
56 | \r | |
57 | //\r | |
58 | // EDK2 OpenSBI firmware extension return status.\r | |
59 | //\r | |
60 | typedef struct {\r | |
61 | UINTN Error; ///< SBI status code\r | |
62 | UINTN Value; ///< Value returned\r | |
63 | } SBI_RET;\r | |
64 | \r | |
65 | VOID\r | |
66 | EFIAPI\r | |
67 | SbiSetTimer (\r | |
68 | IN UINT64 Time\r | |
69 | );\r | |
70 | \r | |
71 | EFI_STATUS\r | |
72 | EFIAPI\r | |
73 | SbiSystemReset (\r | |
74 | IN UINTN ResetType,\r | |
75 | IN UINTN ResetReason\r | |
76 | );\r | |
77 | \r | |
78 | /**\r | |
79 | Get firmware context of the calling hart.\r | |
80 | \r | |
81 | @param[out] FirmwareContext The firmware context pointer.\r | |
82 | **/\r | |
83 | VOID\r | |
84 | EFIAPI\r | |
85 | GetFirmwareContext (\r | |
86 | OUT EFI_RISCV_FIRMWARE_CONTEXT **FirmwareContext\r | |
87 | );\r | |
88 | \r | |
89 | /**\r | |
90 | Set firmware context of the calling hart.\r | |
91 | \r | |
92 | @param[in] FirmwareContext The firmware context pointer.\r | |
93 | **/\r | |
94 | VOID\r | |
95 | EFIAPI\r | |
96 | SetFirmwareContext (\r | |
97 | IN EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContext\r | |
98 | );\r | |
99 | \r | |
100 | /**\r | |
101 | Get pointer to OpenSBI Firmware Context\r | |
102 | \r | |
103 | Get the pointer of firmware context.\r | |
104 | \r | |
105 | @param FirmwareContextPtr Pointer to retrieve pointer to the\r | |
106 | Firmware Context.\r | |
107 | **/\r | |
108 | VOID\r | |
109 | EFIAPI\r | |
110 | GetFirmwareContextPointer (\r | |
111 | IN OUT EFI_RISCV_FIRMWARE_CONTEXT **FirmwareContextPtr\r | |
112 | );\r | |
113 | \r | |
114 | /**\r | |
115 | Set pointer to OpenSBI Firmware Context\r | |
116 | \r | |
117 | Set the pointer of firmware context.\r | |
118 | \r | |
119 | @param FirmwareContextPtr Pointer to Firmware Context.\r | |
120 | **/\r | |
121 | VOID\r | |
122 | EFIAPI\r | |
123 | SetFirmwareContextPointer (\r | |
124 | IN EFI_RISCV_FIRMWARE_CONTEXT *FirmwareContextPtr\r | |
125 | );\r | |
126 | \r | |
127 | /**\r | |
128 | Make ECALL in assembly\r | |
129 | \r | |
130 | Switch to M-mode\r | |
131 | \r | |
132 | @param[in,out] Arg0\r | |
133 | @param[in,out] Arg1\r | |
134 | @param[in] Arg2\r | |
135 | @param[in] Arg3\r | |
136 | @param[in] Arg4\r | |
137 | @param[in] Arg5\r | |
138 | @param[in] FID\r | |
139 | @param[in] EXT\r | |
140 | **/\r | |
141 | VOID\r | |
142 | EFIAPI\r | |
143 | RiscVSbiEcall (\r | |
144 | IN OUT UINTN *Arg0,\r | |
145 | IN OUT UINTN *Arg1,\r | |
146 | IN UINTN Arg2,\r | |
147 | IN UINTN Arg3,\r | |
148 | IN UINTN Arg4,\r | |
149 | IN UINTN Arg5,\r | |
150 | IN UINTN Fid,\r | |
151 | IN UINTN Ext\r | |
152 | );\r | |
153 | \r | |
154 | #endif\r |