aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorMaynard Johnson <mpjohn@us.ibm.com>2007-02-13 16:02:03 -0500
committerArnd Bergmann <arnd@klappe.arndb.de>2007-02-13 16:03:07 -0500
commitc7eb734766217b9ddac217cbccae3aedcfa67520 (patch)
tree43019f359ce1b9194d59d42328f29919d3705d43 /arch/powerpc
parentbcb63e25ed3c56ee40cca4d18fbaac1d2a40c1d6 (diff)
[POWERPC] cell: pm_rtas_activat_signals routine cleanup
The code was setting up the debug bus for group 21 when profiling on the event PPU CYCLES. The debug bus is not actually used by the hardware performance counters when counting PPU CYCLES. Setting up the debug bus for PPU CYCLES causes signal routing conflicts on the debug bus when profiling PPU cycles and another PPU event. This patch fixes the code to only setup the debug bus to route the performance signals for the non PPU CYCLE events. Signed-off-by: Maynard Johnson <mpjohn@us.ibm.com> Signed-off-by: Carl Love <carll@us.ibm.com> Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/oprofile/op_model_cell.c49
1 files changed, 33 insertions, 16 deletions
diff --git a/arch/powerpc/oprofile/op_model_cell.c b/arch/powerpc/oprofile/op_model_cell.c
index 8d4a9586464d..e08e1d7b3dc5 100644
--- a/arch/powerpc/oprofile/op_model_cell.c
+++ b/arch/powerpc/oprofile/op_model_cell.c
@@ -39,6 +39,9 @@
39#include "../platforms/cell/interrupt.h" 39#include "../platforms/cell/interrupt.h"
40 40
41#define PPU_CYCLES_EVENT_NUM 1 /* event number for CYCLES */ 41#define PPU_CYCLES_EVENT_NUM 1 /* event number for CYCLES */
42#define PPU_CYCLES_GRP_NUM 1 /* special group number for identifying
43 * PPU_CYCLES event
44 */
42#define CBE_COUNT_ALL_CYCLES 0x42800000 /* PPU cycle event specifier */ 45#define CBE_COUNT_ALL_CYCLES 0x42800000 /* PPU cycle event specifier */
43 46
44#define NUM_THREADS 2 /* number of physical threads in 47#define NUM_THREADS 2 /* number of physical threads in
@@ -62,7 +65,7 @@ struct pmc_cntrl_data {
62struct pm_signal { 65struct pm_signal {
63 u16 cpu; /* Processor to modify */ 66 u16 cpu; /* Processor to modify */
64 u16 sub_unit; /* hw subunit this applies to (if applicable) */ 67 u16 sub_unit; /* hw subunit this applies to (if applicable) */
65 u16 signal_group; /* Signal Group to Enable/Disable */ 68 short int signal_group; /* Signal Group to Enable/Disable */
66 u8 bus_word; /* Enable/Disable on this Trace/Trigger/Event 69 u8 bus_word; /* Enable/Disable on this Trace/Trigger/Event
67 * Bus Word(s) (bitmask) 70 * Bus Word(s) (bitmask)
68 */ 71 */
@@ -179,26 +182,40 @@ static void pm_rtas_reset_signals(u32 node)
179static void pm_rtas_activate_signals(u32 node, u32 count) 182static void pm_rtas_activate_signals(u32 node, u32 count)
180{ 183{
181 int ret; 184 int ret;
182 int j; 185 int i, j;
183 struct pm_signal pm_signal_local[NR_PHYS_CTRS]; 186 struct pm_signal pm_signal_local[NR_PHYS_CTRS];
184 187
188 /* There is no debug setup required for the cycles event.
189 * Note that only events in the same group can be used.
190 * Otherwise, there will be conflicts in correctly routing
191 * the signals on the debug bus. It is the responsiblity
192 * of the OProfile user tool to check the events are in
193 * the same group.
194 */
195 i = 0;
185 for (j = 0; j < count; j++) { 196 for (j = 0; j < count; j++) {
186 /* fw expects physical cpu # */ 197 if (pm_signal[j].signal_group != PPU_CYCLES_GRP_NUM) {
187 pm_signal_local[j].cpu = node; 198
188 pm_signal_local[j].signal_group 199 /* fw expects physical cpu # */
189 = pm_signal[j].signal_group; 200 pm_signal_local[i].cpu = node;
190 pm_signal_local[j].bus_word = pm_signal[j].bus_word; 201 pm_signal_local[i].signal_group
191 pm_signal_local[j].sub_unit = pm_signal[j].sub_unit; 202 = pm_signal[j].signal_group;
192 pm_signal_local[j].bit = pm_signal[j].bit; 203 pm_signal_local[i].bus_word = pm_signal[j].bus_word;
204 pm_signal_local[i].sub_unit = pm_signal[j].sub_unit;
205 pm_signal_local[i].bit = pm_signal[j].bit;
206 i++;
207 }
193 } 208 }
194 209
195 ret = rtas_ibm_cbe_perftools(SUBFUNC_ACTIVATE, PASSTHRU_ENABLE, 210 if (i != 0) {
196 pm_signal_local, 211 ret = rtas_ibm_cbe_perftools(SUBFUNC_ACTIVATE, PASSTHRU_ENABLE,
197 count * sizeof(struct pm_signal)); 212 pm_signal_local,
213 i * sizeof(struct pm_signal));
198 214
199 if (ret) 215 if (ret)
200 printk(KERN_WARNING "%s: rtas returned: %d\n", 216 printk(KERN_WARNING "%s: rtas returned: %d\n",
201 __FUNCTION__, ret); 217 __FUNCTION__, ret);
218 }
202} 219}
203 220
204/* 221/*
@@ -215,7 +232,7 @@ static void set_pm_event(u32 ctr, int event, u32 unit_mask)
215 /* Special Event: Count all cpu cycles */ 232 /* Special Event: Count all cpu cycles */
216 pm_regs.pm07_cntrl[ctr] = CBE_COUNT_ALL_CYCLES; 233 pm_regs.pm07_cntrl[ctr] = CBE_COUNT_ALL_CYCLES;
217 p = &(pm_signal[ctr]); 234 p = &(pm_signal[ctr]);
218 p->signal_group = 21; 235 p->signal_group = PPU_CYCLES_GRP_NUM;
219 p->bus_word = 1; 236 p->bus_word = 1;
220 p->sub_unit = 0; 237 p->sub_unit = 0;
221 p->bit = 0; 238 p->bit = 0;