0001
0002 #ifndef __ASM_POWERPC_IMC_PMU_H
0003 #define __ASM_POWERPC_IMC_PMU_H
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/perf_event.h>
0014 #include <linux/slab.h>
0015 #include <linux/of.h>
0016 #include <linux/io.h>
0017 #include <asm/opal.h>
0018
0019
0020
0021
0022 #define IMC_DTB_COMPAT "ibm,opal-in-memory-counters"
0023 #define IMC_DTB_UNIT_COMPAT "ibm,imc-counters"
0024
0025
0026
0027
0028
0029
0030 #define THREAD_IMC_LDBAR_MASK 0x0003ffffffffe000ULL
0031 #define THREAD_IMC_ENABLE 0x8000000000000000ULL
0032 #define TRACE_IMC_ENABLE 0x4000000000000000ULL
0033
0034
0035
0036
0037 #define IMC_CNTL_BLK_OFFSET 0x3FC00
0038 #define IMC_CNTL_BLK_CMD_OFFSET 8
0039 #define IMC_CNTL_BLK_MODE_OFFSET 32
0040
0041
0042
0043
0044 struct imc_mem_info {
0045 u64 *vbase;
0046 u32 id;
0047 };
0048
0049
0050
0051
0052 struct imc_events {
0053 u32 value;
0054 char *name;
0055 char *unit;
0056 char *scale;
0057 };
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076 struct trace_imc_data {
0077 u64 tb1;
0078 u64 ip;
0079 u64 val;
0080 u64 cpmc1;
0081 u64 cpmc2;
0082 u64 cpmc3;
0083 u64 cpmc4;
0084 u64 tb2;
0085 };
0086
0087
0088 #define IMC_FORMAT_ATTR 0
0089 #define IMC_EVENT_ATTR 1
0090 #define IMC_CPUMASK_ATTR 2
0091 #define IMC_NULL_ATTR 3
0092
0093
0094 #define IMC_EVENT_OFFSET_MASK 0xffffffffULL
0095
0096
0097
0098
0099
0100 #define IMC_TRACE_RECORD_TB1_MASK 0x3ffffffffffULL
0101
0102
0103
0104
0105
0106 #define IMC_TRACE_RECORD_VAL_HVPR(x) ((x) >> 62)
0107
0108
0109
0110
0111
0112
0113
0114
0115 struct imc_pmu {
0116 struct pmu pmu;
0117 struct imc_mem_info *mem_info;
0118 struct imc_events *events;
0119
0120
0121
0122
0123
0124
0125 const struct attribute_group *attr_groups[4];
0126 u32 counter_mem_size;
0127 int domain;
0128
0129
0130
0131
0132 bool imc_counter_mmaped;
0133 };
0134
0135
0136
0137
0138
0139 struct imc_pmu_ref {
0140 struct mutex lock;
0141 unsigned int id;
0142 int refc;
0143 };
0144
0145
0146
0147
0148
0149
0150
0151 enum {
0152 IMC_TYPE_THREAD = 0x1,
0153 IMC_TYPE_TRACE = 0x2,
0154 IMC_TYPE_CORE = 0x4,
0155 IMC_TYPE_CHIP = 0x10,
0156 };
0157
0158
0159
0160
0161 #define IMC_DOMAIN_NEST 1
0162 #define IMC_DOMAIN_CORE 2
0163 #define IMC_DOMAIN_THREAD 3
0164
0165 #define IMC_DOMAIN_TRACE 4
0166
0167 extern int init_imc_pmu(struct device_node *parent,
0168 struct imc_pmu *pmu_ptr, int pmu_id);
0169 extern void thread_imc_disable(void);
0170 extern int get_max_nest_dev(void);
0171 extern void unregister_thread_imc(void);
0172 #endif