[PATCH v4 2/3] lib: sbi: Introduce register_extensions extension callback
Anup Patel
anup at brainfault.org
Fri May 12 07:25:56 PDT 2023
On Thu, May 11, 2023 at 9:41 PM Andrew Jones <ajones at ventanamicro.com> wrote:
>
> The register_extensions callback is called from sbi_ecall_init() for
> any extension that provides it. It's purpose is to register the
> extension with one or more sbi_ecall_register_extension() calls after
> possibly narrowing the range of extension IDs that should be handled.
> More than one call of sbi_ecall_register_extension() is necessary
> when the supported extension ID ranges have gaps. Additionally, when
> an extension may not be available and has a probe function, then the
> probe function should be consulted as to whether or not the extension
> should be registered. In summary, when register_extensions() returns,
> only valid extension IDs from the initial range, which are also
> available, have been registered.
>
> Signed-off-by: Andrew Jones <ajones at ventanamicro.com>
> ---
> include/sbi/sbi_ecall.h | 1 +
> lib/sbi/sbi_ecall.c | 8 ++++++--
> 2 files changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/include/sbi/sbi_ecall.h b/include/sbi/sbi_ecall.h
> index ff9bf8e2b435..fac26429cf5d 100644
> --- a/include/sbi/sbi_ecall.h
> +++ b/include/sbi/sbi_ecall.h
> @@ -24,6 +24,7 @@ struct sbi_ecall_extension {
> struct sbi_dlist head;
> unsigned long extid_start;
> unsigned long extid_end;
> + int (* register_extensions)(void);
> int (* probe)(unsigned long extid, unsigned long *out_val);
> int (* handle)(unsigned long extid, unsigned long funcid,
> const struct sbi_trap_regs *regs,
> diff --git a/lib/sbi/sbi_ecall.c b/lib/sbi/sbi_ecall.c
> index 5a301fb7d403..1c4a26fde438 100644
> --- a/lib/sbi/sbi_ecall.c
> +++ b/lib/sbi/sbi_ecall.c
> @@ -154,8 +154,12 @@ int sbi_ecall_init(void)
>
> for (i = 0; i < sbi_ecall_exts_size; i++) {
> ext = sbi_ecall_exts[i];
> - if (ext->extid_start != ext->extid_end || !ext->probe ||
> - (!ext->probe(ext->extid_end, &out_val) && out_val)) {
> + if (ext->register_extensions) {
> + ret = ext->register_extensions();
> + if (ret)
> + return ret;
> + } else if (ext->extid_start != ext->extid_end || !ext->probe ||
> + (!ext->probe(ext->extid_end, &out_val) && out_val)) {
We should replace probe() callback with register_extensions()
and code over here can be something like below:
if (ext->register_extensions)
ret = ext->register_extensions();
else if (ext->extid_start == ext->extid_end)
ret = sbi_ecall_register_extension(ext);
else
ret = SBI_ENODEV;
if (ret)
return ret;
Basically, register_extensions() is optional for single extension ID
but mandatory for extension ID range.
> ret = sbi_ecall_register_extension(ext);
> if (ret)
> return ret;
> --
> 2.40.0
>
Regards,
Anup
More information about the opensbi
mailing list