diff options
author | Anup Patel <apatel@ventanamicro.com> | 2022-04-29 16:08:05 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2022-05-07 07:47:22 +0300 |
commit | be4903ae0019947853ebf331d5b752ea178fd697 (patch) | |
tree | 4090b3e300df752d81fd60cc73eaabddc7da9177 | |
parent | cad6c91045331009f38d13f63956a119b0b053c8 (diff) | |
download | opensbi-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.c | 14 |
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; } |