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 
17 enum arm_pmu_type {
18 	ARM_PMU_DEVICE_CPU	= 0,
19 	ARM_NUM_PMU_DEVICES,
20 };
21 
22 /*
23  * struct arm_pmu_platdata - ARM PMU platform data
24  *
25  * @handle_irq: an optional handler which will be called from the interrupt and
26  * passed the address of the low level handler, and can be used to implement
27  * any platform specific handling before or after calling it.
28  */
29 struct arm_pmu_platdata {
30 	irqreturn_t (*handle_irq)(int irq, void *dev,
31 				  irq_handler_t pmu_handler);
32 };
33 
34 #ifdef CONFIG_CPU_HAS_PMU
35 
36 /**
37  * reserve_pmu() - reserve the hardware performance counters
38  *
39  * Reserve the hardware performance counters in the system for exclusive use.
40  * The platform_device for the system is returned on success, ERR_PTR()
41  * encoded error on failure.
42  */
43 extern struct platform_device *
44 reserve_pmu(enum arm_pmu_type device);
45 
46 /**
47  * release_pmu() - Relinquish control of the performance counters
48  *
49  * Release the performance counters and allow someone else to use them.
50  * Callers must have disabled the counters and released IRQs before calling
51  * this. The platform_device returned from reserve_pmu() must be passed as
52  * a cookie.
53  */
54 extern int
55 release_pmu(struct platform_device *pdev);
56 
57 /**
58  * init_pmu() - Initialise the PMU.
59  *
60  * Initialise the system ready for PMU enabling. This should typically set the
61  * IRQ affinity and nothing else. The users (oprofile/perf events etc) will do
62  * the actual hardware initialisation.
63  */
64 extern int
65 init_pmu(enum arm_pmu_type device);
66 
67 #else /* CONFIG_CPU_HAS_PMU */
68 
69 #include <linux/err.h>
70 
71 static inline struct platform_device *
reserve_pmu(enum arm_pmu_type device)72 reserve_pmu(enum arm_pmu_type device)
73 {
74 	return ERR_PTR(-ENODEV);
75 }
76 
77 static inline int
release_pmu(struct platform_device * pdev)78 release_pmu(struct platform_device *pdev)
79 {
80 	return -ENODEV;
81 }
82 
83 static inline int
init_pmu(enum arm_pmu_type device)84 init_pmu(enum arm_pmu_type device)
85 {
86 	return -ENODEV;
87 }
88 
89 #endif /* CONFIG_CPU_HAS_PMU */
90 
91 #endif /* __ARM_PMU_H__ */
92