From be4903ae0019947853ebf331d5b752ea178fd697 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Fri, 29 Apr 2022 18:38:05 +0530 Subject: [PATCH] lib: sbi: Detect hart features only once for each hart Currently, the hart_detect_features() is called everytime a hart is stopped and started again which is unnecessary work. We update hart_detect_features() to detect hart features only once for each hart. Signed-off-by: Anup Patel Reviewed-by: Atish Patra --- lib/sbi/sbi_hart.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/sbi/sbi_hart.c b/lib/sbi/sbi_hart.c index cba73c1..a5ba239 100644 --- a/lib/sbi/sbi_hart.c +++ b/lib/sbi/sbi_hart.c @@ -28,6 +28,7 @@ extern void __sbi_expected_trap_hext(void); void (*sbi_hart_expected_trap)(void) = &__sbi_expected_trap; struct hart_features { + bool detected; int priv_version; unsigned long extensions; unsigned int pmp_count; @@ -510,11 +511,15 @@ static int hart_pmu_get_allowed_bits(void) static void hart_detect_features(struct sbi_scratch *scratch) { struct sbi_trap_info trap = {0}; - struct hart_features *hfeatures; + struct hart_features *hfeatures = + sbi_scratch_offset_ptr(scratch, hart_features_offset); unsigned long val, oldval; - /* Reset hart features */ - hfeatures = sbi_scratch_offset_ptr(scratch, hart_features_offset); + /* If hart features already detected then do nothing */ + if (hfeatures->detected) + return; + + /* Clear hart features */ hfeatures->extensions = 0; hfeatures->pmp_count = 0; hfeatures->mhpm_count = 0; @@ -642,6 +647,9 @@ __mhpm_skip: hfeatures->extensions |= BIT(SBI_HART_EXT_SMSTATEEN); } + /* Mark hart feature detection done */ + hfeatures->detected = true; + return; }