Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.16-rc2 136 lines 2.9 kB view raw
1/* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 2004, 2005 Ralf Baechle 7 * Copyright (C) 2005 MIPS Technologies, Inc. 8 */ 9#include <linux/compiler.h> 10#include <linux/errno.h> 11#include <linux/init.h> 12#include <linux/oprofile.h> 13#include <linux/smp.h> 14#include <asm/cpu-info.h> 15#include <asm/cpu-type.h> 16 17#include "op_impl.h" 18 19extern struct op_mips_model op_model_mipsxx_ops __weak; 20extern struct op_mips_model op_model_loongson2_ops __weak; 21 22static struct op_mips_model *model; 23 24static struct op_counter_config ctr[20]; 25 26static int op_mips_setup(void) 27{ 28 /* Pre-compute the values to stuff in the hardware registers. */ 29 model->reg_setup(ctr); 30 31 /* Configure the registers on all cpus. */ 32 on_each_cpu(model->cpu_setup, NULL, 1); 33 34 return 0; 35} 36 37static int op_mips_create_files(struct dentry *root) 38{ 39 int i; 40 41 for (i = 0; i < model->num_counters; ++i) { 42 struct dentry *dir; 43 char buf[4]; 44 45 snprintf(buf, sizeof buf, "%d", i); 46 dir = oprofilefs_mkdir(root, buf); 47 48 oprofilefs_create_ulong(dir, "enabled", &ctr[i].enabled); 49 oprofilefs_create_ulong(dir, "event", &ctr[i].event); 50 oprofilefs_create_ulong(dir, "count", &ctr[i].count); 51 oprofilefs_create_ulong(dir, "kernel", &ctr[i].kernel); 52 oprofilefs_create_ulong(dir, "user", &ctr[i].user); 53 oprofilefs_create_ulong(dir, "exl", &ctr[i].exl); 54 /* Dummy. */ 55 oprofilefs_create_ulong(dir, "unit_mask", &ctr[i].unit_mask); 56 } 57 58 return 0; 59} 60 61static int op_mips_start(void) 62{ 63 on_each_cpu(model->cpu_start, NULL, 1); 64 65 return 0; 66} 67 68static void op_mips_stop(void) 69{ 70 /* Disable performance monitoring for all counters. */ 71 on_each_cpu(model->cpu_stop, NULL, 1); 72} 73 74int __init oprofile_arch_init(struct oprofile_operations *ops) 75{ 76 struct op_mips_model *lmodel = NULL; 77 int res; 78 79 switch (current_cpu_type()) { 80 case CPU_5KC: 81 case CPU_M14KC: 82 case CPU_M14KEC: 83 case CPU_20KC: 84 case CPU_24K: 85 case CPU_25KF: 86 case CPU_34K: 87 case CPU_1004K: 88 case CPU_74K: 89 case CPU_1074K: 90 case CPU_INTERAPTIV: 91 case CPU_PROAPTIV: 92 case CPU_P5600: 93 case CPU_M5150: 94 case CPU_LOONGSON1: 95 case CPU_SB1: 96 case CPU_SB1A: 97 case CPU_R10000: 98 case CPU_R12000: 99 case CPU_R14000: 100 case CPU_XLR: 101 lmodel = &op_model_mipsxx_ops; 102 break; 103 104 case CPU_LOONGSON2: 105 lmodel = &op_model_loongson2_ops; 106 break; 107 }; 108 109 if (!lmodel) 110 return -ENODEV; 111 112 res = lmodel->init(); 113 if (res) 114 return res; 115 116 model = lmodel; 117 118 ops->create_files = op_mips_create_files; 119 ops->setup = op_mips_setup; 120 //ops->shutdown = op_mips_shutdown; 121 ops->start = op_mips_start; 122 ops->stop = op_mips_stop; 123 ops->cpu_type = lmodel->cpu_type; 124 ops->backtrace = op_mips_backtrace; 125 126 printk(KERN_INFO "oprofile: using %s performance monitoring.\n", 127 lmodel->cpu_type); 128 129 return 0; 130} 131 132void oprofile_arch_exit(void) 133{ 134 if (model) 135 model->exit(); 136}