[RFC PATCH v4 1/4] lib: sbi_domain: Add finalize callback for per-domain state

Pawandeep Oza pawandeep.oza at oss.qualcomm.com
Tue Aug 25 09:19:19 PDT 2026


On Sun, Aug 23, 2026 at 7:10 PM Rahul Pathak
<rahul.pathak at oss.qualcomm.com> wrote:
>
> Per-domain state is registered via sbi_domain_state in state_setup()
> but during that time the domain memory regions are not final.
> Add optional state_finalize() callback which is called
> from sbi_domain_finalize for each domain after all domains are
> registered and their memory regions are final.
>
> Signed-off-by: Rahul Pathak <rahul.pathak at oss.qualcomm.com>
> ---
>  include/sbi/sbi_domain_state.h | 22 ++++++++++++++++++++++
>  lib/sbi/sbi_domain.c           | 16 ++++++++++++++++
>  lib/sbi/sbi_domain_state.c     | 25 +++++++++++++++++++++++++
>  3 files changed, 63 insertions(+)
>
> diff --git a/include/sbi/sbi_domain_state.h b/include/sbi/sbi_domain_state.h
> index 72030380..6528a95b 100644
> --- a/include/sbi/sbi_domain_state.h
> +++ b/include/sbi/sbi_domain_state.h
> @@ -40,6 +40,18 @@ struct sbi_domain_state {
>         /** Optional callback to setup domain state */
>         int (*state_setup)(struct sbi_domain *dom,
>                           struct sbi_domain_state *state, void *state_ptr);
> +       /**
> +        * Optional callback to finalize domain state
> +        *
> +        * Called for each domain from sbi_domain_finalize() after all
> +        * domains are registered and memory regions are final.
> +        *
> +        * State from the domain memory regions must be setup here instead
> +        * of state_setup()
> +        */
> +       int (*state_finalize)(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);
> @@ -64,6 +76,16 @@ void *sbi_domain_state_ptr(struct sbi_domain *dom, struct sbi_domain_state *stat
>   */
>  int sbi_domain_setup_state(struct sbi_domain *dom);
>
> +/**
> + * Finalize 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_finalize_state(struct sbi_domain *dom);
> +
>  /**
>   * Cleanup all domain state for a domain
>   * @param dom pointer to domain
> diff --git a/lib/sbi/sbi_domain.c b/lib/sbi/sbi_domain.c
> index 79d61c54..aa85d736 100644
> --- a/lib/sbi/sbi_domain.c
> +++ b/lib/sbi/sbi_domain.c
> @@ -845,6 +845,7 @@ int sbi_domain_startup(struct sbi_scratch *scratch, u32 cold_hartid)
>  int sbi_domain_finalize(struct sbi_scratch *scratch)
>  {
>         int rc;
> +       struct sbi_domain *dom;
>         const struct sbi_platform *plat = sbi_platform_ptr(scratch);
>
>         /* Sanity checks */
> @@ -865,6 +866,21 @@ int sbi_domain_finalize(struct sbi_scratch *scratch)
>          */
>         domain_finalized = true;
>
> +       /*
> +        * Finalize per-domain state of each domain. Now all domains
> +        * are finalized already and their memory regions are final.
> +        * State which is derived from the domain memory regions is
> +        * set up below.
> +        */
> +       sbi_domain_for_each(dom) {
> +               rc = sbi_domain_finalize_state(dom);
> +               if (rc) {
> +                       sbi_printf("%s: domain state finalize failed for %s"
> +                                  " (error %d)\n", __func__, dom->name, rc);
> +                       return rc;
> +               }
> +       }
> +
>         return 0;
>  }
Oza:


I am not sure if this infrastructure would be useful to you for state
finalization. but have a look if you think you could reuse this
notifier infrastructure which is inflight athe the moment.

refer to this patch. this notifier is called before the
[PATCH v2 1/3] lib: sbi: domain: add domain registration notifier infrastructure

but if you look sbi_domain_finalize calls sbi_platform_domains_init
which in turn calls sbi_platform_ops(plat)->domains_init();
and generic_domains_init will eventually call into
fdt_domains_populate and during domina_register this call back
notifier will be called.

have a look to see if it makes sense to use it ? I could be missing
some subtle thing though here.

>
> diff --git a/lib/sbi/sbi_domain_state.c b/lib/sbi/sbi_domain_state.c
> index 2d1f30e3..f8ccab69 100644
> --- a/lib/sbi/sbi_domain_state.c
> +++ b/lib/sbi/sbi_domain_state.c
> @@ -84,6 +84,31 @@ int sbi_domain_setup_state(struct sbi_domain *dom)
>         return 0;
>  }
>
> +int sbi_domain_finalize_state(struct sbi_domain *dom)
> +{
> +       struct sbi_domain_state *state;
> +       void *state_ptr;
> +       int rc;
> +
> +       if (!dom)
> +               return SBI_EINVAL;
> +
> +       sbi_list_for_each_entry(state, &state_list, head) {
> +               if (!state->state_finalize)
> +                       continue;
> +
> +               state_ptr = sbi_domain_state_ptr(dom, state);
> +               if (!state_ptr)
> +                       continue;
> +
> +               rc = state->state_finalize(dom, state, state_ptr);
> +               if (rc)
> +                       return rc;
> +       }
> +
> +       return 0;
> +}
> +
>  void sbi_domain_cleanup_state(struct sbi_domain *dom)
>  {
>         struct sbi_domain_state *state;
> --
> 2.53.0
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list