summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnup Patel <apatel@ventanamicro.com>2022-04-29 16:08:05 +0300
committerAnup Patel <anup@brainfault.org>2022-05-07 07:47:22 +0300
commitbe4903ae0019947853ebf331d5b752ea178fd697 (patch)
tree4090b3e300df752d81fd60cc73eaabddc7da9177
parentcad6c91045331009f38d13f63956a119b0b053c8 (diff)
downloadopensbi-be4903ae0019947853ebf331d5b752ea178fd697.tar.xz
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 <apatel@ventanamicro.com> Reviewed-by: Atish Patra <atishp@rivosinc.com>
-rw-r--r--lib/sbi/sbi_hart.c14
1 files 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;
}