MdePkg: Add BaseRiscVSbiLib Library for RISC-V
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4076 This library is required to make SBI ecalls from the S-mode EDK2. This is mostly copied from edk2-platforms/Silicon/RISC-V/ProcessorPkg/Library/RiscVEdk2SbiLib Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Zhiguang Liu <zhiguang.liu@intel.com> Signed-off-by: Sunil V L <sunilvl@ventanamicro.com> Acked-by: Abner Chang <abner.chang@amd.com> Reviewed-by: Andrei Warkentin <andrei.warkentin@intel.com> Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
This commit is contained in:
154
MdePkg/Include/Library/BaseRiscVSbiLib.h
Normal file
154
MdePkg/Include/Library/BaseRiscVSbiLib.h
Normal file
@@ -0,0 +1,154 @@
|
||||
/** @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
|
Reference in New Issue
Block a user