Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
pmu.h
Go to the documentation of this file.
1 /*
2  * linux/arch/arm/include/asm/pmu.h
3  *
4  * Copyright (C) 2009 picoChip Designs Ltd, Jamie Iles
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  */
11 
12 #ifndef __ARM_PMU_H__
13 #define __ARM_PMU_H__
14 
15 #include <linux/interrupt.h>
16 #include <linux/perf_event.h>
17 
18 /*
19  * struct arm_pmu_platdata - ARM PMU platform data
20  *
21  * @handle_irq: an optional handler which will be called from the
22  * interrupt and passed the address of the low level handler,
23  * and can be used to implement any platform specific handling
24  * before or after calling it.
25  * @runtime_resume: an optional handler which will be called by the
26  * runtime PM framework following a call to pm_runtime_get().
27  * Note that if pm_runtime_get() is called more than once in
28  * succession this handler will only be called once.
29  * @runtime_suspend: an optional handler which will be called by the
30  * runtime PM framework following a call to pm_runtime_put().
31  * Note that if pm_runtime_get() is called more than once in
32  * succession this handler will only be called following the
33  * final call to pm_runtime_put() that actually disables the
34  * hardware.
35  */
37  irqreturn_t (*handle_irq)(int irq, void *dev,
38  irq_handler_t pmu_handler);
41 };
42 
43 #ifdef CONFIG_HW_PERF_EVENTS
44 
45 /* The events for a given PMU register set. */
46 struct pmu_hw_events {
47  /*
48  * The events that are active on the PMU for the given index.
49  */
50  struct perf_event **events;
51 
52  /*
53  * A 1 bit for an index indicates that the counter is being used for
54  * an event. A 0 means that the counter can be used.
55  */
56  unsigned long *used_mask;
57 
58  /*
59  * Hardware lock to serialize accesses to PMU registers. Needed for the
60  * read/modify/write sequences.
61  */
62  raw_spinlock_t pmu_lock;
63 };
64 
65 struct arm_pmu {
66  struct pmu pmu;
67  cpumask_t active_irqs;
68  char *name;
69  irqreturn_t (*handle_irq)(int irq_num, void *dev);
70  void (*enable)(struct hw_perf_event *evt, int idx);
71  void (*disable)(struct hw_perf_event *evt, int idx);
72  int (*get_event_idx)(struct pmu_hw_events *hw_events,
73  struct hw_perf_event *hwc);
74  int (*set_event_filter)(struct hw_perf_event *evt,
75  struct perf_event_attr *attr);
76  u32 (*read_counter)(int idx);
77  void (*write_counter)(int idx, u32 val);
78  void (*start)(void);
79  void (*stop)(void);
80  void (*reset)(void *);
82  void (*free_irq)(void);
83  int (*map_event)(struct perf_event *event);
84  int num_events;
85  atomic_t active_events;
86  struct mutex reserve_mutex;
87  u64 max_period;
88  struct platform_device *plat_device;
89  struct pmu_hw_events *(*get_hw_events)(void);
90 };
91 
92 #define to_arm_pmu(p) (container_of(p, struct arm_pmu, pmu))
93 
94 extern const struct dev_pm_ops armpmu_dev_pm_ops;
95 
96 int armpmu_register(struct arm_pmu *armpmu, char *name, int type);
97 
99  struct hw_perf_event *hwc,
100  int idx);
101 
103  struct hw_perf_event *hwc,
104  int idx);
105 
106 int armpmu_map_event(struct perf_event *event,
107  const unsigned (*event_map)[PERF_COUNT_HW_MAX],
108  const unsigned (*cache_map)[PERF_COUNT_HW_CACHE_MAX]
111  u32 raw_event_mask);
112 
113 #endif /* CONFIG_HW_PERF_EVENTS */
114 
115 #endif /* __ARM_PMU_H__ */