Release 4.14 arch/powerpc/oprofile/common.c
/*
* PPC 64 oprofile support:
* Copyright (C) 2004 Anton Blanchard <anton@au.ibm.com>, IBM
* PPC 32 oprofile support: (based on PPC 64 support)
* Copyright (C) Freescale Semiconductor, Inc 2004
* Author: Andy Fleming
*
* Based on alpha version.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*/
#include <linux/oprofile.h>
#include <linux/init.h>
#include <linux/smp.h>
#include <linux/errno.h>
#include <asm/ptrace.h>
#include <asm/pmc.h>
#include <asm/cputable.h>
#include <asm/oprofile_impl.h>
#include <asm/firmware.h>
static struct op_powerpc_model *model;
static struct op_counter_config ctr[OP_MAX_COUNTER];
static struct op_system_config sys;
static int op_per_cpu_rc;
static void op_handle_interrupt(struct pt_regs *regs)
{
model->handle_interrupt(regs, ctr);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andrew Morton | 20 | 100.00% | 1 | 100.00% |
Total | 20 | 100.00% | 1 | 100.00% |
static void op_powerpc_cpu_setup(void *dummy)
{
int ret;
ret = model->cpu_setup(ctr);
if (ret != 0)
op_per_cpu_rc = ret;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andy Fleming | 17 | 53.12% | 1 | 50.00% |
Bob Nelson | 15 | 46.88% | 1 | 50.00% |
Total | 32 | 100.00% | 2 | 100.00% |
static int op_powerpc_setup(void)
{
int err;
op_per_cpu_rc = 0;
/* Grab the hardware */
err = reserve_pmc_hardware(op_handle_interrupt);
if (err)
return err;
/* Pre-compute the values to stuff in the hardware registers. */
op_per_cpu_rc = model->reg_setup(ctr, &sys, model->num_counters);
if (op_per_cpu_rc)
goto out;
/* Configure the registers on all cpus. If an error occurs on one
* of the cpus, op_per_cpu_rc will be set to the error */
on_each_cpu(op_powerpc_cpu_setup, NULL, 1);
out: if (op_per_cpu_rc) {
/* error on setup release the performance counter hardware */
release_pmc_hardware();
}
return op_per_cpu_rc;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andrew Morton | 35 | 44.30% | 1 | 20.00% |
Bob Nelson | 27 | 34.18% | 1 | 20.00% |
David Gibson | 15 | 18.99% | 1 | 20.00% |
Stephen Rothwell | 1 | 1.27% | 1 | 20.00% |
Andy Fleming | 1 | 1.27% | 1 | 20.00% |
Total | 79 | 100.00% | 5 | 100.00% |
static void op_powerpc_shutdown(void)
{
release_pmc_hardware();
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andrew Morton | 7 | 63.64% | 1 | 25.00% |
Anton Blanchard | 2 | 18.18% | 1 | 25.00% |
David Gibson | 1 | 9.09% | 1 | 25.00% |
Stephen Rothwell | 1 | 9.09% | 1 | 25.00% |
Total | 11 | 100.00% | 4 | 100.00% |
static void op_powerpc_cpu_start(void *dummy)
{
/* If any of the cpus have return an error, set the
* global flag to the error so it can be returned
* to the generic OProfile caller.
*/
int ret;
ret = model->start(ctr);
if (ret != 0)
op_per_cpu_rc = ret;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Bob Nelson | 16 | 48.48% | 1 | 33.33% |
Andrew Morton | 16 | 48.48% | 1 | 33.33% |
Stephen Rothwell | 1 | 3.03% | 1 | 33.33% |
Total | 33 | 100.00% | 3 | 100.00% |
static int op_powerpc_start(void)
{
op_per_cpu_rc = 0;
if (model->global_start)
return model->global_start(ctr);
if (model->start) {
on_each_cpu(op_powerpc_cpu_start, NULL, 1);
return op_per_cpu_rc;
}
return -EIO; /* No start function is defined for this
power architecture */
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Maynard Johnson | 18 | 35.29% | 1 | 25.00% |
Andrew Morton | 17 | 33.33% | 1 | 25.00% |
Bob Nelson | 14 | 27.45% | 1 | 25.00% |
Stephen Rothwell | 2 | 3.92% | 1 | 25.00% |
Total | 51 | 100.00% | 4 | 100.00% |
static inline void op_powerpc_cpu_stop(void *dummy)
{
model->stop();
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andrew Morton | 15 | 93.75% | 1 | 50.00% |
Stephen Rothwell | 1 | 6.25% | 1 | 50.00% |
Total | 16 | 100.00% | 2 | 100.00% |
static void op_powerpc_stop(void)
{
if (model->stop)
on_each_cpu(op_powerpc_cpu_stop, NULL, 1);
if (model->global_stop)
model->global_stop();
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Maynard Johnson | 17 | 50.00% | 1 | 33.33% |
Andrew Morton | 15 | 44.12% | 1 | 33.33% |
Stephen Rothwell | 2 | 5.88% | 1 | 33.33% |
Total | 34 | 100.00% | 3 | 100.00% |
static int op_powerpc_create_files(struct dentry *root)
{
int i;
#ifdef CONFIG_PPC64
/*
* There is one mmcr0, mmcr1 and mmcra for setting the events for
* all of the counters.
*/
oprofilefs_create_ulong(root, "mmcr0", &sys.mmcr0);
oprofilefs_create_ulong(root, "mmcr1", &sys.mmcr1);
oprofilefs_create_ulong(root, "mmcra", &sys.mmcra);
#ifdef CONFIG_OPROFILE_CELL
/* create a file the user tool can check to see what level of profiling
* support exits with this kernel. Initialize bit mask to indicate
* what support the kernel has:
* bit 0 - Supports SPU event profiling in addition to PPU
* event and cycles; and SPU cycle profiling
* bits 1-31 - Currently unused.
*
* If the file does not exist, then the kernel only supports SPU
* cycle profiling, PPU event and cycle profiling.
*/
oprofilefs_create_ulong(root, "cell_support", &sys.cell_support);
sys.cell_support = 0x1; /* Note, the user OProfile tool must check
* that this bit is set before attempting to
* user SPU event profiling. Older kernels
* will not have this file, hence the user
* tool is not allowed to do SPU event
* profiling on older kernels. Older kernels
* will accept SPU events but collected data
* is garbage.
*/
#endif
#endif
for (i = 0; i < model->num_counters; ++i) {
struct dentry *dir;
char buf[4];
snprintf(buf, sizeof buf, "%d", i);
dir = oprofilefs_mkdir(root, buf);
oprofilefs_create_ulong(dir, "enabled", &ctr[i].enabled);
oprofilefs_create_ulong(dir, "event", &ctr[i].event);
oprofilefs_create_ulong(dir, "count", &ctr[i].count);
/*
* Classic PowerPC doesn't support per-counter
* control like this, but the options are
* expected, so they remain. For Freescale
* Book-E style performance monitors, we do
* support them.
*/
oprofilefs_create_ulong(dir, "kernel", &ctr[i].kernel);
oprofilefs_create_ulong(dir, "user", &ctr[i].user);
oprofilefs_create_ulong(dir, "unit_mask", &ctr[i].unit_mask);
}
oprofilefs_create_ulong(root, "enable_kernel", &sys.enable_kernel);
oprofilefs_create_ulong(root, "enable_user", &sys.enable_user);
/* Default to tracing both kernel and user */
sys.enable_kernel = 1;
sys.enable_user = 1;
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andrew Morton | 175 | 67.05% | 1 | 14.29% |
Anton Blanchard | 47 | 18.01% | 1 | 14.29% |
Carl E. Love | 24 | 9.20% | 1 | 14.29% |
Al Viro | 7 | 2.68% | 1 | 14.29% |
Stephen Rothwell | 5 | 1.92% | 1 | 14.29% |
Andy Fleming | 2 | 0.77% | 1 | 14.29% |
Markus Armbruster | 1 | 0.38% | 1 | 14.29% |
Total | 261 | 100.00% | 7 | 100.00% |
int __init oprofile_arch_init(struct oprofile_operations *ops)
{
if (!cur_cpu_spec->oprofile_cpu_type)
return -ENODEV;
switch (cur_cpu_spec->oprofile_type) {
#ifdef CONFIG_PPC_BOOK3S_64
#ifdef CONFIG_OPROFILE_CELL
case PPC_OPROFILE_CELL:
if (firmware_has_feature(FW_FEATURE_LPAR))
return -ENODEV;
model = &op_model_cell;
ops->sync_start = model->sync_start;
ops->sync_stop = model->sync_stop;
break;
#endif
case PPC_OPROFILE_POWER4:
model = &op_model_power4;
break;
case PPC_OPROFILE_PA6T:
model = &op_model_pa6t;
break;
#endif
#ifdef CONFIG_6xx
case PPC_OPROFILE_G4:
model = &op_model_7450;
break;
#endif
#if defined(CONFIG_FSL_EMB_PERFMON)
case PPC_OPROFILE_FSL_EMB:
model = &op_model_fsl_emb;
break;
#endif
default:
return -ENODEV;
}
model->num_counters = cur_cpu_spec->num_pmcs;
ops->cpu_type = cur_cpu_spec->oprofile_cpu_type;
ops->create_files = op_powerpc_create_files;
ops->setup = op_powerpc_setup;
ops->shutdown = op_powerpc_shutdown;
ops->start = op_powerpc_start;
ops->stop = op_powerpc_stop;
ops->backtrace = op_powerpc_backtrace;
printk(KERN_DEBUG "oprofile: using %s performance monitoring.\n",
ops->cpu_type);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Anton Blanchard | 63 | 32.31% | 4 | 22.22% |
Greg Banks | 24 | 12.31% | 1 | 5.56% |
Andrew Morton | 22 | 11.28% | 1 | 5.56% |
Bob Nelson | 17 | 8.72% | 1 | 5.56% |
Andy Fleming | 13 | 6.67% | 2 | 11.11% |
Maynard Johnson | 13 | 6.67% | 1 | 5.56% |
Ishizaki Kou | 11 | 5.64% | 1 | 5.56% |
Olof Johansson | 10 | 5.13% | 2 | 11.11% |
Akinobu Mita | 8 | 4.10% | 1 | 5.56% |
Brian Rogan | 6 | 3.08% | 1 | 5.56% |
Stephen Rothwell | 5 | 2.56% | 1 | 5.56% |
Andy Whitcroft | 2 | 1.03% | 1 | 5.56% |
Benjamin Herrenschmidt | 1 | 0.51% | 1 | 5.56% |
Total | 195 | 100.00% | 18 | 100.00% |
void oprofile_arch_exit(void)
{
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andrew Morton | 5 | 83.33% | 1 | 50.00% |
Andy Fleming | 1 | 16.67% | 1 | 50.00% |
Total | 6 | 100.00% | 2 | 100.00% |
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Andrew Morton | 362 | 45.88% | 1 | 3.57% |
Anton Blanchard | 116 | 14.70% | 7 | 25.00% |
Bob Nelson | 93 | 11.79% | 1 | 3.57% |
Maynard Johnson | 48 | 6.08% | 1 | 3.57% |
Andy Fleming | 34 | 4.31% | 3 | 10.71% |
Carl E. Love | 24 | 3.04% | 1 | 3.57% |
Greg Banks | 24 | 3.04% | 1 | 3.57% |
Stephen Rothwell | 20 | 2.53% | 2 | 7.14% |
David Gibson | 19 | 2.41% | 1 | 3.57% |
Ishizaki Kou | 11 | 1.39% | 1 | 3.57% |
Olof Johansson | 10 | 1.27% | 2 | 7.14% |
Akinobu Mita | 8 | 1.01% | 1 | 3.57% |
Al Viro | 7 | 0.89% | 1 | 3.57% |
Brian Rogan | 6 | 0.76% | 1 | 3.57% |
Kelly Daly | 3 | 0.38% | 1 | 3.57% |
Andy Whitcroft | 2 | 0.25% | 1 | 3.57% |
Benjamin Herrenschmidt | 1 | 0.13% | 1 | 3.57% |
Markus Armbruster | 1 | 0.13% | 1 | 3.57% |
Total | 789 | 100.00% | 28 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.