From e3f69fc1e934ce7815d9cde2d13dd2038a2894a6 Mon Sep 17 00:00:00 2001 From: Atish Patra Date: Tue, 11 Feb 2020 17:32:39 -0800 Subject: [PATCH] lib: Implement Hart State Management (HSM) SBI extension This patch adds support HSM extension. The specification is available at https://github.com/riscv/riscv-sbi-doc. It allows to implement hart hotplug and fixed ordered hart booting in supervisor. Signed-off-by: Atish Patra Reviewed-by: Anup Patel --- include/sbi/sbi_ecall.h | 1 + include/sbi/sbi_ecall_interface.h | 6 ++++ lib/sbi/objects.mk | 1 + lib/sbi/sbi_ecall.c | 3 ++ lib/sbi/sbi_ecall_hsm.c | 51 +++++++++++++++++++++++++++++++ 5 files changed, 62 insertions(+) create mode 100644 lib/sbi/sbi_ecall_hsm.c diff --git a/include/sbi/sbi_ecall.h b/include/sbi/sbi_ecall.h index 2a3500f1..1b564969 100644 --- a/include/sbi/sbi_ecall.h +++ b/include/sbi/sbi_ecall.h @@ -39,6 +39,7 @@ extern struct sbi_ecall_extension ecall_time; extern struct sbi_ecall_extension ecall_rfence; extern struct sbi_ecall_extension ecall_ipi; extern struct sbi_ecall_extension ecall_vendor; +extern struct sbi_ecall_extension ecall_hsm; u16 sbi_ecall_version_major(void); diff --git a/include/sbi/sbi_ecall_interface.h b/include/sbi/sbi_ecall_interface.h index ba88e8b1..727a5454 100644 --- a/include/sbi/sbi_ecall_interface.h +++ b/include/sbi/sbi_ecall_interface.h @@ -26,6 +26,7 @@ #define SBI_EXT_TIME 0x54494D45 #define SBI_EXT_IPI 0x735049 #define SBI_EXT_RFENCE 0x52464E43 +#define SBI_EXT_HSM 0x48534D /* SBI function IDs for BASE extension*/ #define SBI_EXT_BASE_GET_SPEC_VERSION 0x0 @@ -51,6 +52,11 @@ #define SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA 0x5 #define SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID 0x6 +/* SBI function IDs for HSM extension */ +#define SBI_EXT_HSM_HART_START 0x0 +#define SBI_EXT_HSM_HART_STOP 0x1 +#define SBI_EXT_HSM_HART_GET_STATUS 0x2 + #define SBI_HSM_HART_STATUS_STARTED 0x0 #define SBI_HSM_HART_STATUS_STOPPED 0x1 #define SBI_HSM_HART_STATUS_START_PENDING 0x2 diff --git a/lib/sbi/objects.mk b/lib/sbi/objects.mk index dc52a9f9..39e92953 100644 --- a/lib/sbi/objects.mk +++ b/lib/sbi/objects.mk @@ -18,6 +18,7 @@ libsbi-objs-y += sbi_ecall_base.o libsbi-objs-y += sbi_ecall_legacy.o libsbi-objs-y += sbi_ecall_replace.o libsbi-objs-y += sbi_ecall_vendor.o +libsbi-objs-y += sbi_ecall_hsm.o libsbi-objs-y += sbi_emulate_csr.o libsbi-objs-y += sbi_fifo.o libsbi-objs-y += sbi_hfence.o diff --git a/lib/sbi/sbi_ecall.c b/lib/sbi/sbi_ecall.c index 82397c4b..2383e4fd 100644 --- a/lib/sbi/sbi_ecall.c +++ b/lib/sbi/sbi_ecall.c @@ -136,6 +136,9 @@ int sbi_ecall_init(void) if (ret) return ret; ret = sbi_ecall_register_extension(&ecall_base); + if (ret) + return ret; + ret = sbi_ecall_register_extension(&ecall_hsm); if (ret) return ret; ret = sbi_ecall_register_extension(&ecall_legacy); diff --git a/lib/sbi/sbi_ecall_hsm.c b/lib/sbi/sbi_ecall_hsm.c new file mode 100644 index 00000000..528bc801 --- /dev/null +++ b/lib/sbi/sbi_ecall_hsm.c @@ -0,0 +1,51 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2020 Western Digital Corporation or its affiliates. + * + * Authors: + * Atish Patra + */ + +#include +#include +#include +#include +#include +#include + +static int sbi_ecall_hsm_handler(struct sbi_scratch *scratch, + unsigned long extid, unsigned long funcid, + unsigned long *args, unsigned long *out_val, + struct sbi_trap_info *out_trap) +{ + int ret = 0; + int hstate; + + switch (funcid) { + case SBI_EXT_HSM_HART_START: + ret = sbi_hsm_hart_start(scratch, args[0], args[1], args[2]); + break; + case SBI_EXT_HSM_HART_STOP: + ret = sbi_hsm_hart_stop(scratch, TRUE); + break; + case SBI_EXT_HSM_HART_GET_STATUS: + hstate = sbi_hsm_hart_get_state(scratch, args[0]); + ret = sbi_hsm_hart_state_to_status(hstate); + break; + default: + ret = SBI_ENOTSUPP; + }; + if (ret >= 0) { + *out_val = ret; + ret = 0; + } + + return ret; +} + +struct sbi_ecall_extension ecall_hsm = { + .extid_start = SBI_EXT_HSM, + .extid_end = SBI_EXT_HSM, + .handle = sbi_ecall_hsm_handler, +};