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)72reserve_pmu(enum arm_pmu_type device) 73 { 74 return ERR_PTR(-ENODEV); 75 } 76 77 static inline int release_pmu(struct platform_device * pdev)78release_pmu(struct platform_device *pdev) 79 { 80 return -ENODEV; 81 } 82 83 static inline int init_pmu(enum arm_pmu_type device)84init_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