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:
parent
cad6c91045
commit
be4903ae00
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue