~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/x86/events/intel/p6.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/x86/events/intel/p6.c (Version linux-6.11-rc3) and /arch/i386/events/intel/p6.c (Version linux-6.5.13)


  1 // SPDX-License-Identifier: GPL-2.0                 1 
  2 #include <linux/perf_event.h>                     
  3 #include <linux/types.h>                          
  4                                                   
  5 #include "../perf_event.h"                        
  6                                                   
  7 /*                                                
  8  * Not sure about some of these                   
  9  */                                               
 10 static const u64 p6_perfmon_event_map[] =         
 11 {                                                 
 12   [PERF_COUNT_HW_CPU_CYCLES]            = 0x00    
 13   [PERF_COUNT_HW_INSTRUCTIONS]          = 0x00    
 14   [PERF_COUNT_HW_CACHE_REFERENCES]      = 0x0f    
 15   [PERF_COUNT_HW_CACHE_MISSES]          = 0x01    
 16   [PERF_COUNT_HW_BRANCH_INSTRUCTIONS]   = 0x00    
 17   [PERF_COUNT_HW_BRANCH_MISSES]         = 0x00    
 18   [PERF_COUNT_HW_BUS_CYCLES]            = 0x00    
 19   [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = 0x    
 20                                                   
 21 };                                                
 22                                                   
 23 static const u64 __initconst p6_hw_cache_event    
 24                                 [PERF_COUNT_HW    
 25                                 [PERF_COUNT_HW    
 26                                 [PERF_COUNT_HW    
 27 {                                                 
 28  [ C(L1D) ] = {                                   
 29         [ C(OP_READ) ] = {                        
 30                 [ C(RESULT_ACCESS) ] = 0x0043,    
 31                 [ C(RESULT_MISS)   ] = 0x0045,    
 32         },                                        
 33         [ C(OP_WRITE) ] = {                       
 34                 [ C(RESULT_ACCESS) ] = 0,         
 35                 [ C(RESULT_MISS)   ] = 0x0f29,    
 36         },                                        
 37         [ C(OP_PREFETCH) ] = {                    
 38                 [ C(RESULT_ACCESS) ] = 0,         
 39                 [ C(RESULT_MISS)   ] = 0,         
 40         },                                        
 41  },                                               
 42  [ C(L1I ) ] = {                                  
 43         [ C(OP_READ) ] = {                        
 44                 [ C(RESULT_ACCESS) ] = 0x0080,    
 45                 [ C(RESULT_MISS)   ] = 0x0f28,    
 46         },                                        
 47         [ C(OP_WRITE) ] = {                       
 48                 [ C(RESULT_ACCESS) ] = -1,        
 49                 [ C(RESULT_MISS)   ] = -1,        
 50         },                                        
 51         [ C(OP_PREFETCH) ] = {                    
 52                 [ C(RESULT_ACCESS) ] = 0,         
 53                 [ C(RESULT_MISS)   ] = 0,         
 54         },                                        
 55  },                                               
 56  [ C(LL  ) ] = {                                  
 57         [ C(OP_READ) ] = {                        
 58                 [ C(RESULT_ACCESS) ] = 0,         
 59                 [ C(RESULT_MISS)   ] = 0,         
 60         },                                        
 61         [ C(OP_WRITE) ] = {                       
 62                 [ C(RESULT_ACCESS) ] = 0,         
 63                 [ C(RESULT_MISS)   ] = 0x0025,    
 64         },                                        
 65         [ C(OP_PREFETCH) ] = {                    
 66                 [ C(RESULT_ACCESS) ] = 0,         
 67                 [ C(RESULT_MISS)   ] = 0,         
 68         },                                        
 69  },                                               
 70  [ C(DTLB) ] = {                                  
 71         [ C(OP_READ) ] = {                        
 72                 [ C(RESULT_ACCESS) ] = 0x0043,    
 73                 [ C(RESULT_MISS)   ] = 0,         
 74         },                                        
 75         [ C(OP_WRITE) ] = {                       
 76                 [ C(RESULT_ACCESS) ] = 0,         
 77                 [ C(RESULT_MISS)   ] = 0,         
 78         },                                        
 79         [ C(OP_PREFETCH) ] = {                    
 80                 [ C(RESULT_ACCESS) ] = 0,         
 81                 [ C(RESULT_MISS)   ] = 0,         
 82         },                                        
 83  },                                               
 84  [ C(ITLB) ] = {                                  
 85         [ C(OP_READ) ] = {                        
 86                 [ C(RESULT_ACCESS) ] = 0x0080,    
 87                 [ C(RESULT_MISS)   ] = 0x0085,    
 88         },                                        
 89         [ C(OP_WRITE) ] = {                       
 90                 [ C(RESULT_ACCESS) ] = -1,        
 91                 [ C(RESULT_MISS)   ] = -1,        
 92         },                                        
 93         [ C(OP_PREFETCH) ] = {                    
 94                 [ C(RESULT_ACCESS) ] = -1,        
 95                 [ C(RESULT_MISS)   ] = -1,        
 96         },                                        
 97  },                                               
 98  [ C(BPU ) ] = {                                  
 99         [ C(OP_READ) ] = {                        
100                 [ C(RESULT_ACCESS) ] = 0x00c4,    
101                 [ C(RESULT_MISS)   ] = 0x00c5,    
102         },                                        
103         [ C(OP_WRITE) ] = {                       
104                 [ C(RESULT_ACCESS) ] = -1,        
105                 [ C(RESULT_MISS)   ] = -1,        
106         },                                        
107         [ C(OP_PREFETCH) ] = {                    
108                 [ C(RESULT_ACCESS) ] = -1,        
109                 [ C(RESULT_MISS)   ] = -1,        
110         },                                        
111  },                                               
112 };                                                
113                                                   
114 static u64 p6_pmu_event_map(int hw_event)         
115 {                                                 
116         return p6_perfmon_event_map[hw_event];    
117 }                                                 
118                                                   
119 /*                                                
120  * Event setting that is specified not to coun    
121  * We use this to effectively disable a counte    
122  *                                                
123  * L2_RQSTS with 0 MESI unit mask.                
124  */                                               
125 #define P6_NOP_EVENT                    0x0000    
126                                                   
127 static struct event_constraint p6_event_constr    
128 {                                                 
129         INTEL_EVENT_CONSTRAINT(0xc1, 0x1),        
130         INTEL_EVENT_CONSTRAINT(0x10, 0x1),        
131         INTEL_EVENT_CONSTRAINT(0x11, 0x2),        
132         INTEL_EVENT_CONSTRAINT(0x12, 0x2),        
133         INTEL_EVENT_CONSTRAINT(0x13, 0x2),        
134         INTEL_EVENT_CONSTRAINT(0x14, 0x1),        
135         EVENT_CONSTRAINT_END                      
136 };                                                
137                                                   
138 static void p6_pmu_disable_all(void)              
139 {                                                 
140         u64 val;                                  
141                                                   
142         /* p6 only has one enable register */     
143         rdmsrl(MSR_P6_EVNTSEL0, val);             
144         val &= ~ARCH_PERFMON_EVENTSEL_ENABLE;     
145         wrmsrl(MSR_P6_EVNTSEL0, val);             
146 }                                                 
147                                                   
148 static void p6_pmu_enable_all(int added)          
149 {                                                 
150         unsigned long val;                        
151                                                   
152         /* p6 only has one enable register */     
153         rdmsrl(MSR_P6_EVNTSEL0, val);             
154         val |= ARCH_PERFMON_EVENTSEL_ENABLE;      
155         wrmsrl(MSR_P6_EVNTSEL0, val);             
156 }                                                 
157                                                   
158 static inline void                                
159 p6_pmu_disable_event(struct perf_event *event)    
160 {                                                 
161         struct hw_perf_event *hwc = &event->hw    
162         u64 val = P6_NOP_EVENT;                   
163                                                   
164         (void)wrmsrl_safe(hwc->config_base, va    
165 }                                                 
166                                                   
167 static void p6_pmu_enable_event(struct perf_ev    
168 {                                                 
169         struct hw_perf_event *hwc = &event->hw    
170         u64 val;                                  
171                                                   
172         val = hwc->config;                        
173                                                   
174         /*                                        
175          * p6 only has a global event enable,     
176          * We "disable" events by programming     
177          * and we rely on p6_pmu_enable_all()     
178          * to actually enable the events.         
179          */                                       
180                                                   
181         (void)wrmsrl_safe(hwc->config_base, va    
182 }                                                 
183                                                   
184 PMU_FORMAT_ATTR(event,  "config:0-7"    );        
185 PMU_FORMAT_ATTR(umask,  "config:8-15"   );        
186 PMU_FORMAT_ATTR(edge,   "config:18"     );        
187 PMU_FORMAT_ATTR(pc,     "config:19"     );        
188 PMU_FORMAT_ATTR(inv,    "config:23"     );        
189 PMU_FORMAT_ATTR(cmask,  "config:24-31"  );        
190                                                   
191 static struct attribute *intel_p6_formats_attr    
192         &format_attr_event.attr,                  
193         &format_attr_umask.attr,                  
194         &format_attr_edge.attr,                   
195         &format_attr_pc.attr,                     
196         &format_attr_inv.attr,                    
197         &format_attr_cmask.attr,                  
198         NULL,                                     
199 };                                                
200                                                   
201 static __initconst const struct x86_pmu p6_pmu    
202         .name                   = "p6",           
203         .handle_irq             = x86_pmu_hand    
204         .disable_all            = p6_pmu_disab    
205         .enable_all             = p6_pmu_enabl    
206         .enable                 = p6_pmu_enabl    
207         .disable                = p6_pmu_disab    
208         .hw_config              = x86_pmu_hw_c    
209         .schedule_events        = x86_schedule    
210         .eventsel               = MSR_P6_EVNTS    
211         .perfctr                = MSR_P6_PERFC    
212         .event_map              = p6_pmu_event    
213         .max_events             = ARRAY_SIZE(p    
214         .apic                   = 1,              
215         .max_period             = (1ULL << 31)    
216         .version                = 0,              
217         .cntr_mask64            = 0x3,            
218         /*                                        
219          * Events have 40 bits implemented. Ho    
220          * that bits [32-39] are sign extensio    
221          * effective width of a event for P6-l    
222          *                                        
223          * See IA-32 Intel Architecture Softwa    
224          */                                       
225         .cntval_bits            = 32,             
226         .cntval_mask            = (1ULL << 32)    
227         .get_event_constraints  = x86_get_even    
228         .event_constraints      = p6_event_con    
229                                                   
230         .format_attrs           = intel_p6_for    
231         .events_sysfs_show      = intel_event_    
232                                                   
233 };                                                
234                                                   
235 static __init void p6_pmu_rdpmc_quirk(void)       
236 {                                                 
237         if (boot_cpu_data.x86_stepping < 9) {     
238                 /*                                
239                  * PPro erratum 26; fixed in s    
240                  */                               
241                 pr_warn("Userspace RDPMC suppo    
242                 x86_pmu.attr_rdpmc_broken = 1;    
243                 x86_pmu.attr_rdpmc = 0;           
244         }                                         
245 }                                                 
246                                                   
247 __init int p6_pmu_init(void)                      
248 {                                                 
249         x86_pmu = p6_pmu;                         
250                                                   
251         switch (boot_cpu_data.x86_model) {        
252         case  1: /* Pentium Pro */                
253                 x86_add_quirk(p6_pmu_rdpmc_qui    
254                 break;                            
255                                                   
256         case  3: /* Pentium II - Klamath */       
257         case  5: /* Pentium II - Deschutes */     
258         case  6: /* Pentium II - Mendocino */     
259                 break;                            
260                                                   
261         case  7: /* Pentium III - Katmai */       
262         case  8: /* Pentium III - Coppermine *    
263         case 10: /* Pentium III Xeon */           
264         case 11: /* Pentium III - Tualatin */     
265                 break;                            
266                                                   
267         case  9: /* Pentium M - Banias */         
268         case 13: /* Pentium M - Dothan */         
269                 break;                            
270                                                   
271         default:                                  
272                 pr_cont("unsupported p6 CPU mo    
273                 return -ENODEV;                   
274         }                                         
275                                                   
276         memcpy(hw_cache_event_ids, p6_hw_cache    
277                 sizeof(hw_cache_event_ids));      
278                                                   
279         return 0;                                 
280 }                                                 
281                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php