[PATCH v4 2/5] lib: sbi: sse: return an error value from sse_event_get()
Atish Kumar Patra
atishp at rivosinc.com
Mon Dec 16 18:31:48 PST 2024
On Mon, Dec 16, 2024 at 1:22 PM Clément Léger <cleger at rivosinc.com> wrote:
>
> Since event support will be checked in the next commits, return a value
> from sse_event_get() to allow propagating it. This will be used to
> report SBI_ERR_NOT_SUPPORTED when an event isn't supported.
>
> Signed-off-by: Clément Léger <cleger at rivosinc.com>
> Reviewed-by: Samuel Holland <samuel.holland at sifive.com>
> ---
> lib/sbi/sbi_sse.c | 72 +++++++++++++++++++++++++----------------------
> 1 file changed, 38 insertions(+), 34 deletions(-)
>
> diff --git a/lib/sbi/sbi_sse.c b/lib/sbi/sbi_sse.c
> index c9f9a9dd..f710338e 100644
> --- a/lib/sbi/sbi_sse.c
> +++ b/lib/sbi/sbi_sse.c
> @@ -244,30 +244,36 @@ static void sse_event_set_state(struct sbi_sse_event *e,
> e->attrs.status |= new_state;
> }
>
> -static struct sbi_sse_event *sse_event_get(uint32_t event_id)
> +static int sse_event_get(uint32_t event_id, struct sbi_sse_event **eret)
> {
> unsigned int i;
> struct sbi_sse_event *e;
> struct sse_hart_state *shs;
>
> + if (!eret)
> + return SBI_EINVAL;
> +
> if (EVENT_IS_GLOBAL(event_id)) {
> for (i = 0; i < global_event_count; i++) {
> e = &global_events[i].event;
> if (e->event_id == event_id) {
> spin_lock(&global_events[i].lock);
> - return e;
> + *eret = e;
> + return SBI_SUCCESS;
> }
> }
> } else {
> shs = sse_thishart_state_ptr();
> for (i = 0; i < local_event_count; i++) {
> e = &shs->local_events[i];
> - if (e->event_id == event_id)
> - return e;
> + if (e->event_id == event_id) {
> + *eret = e;
> + return SBI_SUCCESS;
> + }
> }
> }
>
> - return NULL;
> + return SBI_EINVAL;
> }
>
> static void sse_event_put(struct sbi_sse_event *e)
> @@ -653,8 +659,7 @@ static void sse_ipi_inject_process(struct sbi_scratch *scratch)
>
> /* Mark all queued events as pending */
> while (!sbi_fifo_dequeue(sse_inject_fifo_r, &evt)) {
> - e = sse_event_get(evt.event_id);
> - if (!e)
> + if (sse_event_get(evt.event_id, &e))
> continue;
>
> sse_event_set_pending(e);
> @@ -696,10 +701,9 @@ static int sse_inject_event(uint32_t event_id, unsigned long hartid)
> int ret;
> struct sbi_sse_event *e;
>
> - e = sse_event_get(event_id);
> - if (!e)
> - return SBI_EINVAL;
> -
> + ret = sse_event_get(event_id, &e);
> + if (ret)
> + return ret;
>
> /* In case of global event, provided hart_id is ignored */
> if (sse_event_is_global(e))
> @@ -788,9 +792,9 @@ int sbi_sse_enable(uint32_t event_id)
> int ret;
> struct sbi_sse_event *e;
>
> - e = sse_event_get(event_id);
> - if (!e)
> - return SBI_EINVAL;
> + ret = sse_event_get(event_id, &e);
> + if (ret)
> + return ret;
>
> sse_enabled_event_lock(e);
> ret = sse_event_enable(e);
> @@ -805,9 +809,9 @@ int sbi_sse_disable(uint32_t event_id)
> int ret;
> struct sbi_sse_event *e;
>
> - e = sse_event_get(event_id);
> - if (!e)
> - return SBI_EINVAL;
> + ret = sse_event_get(event_id, &e);
> + if (ret)
> + return ret;
>
> sse_enabled_event_lock(e);
> ret = sse_event_disable(e);
> @@ -865,14 +869,15 @@ int sbi_sse_inject_event(uint32_t event_id)
>
> int sbi_sse_set_cb_ops(uint32_t event_id, const struct sbi_sse_cb_ops *cb_ops)
> {
> + int ret;
> struct sbi_sse_event *e;
>
> if (cb_ops->set_hartid_cb && !EVENT_IS_GLOBAL(event_id))
> return SBI_EINVAL;
>
> - e = sse_event_get(event_id);
> - if (!e)
> - return SBI_EINVAL;
> + ret = sse_event_get(event_id, &e);
> + if (ret)
> + return ret;
>
> e->cb_ops = cb_ops;
> sse_event_put(e);
> @@ -943,9 +948,9 @@ int sbi_sse_read_attrs(uint32_t event_id, uint32_t base_attr_id,
> if (ret)
> return ret;
>
> - e = sse_event_get(event_id);
> - if (!e)
> - return SBI_EINVAL;
> + ret = sse_event_get(event_id, &e);
> + if (ret)
> + return ret;
>
> sbi_hart_map_saddr(output_phys_lo, sizeof(unsigned long) * attr_count);
>
> @@ -1008,9 +1013,9 @@ int sbi_sse_write_attrs(uint32_t event_id, uint32_t base_attr_id,
> if (ret)
> return ret;
>
> - e = sse_event_get(event_id);
> - if (!e)
> - return SBI_EINVAL;
> + ret = sse_event_get(event_id, &e);
> + if (ret)
> + return ret;
>
> ret = sse_write_attrs(e, base_attr_id, attr_count, input_phys_lo);
> sse_event_put(e);
> @@ -1033,9 +1038,9 @@ int sbi_sse_register(uint32_t event_id, unsigned long handler_entry_pc,
> SBI_DOMAIN_EXECUTE))
> return SBI_EINVALID_ADDR;
>
> - e = sse_event_get(event_id);
> - if (!e)
> - return SBI_EINVAL;
> + ret = sse_event_get(event_id, &e);
> + if (ret)
> + return ret;
>
> ret = sse_event_register(e, handler_entry_pc, handler_entry_arg);
> sse_event_put(e);
> @@ -1048,9 +1053,9 @@ int sbi_sse_unregister(uint32_t event_id)
> int ret;
> struct sbi_sse_event *e;
>
> - e = sse_event_get(event_id);
> - if (!e)
> - return SBI_EINVAL;
> + ret = sse_event_get(event_id, &e);
> + if (ret)
> + return ret;
>
> ret = sse_event_unregister(e);
> sse_event_put(e);
> @@ -1192,8 +1197,7 @@ void sbi_sse_exit(struct sbi_scratch *scratch)
> struct sbi_sse_event *e;
>
> for (i = 0; i < EVENT_COUNT; i++) {
> - e = sse_event_get(supported_events[i]);
> - if (!e)
> + if (sse_event_get(supported_events[i], &e))
> continue;
>
> if (e->attrs.hartid != current_hartid())
> --
> 2.45.2
Reviewed-by: Atish Patra <atishp at rivosinc.com>
>
More information about the opensbi
mailing list