diff options
author | Anup Patel <apatel@ventanamicro.com> | 2024-08-08 11:04:55 +0530 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2024-12-06 09:26:52 +0530 |
commit | e67d91cdcc1cba32b08d104821558d8211596e16 (patch) | |
tree | 3355b2899060877d15eb8400580d773051b43bbc | |
parent | 7939bf1329eb551845dbfa3ee06d92d30de70662 (diff) | |
download | opensbi-e67d91cdcc1cba32b08d104821558d8211596e16.zip opensbi-e67d91cdcc1cba32b08d104821558d8211596e16.tar.gz opensbi-e67d91cdcc1cba32b08d104821558d8211596e16.tar.bz2 |
lib: sbi: Implement SBI MPXY extension
Implement the SBI MPXY extension which provides an SBI interface to
the supervisor software for send messages via MPXY framework.
Signed-off-by: Rahul Pathak <rpathak@ventanamicro.com>
Co-developed-by: Anup Patel <apatel@ventanamicro.com>
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
-rw-r--r-- | include/sbi/sbi_ecall_interface.h | 10 | ||||
-rw-r--r-- | lib/sbi/Kconfig | 3 | ||||
-rw-r--r-- | lib/sbi/objects.mk | 3 | ||||
-rw-r--r-- | lib/sbi/sbi_ecall_mpxy.c | 68 |
4 files changed, 84 insertions, 0 deletions
diff --git a/include/sbi/sbi_ecall_interface.h b/include/sbi/sbi_ecall_interface.h index ee578bd..9cacd3a 100644 --- a/include/sbi/sbi_ecall_interface.h +++ b/include/sbi/sbi_ecall_interface.h @@ -37,6 +37,7 @@ #define SBI_EXT_DBTR 0x44425452 #define SBI_EXT_SSE 0x535345 #define SBI_EXT_FWFT 0x46574654 +#define SBI_EXT_MPXY 0x4D505859 /* SBI function IDs for BASE extension*/ #define SBI_EXT_BASE_GET_SPEC_VERSION 0x0 @@ -421,6 +422,15 @@ enum sbi_sse_state { #define SBI_SSE_EVENT_GLOBAL_BIT (1 << 15) #define SBI_SSE_EVENT_PLATFORM_BIT (1 << 14) +/* SBI function IDs for MPXY extension */ +#define SBI_EXT_MPXY_SET_SHMEM 0x0 +#define SBI_EXT_MPXY_GET_CHANNEL_IDS 0x1 +#define SBI_EXT_MPXY_READ_ATTRS 0x2 +#define SBI_EXT_MPXY_WRITE_ATTRS 0x3 +#define SBI_EXT_MPXY_SEND_MSG_WITH_RESP 0x4 +#define SBI_EXT_MPXY_SEND_MSG_NO_RESP 0x5 +#define SBI_EXT_MPXY_GET_NOTIFICATION_EVENTS 0x6 + /* SBI base specification related macros */ #define SBI_SPEC_VERSION_MAJOR_OFFSET 24 #define SBI_SPEC_VERSION_MAJOR_MASK 0x7f diff --git a/lib/sbi/Kconfig b/lib/sbi/Kconfig index bd8ba2b..c6cc04b 100644 --- a/lib/sbi/Kconfig +++ b/lib/sbi/Kconfig @@ -66,4 +66,7 @@ config SBI_ECALL_SSE bool "SSE extension" default y +config SBI_ECALL_MPXY + bool "MPXY extension" + default y endmenu diff --git a/lib/sbi/objects.mk b/lib/sbi/objects.mk index 80b82f8..12e9e2b 100644 --- a/lib/sbi/objects.mk +++ b/lib/sbi/objects.mk @@ -61,6 +61,9 @@ libsbi-objs-$(CONFIG_SBI_ECALL_DBTR) += sbi_ecall_dbtr.o carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_SSE) += ecall_sse libsbi-objs-$(CONFIG_SBI_ECALL_SSE) += sbi_ecall_sse.o +carray-sbi_ecall_exts-$(CONFIG_SBI_ECALL_MPXY) += ecall_mpxy +libsbi-objs-$(CONFIG_SBI_ECALL_MPXY) += sbi_ecall_mpxy.o + libsbi-objs-y += sbi_bitmap.o libsbi-objs-y += sbi_bitops.o libsbi-objs-y += sbi_console.o diff --git a/lib/sbi/sbi_ecall_mpxy.c b/lib/sbi/sbi_ecall_mpxy.c new file mode 100644 index 0000000..5f717b7 --- /dev/null +++ b/lib/sbi/sbi_ecall_mpxy.c @@ -0,0 +1,68 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2024 Ventana Micro Systems Inc. + * + * Authors: + * Anup Patel <apatel@ventanamicro.com> + */ + +#include <sbi/sbi_ecall.h> +#include <sbi/sbi_ecall_interface.h> +#include <sbi/sbi_error.h> +#include <sbi/sbi_trap.h> +#include <sbi/sbi_mpxy.h> + +static int sbi_ecall_mpxy_handler(unsigned long extid, unsigned long funcid, + struct sbi_trap_regs *regs, + struct sbi_ecall_return *out) +{ + int ret = 0; + + switch (funcid) { + case SBI_EXT_MPXY_SET_SHMEM: + ret = sbi_mpxy_set_shmem(regs->a0, regs->a1, regs->a2, regs->a3); + break; + case SBI_EXT_MPXY_GET_CHANNEL_IDS: + ret = sbi_mpxy_get_channel_ids(regs->a0); + break; + case SBI_EXT_MPXY_READ_ATTRS: + ret = sbi_mpxy_read_attrs(regs->a0, regs->a1, regs->a2); + break; + case SBI_EXT_MPXY_WRITE_ATTRS: + ret = sbi_mpxy_write_attrs(regs->a0, regs->a1, regs->a2); + break; + case SBI_EXT_MPXY_SEND_MSG_WITH_RESP: + ret = sbi_mpxy_send_message(regs->a0, regs->a1, + regs->a2, &out->value); + break; + case SBI_EXT_MPXY_SEND_MSG_NO_RESP: + ret = sbi_mpxy_send_message(regs->a0, regs->a1, regs->a2, + NULL); + break; + case SBI_EXT_MPXY_GET_NOTIFICATION_EVENTS: + ret = sbi_mpxy_get_notification_events(regs->a0, &out->value); + break; + default: + ret = SBI_ENOTSUPP; + } + + return ret; +} + +struct sbi_ecall_extension ecall_mpxy; + +static int sbi_ecall_mpxy_register_extensions(void) +{ + if (!sbi_mpxy_channel_available()) + return 0; + + return sbi_ecall_register_extension(&ecall_mpxy); +} + +struct sbi_ecall_extension ecall_mpxy = { + .extid_start = SBI_EXT_MPXY, + .extid_end = SBI_EXT_MPXY, + .register_extensions = sbi_ecall_mpxy_register_extensions, + .handle = sbi_ecall_mpxy_handler, +}; |