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;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue