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>
This commit is contained in:
Anup Patel 2022-04-29 18:38:05 +05:30 committed by Anup Patel
parent cad6c91045
commit be4903ae00
1 changed files with 11 additions and 3 deletions

View File

@ -28,6 +28,7 @@ extern void __sbi_expected_trap_hext(void);
void (*sbi_hart_expected_trap)(void) = &__sbi_expected_trap; void (*sbi_hart_expected_trap)(void) = &__sbi_expected_trap;
struct hart_features { struct hart_features {
bool detected;
int priv_version; int priv_version;
unsigned long extensions; unsigned long extensions;
unsigned int pmp_count; 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) static void hart_detect_features(struct sbi_scratch *scratch)
{ {
struct sbi_trap_info trap = {0}; 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; unsigned long val, oldval;
/* Reset hart features */ /* If hart features already detected then do nothing */
hfeatures = sbi_scratch_offset_ptr(scratch, hart_features_offset); if (hfeatures->detected)
return;
/* Clear hart features */
hfeatures->extensions = 0; hfeatures->extensions = 0;
hfeatures->pmp_count = 0; hfeatures->pmp_count = 0;
hfeatures->mhpm_count = 0; hfeatures->mhpm_count = 0;
@ -642,6 +647,9 @@ __mhpm_skip:
hfeatures->extensions |= BIT(SBI_HART_EXT_SMSTATEEN); hfeatures->extensions |= BIT(SBI_HART_EXT_SMSTATEEN);
} }
/* Mark hart feature detection done */
hfeatures->detected = true;
return; return;
} }