1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Kernel interface for the RISCV arch_random_* functions
5 * Copyright (c) 2023 Rivos Inc.
9 #ifndef ASM_RISCV_ARCHRANDOM_H
10 #define ASM_RISCV_ARCHRANDOM_H
13 #include <asm/processor.h>
15 #define SEED_RETRY_LOOPS 100
17 static inline bool __must_check
csr_seed_long(unsigned long *v
)
19 unsigned int retry
= SEED_RETRY_LOOPS
, valid_seeds
= 0;
20 const int needed_seeds
= sizeof(long) / sizeof(u16
);
21 u16
*entropy
= (u16
*)v
;
25 * The SEED CSR must be accessed with a read-write instruction.
27 unsigned long csr_seed
= csr_swap(CSR_SEED
, 0);
28 unsigned long opst
= csr_seed
& SEED_OPST_MASK
;
32 entropy
[valid_seeds
++] = csr_seed
& SEED_ENTROPY_MASK
;
33 if (valid_seeds
== needed_seeds
)
38 pr_err_once("archrandom: Unrecoverable error\n");
52 static inline size_t __must_check
arch_get_random_longs(unsigned long *v
, size_t max_longs
)
57 static inline size_t __must_check
arch_get_random_seed_longs(unsigned long *v
, size_t max_longs
)
63 * If Zkr is supported and csr_seed_long succeeds, we return one long
66 if (riscv_has_extension_likely(RISCV_ISA_EXT_ZKR
) && csr_seed_long(v
))
72 #endif /* ASM_RISCV_ARCHRANDOM_H */