mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-18 14:25:25 +00:00
RISC-V Fixes for 6.3-rc5
* A fix for FPU probing in XIP kernels. * Always enable the alternative framework for non-XIP kernels. -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEKzw3R0RoQ7JKlDp6LhMZ81+7GIkFAmQm9ToTHHBhbG1lckBk YWJiZWx0LmNvbQAKCRAuExnzX7sYib30D/0ccbYz0wflpuRaH1Rx011HaI+PeqA0 b/yG9Wq0xCS/iIAFgH97sMj8DQMsUb6Gut64kiG0rn7S29jg/t7UMTPHsXWLdhzk +deyPYQdmOLl30OIVxCLFRCQGUxv8fS0UAAbS0AbrXqiqym/7NEigPXS1ny46hxJ vB1xJxDc3Z78dlANdyuD9jnTrdagtPlQgsdeKqtGkx/EehrgQiR3ap9emjjCaVQp jFcRlcDP0G0LSeJusDA58ufZggpjrB77yVeREBD0kZ8ukeGcMtCXsRje1qTH1vkc ngYzgr0IVasugZK48ErnPirgjy2dOycEprWH7qixR2Kly0E5xxY3gCO1xEj2skbL kA36S6zMvPUv8h9f2313zDv7oZKr+iSnhKB2OWSzctIYQeoHBKNyzeqi0Hb44Sa9 BtwO6yxQ3KOlX+LUjT8Us2ZoRF+lPIADHvORHJPr5LsJeLR83PoGJc5PZmi++6qA CHn0ap1Ob6N9jwH5quBr6O3TQjM78i1r/U4Vh7FR7xXAN/peNJ6MFsXnmJo91adn Q+lzR4gcsxjrWHAcS0d7cAoNdwE6oPhEdgcMrADy8d3g2MJw+oX2e2333fw7CLeh ZXM/Tq+0CW0QPY4XI/LWvb2aeuUUdGJFiLrASAHCxO+gK0sIhLqjqLk7DJ3+Tz9g Z79aVHpliwj11A== =rwtl -----END PGP SIGNATURE----- Merge tag 'riscv-for-linus-6.3-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux Pull RISC-V fixes from Palmer Dabbelt: - A fix for FPU probing in XIP kernels - Always enable the alternative framework for non-XIP kernels * tag 'riscv-for-linus-6.3-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux: RISC-V: always select RISCV_ALTERNATIVE for non-xip kernels RISC-V: add non-alternative fallback for riscv_has_extension_[un]likely()
This commit is contained in:
commit
39f692125c
@ -126,6 +126,7 @@ config RISCV
|
|||||||
select OF_IRQ
|
select OF_IRQ
|
||||||
select PCI_DOMAINS_GENERIC if PCI
|
select PCI_DOMAINS_GENERIC if PCI
|
||||||
select PCI_MSI if PCI
|
select PCI_MSI if PCI
|
||||||
|
select RISCV_ALTERNATIVE if !XIP_KERNEL
|
||||||
select RISCV_INTC
|
select RISCV_INTC
|
||||||
select RISCV_TIMER if RISCV_SBI
|
select RISCV_TIMER if RISCV_SBI
|
||||||
select SIFIVE_PLIC
|
select SIFIVE_PLIC
|
||||||
@ -401,9 +402,8 @@ config RISCV_ISA_C
|
|||||||
config RISCV_ISA_SVPBMT
|
config RISCV_ISA_SVPBMT
|
||||||
bool "SVPBMT extension support"
|
bool "SVPBMT extension support"
|
||||||
depends on 64BIT && MMU
|
depends on 64BIT && MMU
|
||||||
depends on !XIP_KERNEL
|
depends on RISCV_ALTERNATIVE
|
||||||
default y
|
default y
|
||||||
select RISCV_ALTERNATIVE
|
|
||||||
help
|
help
|
||||||
Adds support to dynamically detect the presence of the SVPBMT
|
Adds support to dynamically detect the presence of the SVPBMT
|
||||||
ISA-extension (Supervisor-mode: page-based memory types) and
|
ISA-extension (Supervisor-mode: page-based memory types) and
|
||||||
@ -428,8 +428,8 @@ config TOOLCHAIN_HAS_ZBB
|
|||||||
config RISCV_ISA_ZBB
|
config RISCV_ISA_ZBB
|
||||||
bool "Zbb extension support for bit manipulation instructions"
|
bool "Zbb extension support for bit manipulation instructions"
|
||||||
depends on TOOLCHAIN_HAS_ZBB
|
depends on TOOLCHAIN_HAS_ZBB
|
||||||
depends on !XIP_KERNEL && MMU
|
depends on MMU
|
||||||
select RISCV_ALTERNATIVE
|
depends on RISCV_ALTERNATIVE
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
Adds support to dynamically detect the presence of the ZBB
|
Adds support to dynamically detect the presence of the ZBB
|
||||||
@ -443,9 +443,9 @@ config RISCV_ISA_ZBB
|
|||||||
|
|
||||||
config RISCV_ISA_ZICBOM
|
config RISCV_ISA_ZICBOM
|
||||||
bool "Zicbom extension support for non-coherent DMA operation"
|
bool "Zicbom extension support for non-coherent DMA operation"
|
||||||
depends on !XIP_KERNEL && MMU
|
depends on MMU
|
||||||
|
depends on RISCV_ALTERNATIVE
|
||||||
default y
|
default y
|
||||||
select RISCV_ALTERNATIVE
|
|
||||||
select RISCV_DMA_NONCOHERENT
|
select RISCV_DMA_NONCOHERENT
|
||||||
help
|
help
|
||||||
Adds support to dynamically detect the presence of the ZICBOM
|
Adds support to dynamically detect the presence of the ZICBOM
|
||||||
|
@ -2,8 +2,7 @@ menu "CPU errata selection"
|
|||||||
|
|
||||||
config ERRATA_SIFIVE
|
config ERRATA_SIFIVE
|
||||||
bool "SiFive errata"
|
bool "SiFive errata"
|
||||||
depends on !XIP_KERNEL
|
depends on RISCV_ALTERNATIVE
|
||||||
select RISCV_ALTERNATIVE
|
|
||||||
help
|
help
|
||||||
All SiFive errata Kconfig depend on this Kconfig. Disabling
|
All SiFive errata Kconfig depend on this Kconfig. Disabling
|
||||||
this Kconfig will disable all SiFive errata. Please say "Y"
|
this Kconfig will disable all SiFive errata. Please say "Y"
|
||||||
@ -35,8 +34,7 @@ config ERRATA_SIFIVE_CIP_1200
|
|||||||
|
|
||||||
config ERRATA_THEAD
|
config ERRATA_THEAD
|
||||||
bool "T-HEAD errata"
|
bool "T-HEAD errata"
|
||||||
depends on !XIP_KERNEL
|
depends on RISCV_ALTERNATIVE
|
||||||
select RISCV_ALTERNATIVE
|
|
||||||
help
|
help
|
||||||
All T-HEAD errata Kconfig depend on this Kconfig. Disabling
|
All T-HEAD errata Kconfig depend on this Kconfig. Disabling
|
||||||
this Kconfig will disable all T-HEAD errata. Please say "Y"
|
this Kconfig will disable all T-HEAD errata. Please say "Y"
|
||||||
|
@ -57,18 +57,31 @@ struct riscv_isa_ext_data {
|
|||||||
unsigned int isa_ext_id;
|
unsigned int isa_ext_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
unsigned long riscv_isa_extension_base(const unsigned long *isa_bitmap);
|
||||||
|
|
||||||
|
#define riscv_isa_extension_mask(ext) BIT_MASK(RISCV_ISA_EXT_##ext)
|
||||||
|
|
||||||
|
bool __riscv_isa_extension_available(const unsigned long *isa_bitmap, int bit);
|
||||||
|
#define riscv_isa_extension_available(isa_bitmap, ext) \
|
||||||
|
__riscv_isa_extension_available(isa_bitmap, RISCV_ISA_EXT_##ext)
|
||||||
|
|
||||||
static __always_inline bool
|
static __always_inline bool
|
||||||
riscv_has_extension_likely(const unsigned long ext)
|
riscv_has_extension_likely(const unsigned long ext)
|
||||||
{
|
{
|
||||||
compiletime_assert(ext < RISCV_ISA_EXT_MAX,
|
compiletime_assert(ext < RISCV_ISA_EXT_MAX,
|
||||||
"ext must be < RISCV_ISA_EXT_MAX");
|
"ext must be < RISCV_ISA_EXT_MAX");
|
||||||
|
|
||||||
asm_volatile_goto(
|
if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE)) {
|
||||||
ALTERNATIVE("j %l[l_no]", "nop", 0, %[ext], 1)
|
asm_volatile_goto(
|
||||||
:
|
ALTERNATIVE("j %l[l_no]", "nop", 0, %[ext], 1)
|
||||||
: [ext] "i" (ext)
|
:
|
||||||
:
|
: [ext] "i" (ext)
|
||||||
: l_no);
|
:
|
||||||
|
: l_no);
|
||||||
|
} else {
|
||||||
|
if (!__riscv_isa_extension_available(NULL, ext))
|
||||||
|
goto l_no;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
l_no:
|
l_no:
|
||||||
@ -81,26 +94,23 @@ riscv_has_extension_unlikely(const unsigned long ext)
|
|||||||
compiletime_assert(ext < RISCV_ISA_EXT_MAX,
|
compiletime_assert(ext < RISCV_ISA_EXT_MAX,
|
||||||
"ext must be < RISCV_ISA_EXT_MAX");
|
"ext must be < RISCV_ISA_EXT_MAX");
|
||||||
|
|
||||||
asm_volatile_goto(
|
if (IS_ENABLED(CONFIG_RISCV_ALTERNATIVE)) {
|
||||||
ALTERNATIVE("nop", "j %l[l_yes]", 0, %[ext], 1)
|
asm_volatile_goto(
|
||||||
:
|
ALTERNATIVE("nop", "j %l[l_yes]", 0, %[ext], 1)
|
||||||
: [ext] "i" (ext)
|
:
|
||||||
:
|
: [ext] "i" (ext)
|
||||||
: l_yes);
|
:
|
||||||
|
: l_yes);
|
||||||
|
} else {
|
||||||
|
if (__riscv_isa_extension_available(NULL, ext))
|
||||||
|
goto l_yes;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
l_yes:
|
l_yes:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long riscv_isa_extension_base(const unsigned long *isa_bitmap);
|
|
||||||
|
|
||||||
#define riscv_isa_extension_mask(ext) BIT_MASK(RISCV_ISA_EXT_##ext)
|
|
||||||
|
|
||||||
bool __riscv_isa_extension_available(const unsigned long *isa_bitmap, int bit);
|
|
||||||
#define riscv_isa_extension_available(isa_bitmap, ext) \
|
|
||||||
__riscv_isa_extension_available(isa_bitmap, RISCV_ISA_EXT_##ext)
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _ASM_RISCV_HWCAP_H */
|
#endif /* _ASM_RISCV_HWCAP_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user