Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * This file is part of the Linux kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (c) 2011-2014, Intel Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Authors: Fenghua Yu <fenghua.yu@intel.com>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *          H. Peter Anvin <hpa@linux.intel.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #ifndef ASM_X86_ARCHRANDOM_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #define ASM_X86_ARCHRANDOM_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <asm/processor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <asm/cpufeature.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #define RDRAND_RETRY_LOOPS	10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) /* Unconditional execution of RDRAND and RDSEED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) static inline bool __must_check rdrand_long(unsigned long *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	bool ok;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 	unsigned int retry = RDRAND_RETRY_LOOPS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 		asm volatile("rdrand %[out]"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 			     CC_SET(c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 			     : CC_OUT(c) (ok), [out] "=r" (*v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 		if (ok)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	} while (--retry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) static inline bool __must_check rdrand_int(unsigned int *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	bool ok;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	unsigned int retry = RDRAND_RETRY_LOOPS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 		asm volatile("rdrand %[out]"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 			     CC_SET(c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 			     : CC_OUT(c) (ok), [out] "=r" (*v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 		if (ok)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 			return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	} while (--retry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) static inline bool __must_check rdseed_long(unsigned long *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	bool ok;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	asm volatile("rdseed %[out]"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 		     CC_SET(c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 		     : CC_OUT(c) (ok), [out] "=r" (*v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	return ok;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) static inline bool __must_check rdseed_int(unsigned int *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	bool ok;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	asm volatile("rdseed %[out]"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 		     CC_SET(c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 		     : CC_OUT(c) (ok), [out] "=r" (*v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	return ok;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67)  * These are the generic interfaces; they must not be declared if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68)  * stubs in <linux/random.h> are to be invoked,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69)  * i.e. CONFIG_ARCH_RANDOM is not defined.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) #ifdef CONFIG_ARCH_RANDOM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) static inline bool __must_check arch_get_random_long(unsigned long *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	return static_cpu_has(X86_FEATURE_RDRAND) ? rdrand_long(v) : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) static inline bool __must_check arch_get_random_int(unsigned int *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	return static_cpu_has(X86_FEATURE_RDRAND) ? rdrand_int(v) : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) static inline bool __must_check arch_get_random_seed_long(unsigned long *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	return static_cpu_has(X86_FEATURE_RDSEED) ? rdseed_long(v) : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) static inline bool __must_check arch_get_random_seed_int(unsigned int *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	return static_cpu_has(X86_FEATURE_RDSEED) ? rdseed_int(v) : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) extern void x86_init_rdrand(struct cpuinfo_x86 *c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) #else  /* !CONFIG_ARCH_RANDOM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) static inline void x86_init_rdrand(struct cpuinfo_x86 *c) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) #endif  /* !CONFIG_ARCH_RANDOM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #endif /* ASM_X86_ARCHRANDOM_H */