-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 120127 b: refs/heads/master c: 60a51fb h: refs/heads/master i: 120125: 502eb67 120123: 423abee 120119: c849bd2 120111: 055dbb7 120095: 64bc050 120063: e1b490c v: v3
- Loading branch information
Paul Mundt
committed
Dec 22, 2008
1 parent
d403c24
commit 9072aa2
Showing
5 changed files
with
179 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 70fe224743c11b57f9b63326313988fdcceb54df | ||
refs/heads/master: 60a51fbe5dd2baef0f35bcf79f25ac1ee239a660 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,141 @@ | ||
/* | ||
* arch/sh/oprofile/init.c | ||
* | ||
* Copyright (C) 2003 - 2008 Paul Mundt | ||
* | ||
* Based on arch/mips/oprofile/common.c: | ||
* | ||
* Copyright (C) 2004, 2005 Ralf Baechle | ||
* Copyright (C) 2005 MIPS Technologies, Inc. | ||
* | ||
* This file is subject to the terms and conditions of the GNU General Public | ||
* License. See the file "COPYING" in the main directory of this archive | ||
* for more details. | ||
*/ | ||
#include <linux/kernel.h> | ||
#include <linux/oprofile.h> | ||
#include <linux/init.h> | ||
#include <linux/errno.h> | ||
#include <linux/smp.h> | ||
#include <asm/processor.h> | ||
#include "op_impl.h" | ||
|
||
extern struct op_sh_model op_model_sh7750_ops __weak; | ||
extern struct op_sh_model op_model_sh4a_ops __weak; | ||
|
||
static struct op_sh_model *model; | ||
|
||
static struct op_counter_config ctr[20]; | ||
|
||
static int op_sh_setup(void) | ||
{ | ||
/* Pre-compute the values to stuff in the hardware registers. */ | ||
model->reg_setup(ctr); | ||
|
||
/* Configure the registers on all cpus. */ | ||
on_each_cpu(model->cpu_setup, NULL, 1); | ||
|
||
return 0; | ||
} | ||
|
||
static int op_sh_create_files(struct super_block *sb, struct dentry *root) | ||
{ | ||
int i, ret = 0; | ||
|
||
for (i = 0; i < model->num_counters; i++) { | ||
struct dentry *dir; | ||
char buf[4]; | ||
|
||
snprintf(buf, sizeof(buf), "%d", i); | ||
dir = oprofilefs_mkdir(sb, root, buf); | ||
|
||
ret |= oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); | ||
ret |= oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); | ||
ret |= oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); | ||
ret |= oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); | ||
|
||
if (model->create_files) | ||
ret |= model->create_files(sb, dir); | ||
else | ||
ret |= oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); | ||
|
||
/* Dummy entries */ | ||
ret |= oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); | ||
} | ||
|
||
return ret; | ||
} | ||
|
||
static int op_sh_start(void) | ||
{ | ||
/* Enable performance monitoring for all counters. */ | ||
on_each_cpu(model->cpu_start, NULL, 1); | ||
|
||
return 0; | ||
} | ||
|
||
static void op_sh_stop(void) | ||
{ | ||
/* Disable performance monitoring for all counters. */ | ||
on_each_cpu(model->cpu_stop, NULL, 1); | ||
} | ||
|
||
int __init oprofile_arch_init(struct oprofile_operations *ops) | ||
{ | ||
struct op_sh_model *lmodel = NULL; | ||
int ret; | ||
|
||
switch (current_cpu_data.type) { | ||
/* SH-4 types */ | ||
case CPU_SH7750: | ||
case CPU_SH7750S: | ||
lmodel = &op_model_sh7750_ops; | ||
break; | ||
|
||
/* SH-4A types */ | ||
case CPU_SH7763: | ||
case CPU_SH7770: | ||
case CPU_SH7780: | ||
case CPU_SH7781: | ||
case CPU_SH7785: | ||
case CPU_SH7723: | ||
case CPU_SHX3: | ||
lmodel = &op_model_sh4a_ops; | ||
break; | ||
|
||
/* SH4AL-DSP types */ | ||
case CPU_SH7343: | ||
case CPU_SH7722: | ||
case CPU_SH7366: | ||
lmodel = &op_model_sh4a_ops; | ||
break; | ||
} | ||
|
||
if (!lmodel) | ||
return -ENODEV; | ||
if (!(current_cpu_data.flags & CPU_HAS_PERF_COUNTER)) | ||
return -ENODEV; | ||
|
||
ret = lmodel->init(); | ||
if (unlikely(ret != 0)) | ||
return ret; | ||
|
||
model = lmodel; | ||
|
||
ops->setup = op_sh_setup; | ||
ops->create_files = op_sh_create_files; | ||
ops->start = op_sh_start; | ||
ops->stop = op_sh_stop; | ||
ops->cpu_type = lmodel->cpu_type; | ||
|
||
printk(KERN_INFO "oprofile: using %s performance monitoring.\n", | ||
lmodel->cpu_type); | ||
|
||
return 0; | ||
} | ||
|
||
void oprofile_arch_exit(void) | ||
{ | ||
if (model && model->exit) | ||
model->exit(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
#ifndef __OP_IMPL_H | ||
#define __OP_IMPL_H | ||
|
||
/* Per-counter configuration as set via oprofilefs. */ | ||
struct op_counter_config { | ||
unsigned long enabled; | ||
unsigned long event; | ||
|
||
unsigned long long count; | ||
|
||
/* Dummy values for userspace tool compliance */ | ||
unsigned long kernel; | ||
unsigned long user; | ||
unsigned long unit_mask; | ||
}; | ||
|
||
/* Per-architecture configury and hooks. */ | ||
struct op_sh_model { | ||
void (*reg_setup)(struct op_counter_config *); | ||
int (*create_files)(struct super_block *sb, struct dentry *dir); | ||
void (*cpu_setup)(void *dummy); | ||
int (*init)(void); | ||
void (*exit)(void); | ||
void (*cpu_start)(void *args); | ||
void (*cpu_stop)(void *args); | ||
char *cpu_type; | ||
unsigned char num_counters; | ||
}; | ||
|
||
/* arch/sh/oprofile/common.c */ | ||
extern void sh_backtrace(struct pt_regs * const regs, unsigned int depth); | ||
|
||
#endif /* __OP_IMPL_H */ |
This file was deleted.
Oops, something went wrong.