[PATCH 2/2] lib: sbi_domain: Rename per-domain data to per-domain state
Rahul Pathak <[email protected]>
| Newsgroups | org.infradead.lists.opensbi |
|---|---|
| Message-ID | <[email protected]> |
The per-domain sbi_domain_data hold each domain associated state like hart context in sbi_domain_context, mpxy state in sbi_mpxy, and others like each domain backed by the corresponding MPT (SMMPT). DATA reads as a generic name, while every use stores state. Rename functions and macros appropriately. There are no functional changes. Signed-off-by: Rahul Pathak <[email protected]> --- include/sbi/sbi_domain.h | 6 +- include/sbi/sbi_domain_data.h | 93 ---------------------- include/sbi/sbi_domain_state.h | 93 ++++++++++++++++++++++ lib/sbi/objects.mk | 2 +- lib/sbi/sbi_domain.c | 6 +- lib/sbi/sbi_domain_context.c | 14 ++-- lib/sbi/sbi_domain_data.c | 138 --------------------------------- lib/sbi/sbi_domain_state.c | 138 +++++++++++++++++++++++++++++++++ lib/sbi/sbi_mpxy.c | 32 ++++---- 9 files changed, 261 insertions(+), 261 deletions(-) delete mode 100644 include/sbi/sbi_domain_data.h create mode 100644 include/sbi/sbi_domain_state.h delete mode 100644 lib/sbi/sbi_domain_data.c create mode 100644 lib/sbi/sbi_domain_state.c diff --git a/include/sbi/sbi_domain.h b/include/sbi/sbi_domain.h index 16edd4ce..38784a0e 100644 --- a/include/sbi/sbi_domain.h +++ b/include/sbi/sbi_domain.h @@ -15,7 +15,7 @@ #include <sbi/sbi_types.h> #include <sbi/sbi_hartmask.h> #include <sbi/sbi_domain_context.h> -#include <sbi/sbi_domain_data.h> +#include <sbi/sbi_domain_state.h> struct sbi_scratch; @@ -189,8 +189,8 @@ static inline bool sbi_domain_memregion_is_subset( struct sbi_domain { /** Node in linked list of domains */ struct sbi_dlist node; - /** Internal state of per-domain data */ - struct sbi_domain_data_priv data_priv; + /** Internal per-domain state areas */ + struct sbi_domain_state_priv state_priv; /** Logical index of this domain */ u32 index; /** HARTs assigned to this domain */ diff --git a/include/sbi/sbi_domain_data.h b/include/sbi/sbi_domain_data.h deleted file mode 100644 index 7eeafdce..00000000 --- a/include/sbi/sbi_domain_data.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * SPDX-License-Identifier: BSD-2-Clause - * - * Copyright (c) 2024 Ventana Micro Systems Inc. - */ - -#ifndef __SBI_DOMAIN_DATA_H__ -#define __SBI_DOMAIN_DATA_H__ - -#include <sbi/sbi_types.h> -#include <sbi/sbi_list.h> - -struct sbi_domain; - -/** Maximum domain data per-domain */ -#define SBI_DOMAIN_MAX_DATA_PTRS 32 - -/** Representation of per-domain data */ -struct sbi_domain_data_priv { - /** Array of domain data pointers indexed by domain data identifier */ - void *idx_to_data_ptr[SBI_DOMAIN_MAX_DATA_PTRS]; -}; - -/** Representation of a domain data */ -struct sbi_domain_data { - /** - * Head is used for maintaining data list - * - * Note: initialized by domain framework - */ - struct sbi_dlist head; - /** - * Identifier which used to locate per-domain data - * - * Note: initialized by domain framework - */ - unsigned long data_idx; - /** Size of per-domain data */ - unsigned long data_size; - /** Optional callback to setup domain data */ - int (*data_setup)(struct sbi_domain *dom, - struct sbi_domain_data *data, void *data_ptr); - /** Optional callback to cleanup domain data */ - void (*data_cleanup)(struct sbi_domain *dom, - struct sbi_domain_data *data, void *data_ptr); -}; - -/** - * Get per-domain data pointer for a given domain - * @param dom pointer to domain - * @param data pointer to domain data - * - * @return per-domain data pointer - */ -void *sbi_domain_data_ptr(struct sbi_domain *dom, struct sbi_domain_data *data); - -/** - * Setup all domain data for a domain - * @param dom pointer to domain - * - * @return 0 on success and negative error code on failure - * - * Note: This function is used internally within domain framework. - */ -int sbi_domain_setup_data(struct sbi_domain *dom); - -/** - * Cleanup all domain data for a domain - * @param dom pointer to domain - * - * Note: This function is used internally within domain framework. - */ -void sbi_domain_cleanup_data(struct sbi_domain *dom); - -/** - * Register a domain data - * @param hndl pointer to domain data - * - * @return 0 on success and negative error code on failure - * - * Note: This function must be used only in cold boot path. - */ -int sbi_domain_register_data(struct sbi_domain_data *data); - -/** - * Unregister a domain data - * @param hndl pointer to domain data - * - * Note: This function must be used only in cold boot path. - */ -void sbi_domain_unregister_data(struct sbi_domain_data *data); - -#endif diff --git a/include/sbi/sbi_domain_state.h b/include/sbi/sbi_domain_state.h new file mode 100644 index 00000000..72030380 --- /dev/null +++ b/include/sbi/sbi_domain_state.h @@ -0,0 +1,93 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2024 Ventana Micro Systems Inc. + */ + +#ifndef __SBI_DOMAIN_STATE_H__ +#define __SBI_DOMAIN_STATE_H__ + +#include <sbi/sbi_types.h> +#include <sbi/sbi_list.h> + +struct sbi_domain; + +/** Maximum number of per-domain state areas */ +#define SBI_DOMAIN_MAX_STATE_PTRS 32 + +/** Internal per-domain state areas */ +struct sbi_domain_state_priv { + /** Array of per-domain state pointers indexed by state identifier */ + void *idx_to_state_ptr[SBI_DOMAIN_MAX_STATE_PTRS]; +}; + +/** Representation of a domain state */ +struct sbi_domain_state { + /** + * Head is used for maintaining state list + * + * Note: initialized by domain framework + */ + struct sbi_dlist head; + /** + * Identifier which used to locate per-domain state + * + * Note: initialized by domain framework + */ + unsigned long state_idx; + /** Size of per-domain state */ + unsigned long state_size; + /** Optional callback to setup domain state */ + int (*state_setup)(struct sbi_domain *dom, + struct sbi_domain_state *state, void *state_ptr); + /** Optional callback to cleanup domain state */ + void (*state_cleanup)(struct sbi_domain *dom, + struct sbi_domain_state *state, void *state_ptr); +}; + +/** + * Get per-domain state pointer for a given domain + * @param dom pointer to domain + * @param state pointer to domain state + * + * @return per-domain state pointer + */ +void *sbi_domain_state_ptr(struct sbi_domain *dom, struct sbi_domain_state *state); + +/** + * Setup all domain state for a domain + * @param dom pointer to domain + * + * @return 0 on success and negative error code on failure + * + * Note: This function is used internally within domain framework. + */ +int sbi_domain_setup_state(struct sbi_domain *dom); + +/** + * Cleanup all domain state for a domain + * @param dom pointer to domain + * + * Note: This function is used internally within domain framework. + */ +void sbi_domain_cleanup_state(struct sbi_domain *dom); + +/** + * Register a domain state + * @param hndl pointer to domain state + * + * @return 0 on success and negative error code on failure + * + * Note: This function must be used only in cold boot path. + */ +int sbi_domain_register_state(struct sbi_domain_state *state); + +/** + * Unregister a domain state + * @param hndl pointer to domain state + * + * Note: This function must be used only in cold boot path. + */ +void sbi_domain_unregister_state(struct sbi_domain_state *state); + +#endif 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; -- 2.53.0 -- opensbi mailing list [email protected] http://lists.infradead.org/mailman/listinfo/opensbi