From 14f5c4cb4d2b9a5839a156c957f77a19a2f3eda7 Mon Sep 17 00:00:00 2001 From: Vivian Wang Date: Wed, 9 Nov 2022 14:53:37 +0800 Subject: lib: sbi_ecall: Split up sbi_ecall_replace Split up sbi_ecall_replace so that each extension is in its individual file. Also reorganize the corresponding section in lib/sbi/objects.mk so that it is grouped by extension, now that the object file targets are split up. Signed-off-by: Vivian Wang Reviewed-by: Anup Patel --- lib/sbi/objects.mk | 22 +++-- lib/sbi/sbi_ecall_ipi.c | 36 ++++++++ lib/sbi/sbi_ecall_replace.c | 204 -------------------------------------------- lib/sbi/sbi_ecall_rfence.c | 86 +++++++++++++++++++ lib/sbi/sbi_ecall_srst.c | 75 ++++++++++++++++ lib/sbi/sbi_ecall_time.c | 40 +++++++++ 6 files changed, 253 insertions(+), 210 deletions(-) create mode 100644 lib/sbi/sbi_ecall_ipi.c delete mode 100644 lib/sbi/sbi_ecall_replace.c create mode 100644 lib/sbi/sbi_ecall_rfence.c create mode 100644 lib/sbi/sbi_ecall_srst.c create mode 100644 lib/sbi/sbi_ecall_time.c (limited to 'lib') diff --git a/lib/sbi/objects.mk b/lib/sbi/objects.mk index 783c46d..c774ebb 100644 --- a/lib/sbi/objects.mk +++ b/lib/sbi/objects.mk @@ -17,20 +17,30 @@ libsbi-objs-y += sbi_ecall_exts.o # The order of below extensions is performance optimized carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_TIME) += ecall_time +libsbi-objs-$(CONFIG_SBI_ECALL_TIME) += sbi_ecall_time.o + carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_RFENCE) += ecall_rfence +libsbi-objs-$(CONFIG_SBI_ECALL_RFENCE) += sbi_ecall_rfence.o + carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_IPI) += ecall_ipi +libsbi-objs-$(CONFIG_SBI_ECALL_IPI) += sbi_ecall_ipi.o + carray-sbi_ecall_exts-y += ecall_base +libsbi-objs-y += sbi_ecall_base.o + carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_HSM) += ecall_hsm +libsbi-objs-$(CONFIG_SBI_ECALL_HSM) += sbi_ecall_hsm.o + carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_SRST) += ecall_srst +libsbi-objs-$(CONFIG_SBI_ECALL_SRST) += sbi_ecall_srst.o + carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_PMU) += ecall_pmu -carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_LEGACY) += ecall_legacy -carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_VENDOR) += ecall_vendor +libsbi-objs-$(CONFIG_SBI_ECALL_PMU) += sbi_ecall_pmu.o -libsbi-objs-y += sbi_ecall_base.o -libsbi-objs-$(CONFIG_SBI_ECALL_HSM) += sbi_ecall_hsm.o +carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_LEGACY) += ecall_legacy libsbi-objs-$(CONFIG_SBI_ECALL_LEGACY) += sbi_ecall_legacy.o -libsbi-objs-$(CONFIG_SBI_ECALL_PMU) += sbi_ecall_pmu.o -libsbi-objs-y += sbi_ecall_replace.o + +carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_VENDOR) += ecall_vendor libsbi-objs-$(CONFIG_SBI_ECALL_VENDOR) += sbi_ecall_vendor.o libsbi-objs-y += sbi_bitmap.o diff --git a/lib/sbi/sbi_ecall_ipi.c b/lib/sbi/sbi_ecall_ipi.c new file mode 100644 index 0000000..f4797e1 --- /dev/null +++ b/lib/sbi/sbi_ecall_ipi.c @@ -0,0 +1,36 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2020 Western Digital Corporation or its affiliates. + * + * Authors: + * Anup Patel + * Atish Patra + */ + +#include +#include +#include +#include +#include + +static int sbi_ecall_ipi_handler(unsigned long extid, unsigned long funcid, + const struct sbi_trap_regs *regs, + unsigned long *out_val, + struct sbi_trap_info *out_trap) +{ + int ret = 0; + + if (funcid == SBI_EXT_IPI_SEND_IPI) + ret = sbi_ipi_send_smode(regs->a0, regs->a1); + else + ret = SBI_ENOTSUPP; + + return ret; +} + +struct sbi_ecall_extension ecall_ipi = { + .extid_start = SBI_EXT_IPI, + .extid_end = SBI_EXT_IPI, + .handle = sbi_ecall_ipi_handler, +}; diff --git a/lib/sbi/sbi_ecall_replace.c b/lib/sbi/sbi_ecall_replace.c deleted file mode 100644 index 0ea00d6..0000000 --- a/lib/sbi/sbi_ecall_replace.c +++ /dev/null @@ -1,204 +0,0 @@ -/* - * SPDX-License-Identifier: BSD-2-Clause - * - * Copyright (c) 2020 Western Digital Corporation or its affiliates. - * - * Authors: - * Anup Patel - * Atish Patra - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_SBI_ECALL_TIME -static int sbi_ecall_time_handler(unsigned long extid, unsigned long funcid, - const struct sbi_trap_regs *regs, - unsigned long *out_val, - struct sbi_trap_info *out_trap) -{ - int ret = 0; - - if (funcid == SBI_EXT_TIME_SET_TIMER) { -#if __riscv_xlen == 32 - sbi_timer_event_start((((u64)regs->a1 << 32) | (u64)regs->a0)); -#else - sbi_timer_event_start((u64)regs->a0); -#endif - } else - ret = SBI_ENOTSUPP; - - return ret; -} - -struct sbi_ecall_extension ecall_time = { - .extid_start = SBI_EXT_TIME, - .extid_end = SBI_EXT_TIME, - .handle = sbi_ecall_time_handler, -}; -#endif - -#ifdef CONFIG_SBI_ECALL_RFENCE -static int sbi_ecall_rfence_handler(unsigned long extid, unsigned long funcid, - const struct sbi_trap_regs *regs, - unsigned long *out_val, - struct sbi_trap_info *out_trap) -{ - int ret = 0; - unsigned long vmid; - struct sbi_tlb_info tlb_info; - u32 source_hart = current_hartid(); - - if (funcid >= SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID && - funcid <= SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA) - if (!misa_extension('H')) - return SBI_ENOTSUPP; - - switch (funcid) { - case SBI_EXT_RFENCE_REMOTE_FENCE_I: - SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0, - sbi_tlb_local_fence_i, source_hart); - ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); - break; - case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA: - SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0, - sbi_tlb_local_hfence_gvma, source_hart); - ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); - break; - case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID: - SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, regs->a4, - sbi_tlb_local_hfence_gvma_vmid, - source_hart); - ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); - break; - case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA: - vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK); - vmid = vmid >> HGATP_VMID_SHIFT; - SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, vmid, - sbi_tlb_local_hfence_vvma, source_hart); - ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); - break; - case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID: - vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK); - vmid = vmid >> HGATP_VMID_SHIFT; - SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4, - vmid, sbi_tlb_local_hfence_vvma_asid, - source_hart); - ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); - break; - case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA: - SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0, - sbi_tlb_local_sfence_vma, source_hart); - ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); - break; - case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID: - SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4, 0, - sbi_tlb_local_sfence_vma_asid, source_hart); - ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); - break; - default: - ret = SBI_ENOTSUPP; - }; - - return ret; -} - -struct sbi_ecall_extension ecall_rfence = { - .extid_start = SBI_EXT_RFENCE, - .extid_end = SBI_EXT_RFENCE, - .handle = sbi_ecall_rfence_handler, -}; -#endif - -#ifdef CONFIG_SBI_ECALL_IPI -static int sbi_ecall_ipi_handler(unsigned long extid, unsigned long funcid, - const struct sbi_trap_regs *regs, - unsigned long *out_val, - struct sbi_trap_info *out_trap) -{ - int ret = 0; - - if (funcid == SBI_EXT_IPI_SEND_IPI) - ret = sbi_ipi_send_smode(regs->a0, regs->a1); - else - ret = SBI_ENOTSUPP; - - return ret; -} - -struct sbi_ecall_extension ecall_ipi = { - .extid_start = SBI_EXT_IPI, - .extid_end = SBI_EXT_IPI, - .handle = sbi_ecall_ipi_handler, -}; -#endif - -#ifdef CONFIG_SBI_ECALL_SRST -static int sbi_ecall_srst_handler(unsigned long extid, unsigned long funcid, - const struct sbi_trap_regs *regs, - unsigned long *out_val, - struct sbi_trap_info *out_trap) -{ - if (funcid == SBI_EXT_SRST_RESET) { - if ((((u32)-1U) <= ((u64)regs->a0)) || - (((u32)-1U) <= ((u64)regs->a1))) - return SBI_EINVAL; - - switch (regs->a0) { - case SBI_SRST_RESET_TYPE_SHUTDOWN: - case SBI_SRST_RESET_TYPE_COLD_REBOOT: - case SBI_SRST_RESET_TYPE_WARM_REBOOT: - break; - default: - return SBI_EINVAL; - } - - switch (regs->a1) { - case SBI_SRST_RESET_REASON_NONE: - case SBI_SRST_RESET_REASON_SYSFAIL: - break; - default: - return SBI_EINVAL; - } - - if (sbi_system_reset_supported(regs->a0, regs->a1)) - sbi_system_reset(regs->a0, regs->a1); - } - - return SBI_ENOTSUPP; -} - -static int sbi_ecall_srst_probe(unsigned long extid, unsigned long *out_val) -{ - u32 type, count = 0; - - /* - * At least one standard reset types should be supported by - * the platform for SBI SRST extension to be usable. - */ - - for (type = 0; type <= SBI_SRST_RESET_TYPE_LAST; type++) { - if (sbi_system_reset_supported(type, - SBI_SRST_RESET_REASON_NONE)) - count++; - } - - *out_val = (count) ? 1 : 0; - return 0; -} - -struct sbi_ecall_extension ecall_srst = { - .extid_start = SBI_EXT_SRST, - .extid_end = SBI_EXT_SRST, - .handle = sbi_ecall_srst_handler, - .probe = sbi_ecall_srst_probe, -}; -#endif diff --git a/lib/sbi/sbi_ecall_rfence.c b/lib/sbi/sbi_ecall_rfence.c new file mode 100644 index 0000000..8f0e3d7 --- /dev/null +++ b/lib/sbi/sbi_ecall_rfence.c @@ -0,0 +1,86 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2020 Western Digital Corporation or its affiliates. + * + * Authors: + * Anup Patel + * Atish Patra + */ + +#include +#include +#include +#include +#include +#include + +static int sbi_ecall_rfence_handler(unsigned long extid, unsigned long funcid, + const struct sbi_trap_regs *regs, + unsigned long *out_val, + struct sbi_trap_info *out_trap) +{ + int ret = 0; + unsigned long vmid; + struct sbi_tlb_info tlb_info; + u32 source_hart = current_hartid(); + + if (funcid >= SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID && + funcid <= SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA) + if (!misa_extension('H')) + return SBI_ENOTSUPP; + + switch (funcid) { + case SBI_EXT_RFENCE_REMOTE_FENCE_I: + SBI_TLB_INFO_INIT(&tlb_info, 0, 0, 0, 0, + sbi_tlb_local_fence_i, source_hart); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); + break; + case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA: + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0, + sbi_tlb_local_hfence_gvma, source_hart); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); + break; + case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID: + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, regs->a4, + sbi_tlb_local_hfence_gvma_vmid, + source_hart); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); + break; + case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA: + vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK); + vmid = vmid >> HGATP_VMID_SHIFT; + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, vmid, + sbi_tlb_local_hfence_vvma, source_hart); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); + break; + case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID: + vmid = (csr_read(CSR_HGATP) & HGATP_VMID_MASK); + vmid = vmid >> HGATP_VMID_SHIFT; + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4, + vmid, sbi_tlb_local_hfence_vvma_asid, + source_hart); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); + break; + case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA: + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, 0, 0, + sbi_tlb_local_sfence_vma, source_hart); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); + break; + case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID: + SBI_TLB_INFO_INIT(&tlb_info, regs->a2, regs->a3, regs->a4, 0, + sbi_tlb_local_sfence_vma_asid, source_hart); + ret = sbi_tlb_request(regs->a0, regs->a1, &tlb_info); + break; + default: + ret = SBI_ENOTSUPP; + }; + + return ret; +} + +struct sbi_ecall_extension ecall_rfence = { + .extid_start = SBI_EXT_RFENCE, + .extid_end = SBI_EXT_RFENCE, + .handle = sbi_ecall_rfence_handler, +}; diff --git a/lib/sbi/sbi_ecall_srst.c b/lib/sbi/sbi_ecall_srst.c new file mode 100644 index 0000000..93b012c --- /dev/null +++ b/lib/sbi/sbi_ecall_srst.c @@ -0,0 +1,75 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2020 Western Digital Corporation or its affiliates. + * + * Authors: + * Anup Patel + * Atish Patra + */ + +#include +#include +#include +#include +#include + +static int sbi_ecall_srst_handler(unsigned long extid, unsigned long funcid, + const struct sbi_trap_regs *regs, + unsigned long *out_val, + struct sbi_trap_info *out_trap) +{ + if (funcid == SBI_EXT_SRST_RESET) { + if ((((u32)-1U) <= ((u64)regs->a0)) || + (((u32)-1U) <= ((u64)regs->a1))) + return SBI_EINVAL; + + switch (regs->a0) { + case SBI_SRST_RESET_TYPE_SHUTDOWN: + case SBI_SRST_RESET_TYPE_COLD_REBOOT: + case SBI_SRST_RESET_TYPE_WARM_REBOOT: + break; + default: + return SBI_EINVAL; + } + + switch (regs->a1) { + case SBI_SRST_RESET_REASON_NONE: + case SBI_SRST_RESET_REASON_SYSFAIL: + break; + default: + return SBI_EINVAL; + } + + if (sbi_system_reset_supported(regs->a0, regs->a1)) + sbi_system_reset(regs->a0, regs->a1); + } + + return SBI_ENOTSUPP; +} + +static int sbi_ecall_srst_probe(unsigned long extid, unsigned long *out_val) +{ + u32 type, count = 0; + + /* + * At least one standard reset types should be supported by + * the platform for SBI SRST extension to be usable. + */ + + for (type = 0; type <= SBI_SRST_RESET_TYPE_LAST; type++) { + if (sbi_system_reset_supported(type, + SBI_SRST_RESET_REASON_NONE)) + count++; + } + + *out_val = (count) ? 1 : 0; + return 0; +} + +struct sbi_ecall_extension ecall_srst = { + .extid_start = SBI_EXT_SRST, + .extid_end = SBI_EXT_SRST, + .handle = sbi_ecall_srst_handler, + .probe = sbi_ecall_srst_probe, +}; diff --git a/lib/sbi/sbi_ecall_time.c b/lib/sbi/sbi_ecall_time.c new file mode 100644 index 0000000..668cb17 --- /dev/null +++ b/lib/sbi/sbi_ecall_time.c @@ -0,0 +1,40 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2020 Western Digital Corporation or its affiliates. + * + * Authors: + * Anup Patel + * Atish Patra + */ + +#include +#include +#include +#include +#include + +static int sbi_ecall_time_handler(unsigned long extid, unsigned long funcid, + const struct sbi_trap_regs *regs, + unsigned long *out_val, + struct sbi_trap_info *out_trap) +{ + int ret = 0; + + if (funcid == SBI_EXT_TIME_SET_TIMER) { +#if __riscv_xlen == 32 + sbi_timer_event_start((((u64)regs->a1 << 32) | (u64)regs->a0)); +#else + sbi_timer_event_start((u64)regs->a0); +#endif + } else + ret = SBI_ENOTSUPP; + + return ret; +} + +struct sbi_ecall_extension ecall_time = { + .extid_start = SBI_EXT_TIME, + .extid_end = SBI_EXT_TIME, + .handle = sbi_ecall_time_handler, +}; -- cgit v1.2.3