[PATCH 1/2] lib: sbi: Align SBI vendor extension id with mvendorid CSR

Anup Patel anup at brainfault.org
Sun Feb 26 22:09:23 PST 2023


On Mon, Feb 13, 2023 at 10:48 AM Anup Patel <apatel at ventanamicro.com> wrote:
>
> As-per the SBI specification, the lower 24bits of the SBI vendor
> extension id is same as lower 24bits of the mvendorid CSR.
>
> We update the SBI vendor extension id checking based on above.
>
> Signed-off-by: Anup Patel <apatel at ventanamicro.com>

Applied this patch to the riscv/opensbi repo.

Regards,
Anup

> ---
>  include/sbi/sbi_platform.h                   | 17 ++++++++---------
>  lib/sbi/sbi_ecall_vendor.c                   | 19 +++++++++++++++++--
>  platform/generic/include/platform_override.h |  1 -
>  platform/generic/platform.c                  | 19 ++++++-------------
>  4 files changed, 31 insertions(+), 25 deletions(-)
>
> diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h
> index 43d1c03..3a629a6 100644
> --- a/include/sbi/sbi_platform.h
> +++ b/include/sbi/sbi_platform.h
> @@ -126,8 +126,8 @@ struct sbi_platform_operations {
>         /** Exit platform timer for current HART */
>         void (*timer_exit)(void);
>
> -       /** platform specific SBI extension implementation probe function */
> -       int (*vendor_ext_check)(long extid);
> +       /** Check if SBI vendor extension is implemented or not */
> +       bool (*vendor_ext_check)(void);
>         /** platform specific SBI extension implementation provider */
>         int (*vendor_ext_provider)(long extid, long funcid,
>                                    const struct sbi_trap_regs *regs,
> @@ -636,20 +636,19 @@ static inline void sbi_platform_timer_exit(const struct sbi_platform *plat)
>  }
>
>  /**
> - * Check if a vendor extension is implemented or not.
> + * Check if SBI vendor extension is implemented or not.
>   *
>   * @param plat pointer to struct sbi_platform
> - * @param extid        vendor SBI extension id
>   *
> - * @return 0 if extid is not implemented and 1 if implemented
> + * @return false if not implemented and true if implemented
>   */
> -static inline int sbi_platform_vendor_ext_check(const struct sbi_platform *plat,
> -                                               long extid)
> +static inline bool sbi_platform_vendor_ext_check(
> +                                       const struct sbi_platform *plat)
>  {
>         if (plat && sbi_platform_ops(plat)->vendor_ext_check)
> -               return sbi_platform_ops(plat)->vendor_ext_check(extid);
> +               return sbi_platform_ops(plat)->vendor_ext_check();
>
> -       return 0;
> +       return false;
>  }
>
>  /**
> diff --git a/lib/sbi/sbi_ecall_vendor.c b/lib/sbi/sbi_ecall_vendor.c
> index 9252829..9ea5156 100644
> --- a/lib/sbi/sbi_ecall_vendor.c
> +++ b/lib/sbi/sbi_ecall_vendor.c
> @@ -13,12 +13,23 @@
>  #include <sbi/sbi_error.h>
>  #include <sbi/sbi_platform.h>
>  #include <sbi/sbi_trap.h>
> +#include <sbi/riscv_asm.h>
> +
> +static inline unsigned long sbi_ecall_vendor_id(void)
> +{
> +       return SBI_EXT_VENDOR_START +
> +               (csr_read(CSR_MVENDORID) &
> +                (SBI_EXT_VENDOR_END - SBI_EXT_VENDOR_START));
> +}
>
>  static int sbi_ecall_vendor_probe(unsigned long extid,
>                                   unsigned long *out_val)
>  {
> -       *out_val = sbi_platform_vendor_ext_check(sbi_platform_thishart_ptr(),
> -                                                extid);
> +       if (!sbi_platform_vendor_ext_check(sbi_platform_thishart_ptr()) ||
> +           extid != sbi_ecall_vendor_id())
> +               *out_val = 0;
> +       else
> +               *out_val = 1;
>         return 0;
>  }
>
> @@ -27,6 +38,10 @@ static int sbi_ecall_vendor_handler(unsigned long extid, unsigned long funcid,
>                                     unsigned long *out_val,
>                                     struct sbi_trap_info *out_trap)
>  {
> +       if (!sbi_platform_vendor_ext_check(sbi_platform_thishart_ptr()) ||
> +           extid != sbi_ecall_vendor_id())
> +               return SBI_ERR_NOT_SUPPORTED;
> +
>         return sbi_platform_vendor_ext_provider(sbi_platform_thishart_ptr(),
>                                                 extid, funcid, regs,
>                                                 out_val, out_trap);
> diff --git a/platform/generic/include/platform_override.h b/platform/generic/include/platform_override.h
> index a59b06a..350c381 100644
> --- a/platform/generic/include/platform_override.h
> +++ b/platform/generic/include/platform_override.h
> @@ -27,7 +27,6 @@ struct platform_override {
>         int (*extensions_init)(const struct fdt_match *match,
>                                struct sbi_hart_features *hfeatures);
>         void (*fw_init)(void *fdt, const struct fdt_match *match);
> -       int (*vendor_ext_check)(long extid, const struct fdt_match *match);
>         int (*vendor_ext_provider)(long extid, long funcid,
>                                    const struct sbi_trap_regs *regs,
>                                    unsigned long *out_value,
> diff --git a/platform/generic/platform.c b/platform/generic/platform.c
> index a34d3b0..88c3ec7 100644
> --- a/platform/generic/platform.c
> +++ b/platform/generic/platform.c
> @@ -180,13 +180,10 @@ static int generic_final_init(bool cold_boot)
>         return 0;
>  }
>
> -static int generic_vendor_ext_check(long extid)
> +static bool generic_vendor_ext_check(void)
>  {
> -       if (generic_plat && generic_plat->vendor_ext_check)
> -               return generic_plat->vendor_ext_check(extid,
> -                                                     generic_plat_match);
> -
> -       return 0;
> +       return (generic_plat && generic_plat->vendor_ext_provider) ?
> +               true : false;
>  }
>
>  static int generic_vendor_ext_provider(long extid, long funcid,
> @@ -194,13 +191,9 @@ static int generic_vendor_ext_provider(long extid, long funcid,
>                                        unsigned long *out_value,
>                                        struct sbi_trap_info *out_trap)
>  {
> -       if (generic_plat && generic_plat->vendor_ext_provider) {
> -               return generic_plat->vendor_ext_provider(extid, funcid, regs,
> -                                                        out_value, out_trap,
> -                                                        generic_plat_match);
> -       }
> -
> -       return SBI_ENOTSUPP;
> +       return generic_plat->vendor_ext_provider(extid, funcid, regs,
> +                                                out_value, out_trap,
> +                                                generic_plat_match);
>  }
>
>  static void generic_early_exit(void)
> --
> 2.34.1
>



More information about the opensbi mailing list