Skip to content

Commit 9daaca4

Browse files
jones-drewpalmer-dabbelt
authored andcommitted
RISC-V: Ensure Zicbom has a valid block size
When a DT puts zicbom in the isa string, but does not provide a block size, ALT_CMO_OP() will attempt to do cache operations on address zero since the start address will be ANDed with zero. We can't simply BUG() in riscv_init_cbom_blocksize() when we fail to find a block size because the failure will happen before logging works, leaving users to scratch their heads as to why the boot hung. Instead, ensure Zicbom is disabled and output an error which will hopefully alert people that the DT needs to be fixed. While at it, add a check that the block size is a power-of-2 too. Signed-off-by: Andrew Jones <[email protected]> Reviewed-by: Conor Dooley <[email protected]> Reviewed-by: Heiko Stuebner <[email protected]> Link: https://lore.kernel.org/r/[email protected] [Palmer: base on 5c20a3a ("RISC-V: Fix compilation without RISCV_ISA_ZICBOM"] Reported-by: kernel test robot <[email protected]> Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent fb0ff0a commit 9daaca4

File tree

1 file changed

+13
-0
lines changed

1 file changed

+13
-0
lines changed

arch/riscv/kernel/cpufeature.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <linux/bitmap.h>
1010
#include <linux/ctype.h>
1111
#include <linux/libfdt.h>
12+
#include <linux/log2.h>
1213
#include <linux/module.h>
1314
#include <linux/of.h>
1415
#include <asm/alternative.h>
@@ -70,6 +71,18 @@ EXPORT_SYMBOL_GPL(__riscv_isa_extension_available);
7071

7172
static bool riscv_isa_extension_check(int id)
7273
{
74+
switch (id) {
75+
case RISCV_ISA_EXT_ZICBOM:
76+
if (!riscv_cbom_block_size) {
77+
pr_err("Zicbom detected in ISA string, but no cbom-block-size found\n");
78+
return false;
79+
} else if (!is_power_of_2(riscv_cbom_block_size)) {
80+
pr_err("cbom-block-size present, but is not a power-of-2\n");
81+
return false;
82+
}
83+
return true;
84+
}
85+
7386
return true;
7487
}
7588

0 commit comments

Comments
 (0)