linux/arch/mips/oprofile/common.c
<<
>>
Prefs
   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/errno.h>
  10#include <linux/init.h>
  11#include <linux/oprofile.h>
  12#include <linux/smp.h>
  13#include <asm/cpu-info.h>
  14
  15#include "op_impl.h"
  16
  17extern struct op_mips_model op_model_mipsxx_ops __attribute__((weak));
  18extern struct op_mips_model op_model_rm9000_ops __attribute__((weak));
  19
  20static struct op_mips_model *model;
  21
  22static struct op_counter_config ctr[20];
  23
  24static int op_mips_setup(void)
  25{
  26        /* Pre-compute the values to stuff in the hardware registers.  */
  27        model->reg_setup(ctr);
  28
  29        /* Configure the registers on all cpus.  */
  30        on_each_cpu(model->cpu_setup, NULL, 0, 1);
  31
  32        return 0;
  33}
  34
  35static int op_mips_create_files(struct super_block * sb, struct dentry * root)
  36{
  37        int i;
  38
  39        for (i = 0; i < model->num_counters; ++i) {
  40                struct dentry *dir;
  41                char buf[4];
  42
  43                snprintf(buf, sizeof buf, "%d", i);
  44                dir = oprofilefs_mkdir(sb, root, buf);
  45
  46                oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled);
  47                oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event);
  48                oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count);
  49                oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel);
  50                oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user);
  51                oprofilefs_create_ulong(sb, dir, "exl", &ctr[i].exl);
  52                /* Dummy.  */
  53                oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask);
  54        }
  55
  56        return 0;
  57}
  58
  59static int op_mips_start(void)
  60{
  61        on_each_cpu(model->cpu_start, NULL, 0, 1);
  62
  63        return 0;
  64}
  65
  66static void op_mips_stop(void)
  67{
  68        /* Disable performance monitoring for all counters.  */
  69        on_each_cpu(model->cpu_stop, NULL, 0, 1);
  70}
  71
  72int __init oprofile_arch_init(struct oprofile_operations *ops)
  73{
  74        struct op_mips_model *lmodel = NULL;
  75        int res;
  76
  77        switch (current_cpu_type()) {
  78        case CPU_5KC:
  79        case CPU_20KC:
  80        case CPU_24K:
  81        case CPU_25KF:
  82        case CPU_34K:
  83        case CPU_74K:
  84        case CPU_SB1:
  85        case CPU_SB1A:
  86        case CPU_R10000:
  87        case CPU_R12000:
  88        case CPU_R14000:
  89                lmodel = &op_model_mipsxx_ops;
  90                break;
  91
  92        case CPU_RM9000:
  93                lmodel = &op_model_rm9000_ops;
  94                break;
  95        };
  96
  97        if (!lmodel)
  98                return -ENODEV;
  99
 100        res = lmodel->init();
 101        if (res)
 102                return res;
 103
 104        model = lmodel;
 105
 106        ops->create_files       = op_mips_create_files;
 107        ops->setup              = op_mips_setup;
 108        //ops->shutdown         = op_mips_shutdown;
 109        ops->start              = op_mips_start;
 110        ops->stop               = op_mips_stop;
 111        ops->cpu_type           = lmodel->cpu_type;
 112
 113        printk(KERN_INFO "oprofile: using %s performance monitoring.\n",
 114               lmodel->cpu_type);
 115
 116        return 0;
 117}
 118
 119void oprofile_arch_exit(void)
 120{
 121        if (model)
 122                model->exit();
 123}
 124
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.