RISC-V: Ensure Zicbom has a valid block size
authorAndrew Jones <ajones@ventanamicro.com>
Tue, 29 Nov 2022 14:34:47 +0000 (15:34 +0100)
committerPalmer Dabbelt <palmer@rivosinc.com>
Sat, 10 Dec 2022 03:12:52 +0000 (19:12 -0800)
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 <ajones@ventanamicro.com>
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Link: https://lore.kernel.org/r/20221129143447.49714-4-ajones@ventanamicro.com
[Palmer: base on 5c20a3a9df19 ("RISC-V: Fix compilation without RISCV_ISA_ZICBOM"]
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/kernel/cpufeature.c

index 220be7222129b43032d994d7bc83b91ffd8f73df..93e45560af307c21533946fe1e2b328a947d46f3 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/bitmap.h>
 #include <linux/ctype.h>
 #include <linux/libfdt.h>
+#include <linux/log2.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <asm/alternative.h>
@@ -70,6 +71,18 @@ EXPORT_SYMBOL_GPL(__riscv_isa_extension_available);
 
 static bool riscv_isa_extension_check(int id)
 {
+       switch (id) {
+       case RISCV_ISA_EXT_ZICBOM:
+               if (!riscv_cbom_block_size) {
+                       pr_err("Zicbom detected in ISA string, but no cbom-block-size found\n");
+                       return false;
+               } else if (!is_power_of_2(riscv_cbom_block_size)) {
+                       pr_err("cbom-block-size present, but is not a power-of-2\n");
+                       return false;
+               }
+               return true;
+       }
+
        return true;
 }