forked from Mirrors/opensbi
lib: Add possible hart status values
SBI HSM extension defines possible hart status values in the specification. Define all possible status values. Add a helper function to convert hart state to status because hart states are internal to OpenSBI only and may not match the status values defined in the specification. Signed-off-by: Atish Patra <atish.patra@wdc.com> Reviewed-by: Anup Patel <anup.patel@wdc.com>
This commit is contained in:
@@ -51,6 +51,11 @@
|
|||||||
#define SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA 0x5
|
#define SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA 0x5
|
||||||
#define SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID 0x6
|
#define SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID 0x6
|
||||||
|
|
||||||
|
#define SBI_HSM_HART_STATUS_STARTED 0x0
|
||||||
|
#define SBI_HSM_HART_STATUS_STOPPED 0x1
|
||||||
|
#define SBI_HSM_HART_STATUS_START_PENDING 0x2
|
||||||
|
#define SBI_HSM_HART_STATUS_STOP_PENDING 0x3
|
||||||
|
|
||||||
#define SBI_SPEC_VERSION_MAJOR_OFFSET 24
|
#define SBI_SPEC_VERSION_MAJOR_OFFSET 24
|
||||||
#define SBI_SPEC_VERSION_MAJOR_MASK 0x7f
|
#define SBI_SPEC_VERSION_MAJOR_MASK 0x7f
|
||||||
#define SBI_SPEC_VERSION_MINOR_MASK 0xffffff
|
#define SBI_SPEC_VERSION_MINOR_MASK 0xffffff
|
||||||
|
@@ -25,6 +25,7 @@ int sbi_hsm_hart_start(struct sbi_scratch *scratch, u32 hartid,
|
|||||||
ulong saddr, ulong priv);
|
ulong saddr, ulong priv);
|
||||||
int sbi_hsm_hart_stop(struct sbi_scratch *scratch, bool exitnow);
|
int sbi_hsm_hart_stop(struct sbi_scratch *scratch, bool exitnow);
|
||||||
int sbi_hsm_hart_get_state(struct sbi_scratch *scratch, u32 hartid);
|
int sbi_hsm_hart_get_state(struct sbi_scratch *scratch, u32 hartid);
|
||||||
|
int sbi_hsm_hart_state_to_status(int state);
|
||||||
bool sbi_hsm_hart_started(struct sbi_scratch *scratch, u32 hartid);
|
bool sbi_hsm_hart_started(struct sbi_scratch *scratch, u32 hartid);
|
||||||
void sbi_hsm_prepare_next_jump(struct sbi_scratch *scratch, u32 hartid);
|
void sbi_hsm_prepare_next_jump(struct sbi_scratch *scratch, u32 hartid);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
#include <sbi/sbi_bits.h>
|
#include <sbi/sbi_bits.h>
|
||||||
#include <sbi/sbi_console.h>
|
#include <sbi/sbi_console.h>
|
||||||
#include <sbi/sbi_error.h>
|
#include <sbi/sbi_error.h>
|
||||||
|
#include <sbi/sbi_ecall_interface.h>
|
||||||
#include <sbi/sbi_hart.h>
|
#include <sbi/sbi_hart.h>
|
||||||
#include <sbi/sbi_hsm.h>
|
#include <sbi/sbi_hsm.h>
|
||||||
#include <sbi/sbi_init.h>
|
#include <sbi/sbi_init.h>
|
||||||
@@ -30,6 +31,30 @@ struct sbi_hsm_data {
|
|||||||
atomic_t state;
|
atomic_t state;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int sbi_hsm_hart_state_to_status(int state)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
switch (state) {
|
||||||
|
case SBI_HART_STOPPED:
|
||||||
|
ret = SBI_HSM_HART_STATUS_STOPPED;
|
||||||
|
break;
|
||||||
|
case SBI_HART_STOPPING:
|
||||||
|
ret = SBI_HSM_HART_STATUS_STOP_PENDING;
|
||||||
|
break;
|
||||||
|
case SBI_HART_STARTING:
|
||||||
|
ret = SBI_HSM_HART_STATUS_START_PENDING;
|
||||||
|
break;
|
||||||
|
case SBI_HART_STARTED:
|
||||||
|
ret = SBI_HSM_HART_STATUS_STARTED;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ret = SBI_EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int sbi_hsm_hart_get_state(struct sbi_scratch *scratch, u32 hartid)
|
int sbi_hsm_hart_get_state(struct sbi_scratch *scratch, u32 hartid)
|
||||||
{
|
{
|
||||||
struct sbi_hsm_data *hdata;
|
struct sbi_hsm_data *hdata;
|
||||||
|
Reference in New Issue
Block a user