0001
0002
0003
0004
0005
0006
0007
0008 #ifndef _ASM_S390_CPU_MCF_H
0009 #define _ASM_S390_CPU_MCF_H
0010
0011 #include <linux/perf_event.h>
0012 #include <asm/cpu_mf.h>
0013
0014 enum cpumf_ctr_set {
0015 CPUMF_CTR_SET_BASIC = 0,
0016 CPUMF_CTR_SET_USER = 1,
0017 CPUMF_CTR_SET_CRYPTO = 2,
0018 CPUMF_CTR_SET_EXT = 3,
0019 CPUMF_CTR_SET_MT_DIAG = 4,
0020
0021
0022 CPUMF_CTR_SET_MAX,
0023 };
0024
0025 #define CPUMF_LCCTL_ENABLE_SHIFT 16
0026 #define CPUMF_LCCTL_ACTCTL_SHIFT 0
0027
0028 static inline void ctr_set_enable(u64 *state, u64 ctrsets)
0029 {
0030 *state |= ctrsets << CPUMF_LCCTL_ENABLE_SHIFT;
0031 }
0032
0033 static inline void ctr_set_disable(u64 *state, u64 ctrsets)
0034 {
0035 *state &= ~(ctrsets << CPUMF_LCCTL_ENABLE_SHIFT);
0036 }
0037
0038 static inline void ctr_set_start(u64 *state, u64 ctrsets)
0039 {
0040 *state |= ctrsets << CPUMF_LCCTL_ACTCTL_SHIFT;
0041 }
0042
0043 static inline void ctr_set_stop(u64 *state, u64 ctrsets)
0044 {
0045 *state &= ~(ctrsets << CPUMF_LCCTL_ACTCTL_SHIFT);
0046 }
0047
0048 static inline int ctr_stcctm(enum cpumf_ctr_set set, u64 range, u64 *dest)
0049 {
0050 switch (set) {
0051 case CPUMF_CTR_SET_BASIC:
0052 return stcctm(BASIC, range, dest);
0053 case CPUMF_CTR_SET_USER:
0054 return stcctm(PROBLEM_STATE, range, dest);
0055 case CPUMF_CTR_SET_CRYPTO:
0056 return stcctm(CRYPTO_ACTIVITY, range, dest);
0057 case CPUMF_CTR_SET_EXT:
0058 return stcctm(EXTENDED, range, dest);
0059 case CPUMF_CTR_SET_MT_DIAG:
0060 return stcctm(MT_DIAG_CLEARING, range, dest);
0061 case CPUMF_CTR_SET_MAX:
0062 return 3;
0063 }
0064 return 3;
0065 }
0066
0067 struct cpu_cf_events {
0068 struct cpumf_ctr_info info;
0069 atomic_t ctr_set[CPUMF_CTR_SET_MAX];
0070 atomic64_t alert;
0071 u64 state;
0072 u64 dev_state;
0073 unsigned int flags;
0074 size_t used;
0075 size_t usedss;
0076 unsigned char start[PAGE_SIZE];
0077 unsigned char stop[PAGE_SIZE];
0078 unsigned char data[PAGE_SIZE];
0079 unsigned int sets;
0080 };
0081 DECLARE_PER_CPU(struct cpu_cf_events, cpu_cf_events);
0082
0083 bool kernel_cpumcf_avail(void);
0084 int __kernel_cpumcf_begin(void);
0085 unsigned long kernel_cpumcf_alert(int clear);
0086 void __kernel_cpumcf_end(void);
0087
0088 static inline int kernel_cpumcf_begin(void)
0089 {
0090 if (!cpum_cf_avail())
0091 return -ENODEV;
0092
0093 preempt_disable();
0094 return __kernel_cpumcf_begin();
0095 }
0096 static inline void kernel_cpumcf_end(void)
0097 {
0098 __kernel_cpumcf_end();
0099 preempt_enable();
0100 }
0101
0102
0103 static inline int stccm_avail(void)
0104 {
0105 return test_facility(142);
0106 }
0107
0108 size_t cpum_cf_ctrset_size(enum cpumf_ctr_set ctrset,
0109 struct cpumf_ctr_info *info);
0110 int cfset_online_cpu(unsigned int cpu);
0111 int cfset_offline_cpu(unsigned int cpu);
0112 #endif