Message ID | 20221024091309.406906-2-ajones@ventanamicro.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Palmer Dabbelt |
Headers | show |
Series | RISC-V: Ensure Zicbom has a valid block size | expand |
Am Montag, 24. Oktober 2022, 11:13:07 CEST schrieb Andrew Jones: > Improve isa2hwcap[] by removing it from static storage, as > riscv_fill_hwcap() is only called once, and by reducing its size > from 256 bytes to 26. The latter improvement is possible because > isa2hwcap[] will never be indexed with capital letters and we can > precompute the offsets from 'a'. > > No functional change intended. > > Signed-off-by: Andrew Jones <ajones@ventanamicro.com> > Reviewed-by: Conor Dooley <conor.dooley@microchip.com> Reviewed-by: Heiko Stuebner <heiko@sntech.de> > --- > arch/riscv/kernel/cpufeature.c | 20 +++++++++++--------- > 1 file changed, 11 insertions(+), 9 deletions(-) > > diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c > index 694267d1fe81..4677320d7e31 100644 > --- a/arch/riscv/kernel/cpufeature.c > +++ b/arch/riscv/kernel/cpufeature.c > @@ -74,15 +74,15 @@ void __init riscv_fill_hwcap(void) > const char *isa; > char print_str[NUM_ALPHA_EXTS + 1]; > int i, j, rc; > - static unsigned long isa2hwcap[256] = {0}; > + unsigned long isa2hwcap[26] = {0}; > unsigned long hartid; > > - isa2hwcap['i'] = isa2hwcap['I'] = COMPAT_HWCAP_ISA_I; > - isa2hwcap['m'] = isa2hwcap['M'] = COMPAT_HWCAP_ISA_M; > - isa2hwcap['a'] = isa2hwcap['A'] = COMPAT_HWCAP_ISA_A; > - isa2hwcap['f'] = isa2hwcap['F'] = COMPAT_HWCAP_ISA_F; > - isa2hwcap['d'] = isa2hwcap['D'] = COMPAT_HWCAP_ISA_D; > - isa2hwcap['c'] = isa2hwcap['C'] = COMPAT_HWCAP_ISA_C; > + isa2hwcap['i' - 'a'] = COMPAT_HWCAP_ISA_I; > + isa2hwcap['m' - 'a'] = COMPAT_HWCAP_ISA_M; > + isa2hwcap['a' - 'a'] = COMPAT_HWCAP_ISA_A; > + isa2hwcap['f' - 'a'] = COMPAT_HWCAP_ISA_F; > + isa2hwcap['d' - 'a'] = COMPAT_HWCAP_ISA_D; > + isa2hwcap['c' - 'a'] = COMPAT_HWCAP_ISA_C; > > elf_hwcap = 0; > > @@ -196,8 +196,10 @@ void __init riscv_fill_hwcap(void) > if (unlikely(ext_err)) > continue; > if (!ext_long) { > - this_hwcap |= isa2hwcap[(unsigned char)(*ext)]; > - set_bit(*ext - 'a', this_isa); > + int nr = *ext - 'a'; > + > + this_hwcap |= isa2hwcap[nr]; > + set_bit(nr, this_isa); > } else { > SET_ISA_EXT_MAP("sscofpmf", RISCV_ISA_EXT_SSCOFPMF); > SET_ISA_EXT_MAP("svpbmt", RISCV_ISA_EXT_SVPBMT); >
diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c index 694267d1fe81..4677320d7e31 100644 --- a/arch/riscv/kernel/cpufeature.c +++ b/arch/riscv/kernel/cpufeature.c @@ -74,15 +74,15 @@ void __init riscv_fill_hwcap(void) const char *isa; char print_str[NUM_ALPHA_EXTS + 1]; int i, j, rc; - static unsigned long isa2hwcap[256] = {0}; + unsigned long isa2hwcap[26] = {0}; unsigned long hartid; - isa2hwcap['i'] = isa2hwcap['I'] = COMPAT_HWCAP_ISA_I; - isa2hwcap['m'] = isa2hwcap['M'] = COMPAT_HWCAP_ISA_M; - isa2hwcap['a'] = isa2hwcap['A'] = COMPAT_HWCAP_ISA_A; - isa2hwcap['f'] = isa2hwcap['F'] = COMPAT_HWCAP_ISA_F; - isa2hwcap['d'] = isa2hwcap['D'] = COMPAT_HWCAP_ISA_D; - isa2hwcap['c'] = isa2hwcap['C'] = COMPAT_HWCAP_ISA_C; + isa2hwcap['i' - 'a'] = COMPAT_HWCAP_ISA_I; + isa2hwcap['m' - 'a'] = COMPAT_HWCAP_ISA_M; + isa2hwcap['a' - 'a'] = COMPAT_HWCAP_ISA_A; + isa2hwcap['f' - 'a'] = COMPAT_HWCAP_ISA_F; + isa2hwcap['d' - 'a'] = COMPAT_HWCAP_ISA_D; + isa2hwcap['c' - 'a'] = COMPAT_HWCAP_ISA_C; elf_hwcap = 0; @@ -196,8 +196,10 @@ void __init riscv_fill_hwcap(void) if (unlikely(ext_err)) continue; if (!ext_long) { - this_hwcap |= isa2hwcap[(unsigned char)(*ext)]; - set_bit(*ext - 'a', this_isa); + int nr = *ext - 'a'; + + this_hwcap |= isa2hwcap[nr]; + set_bit(nr, this_isa); } else { SET_ISA_EXT_MAP("sscofpmf", RISCV_ISA_EXT_SSCOFPMF); SET_ISA_EXT_MAP("svpbmt", RISCV_ISA_EXT_SVPBMT);