cpu_mcf.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Counter facility support definitions for the Linux perf
  4. *
  5. * Copyright IBM Corp. 2019
  6. * Author(s): Hendrik Brueckner <[email protected]>
  7. */
  8. #ifndef _ASM_S390_CPU_MCF_H
  9. #define _ASM_S390_CPU_MCF_H
  10. #include <linux/perf_event.h>
  11. #include <asm/cpu_mf.h>
  12. enum cpumf_ctr_set {
  13. CPUMF_CTR_SET_BASIC = 0, /* Basic Counter Set */
  14. CPUMF_CTR_SET_USER = 1, /* Problem-State Counter Set */
  15. CPUMF_CTR_SET_CRYPTO = 2, /* Crypto-Activity Counter Set */
  16. CPUMF_CTR_SET_EXT = 3, /* Extended Counter Set */
  17. CPUMF_CTR_SET_MT_DIAG = 4, /* MT-diagnostic Counter Set */
  18. /* Maximum number of counter sets */
  19. CPUMF_CTR_SET_MAX,
  20. };
  21. #define CPUMF_LCCTL_ENABLE_SHIFT 16
  22. #define CPUMF_LCCTL_ACTCTL_SHIFT 0
  23. static inline void ctr_set_enable(u64 *state, u64 ctrsets)
  24. {
  25. *state |= ctrsets << CPUMF_LCCTL_ENABLE_SHIFT;
  26. }
  27. static inline void ctr_set_disable(u64 *state, u64 ctrsets)
  28. {
  29. *state &= ~(ctrsets << CPUMF_LCCTL_ENABLE_SHIFT);
  30. }
  31. static inline void ctr_set_start(u64 *state, u64 ctrsets)
  32. {
  33. *state |= ctrsets << CPUMF_LCCTL_ACTCTL_SHIFT;
  34. }
  35. static inline void ctr_set_stop(u64 *state, u64 ctrsets)
  36. {
  37. *state &= ~(ctrsets << CPUMF_LCCTL_ACTCTL_SHIFT);
  38. }
  39. static inline int ctr_stcctm(enum cpumf_ctr_set set, u64 range, u64 *dest)
  40. {
  41. switch (set) {
  42. case CPUMF_CTR_SET_BASIC:
  43. return stcctm(BASIC, range, dest);
  44. case CPUMF_CTR_SET_USER:
  45. return stcctm(PROBLEM_STATE, range, dest);
  46. case CPUMF_CTR_SET_CRYPTO:
  47. return stcctm(CRYPTO_ACTIVITY, range, dest);
  48. case CPUMF_CTR_SET_EXT:
  49. return stcctm(EXTENDED, range, dest);
  50. case CPUMF_CTR_SET_MT_DIAG:
  51. return stcctm(MT_DIAG_CLEARING, range, dest);
  52. case CPUMF_CTR_SET_MAX:
  53. return 3;
  54. }
  55. return 3;
  56. }
  57. struct cpu_cf_events {
  58. struct cpumf_ctr_info info;
  59. atomic_t ctr_set[CPUMF_CTR_SET_MAX];
  60. atomic64_t alert;
  61. u64 state; /* For perf_event_open SVC */
  62. u64 dev_state; /* For /dev/hwctr */
  63. unsigned int flags;
  64. size_t used; /* Bytes used in data */
  65. size_t usedss; /* Bytes used in start/stop */
  66. unsigned char start[PAGE_SIZE]; /* Counter set at event add */
  67. unsigned char stop[PAGE_SIZE]; /* Counter set at event delete */
  68. unsigned char data[PAGE_SIZE]; /* Counter set at /dev/hwctr */
  69. unsigned int sets; /* # Counter set saved in memory */
  70. };
  71. DECLARE_PER_CPU(struct cpu_cf_events, cpu_cf_events);
  72. bool kernel_cpumcf_avail(void);
  73. int __kernel_cpumcf_begin(void);
  74. unsigned long kernel_cpumcf_alert(int clear);
  75. void __kernel_cpumcf_end(void);
  76. static inline int kernel_cpumcf_begin(void)
  77. {
  78. if (!cpum_cf_avail())
  79. return -ENODEV;
  80. preempt_disable();
  81. return __kernel_cpumcf_begin();
  82. }
  83. static inline void kernel_cpumcf_end(void)
  84. {
  85. __kernel_cpumcf_end();
  86. preempt_enable();
  87. }
  88. /* Return true if store counter set multiple instruction is available */
  89. static inline int stccm_avail(void)
  90. {
  91. return test_facility(142);
  92. }
  93. size_t cpum_cf_ctrset_size(enum cpumf_ctr_set ctrset,
  94. struct cpumf_ctr_info *info);
  95. int cfset_online_cpu(unsigned int cpu);
  96. int cfset_offline_cpu(unsigned int cpu);
  97. #endif /* _ASM_S390_CPU_MCF_H */