[PATCH 2/4] lib: sbi_domain: Introduce per-domain MPXY state data
Alvin Chang
alvinga at andestech.com
Mon Feb 17 21:48:35 PST 2025
When multiple supervisor domains need to communicate with OpenSBI
through MPXY channel, they will allocate shared memory from their
own memory region (e.g. using alloc_pages() in Linux; memalign()
in OP-TEE OS), thus the MPXY state need to be per-domain and
per-hart data.
Signed-off-by: Yu-Chien Peter Lin <peter.lin at sifive.com>
Co-developed-by: Yong Li <yong.li at intel.com>
Signed-off-by: Yong Li <yong.li at intel.com>
Reviewed-by: Alvin Chang <alvinga at andestech.com>
---
include/sbi/sbi_domain.h | 1 +
include/sbi/sbi_domain_mpxy_state.h | 50 +++++++++++++++++++++++++++++
lib/sbi/objects.mk | 1 +
lib/sbi/sbi_domain.c | 9 +++++-
lib/sbi/sbi_domain_mpxy_state.c | 47 +++++++++++++++++++++++++++
5 files changed, 107 insertions(+), 1 deletion(-)
create mode 100644 include/sbi/sbi_domain_mpxy_state.h
create mode 100644 lib/sbi/sbi_domain_mpxy_state.c
diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h
index 8a2b123..800d67e 100644
--- a/include/sbi/sbi_domain.h
+++ b/include/sbi/sbi_domain.h
@@ -16,6 +16,7 @@
#include <sbi/sbi_hartmask.h>
#include <sbi/sbi_domain_context.h>
#include <sbi/sbi_domain_data.h>
+#include <sbi/sbi_domain_mpxy_state.h>
struct sbi_scratch;
diff --git a/include/sbi/sbi_domain_mpxy_state.h b/include/sbi/sbi_domain_mpxy_state.h
new file mode 100644
index 0000000..c5e3cdc
--- /dev/null
+++ b/include/sbi/sbi_domain_mpxy_state.h
@@ -0,0 +1,50 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2024 Intel Corporation.
+ * Copyright (c) 2024-2025 Andes Technology Corporation.
+ */
+
+#ifndef __SBI_DOMAIN_MPXY_STATE_H__
+#define __SBI_DOMAIN_MPXY_STATE_H__
+
+#include <sbi/sbi_types.h>
+
+struct sbi_domain;
+struct mpxy_state;
+
+/**
+ * Get per-domain MPXY state pointer for a given domain and HART index
+ * @param dom pointer to domain
+ * @param hartindex the HART index
+ *
+ * @return per-domain MPXY state pointer for given HART index
+ */
+struct mpxy_state *sbi_domain_get_mpxy_state(struct sbi_domain *dom,
+ u32 hartindex);
+
+/**
+ * Set per-domain MPXY state pointer for a given domain and HART index
+ * @param dom pointer to domain
+ * @param hartindex the HART index
+ * @param ms pointer to MPXY state
+ */
+void sbi_domain_set_mpxy_state(struct sbi_domain *dom, u32 hartindex,
+ struct mpxy_state *ms);
+
+/** Macro to obtain the current hart's MPXY state pointer */
+#define sbi_domain_mpxy_state_thishart_ptr() \
+ sbi_domain_get_mpxy_state(sbi_domain_thishart_ptr(), \
+ current_hartindex())
+
+/**
+ * Initialize domain MPXY state support
+ *
+ * @return 0 on success and negative error code on failure
+ */
+int sbi_domain_mpxy_state_init(void);
+
+/* Deinitialize domain MPXY state support */
+void sbi_domain_mpxy_state_deinit(void);
+
+#endif
diff --git a/lib/sbi/objects.mk b/lib/sbi/objects.mk
index 9cb2842..a728e9b 100644
--- a/lib/sbi/objects.mk
+++ b/lib/sbi/objects.mk
@@ -69,6 +69,7 @@ libsbi-objs-y += sbi_bitops.o
libsbi-objs-y += sbi_console.o
libsbi-objs-y += sbi_domain_context.o
libsbi-objs-y += sbi_domain_data.o
+libsbi-objs-y += sbi_domain_mpxy_state.o
libsbi-objs-y += sbi_domain.o
libsbi-objs-y += sbi_double_trap.o
libsbi-objs-y += sbi_emulate_csr.o
diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
index 1cf7e2d..734e6f6 100644
--- a/lib/sbi/sbi_domain.c
+++ b/lib/sbi/sbi_domain.c
@@ -785,11 +785,16 @@ int sbi_domain_init(struct sbi_scratch *scratch, u32 cold_hartid)
if (rc)
goto fail_free_domain_hart_ptr_offset;
+ /* Initialize domain MPXY state support */
+ rc = sbi_domain_mpxy_state_init();
+ if (rc)
+ goto fail_deinit_context;
+
root_memregs = sbi_calloc(sizeof(*root_memregs), ROOT_REGION_MAX + 1);
if (!root_memregs) {
sbi_printf("%s: no memory for root regions\n", __func__);
rc = SBI_ENOMEM;
- goto fail_deinit_context;
+ goto fail_deinit_mpxy_state;
}
root.regions = root_memregs;
@@ -854,6 +859,8 @@ fail_free_root_hmask:
sbi_free(root_hmask);
fail_free_root_memregs:
sbi_free(root_memregs);
+fail_deinit_mpxy_state:
+ sbi_domain_mpxy_state_deinit();
fail_deinit_context:
sbi_domain_context_deinit();
fail_free_domain_hart_ptr_offset:
diff --git a/lib/sbi/sbi_domain_mpxy_state.c b/lib/sbi/sbi_domain_mpxy_state.c
new file mode 100644
index 0000000..45f63a9
--- /dev/null
+++ b/lib/sbi/sbi_domain_mpxy_state.c
@@ -0,0 +1,47 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2024 Intel Corporation.
+ * Copyright (c) 2024-2025 Andes Technology Corporation.
+ */
+
+#include <sbi/sbi_domain.h>
+
+struct domain_mpxy_state_priv {
+ /** MPXY state for possible HARTs indexed by hartindex */
+ struct mpxy_state *hartindex_to_mpxy_state_table[SBI_HARTMASK_MAX_BITS];
+};
+
+static struct sbi_domain_data dmspriv = {
+ .data_size = sizeof(struct domain_mpxy_state_priv),
+};
+
+struct mpxy_state *sbi_domain_get_mpxy_state(struct sbi_domain *dom,
+ u32 hartindex)
+{
+ struct domain_mpxy_state_priv *dmsp =
+ sbi_domain_data_ptr(dom, &dmspriv);
+
+ return (dmsp && hartindex < SBI_HARTMASK_MAX_BITS) ?
+ dmsp->hartindex_to_mpxy_state_table[hartindex] : NULL;
+}
+
+void sbi_domain_set_mpxy_state(struct sbi_domain *dom, u32 hartindex,
+ struct mpxy_state *ms)
+{
+ struct domain_mpxy_state_priv *dmsp =
+ sbi_domain_data_ptr(dom, &dmspriv);
+
+ if (dmsp && hartindex < SBI_HARTMASK_MAX_BITS)
+ dmsp->hartindex_to_mpxy_state_table[hartindex] = ms;
+}
+
+int sbi_domain_mpxy_state_init(void)
+{
+ return sbi_domain_register_data(&dmspriv);
+}
+
+void sbi_domain_mpxy_state_deinit(void)
+{
+ sbi_domain_unregister_data(&dmspriv);
+}
--
2.34.1
More information about the opensbi
mailing list