Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 1 | /** |
Jon Medhurst | b1d0744 | 2015-05-08 12:04:18 +0100 | [diff] [blame] | 2 | * Copyright (C) ARM Limited 2010-2015. All rights reserved. |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 3 | * |
| 4 | * This program is free software; you can redistribute it and/or modify |
| 5 | * it under the terms of the GNU General Public License version 2 as |
| 6 | * published by the Free Software Foundation. |
| 7 | */ |
| 8 | |
| 9 | #ifndef GATOR_H_ |
| 10 | #define GATOR_H_ |
| 11 | |
| 12 | #include <linux/version.h> |
| 13 | #include <linux/fs.h> |
| 14 | #include <linux/mm.h> |
| 15 | #include <linux/list.h> |
| 16 | |
Jon Medhurst | 96b5615 | 2014-10-30 18:01:15 +0000 | [diff] [blame] | 17 | #define GATOR_PERF_SUPPORT (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)) |
| 18 | #define GATOR_PERF_PMU_SUPPORT (GATOR_PERF_SUPPORT && defined(CONFIG_PERF_EVENTS) && (!(defined(__arm__) || defined(__aarch64__)) || defined(CONFIG_HW_PERF_EVENTS))) |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 19 | #define GATOR_NO_PERF_SUPPORT (!(GATOR_PERF_SUPPORT)) |
Jon Medhurst | 96b5615 | 2014-10-30 18:01:15 +0000 | [diff] [blame] | 20 | #define GATOR_CPU_FREQ_SUPPORT ((LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 38)) && defined(CONFIG_CPU_FREQ)) |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 21 | #define GATOR_IKS_SUPPORT defined(CONFIG_BL_SWITCHER) |
| 22 | |
Jon Medhurst | 96b5615 | 2014-10-30 18:01:15 +0000 | [diff] [blame] | 23 | /* cpu ids */ |
Jon Medhurst | b1d0744 | 2015-05-08 12:04:18 +0100 | [diff] [blame] | 24 | #define ARM1136 0x41b36 |
| 25 | #define ARM1156 0x41b56 |
| 26 | #define ARM1176 0x41b76 |
| 27 | #define ARM11MPCORE 0x41b02 |
| 28 | #define CORTEX_A5 0x41c05 |
| 29 | #define CORTEX_A7 0x41c07 |
| 30 | #define CORTEX_A8 0x41c08 |
| 31 | #define CORTEX_A9 0x41c09 |
| 32 | #define CORTEX_A15 0x41c0f |
| 33 | #define CORTEX_A12 0x41c0d |
| 34 | #define CORTEX_A17 0x41c0e |
| 35 | #define SCORPION 0x5100f |
| 36 | #define SCORPIONMP 0x5102d |
| 37 | #define KRAITSIM 0x51049 |
| 38 | #define KRAIT 0x5104d |
| 39 | #define KRAIT_S4_PRO 0x5106f |
| 40 | #define CORTEX_A53 0x41d03 |
| 41 | #define CORTEX_A57 0x41d07 |
| 42 | #define CORTEX_A72 0x41d08 |
| 43 | #define OTHER 0xfffff |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 44 | |
Jon Medhurst | 96b5615 | 2014-10-30 18:01:15 +0000 | [diff] [blame] | 45 | /* gpu enums */ |
Jon Medhurst | e31266f | 2014-08-04 15:47:44 +0100 | [diff] [blame] | 46 | #define MALI_4xx 1 |
Jon Medhurst | 96b5615 | 2014-10-30 18:01:15 +0000 | [diff] [blame] | 47 | #define MALI_MIDGARD 2 |
Jon Medhurst | e31266f | 2014-08-04 15:47:44 +0100 | [diff] [blame] | 48 | |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 49 | #define MAXSIZE_CORE_NAME 32 |
| 50 | |
| 51 | struct gator_cpu { |
| 52 | const int cpuid; |
Jon Medhurst | 96b5615 | 2014-10-30 18:01:15 +0000 | [diff] [blame] | 53 | /* Human readable name */ |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 54 | const char core_name[MAXSIZE_CORE_NAME]; |
Jon Medhurst | 96b5615 | 2014-10-30 18:01:15 +0000 | [diff] [blame] | 55 | /* gatorfs event and Perf PMU name */ |
| 56 | const char *const pmnc_name; |
| 57 | /* compatible from Documentation/devicetree/bindings/arm/cpus.txt */ |
| 58 | const char *const dt_name; |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 59 | const int pmnc_counters; |
| 60 | }; |
| 61 | |
| 62 | const struct gator_cpu *gator_find_cpu_by_cpuid(const u32 cpuid); |
| 63 | const struct gator_cpu *gator_find_cpu_by_pmu_name(const char *const name); |
| 64 | |
| 65 | /****************************************************************************** |
| 66 | * Filesystem |
| 67 | ******************************************************************************/ |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 68 | struct dentry *gatorfs_mkdir(struct super_block *sb, struct dentry *root, |
| 69 | char const *name); |
| 70 | |
| 71 | int gatorfs_create_ulong(struct super_block *sb, struct dentry *root, |
| 72 | char const *name, unsigned long *val); |
| 73 | |
| 74 | int gatorfs_create_ro_ulong(struct super_block *sb, struct dentry *root, |
| 75 | char const *name, unsigned long *val); |
| 76 | |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 77 | /****************************************************************************** |
| 78 | * Tracepoints |
| 79 | ******************************************************************************/ |
| 80 | #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32) |
| 81 | # error Kernels prior to 2.6.32 not supported |
| 82 | #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35) |
| 83 | # define GATOR_DEFINE_PROBE(probe_name, proto) \ |
| 84 | static void probe_##probe_name(PARAMS(proto)) |
| 85 | # define GATOR_REGISTER_TRACE(probe_name) \ |
| 86 | register_trace_##probe_name(probe_##probe_name) |
| 87 | # define GATOR_UNREGISTER_TRACE(probe_name) \ |
| 88 | unregister_trace_##probe_name(probe_##probe_name) |
Jon Medhurst | e31266f | 2014-08-04 15:47:44 +0100 | [diff] [blame] | 89 | #elif LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0) |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 90 | # define GATOR_DEFINE_PROBE(probe_name, proto) \ |
| 91 | static void probe_##probe_name(void *data, PARAMS(proto)) |
| 92 | # define GATOR_REGISTER_TRACE(probe_name) \ |
| 93 | register_trace_##probe_name(probe_##probe_name, NULL) |
| 94 | # define GATOR_UNREGISTER_TRACE(probe_name) \ |
| 95 | unregister_trace_##probe_name(probe_##probe_name, NULL) |
Jon Medhurst | e31266f | 2014-08-04 15:47:44 +0100 | [diff] [blame] | 96 | #else |
| 97 | # define GATOR_DEFINE_PROBE(probe_name, proto) \ |
| 98 | extern struct tracepoint *gator_tracepoint_##probe_name; \ |
| 99 | static void probe_##probe_name(void *data, PARAMS(proto)) |
| 100 | # define GATOR_REGISTER_TRACE(probe_name) \ |
Jon Medhurst | 96b5615 | 2014-10-30 18:01:15 +0000 | [diff] [blame] | 101 | ((gator_tracepoint_##probe_name == NULL) || tracepoint_probe_register(gator_tracepoint_##probe_name, probe_##probe_name, NULL)) |
Jon Medhurst | e31266f | 2014-08-04 15:47:44 +0100 | [diff] [blame] | 102 | # define GATOR_UNREGISTER_TRACE(probe_name) \ |
| 103 | tracepoint_probe_unregister(gator_tracepoint_##probe_name, probe_##probe_name, NULL) |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 104 | #endif |
| 105 | |
| 106 | /****************************************************************************** |
| 107 | * Events |
| 108 | ******************************************************************************/ |
| 109 | struct gator_interface { |
Jon Medhurst | 96b5615 | 2014-10-30 18:01:15 +0000 | [diff] [blame] | 110 | /* Complementary function to init */ |
| 111 | void (*shutdown)(void); |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 112 | int (*create_files)(struct super_block *sb, struct dentry *root); |
| 113 | int (*start)(void); |
Jon Medhurst | 96b5615 | 2014-10-30 18:01:15 +0000 | [diff] [blame] | 114 | /* Complementary function to start */ |
| 115 | void (*stop)(void); |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 116 | int (*online)(int **buffer, bool migrate); |
| 117 | int (*offline)(int **buffer, bool migrate); |
Jon Medhurst | 96b5615 | 2014-10-30 18:01:15 +0000 | [diff] [blame] | 118 | /* called in process context but may not be running on core 'cpu' */ |
| 119 | void (*online_dispatch)(int cpu, bool migrate); |
| 120 | /* called in process context but may not be running on core 'cpu' */ |
| 121 | void (*offline_dispatch)(int cpu, bool migrate); |
| 122 | int (*read)(int **buffer, bool sched_switch); |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 123 | int (*read64)(long long **buffer); |
Jon Medhurst | 34d9769 | 2013-12-19 09:23:06 +0000 | [diff] [blame] | 124 | int (*read_proc)(long long **buffer, struct task_struct *); |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 125 | struct list_head list; |
| 126 | }; |
| 127 | |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 128 | int gator_events_install(struct gator_interface *interface); |
| 129 | int gator_events_get_key(void); |
| 130 | u32 gator_cpuid(void); |
| 131 | |
| 132 | void gator_backtrace_handler(struct pt_regs *const regs); |
| 133 | |
Jon Medhurst | e31266f | 2014-08-04 15:47:44 +0100 | [diff] [blame] | 134 | void gator_marshal_activity_switch(int core, int key, int activity, int pid); |
| 135 | |
Jon Medhurst | aaf37a3 | 2013-06-11 12:10:56 +0100 | [diff] [blame] | 136 | #if !GATOR_IKS_SUPPORT |
| 137 | |
| 138 | #define get_physical_cpu() smp_processor_id() |
| 139 | #define lcpu_to_pcpu(lcpu) lcpu |
| 140 | #define pcpu_to_lcpu(pcpu) pcpu |
| 141 | |
| 142 | #else |
| 143 | |
| 144 | #define get_physical_cpu() lcpu_to_pcpu(get_logical_cpu()) |
| 145 | int lcpu_to_pcpu(const int lcpu); |
| 146 | int pcpu_to_lcpu(const int pcpu); |
| 147 | |
| 148 | #endif |
| 149 | |
| 150 | #define get_logical_cpu() smp_processor_id() |
| 151 | #define on_primary_core() (get_logical_cpu() == 0) |
| 152 | |
Jon Medhurst | 96b5615 | 2014-10-30 18:01:15 +0000 | [diff] [blame] | 153 | #endif /* GATOR_H_ */ |