of: MSI: Simplify irqdomain lookup
[linux/fpc-iii.git] / arch / powerpc / platforms / powernv / opal-tracepoints.c
blobe11273b2386d2db305734905870013fa19197088
1 #include <linux/percpu.h>
2 #include <linux/jump_label.h>
3 #include <asm/trace.h>
5 #ifdef HAVE_JUMP_LABEL
6 struct static_key opal_tracepoint_key = STATIC_KEY_INIT;
8 void opal_tracepoint_regfunc(void)
10 static_key_slow_inc(&opal_tracepoint_key);
13 void opal_tracepoint_unregfunc(void)
15 static_key_slow_dec(&opal_tracepoint_key);
17 #else
19 * We optimise OPAL calls by placing opal_tracepoint_refcount
20 * directly in the TOC so we can check if the opal tracepoints are
21 * enabled via a single load.
24 /* NB: reg/unreg are called while guarded with the tracepoints_mutex */
25 extern long opal_tracepoint_refcount;
27 void opal_tracepoint_regfunc(void)
29 opal_tracepoint_refcount++;
32 void opal_tracepoint_unregfunc(void)
34 opal_tracepoint_refcount--;
36 #endif
39 * Since the tracing code might execute OPAL calls we need to guard against
40 * recursion.
42 static DEFINE_PER_CPU(unsigned int, opal_trace_depth);
44 void __trace_opal_entry(unsigned long opcode, unsigned long *args)
46 unsigned long flags;
47 unsigned int *depth;
49 local_irq_save(flags);
51 depth = this_cpu_ptr(&opal_trace_depth);
53 if (*depth)
54 goto out;
56 (*depth)++;
57 preempt_disable();
58 trace_opal_entry(opcode, args);
59 (*depth)--;
61 out:
62 local_irq_restore(flags);
65 void __trace_opal_exit(long opcode, unsigned long retval)
67 unsigned long flags;
68 unsigned int *depth;
70 local_irq_save(flags);
72 depth = this_cpu_ptr(&opal_trace_depth);
74 if (*depth)
75 goto out;
77 (*depth)++;
78 trace_opal_exit(opcode, retval);
79 preempt_enable();
80 (*depth)--;
82 out:
83 local_irq_restore(flags);