Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Counter facility support definitions for the Linux perf
0004  *
0005  * Copyright IBM Corp. 2019
0006  * Author(s): Hendrik Brueckner <brueckner@linux.ibm.com>
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,    /* Basic Counter Set */
0016     CPUMF_CTR_SET_USER    = 1,    /* Problem-State Counter Set */
0017     CPUMF_CTR_SET_CRYPTO  = 2,    /* Crypto-Activity Counter Set */
0018     CPUMF_CTR_SET_EXT     = 3,    /* Extended Counter Set */
0019     CPUMF_CTR_SET_MT_DIAG = 4,    /* MT-diagnostic Counter Set */
0020 
0021     /* Maximum number of counter sets */
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;      /* For perf_event_open SVC */
0072     u64         dev_state;  /* For /dev/hwctr */
0073     unsigned int        flags;
0074     size_t used;            /* Bytes used in data */
0075     size_t usedss;          /* Bytes used in start/stop */
0076     unsigned char start[PAGE_SIZE]; /* Counter set at event add */
0077     unsigned char stop[PAGE_SIZE];  /* Counter set at event delete */
0078     unsigned char data[PAGE_SIZE];  /* Counter set at /dev/hwctr */
0079     unsigned int sets;      /* # Counter set saved in memory */
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 /* Return true if store counter set multiple instruction is available */
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 /* _ASM_S390_CPU_MCF_H */