| Message ID | 20260824020953.2438946-2-rahul.pathak@oss.qualcomm.com |
|---|---|
| State | New |
| Headers | show |
| Series | Add Smsdid and Smmpt supervisor domain protection | expand |
On Sun, Aug 23, 2026 at 7:10 PM Rahul Pathak <rahul.pathak@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@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@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/opensbi
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; } 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;
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@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(+)