archrandom.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Kernel interface for the s390 arch_random_* functions
  3. *
  4. * Copyright IBM Corp. 2017
  5. *
  6. * Author: Harald Freudenberger <freude@de.ibm.com>
  7. *
  8. */
  9. #ifndef _ASM_S390_ARCHRANDOM_H
  10. #define _ASM_S390_ARCHRANDOM_H
  11. #ifdef CONFIG_ARCH_RANDOM
  12. #include <linux/static_key.h>
  13. #include <linux/atomic.h>
  14. #include <asm/cpacf.h>
  15. DECLARE_STATIC_KEY_FALSE(s390_arch_random_available);
  16. extern atomic64_t s390_arch_random_counter;
  17. static void s390_arch_random_generate(u8 *buf, unsigned int nbytes)
  18. {
  19. cpacf_trng(NULL, 0, buf, nbytes);
  20. atomic64_add(nbytes, &s390_arch_random_counter);
  21. }
  22. static inline bool arch_has_random(void)
  23. {
  24. if (static_branch_likely(&s390_arch_random_available))
  25. return true;
  26. return false;
  27. }
  28. static inline bool arch_has_random_seed(void)
  29. {
  30. return arch_has_random();
  31. }
  32. static inline bool arch_get_random_long(unsigned long *v)
  33. {
  34. if (static_branch_likely(&s390_arch_random_available)) {
  35. s390_arch_random_generate((u8 *)v, sizeof(*v));
  36. return true;
  37. }
  38. return false;
  39. }
  40. static inline bool arch_get_random_int(unsigned int *v)
  41. {
  42. if (static_branch_likely(&s390_arch_random_available)) {
  43. s390_arch_random_generate((u8 *)v, sizeof(*v));
  44. return true;
  45. }
  46. return false;
  47. }
  48. static inline bool arch_get_random_seed_long(unsigned long *v)
  49. {
  50. return arch_get_random_long(v);
  51. }
  52. static inline bool arch_get_random_seed_int(unsigned int *v)
  53. {
  54. return arch_get_random_int(v);
  55. }
  56. #endif /* CONFIG_ARCH_RANDOM */
  57. #endif /* _ASM_S390_ARCHRANDOM_H */