diff options
Diffstat (limited to 'lib/sbi')
| -rw-r--r-- | lib/sbi/objects.mk | 2 | ||||
| -rw-r--r-- | lib/sbi/sbi_domain.c | 6 | ||||
| -rw-r--r-- | lib/sbi/sbi_domain_context.c | 14 | ||||
| -rw-r--r-- | lib/sbi/sbi_domain_data.c | 138 | ||||
| -rw-r--r-- | lib/sbi/sbi_domain_state.c | 138 | ||||
| -rw-r--r-- | lib/sbi/sbi_mpxy.c | 32 |
6 files changed, 165 insertions, 165 deletions
diff --git a/lib/sbi/objects.mk b/lib/sbi/objects.mk index c29c888f..ae27d0c5 100644 --- a/lib/sbi/objects.mk +++ b/lib/sbi/objects.mk @@ -68,7 +68,7 @@ libsbi-objs-y += sbi_bitmap.o 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_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 fa69170b..79d61c54 100644 --- a/lib/sbi/sbi_domain.c +++ b/lib/sbi/sbi_domain.c @@ -687,10 +687,10 @@ int sbi_domain_register(struct sbi_domain *dom, } } - /* Setup data for the discovered domain */ - rc = sbi_domain_setup_data(dom); + /* Setup state for the discovered domain */ + rc = sbi_domain_setup_state(dom); if (rc) { - sbi_printf("%s: domain data setup failed for %s (error %d)\n", + sbi_printf("%s: domain state setup failed for %s (error %d)\n", __func__, dom->name, rc); sbi_list_del(&dom->node); return rc; diff --git a/lib/sbi/sbi_domain_context.c b/lib/sbi/sbi_domain_context.c index 0861d541..37cbe175 100644 --- a/lib/sbi/sbi_domain_context.c +++ b/lib/sbi/sbi_domain_context.c @@ -64,14 +64,14 @@ struct hart_context { bool initialized; }; -static struct sbi_domain_data dcpriv; +static struct sbi_domain_state dcstate; static inline struct hart_context *hart_context_get(struct sbi_domain *dom, u32 hartindex) { struct hart_context **dom_hartindex_to_context_table; - dom_hartindex_to_context_table = sbi_domain_data_ptr(dom, &dcpriv); + dom_hartindex_to_context_table = sbi_domain_state_ptr(dom, &dcstate); if (!dom_hartindex_to_context_table || !sbi_hartindex_valid(hartindex)) return NULL; @@ -83,7 +83,7 @@ static void hart_context_set(struct sbi_domain *dom, u32 hartindex, { struct hart_context **dom_hartindex_to_context_table; - dom_hartindex_to_context_table = sbi_domain_data_ptr(dom, &dcpriv); + dom_hartindex_to_context_table = sbi_domain_state_ptr(dom, &dcstate); if (!dom_hartindex_to_context_table || !sbi_hartindex_valid(hartindex)) return; @@ -314,15 +314,15 @@ int sbi_domain_context_init(void) /** * Allocate per-domain and per-hart context data. * The data type is "struct hart_context **" whose memory space will be - * dynamically allocated by domain_setup_data_one(). Calculate needed + * dynamically allocated by domain_setup_state_one(). Calculate needed * size of memory space here. */ - dcpriv.data_size = sizeof(struct hart_context *) * sbi_hart_count(); + dcstate.state_size = sizeof(struct hart_context *) * sbi_hart_count(); - return sbi_domain_register_data(&dcpriv); + return sbi_domain_register_state(&dcstate); } void sbi_domain_context_deinit(void) { - sbi_domain_unregister_data(&dcpriv); + sbi_domain_unregister_state(&dcstate); } diff --git a/lib/sbi/sbi_domain_data.c b/lib/sbi/sbi_domain_data.c deleted file mode 100644 index 04f0edf9..00000000 --- a/lib/sbi/sbi_domain_data.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * SPDX-License-Identifier: BSD-2-Clause - * - * Copyright (c) 2024 Ventana Micro Systems Inc. - */ - -#include <sbi/sbi_bitmap.h> -#include <sbi/sbi_domain.h> -#include <sbi/sbi_error.h> -#include <sbi/sbi_heap.h> - -static SBI_LIST_HEAD(data_list); -static DECLARE_BITMAP(data_idx_bmap, SBI_DOMAIN_MAX_DATA_PTRS); - -void *sbi_domain_data_ptr(struct sbi_domain *dom, struct sbi_domain_data *data) -{ - if (dom && data && data->data_idx < SBI_DOMAIN_MAX_DATA_PTRS) - return dom->data_priv.idx_to_data_ptr[data->data_idx]; - - return NULL; -} - -static int domain_setup_data_one(struct sbi_domain *dom, - struct sbi_domain_data *data) -{ - struct sbi_domain_data_priv *priv = &dom->data_priv; - void *data_ptr; - int rc; - - if (priv->idx_to_data_ptr[data->data_idx]) - return SBI_EALREADY; - - data_ptr = sbi_zalloc(data->data_size); - if (!data_ptr) { - sbi_domain_cleanup_data(dom); - return SBI_ENOMEM; - } - - if (data->data_setup) { - rc = data->data_setup(dom, data, data_ptr); - if (rc) { - sbi_free(data_ptr); - return rc; - } - } - - priv->idx_to_data_ptr[data->data_idx] = data_ptr; - return 0; -} - -static void domain_cleanup_data_one(struct sbi_domain *dom, - struct sbi_domain_data *data) -{ - struct sbi_domain_data_priv *priv = &dom->data_priv; - void *data_ptr; - - data_ptr = priv->idx_to_data_ptr[data->data_idx]; - if (!data_ptr) - return; - - if (data->data_cleanup) - data->data_cleanup(dom, data, data_ptr); - - sbi_free(data_ptr); - priv->idx_to_data_ptr[data->data_idx] = NULL; -} - -int sbi_domain_setup_data(struct sbi_domain *dom) -{ - struct sbi_domain_data *data; - int rc; - - if (!dom) - return SBI_EINVAL; - - sbi_list_for_each_entry(data, &data_list, head) { - rc = domain_setup_data_one(dom, data); - if (rc) { - sbi_domain_cleanup_data(dom); - return rc; - } - } - - return 0; -} - -void sbi_domain_cleanup_data(struct sbi_domain *dom) -{ - struct sbi_domain_data *data; - - if (!dom) - return; - - sbi_list_for_each_entry(data, &data_list, head) - domain_cleanup_data_one(dom, data); -} - -int sbi_domain_register_data(struct sbi_domain_data *data) -{ - struct sbi_domain *dom; - u32 data_idx; - int rc; - - if (!data || !data->data_size) - return SBI_EINVAL; - - for (data_idx = 0; data_idx < SBI_DOMAIN_MAX_DATA_PTRS; data_idx++) { - if (!bitmap_test(data_idx_bmap, data_idx)) - break; - } - if (SBI_DOMAIN_MAX_DATA_PTRS <= data_idx) - return SBI_ENOSPC; - bitmap_set(data_idx_bmap, data_idx, 1); - - data->data_idx = data_idx; - sbi_list_add_tail(&data->head, &data_list); - - sbi_domain_for_each(dom) { - rc = domain_setup_data_one(dom, data); - if (rc) { - sbi_domain_unregister_data(data); - return rc; - } - } - - return 0; -} - -void sbi_domain_unregister_data(struct sbi_domain_data *data) -{ - struct sbi_domain *dom; - - sbi_domain_for_each(dom) - domain_cleanup_data_one(dom, data); - - sbi_list_del(&data->head); - bitmap_clear(data_idx_bmap, data->data_idx, 1); -} diff --git a/lib/sbi/sbi_domain_state.c b/lib/sbi/sbi_domain_state.c new file mode 100644 index 00000000..2d1f30e3 --- /dev/null +++ b/lib/sbi/sbi_domain_state.c @@ -0,0 +1,138 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2024 Ventana Micro Systems Inc. + */ + +#include <sbi/sbi_bitmap.h> +#include <sbi/sbi_domain.h> +#include <sbi/sbi_error.h> +#include <sbi/sbi_heap.h> + +static SBI_LIST_HEAD(state_list); +static DECLARE_BITMAP(state_idx_bmap, SBI_DOMAIN_MAX_STATE_PTRS); + +void *sbi_domain_state_ptr(struct sbi_domain *dom, struct sbi_domain_state *state) +{ + if (dom && state && state->state_idx < SBI_DOMAIN_MAX_STATE_PTRS) + return dom->state_priv.idx_to_state_ptr[state->state_idx]; + + return NULL; +} + +static int domain_setup_state_one(struct sbi_domain *dom, + struct sbi_domain_state *state) +{ + struct sbi_domain_state_priv *priv = &dom->state_priv; + void *state_ptr; + int rc; + + if (priv->idx_to_state_ptr[state->state_idx]) + return SBI_EALREADY; + + state_ptr = sbi_zalloc(state->state_size); + if (!state_ptr) { + sbi_domain_cleanup_state(dom); + return SBI_ENOMEM; + } + + if (state->state_setup) { + rc = state->state_setup(dom, state, state_ptr); + if (rc) { + sbi_free(state_ptr); + return rc; + } + } + + priv->idx_to_state_ptr[state->state_idx] = state_ptr; + return 0; +} + +static void domain_cleanup_state_one(struct sbi_domain *dom, + struct sbi_domain_state *state) +{ + struct sbi_domain_state_priv *priv = &dom->state_priv; + void *state_ptr; + + state_ptr = priv->idx_to_state_ptr[state->state_idx]; + if (!state_ptr) + return; + + if (state->state_cleanup) + state->state_cleanup(dom, state, state_ptr); + + sbi_free(state_ptr); + priv->idx_to_state_ptr[state->state_idx] = NULL; +} + +int sbi_domain_setup_state(struct sbi_domain *dom) +{ + struct sbi_domain_state *state; + int rc; + + if (!dom) + return SBI_EINVAL; + + sbi_list_for_each_entry(state, &state_list, head) { + rc = domain_setup_state_one(dom, state); + if (rc) { + sbi_domain_cleanup_state(dom); + return rc; + } + } + + return 0; +} + +void sbi_domain_cleanup_state(struct sbi_domain *dom) +{ + struct sbi_domain_state *state; + + if (!dom) + return; + + sbi_list_for_each_entry(state, &state_list, head) + domain_cleanup_state_one(dom, state); +} + +int sbi_domain_register_state(struct sbi_domain_state *state) +{ + struct sbi_domain *dom; + u32 state_idx; + int rc; + + if (!state || !state->state_size) + return SBI_EINVAL; + + for (state_idx = 0; state_idx < SBI_DOMAIN_MAX_STATE_PTRS; state_idx++) { + if (!bitmap_test(state_idx_bmap, state_idx)) + break; + } + if (SBI_DOMAIN_MAX_STATE_PTRS <= state_idx) + return SBI_ENOSPC; + bitmap_set(state_idx_bmap, state_idx, 1); + + state->state_idx = state_idx; + sbi_list_add_tail(&state->head, &state_list); + + sbi_domain_for_each(dom) { + rc = domain_setup_state_one(dom, state); + if (rc) { + sbi_domain_unregister_state(state); + return rc; + } + } + + return 0; +} + +void sbi_domain_unregister_state(struct sbi_domain_state *state) +{ + struct sbi_domain *dom; + + sbi_domain_for_each(dom) + domain_cleanup_state_one(dom, state); + + sbi_list_del(&state->head); + bitmap_clear(state_idx_bmap, state->state_idx, 1); +} diff --git a/lib/sbi/sbi_mpxy.c b/lib/sbi/sbi_mpxy.c index 41fea0ae..2b9ad351 100644 --- a/lib/sbi/sbi_mpxy.c +++ b/lib/sbi/sbi_mpxy.c @@ -267,11 +267,11 @@ int sbi_mpxy_register_channel(struct sbi_mpxy_channel *channel) } /** Setup per domain MPXY state data */ -static int domain_mpxy_state_data_setup(struct sbi_domain *dom, - struct sbi_domain_data *data, - void *data_ptr) +static int domain_mpxy_state_setup(struct sbi_domain *dom, + struct sbi_domain_state *state, + void *state_ptr) { - struct mpxy_state **dom_hartindex_to_mpxy_state_table = data_ptr; + struct mpxy_state **dom_hartindex_to_mpxy_state_table = state_ptr; struct mpxy_state *ms; u32 i; @@ -296,20 +296,20 @@ static int domain_mpxy_state_data_setup(struct sbi_domain *dom, } /** Cleanup per domain MPXY state data */ -static void domain_mpxy_state_data_cleanup(struct sbi_domain *dom, - struct sbi_domain_data *data, - void *data_ptr) +static void domain_mpxy_state_cleanup(struct sbi_domain *dom, + struct sbi_domain_state *state, + void *state_ptr) { - struct mpxy_state **dom_hartindex_to_mpxy_state_table = data_ptr; + struct mpxy_state **dom_hartindex_to_mpxy_state_table = state_ptr; u32 i; sbi_hartmask_for_each_hartindex(i, dom->possible_harts) sbi_free(dom_hartindex_to_mpxy_state_table[i]); } -static struct sbi_domain_data dmspriv = { - .data_setup = domain_mpxy_state_data_setup, - .data_cleanup = domain_mpxy_state_data_cleanup, +static struct sbi_domain_state dmstate = { + .state_setup = domain_mpxy_state_setup, + .state_cleanup = domain_mpxy_state_cleanup, }; /** @@ -324,7 +324,7 @@ static struct mpxy_state *sbi_domain_get_mpxy_state(struct sbi_domain *dom, { struct mpxy_state **dom_hartindex_to_mpxy_state_table; - dom_hartindex_to_mpxy_state_table = sbi_domain_data_ptr(dom, &dmspriv); + dom_hartindex_to_mpxy_state_table = sbi_domain_state_ptr(dom, &dmstate); if (!dom_hartindex_to_mpxy_state_table || !sbi_hartindex_valid(hartindex)) return NULL; @@ -339,12 +339,12 @@ int sbi_mpxy_init(struct sbi_scratch *scratch) /** * Allocate per-domain and per-hart MPXY state data. * The data type is "struct mpxy_state **" whose memory space will be - * dynamically allocated by domain_setup_data_one() and - * domain_mpxy_state_data_setup(). Calculate needed size of memory space + * dynamically allocated by domain_setup_state_one() and + * domain_mpxy_state_setup(). Calculate needed size of memory space * here. */ - dmspriv.data_size = sizeof(struct mpxy_state *) * sbi_hart_count(); - ret = sbi_domain_register_data(&dmspriv); + dmstate.state_size = sizeof(struct mpxy_state *) * sbi_hart_count(); + ret = sbi_domain_register_state(&dmstate); if (ret) return ret; |
