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