xref: /openbmc/linux/arch/s390/include/asm/archrandom.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
24c637cd8SHarald Freudenberger /*
34c637cd8SHarald Freudenberger  * Kernel interface for the s390 arch_random_* functions
44c637cd8SHarald Freudenberger  *
5918e75f7SHarald Freudenberger  * Copyright IBM Corp. 2017, 2022
64c637cd8SHarald Freudenberger  *
74c637cd8SHarald Freudenberger  * Author: Harald Freudenberger <freude@de.ibm.com>
84c637cd8SHarald Freudenberger  *
94c637cd8SHarald Freudenberger  */
104c637cd8SHarald Freudenberger 
114c637cd8SHarald Freudenberger #ifndef _ASM_S390_ARCHRANDOM_H
124c637cd8SHarald Freudenberger #define _ASM_S390_ARCHRANDOM_H
134c637cd8SHarald Freudenberger 
144c637cd8SHarald Freudenberger #include <linux/static_key.h>
15918e75f7SHarald Freudenberger #include <linux/preempt.h>
164c637cd8SHarald Freudenberger #include <linux/atomic.h>
17e4f74400SJason A. Donenfeld #include <asm/cpacf.h>
184c637cd8SHarald Freudenberger 
194c637cd8SHarald Freudenberger DECLARE_STATIC_KEY_FALSE(s390_arch_random_available);
204c637cd8SHarald Freudenberger extern atomic64_t s390_arch_random_counter;
214c637cd8SHarald Freudenberger 
arch_get_random_longs(unsigned long * v,size_t max_longs)22*d349ab99SJason A. Donenfeld static inline size_t __must_check arch_get_random_longs(unsigned long *v, size_t max_longs)
234c637cd8SHarald Freudenberger {
24*d349ab99SJason A. Donenfeld 	return 0;
254c637cd8SHarald Freudenberger }
264c637cd8SHarald Freudenberger 
arch_get_random_seed_longs(unsigned long * v,size_t max_longs)27*d349ab99SJason A. Donenfeld static inline size_t __must_check arch_get_random_seed_longs(unsigned long *v, size_t max_longs)
28f44fa887SHarald Freudenberger {
29918e75f7SHarald Freudenberger 	if (static_branch_likely(&s390_arch_random_available) &&
30918e75f7SHarald Freudenberger 	    in_task()) {
31*d349ab99SJason A. Donenfeld 		cpacf_trng(NULL, 0, (u8 *)v, max_longs * sizeof(*v));
32*d349ab99SJason A. Donenfeld 		atomic64_add(max_longs * sizeof(*v), &s390_arch_random_counter);
33*d349ab99SJason A. Donenfeld 		return max_longs;
344c637cd8SHarald Freudenberger 	}
35*d349ab99SJason A. Donenfeld 	return 0;
364c637cd8SHarald Freudenberger }
374c637cd8SHarald Freudenberger 
384c637cd8SHarald Freudenberger #endif /* _ASM_S390_ARCHRANDOM_H */
39