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_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_MASK	0x7f
 | 
			
		||||
#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);
 | 
			
		||||
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_state_to_status(int state);
 | 
			
		||||
bool sbi_hsm_hart_started(struct sbi_scratch *scratch, u32 hartid);
 | 
			
		||||
void sbi_hsm_prepare_next_jump(struct sbi_scratch *scratch, u32 hartid);
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@
 | 
			
		||||
#include <sbi/sbi_bits.h>
 | 
			
		||||
#include <sbi/sbi_console.h>
 | 
			
		||||
#include <sbi/sbi_error.h>
 | 
			
		||||
#include <sbi/sbi_ecall_interface.h>
 | 
			
		||||
#include <sbi/sbi_hart.h>
 | 
			
		||||
#include <sbi/sbi_hsm.h>
 | 
			
		||||
#include <sbi/sbi_init.h>
 | 
			
		||||
@@ -30,6 +31,30 @@ struct sbi_hsm_data {
 | 
			
		||||
	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)
 | 
			
		||||
{
 | 
			
		||||
	struct sbi_hsm_data *hdata;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user