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