[PATCH 11/11] lib: sbi_platform: Add callback to populate HART extensions
Atish Patra
atishp at atishpatra.org
Tue May 3 19:05:57 PDT 2022
On Fri, Apr 29, 2022 at 8:52 AM Anup Patel <apatel at ventanamicro.com> wrote:
>
> We add platform specific extensions_init() callback which allows
> platforms to populate HART extensions for each HART. For example,
> the generic platform can populate HART extensions from HART ISA
> string described in DeviceTree.
>
> Signed-off-by: Anup Patel <apatel at ventanamicro.com>
> ---
> include/sbi/sbi_platform.h | 18 ++++++++++++++++++
> lib/sbi/sbi_hart.c | 18 ++++++++++++++----
> 2 files changed, 32 insertions(+), 4 deletions(-)
>
> diff --git a/include/sbi/sbi_platform.h b/include/sbi/sbi_platform.h
> index 2c777ac..87024db 100644
> --- a/include/sbi/sbi_platform.h
> +++ b/include/sbi/sbi_platform.h
> @@ -89,6 +89,9 @@ struct sbi_platform_operations {
> */
> int (*misa_get_xlen)(void);
>
> + /** Initialize (or populate) HART extensions for the platform */
> + int (*extensions_init)(void);
> +
> /** Initialize (or populate) domains for the platform */
> int (*domains_init)(void);
>
> @@ -453,6 +456,21 @@ static inline int sbi_platform_misa_xlen(const struct sbi_platform *plat)
> return -1;
> }
>
> +/**
> + * Initialize (or populate) HART extensions for the platform
> + *
> + * @param plat pointer to struct sbi_platform
> + *
> + * @return 0 on success and negative error code on failure
> + */
> +static inline int sbi_platform_extensions_init(
> + const struct sbi_platform *plat)
> +{
> + if (plat && sbi_platform_ops(plat)->extensions_init)
> + return sbi_platform_ops(plat)->extensions_init();
> + return 0;
> +}
> +
> /**
> * Initialize (or populate) domains for the platform
> *
> diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c
> index 3fc8899..8284792 100644
> --- a/lib/sbi/sbi_hart.c
> +++ b/lib/sbi/sbi_hart.c
> @@ -536,16 +536,17 @@ static int hart_pmu_get_allowed_bits(void)
> return num_bits;
> }
>
> -static void hart_detect_features(struct sbi_scratch *scratch)
> +static int hart_detect_features(struct sbi_scratch *scratch)
> {
> struct sbi_trap_info trap = {0};
> struct hart_features *hfeatures =
> sbi_scratch_offset_ptr(scratch, hart_features_offset);
> unsigned long val, oldval;
> + int rc;
>
> /* If hart features already detected then do nothing */
> if (hfeatures->detected)
> - return;
> + return 0;
>
> /* Clear hart features */
> hfeatures->extensions = 0;
> @@ -680,10 +681,15 @@ __mhpm_skip:
> SBI_HART_EXT_SMSTATEEN, true);
> }
>
> + /* Let platform populate extensions */
> + rc = sbi_platform_extensions_init(sbi_platform_thishart_ptr());
> + if (rc)
> + return rc;
> +
> /* Mark hart feature detection done */
> hfeatures->detected = true;
>
> - return;
> + return 0;
> }
>
> int sbi_hart_reinit(struct sbi_scratch *scratch)
> @@ -705,6 +711,8 @@ int sbi_hart_reinit(struct sbi_scratch *scratch)
>
> int sbi_hart_init(struct sbi_scratch *scratch, bool cold_boot)
> {
> + int rc;
> +
> if (cold_boot) {
> if (misa_extension('H'))
> sbi_hart_expected_trap = &__sbi_expected_trap_hext;
> @@ -715,7 +723,9 @@ int sbi_hart_init(struct sbi_scratch *scratch, bool cold_boot)
> return SBI_ENOMEM;
> }
>
> - hart_detect_features(scratch);
> + rc = hart_detect_features(scratch);
> + if (rc)
> + return rc;
>
> return sbi_hart_reinit(scratch);
> }
> --
> 2.34.1
>
Reviewed-by: Atish Patra <atishp at rivosinc.com>
--
Regards,
Atish
More information about the opensbi
mailing list