diff options
Diffstat (limited to 'arch/powerpc/oprofile/common.c')
| -rw-r--r-- | arch/powerpc/oprofile/common.c | 61 | 
1 files changed, 12 insertions, 49 deletions
| diff --git a/arch/powerpc/oprofile/common.c b/arch/powerpc/oprofile/common.c index af2c05d20ba5..a370778b68dd 100644 --- a/arch/powerpc/oprofile/common.c +++ b/arch/powerpc/oprofile/common.c | |||
| @@ -14,9 +14,6 @@ | |||
| 14 | */ | 14 | */ | 
| 15 | 15 | ||
| 16 | #include <linux/oprofile.h> | 16 | #include <linux/oprofile.h> | 
| 17 | #ifndef __powerpc64__ | ||
| 18 | #include <linux/slab.h> | ||
| 19 | #endif /* ! __powerpc64__ */ | ||
| 20 | #include <linux/init.h> | 17 | #include <linux/init.h> | 
| 21 | #include <linux/smp.h> | 18 | #include <linux/smp.h> | 
| 22 | #include <linux/errno.h> | 19 | #include <linux/errno.h> | 
| @@ -31,10 +28,6 @@ static struct op_powerpc_model *model; | |||
| 31 | static struct op_counter_config ctr[OP_MAX_COUNTER]; | 28 | static struct op_counter_config ctr[OP_MAX_COUNTER]; | 
| 32 | static struct op_system_config sys; | 29 | static struct op_system_config sys; | 
| 33 | 30 | ||
| 34 | #ifndef __powerpc64__ | ||
| 35 | static char *cpu_type; | ||
| 36 | #endif /* ! __powerpc64__ */ | ||
| 37 | |||
| 38 | static void op_handle_interrupt(struct pt_regs *regs) | 31 | static void op_handle_interrupt(struct pt_regs *regs) | 
| 39 | { | 32 | { | 
| 40 | model->handle_interrupt(regs, ctr); | 33 | model->handle_interrupt(regs, ctr); | 
| @@ -53,14 +46,7 @@ static int op_powerpc_setup(void) | |||
| 53 | model->reg_setup(ctr, &sys, model->num_counters); | 46 | model->reg_setup(ctr, &sys, model->num_counters); | 
| 54 | 47 | ||
| 55 | /* Configure the registers on all cpus. */ | 48 | /* Configure the registers on all cpus. */ | 
| 56 | #ifdef __powerpc64__ | ||
| 57 | on_each_cpu(model->cpu_setup, NULL, 0, 1); | 49 | on_each_cpu(model->cpu_setup, NULL, 0, 1); | 
| 58 | #else /* __powerpc64__ */ | ||
| 59 | #if 0 | ||
| 60 | /* FIXME: Make multi-cpu work */ | ||
| 61 | on_each_cpu(model->reg_setup, NULL, 0, 1); | ||
| 62 | #endif | ||
| 63 | #endif /* __powerpc64__ */ | ||
| 64 | 50 | ||
| 65 | return 0; | 51 | return 0; | 
| 66 | } | 52 | } | 
| @@ -95,7 +81,7 @@ static int op_powerpc_create_files(struct super_block *sb, struct dentry *root) | |||
| 95 | { | 81 | { | 
| 96 | int i; | 82 | int i; | 
| 97 | 83 | ||
| 98 | #ifdef __powerpc64__ | 84 | #ifdef CONFIG_PPC64 | 
| 99 | /* | 85 | /* | 
| 100 | * There is one mmcr0, mmcr1 and mmcra for setting the events for | 86 | * There is one mmcr0, mmcr1 and mmcra for setting the events for | 
| 101 | * all of the counters. | 87 | * all of the counters. | 
| @@ -103,7 +89,7 @@ static int op_powerpc_create_files(struct super_block *sb, struct dentry *root) | |||
| 103 | oprofilefs_create_ulong(sb, root, "mmcr0", &sys.mmcr0); | 89 | oprofilefs_create_ulong(sb, root, "mmcr0", &sys.mmcr0); | 
| 104 | oprofilefs_create_ulong(sb, root, "mmcr1", &sys.mmcr1); | 90 | oprofilefs_create_ulong(sb, root, "mmcr1", &sys.mmcr1); | 
| 105 | oprofilefs_create_ulong(sb, root, "mmcra", &sys.mmcra); | 91 | oprofilefs_create_ulong(sb, root, "mmcra", &sys.mmcra); | 
| 106 | #endif /* __powerpc64__ */ | 92 | #endif | 
| 107 | 93 | ||
| 108 | for (i = 0; i < model->num_counters; ++i) { | 94 | for (i = 0; i < model->num_counters; ++i) { | 
| 109 | struct dentry *dir; | 95 | struct dentry *dir; | 
| @@ -115,65 +101,46 @@ static int op_powerpc_create_files(struct super_block *sb, struct dentry *root) | |||
| 115 | oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); | 101 | oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); | 
| 116 | oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); | 102 | oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); | 
| 117 | oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); | 103 | oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); | 
| 118 | #ifdef __powerpc64__ | 104 | |
| 119 | /* | 105 | /* | 
| 120 | * We dont support per counter user/kernel selection, but | 106 | * Classic PowerPC doesn't support per-counter | 
| 121 | * we leave the entries because userspace expects them | 107 | * control like this, but the options are | 
| 108 | * expected, so they remain. For Freescale | ||
| 109 | * Book-E style performance monitors, we do | ||
| 110 | * support them. | ||
| 122 | */ | 111 | */ | 
| 123 | #endif /* __powerpc64__ */ | ||
| 124 | oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); | 112 | oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); | 
| 125 | oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); | 113 | oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); | 
| 126 | 114 | ||
| 127 | #ifndef __powerpc64__ | ||
| 128 | /* FIXME: Not sure if this is used */ | ||
| 129 | #endif /* ! __powerpc64__ */ | ||
| 130 | oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); | 115 | oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); | 
| 131 | } | 116 | } | 
| 132 | 117 | ||
| 133 | oprofilefs_create_ulong(sb, root, "enable_kernel", &sys.enable_kernel); | 118 | oprofilefs_create_ulong(sb, root, "enable_kernel", &sys.enable_kernel); | 
| 134 | oprofilefs_create_ulong(sb, root, "enable_user", &sys.enable_user); | 119 | oprofilefs_create_ulong(sb, root, "enable_user", &sys.enable_user); | 
| 135 | #ifdef __powerpc64__ | 120 | #ifdef CONFIG_PPC64 | 
| 136 | oprofilefs_create_ulong(sb, root, "backtrace_spinlocks", | 121 | oprofilefs_create_ulong(sb, root, "backtrace_spinlocks", | 
| 137 | &sys.backtrace_spinlocks); | 122 | &sys.backtrace_spinlocks); | 
| 138 | #endif /* __powerpc64__ */ | 123 | #endif | 
| 139 | 124 | ||
| 140 | /* Default to tracing both kernel and user */ | 125 | /* Default to tracing both kernel and user */ | 
| 141 | sys.enable_kernel = 1; | 126 | sys.enable_kernel = 1; | 
| 142 | sys.enable_user = 1; | 127 | sys.enable_user = 1; | 
| 143 | #ifdef __powerpc64__ | 128 | #ifdef CONFIG_PPC64 | 
| 144 | /* Turn on backtracing through spinlocks by default */ | 129 | /* Turn on backtracing through spinlocks by default */ | 
| 145 | sys.backtrace_spinlocks = 1; | 130 | sys.backtrace_spinlocks = 1; | 
| 146 | #endif /* __powerpc64__ */ | 131 | #endif | 
| 147 | 132 | ||
| 148 | return 0; | 133 | return 0; | 
| 149 | } | 134 | } | 
| 150 | 135 | ||
| 151 | int __init oprofile_arch_init(struct oprofile_operations *ops) | 136 | int __init oprofile_arch_init(struct oprofile_operations *ops) | 
| 152 | { | 137 | { | 
| 153 | #ifndef __powerpc64__ | ||
| 154 | #ifdef CONFIG_FSL_BOOKE | ||
| 155 | model = &op_model_fsl_booke; | ||
| 156 | #else | ||
| 157 | return -ENODEV; | ||
| 158 | #endif | ||
| 159 | |||
| 160 | cpu_type = kmalloc(32, GFP_KERNEL); | ||
| 161 | if (NULL == cpu_type) | ||
| 162 | return -ENOMEM; | ||
| 163 | |||
| 164 | sprintf(cpu_type, "ppc/%s", cur_cpu_spec->cpu_name); | ||
| 165 | |||
| 166 | model->num_counters = cur_cpu_spec->num_pmcs; | ||
| 167 | |||
| 168 | ops->cpu_type = cpu_type; | ||
| 169 | #else /* __powerpc64__ */ | ||
| 170 | if (!cur_cpu_spec->oprofile_model || !cur_cpu_spec->oprofile_cpu_type) | 138 | if (!cur_cpu_spec->oprofile_model || !cur_cpu_spec->oprofile_cpu_type) | 
| 171 | return -ENODEV; | 139 | return -ENODEV; | 
| 172 | model = cur_cpu_spec->oprofile_model; | 140 | model = cur_cpu_spec->oprofile_model; | 
| 173 | model->num_counters = cur_cpu_spec->num_pmcs; | 141 | model->num_counters = cur_cpu_spec->num_pmcs; | 
| 174 | 142 | ||
| 175 | ops->cpu_type = cur_cpu_spec->oprofile_cpu_type; | 143 | ops->cpu_type = cur_cpu_spec->oprofile_cpu_type; | 
| 176 | #endif /* __powerpc64__ */ | ||
| 177 | ops->create_files = op_powerpc_create_files; | 144 | ops->create_files = op_powerpc_create_files; | 
| 178 | ops->setup = op_powerpc_setup; | 145 | ops->setup = op_powerpc_setup; | 
| 179 | ops->shutdown = op_powerpc_shutdown; | 146 | ops->shutdown = op_powerpc_shutdown; | 
| @@ -188,8 +155,4 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
| 188 | 155 | ||
| 189 | void oprofile_arch_exit(void) | 156 | void oprofile_arch_exit(void) | 
| 190 | { | 157 | { | 
| 191 | #ifndef __powerpc64__ | ||
| 192 | kfree(cpu_type); | ||
| 193 | cpu_type = NULL; | ||
| 194 | #endif /* ! __powerpc64__ */ | ||
| 195 | } | 158 | } | 
