[PATCH 1/3] lib: sbi: sse: Return a value from the register callback

Clément Léger cleger at rivosinc.com
Fri Dec 6 12:59:55 PST 2024


Some events might not be available to registration due to missing
dependencies (ISA extensions for instance). Return an 'int' from the
register_cb() callback so that this can be handled.

Signed-off-by: Clément Léger <cleger at rivosinc.com>
---
 include/sbi/sbi_sse.h |  2 +-
 lib/sbi/sbi_sse.c     | 16 ++++++++++++++--
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/include/sbi/sbi_sse.h b/include/sbi/sbi_sse.h
index 7419698a..58bd2ae0 100644
--- a/include/sbi/sbi_sse.h
+++ b/include/sbi/sbi_sse.h
@@ -36,7 +36,7 @@ struct sbi_sse_cb_ops {
 	/**
 	 * Called when the SBI_EXT_SSE_REGISTER is invoked on the event.
 	 */
-	void (*register_cb)(uint32_t event_id);
+	int (*register_cb)(uint32_t event_id);
 
 	/**
 	 * Called when the SBI_EXT_SSE_UNREGISTER is invoked on the event.
diff --git a/lib/sbi/sbi_sse.c b/lib/sbi/sbi_sse.c
index bf5620e8..5679c26f 100644
--- a/lib/sbi/sbi_sse.c
+++ b/lib/sbi/sbi_sse.c
@@ -50,6 +50,15 @@ static const uint32_t supported_events[] = {
 
 #define EVENT_COUNT array_size(supported_events)
 
+#define sse_event_invoke_cb_ret(_event, _cb, ...)                             \
+	({                                                                    \
+		int __ret = 0;                                                \
+		if (_event->cb_ops && _event->cb_ops->_cb)                    \
+			__ret = _event->cb_ops->_cb(_event->event_id,         \
+						   ##__VA_ARGS__);            \
+		__ret;							      \
+	})
+
 #define sse_event_invoke_cb(_event, _cb, ...)                                 \
 	{                                                                     \
 		if (_event->cb_ops && _event->cb_ops->_cb)                    \
@@ -423,16 +432,19 @@ static int sse_event_register(struct sbi_sse_event *e,
 			      unsigned long handler_entry_pc,
 			      unsigned long handler_entry_arg)
 {
+	int ret;
 	if (sse_event_state(e) != SBI_SSE_STATE_UNUSED)
 		return SBI_EINVALID_STATE;
 
+	ret = sse_event_invoke_cb_ret(e, register_cb);
+	if (ret)
+		return ret;
+
 	e->attrs.entry.pc = handler_entry_pc;
 	e->attrs.entry.arg = handler_entry_arg;
 
 	sse_event_set_state(e, SBI_SSE_STATE_REGISTERED);
 
-	sse_event_invoke_cb(e, register_cb);
-
 	return 0;
 }
 
-- 
2.45.2




More information about the opensbi mailing list