lib: Add possible hart status values
authorAtish Patra <atish.patra@wdc.com>
Wed, 12 Feb 2020 01:32:38 +0000 (17:32 -0800)
committerAnup Patel <anup@brainfault.org>
Mon, 24 Feb 2020 12:41:47 +0000 (18:11 +0530)
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>
include/sbi/sbi_ecall_interface.h
include/sbi/sbi_hsm.h
lib/sbi/sbi_hsm.c

index 93c0747..ba88e8b 100644 (file)
 #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
index 2566afb..11ea7cf 100644 (file)
@@ -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
index f3207ee..36fafed 100644 (file)
@@ -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;