blob: 46fb8c5468246f9b1a1310a7938c0e6de5e0032a [file] [log] [blame]
/** @file
Library to call the RISC-V SBI ecalls
Copyright (c) 2021-2022, Hewlett Packard Development LP. All rights reserved.<BR>
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 <Uefi.h>
/* SBI Extension IDs */
#define SBI_EXT_TIME 0x54494D45
#define SBI_EXT_SRST 0x53525354
/* 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;
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