diff options
| author | Raj Vishwanathan <[email protected]> | 2025-04-23 15:50:45 -0700 |
|---|---|---|
| committer | Anup Patel <[email protected]> | 2025-04-24 09:23:47 +0530 |
| commit | 99aabc6b8431a2bcf2b28a2423952e529de9fbc5 (patch) | |
| tree | 98113aa1ca54567d010931e7f9f3799ca208e435 /lib/utils | |
| parent | 4d0128ec58e109faed3f6357f982a0079361075a (diff) | |
lib: sbi: Set the scratch allocation to alignment to cacheline size
Set the scratch allocation alignment to cacheline size specified by
riscv,cbom-block-size in the DTS file to avoid two atomic variables
from the same cache line causing livelock on some platforms. If the
cacheline is not specified, we set it a default value.
Signed-off-by: Raj Vishwanathan <[email protected]>
Reviewed-by: Anup Patel <[email protected]>
Reviewed-by: Samuel Holland <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Anup Patel <[email protected]>
Diffstat (limited to 'lib/utils')
| -rw-r--r-- | lib/utils/fdt/fdt_helper.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/utils/fdt/fdt_helper.c b/lib/utils/fdt/fdt_helper.c index 79e59dd5..b2d91fdf 100644 --- a/lib/utils/fdt/fdt_helper.c +++ b/lib/utils/fdt/fdt_helper.c @@ -246,6 +246,30 @@ int fdt_parse_hart_id(const void *fdt, int cpu_offset, u32 *hartid) return 0; } +int fdt_parse_cbom_block_size(const void *fdt, int cpu_offset, unsigned long *cbom_block_size) +{ + int len; + const void *prop; + const fdt32_t *val; + + if (!fdt || cpu_offset < 0) + return SBI_EINVAL; + + prop = fdt_getprop(fdt, cpu_offset, "device_type", &len); + if (!prop || !len) + return SBI_EINVAL; + if (strncmp (prop, "cpu", strlen ("cpu"))) + return SBI_EINVAL; + + val = fdt_getprop(fdt, cpu_offset, "riscv,cbom-block-size", &len); + if (!val || len < sizeof(fdt32_t)) + return SBI_EINVAL; + + if (cbom_block_size) + *cbom_block_size = fdt32_to_cpu(*val); + return 0; +} + int fdt_parse_max_enabled_hart_id(const void *fdt, u32 *max_hartid) { u32 hartid; |
