162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#undef TRACE_SYSTEM
362306a36Sopenharmony_ci#define TRACE_SYSTEM powerpc
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#if !defined(_TRACE_POWERPC_H) || defined(TRACE_HEADER_MULTI_READ)
662306a36Sopenharmony_ci#define _TRACE_POWERPC_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/tracepoint.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistruct pt_regs;
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciDECLARE_EVENT_CLASS(ppc64_interrupt_class,
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci	TP_PROTO(struct pt_regs *regs),
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci	TP_ARGS(regs),
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci	TP_STRUCT__entry(
1962306a36Sopenharmony_ci		__field(struct pt_regs *, regs)
2062306a36Sopenharmony_ci	),
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	TP_fast_assign(
2362306a36Sopenharmony_ci		__entry->regs = regs;
2462306a36Sopenharmony_ci	),
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	TP_printk("pt_regs=%p", __entry->regs)
2762306a36Sopenharmony_ci);
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciDEFINE_EVENT(ppc64_interrupt_class, irq_entry,
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	TP_PROTO(struct pt_regs *regs),
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	TP_ARGS(regs)
3462306a36Sopenharmony_ci);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciDEFINE_EVENT(ppc64_interrupt_class, irq_exit,
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	TP_PROTO(struct pt_regs *regs),
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	TP_ARGS(regs)
4162306a36Sopenharmony_ci);
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ciDEFINE_EVENT(ppc64_interrupt_class, timer_interrupt_entry,
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	TP_PROTO(struct pt_regs *regs),
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	TP_ARGS(regs)
4862306a36Sopenharmony_ci);
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciDEFINE_EVENT(ppc64_interrupt_class, timer_interrupt_exit,
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	TP_PROTO(struct pt_regs *regs),
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	TP_ARGS(regs)
5562306a36Sopenharmony_ci);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#ifdef CONFIG_PPC_DOORBELL
5862306a36Sopenharmony_ciDEFINE_EVENT(ppc64_interrupt_class, doorbell_entry,
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	TP_PROTO(struct pt_regs *regs),
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	TP_ARGS(regs)
6362306a36Sopenharmony_ci);
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciDEFINE_EVENT(ppc64_interrupt_class, doorbell_exit,
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	TP_PROTO(struct pt_regs *regs),
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	TP_ARGS(regs)
7062306a36Sopenharmony_ci);
7162306a36Sopenharmony_ci#endif
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci#ifdef CONFIG_PPC_PSERIES
7462306a36Sopenharmony_ciextern int hcall_tracepoint_regfunc(void);
7562306a36Sopenharmony_ciextern void hcall_tracepoint_unregfunc(void);
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ciTRACE_EVENT_FN_COND(hcall_entry,
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	TP_PROTO(unsigned long opcode, unsigned long *args),
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	TP_ARGS(opcode, args),
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	TP_CONDITION(cpu_online(raw_smp_processor_id())),
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	TP_STRUCT__entry(
8662306a36Sopenharmony_ci		__field(unsigned long, opcode)
8762306a36Sopenharmony_ci	),
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	TP_fast_assign(
9062306a36Sopenharmony_ci		__entry->opcode = opcode;
9162306a36Sopenharmony_ci	),
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	TP_printk("opcode=%lu", __entry->opcode),
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	hcall_tracepoint_regfunc, hcall_tracepoint_unregfunc
9662306a36Sopenharmony_ci);
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ciTRACE_EVENT_FN_COND(hcall_exit,
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	TP_PROTO(unsigned long opcode, long retval, unsigned long *retbuf),
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	TP_ARGS(opcode, retval, retbuf),
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	TP_CONDITION(cpu_online(raw_smp_processor_id())),
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	TP_STRUCT__entry(
10762306a36Sopenharmony_ci		__field(unsigned long, opcode)
10862306a36Sopenharmony_ci		__field(long, retval)
10962306a36Sopenharmony_ci	),
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	TP_fast_assign(
11262306a36Sopenharmony_ci		__entry->opcode = opcode;
11362306a36Sopenharmony_ci		__entry->retval = retval;
11462306a36Sopenharmony_ci	),
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	TP_printk("opcode=%lu retval=%ld", __entry->opcode, __entry->retval),
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	hcall_tracepoint_regfunc, hcall_tracepoint_unregfunc
11962306a36Sopenharmony_ci);
12062306a36Sopenharmony_ci#endif
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci#ifdef CONFIG_PPC_RTAS
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci#include <asm/rtas-types.h>
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ciTRACE_EVENT(rtas_input,
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	TP_PROTO(struct rtas_args *rtas_args, const char *name),
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	TP_ARGS(rtas_args, name),
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	TP_STRUCT__entry(
13362306a36Sopenharmony_ci		__field(__u32, nargs)
13462306a36Sopenharmony_ci		__string(name, name)
13562306a36Sopenharmony_ci		__dynamic_array(__u32, inputs, be32_to_cpu(rtas_args->nargs))
13662306a36Sopenharmony_ci	),
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	TP_fast_assign(
13962306a36Sopenharmony_ci		__entry->nargs = be32_to_cpu(rtas_args->nargs);
14062306a36Sopenharmony_ci		__assign_str(name, name);
14162306a36Sopenharmony_ci		be32_to_cpu_array(__get_dynamic_array(inputs), rtas_args->args, __entry->nargs);
14262306a36Sopenharmony_ci	),
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci	TP_printk("%s arguments: %s", __get_str(name),
14562306a36Sopenharmony_ci		  __print_array(__get_dynamic_array(inputs), __entry->nargs, 4)
14662306a36Sopenharmony_ci	)
14762306a36Sopenharmony_ci);
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ciTRACE_EVENT(rtas_output,
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci	TP_PROTO(struct rtas_args *rtas_args, const char *name),
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	TP_ARGS(rtas_args, name),
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	TP_STRUCT__entry(
15662306a36Sopenharmony_ci		__field(__u32, nr_other)
15762306a36Sopenharmony_ci		__field(__s32, status)
15862306a36Sopenharmony_ci		__string(name, name)
15962306a36Sopenharmony_ci		__dynamic_array(__u32, other_outputs, be32_to_cpu(rtas_args->nret) - 1)
16062306a36Sopenharmony_ci	),
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	TP_fast_assign(
16362306a36Sopenharmony_ci		__entry->nr_other = be32_to_cpu(rtas_args->nret) - 1;
16462306a36Sopenharmony_ci		__entry->status = be32_to_cpu(rtas_args->rets[0]);
16562306a36Sopenharmony_ci		__assign_str(name, name);
16662306a36Sopenharmony_ci		be32_to_cpu_array(__get_dynamic_array(other_outputs),
16762306a36Sopenharmony_ci				  &rtas_args->rets[1], __entry->nr_other);
16862306a36Sopenharmony_ci	),
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci	TP_printk("%s status: %d, other outputs: %s", __get_str(name), __entry->status,
17162306a36Sopenharmony_ci		  __print_array(__get_dynamic_array(other_outputs),
17262306a36Sopenharmony_ci				__entry->nr_other, 4)
17362306a36Sopenharmony_ci	)
17462306a36Sopenharmony_ci);
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ciDECLARE_EVENT_CLASS(rtas_parameter_block,
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	TP_PROTO(struct rtas_args *rtas_args),
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci	TP_ARGS(rtas_args),
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	TP_STRUCT__entry(
18362306a36Sopenharmony_ci		__field(u32, token)
18462306a36Sopenharmony_ci		__field(u32, nargs)
18562306a36Sopenharmony_ci		__field(u32, nret)
18662306a36Sopenharmony_ci		__array(__u32, params, 16)
18762306a36Sopenharmony_ci	),
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	TP_fast_assign(
19062306a36Sopenharmony_ci		__entry->token = be32_to_cpu(rtas_args->token);
19162306a36Sopenharmony_ci		__entry->nargs = be32_to_cpu(rtas_args->nargs);
19262306a36Sopenharmony_ci		__entry->nret = be32_to_cpu(rtas_args->nret);
19362306a36Sopenharmony_ci		be32_to_cpu_array(__entry->params, rtas_args->args, ARRAY_SIZE(rtas_args->args));
19462306a36Sopenharmony_ci	),
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci	TP_printk("token=%u nargs=%u nret=%u params:"
19762306a36Sopenharmony_ci		  " [0]=0x%08x [1]=0x%08x [2]=0x%08x [3]=0x%08x"
19862306a36Sopenharmony_ci		  " [4]=0x%08x [5]=0x%08x [6]=0x%08x [7]=0x%08x"
19962306a36Sopenharmony_ci		  " [8]=0x%08x [9]=0x%08x [10]=0x%08x [11]=0x%08x"
20062306a36Sopenharmony_ci		  " [12]=0x%08x [13]=0x%08x [14]=0x%08x [15]=0x%08x",
20162306a36Sopenharmony_ci		  __entry->token, __entry->nargs, __entry->nret,
20262306a36Sopenharmony_ci		  __entry->params[0], __entry->params[1], __entry->params[2], __entry->params[3],
20362306a36Sopenharmony_ci		  __entry->params[4], __entry->params[5], __entry->params[6], __entry->params[7],
20462306a36Sopenharmony_ci		  __entry->params[8], __entry->params[9], __entry->params[10], __entry->params[11],
20562306a36Sopenharmony_ci		  __entry->params[12], __entry->params[13], __entry->params[14], __entry->params[15]
20662306a36Sopenharmony_ci	)
20762306a36Sopenharmony_ci);
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ciDEFINE_EVENT(rtas_parameter_block, rtas_ll_entry,
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	TP_PROTO(struct rtas_args *rtas_args),
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	TP_ARGS(rtas_args)
21462306a36Sopenharmony_ci);
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ciDEFINE_EVENT(rtas_parameter_block, rtas_ll_exit,
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci	TP_PROTO(struct rtas_args *rtas_args),
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	TP_ARGS(rtas_args)
22162306a36Sopenharmony_ci);
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci#endif /* CONFIG_PPC_RTAS */
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci#ifdef CONFIG_PPC_POWERNV
22662306a36Sopenharmony_ciextern int opal_tracepoint_regfunc(void);
22762306a36Sopenharmony_ciextern void opal_tracepoint_unregfunc(void);
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ciTRACE_EVENT_FN(opal_entry,
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci	TP_PROTO(unsigned long opcode, unsigned long *args),
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci	TP_ARGS(opcode, args),
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci	TP_STRUCT__entry(
23662306a36Sopenharmony_ci		__field(unsigned long, opcode)
23762306a36Sopenharmony_ci	),
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci	TP_fast_assign(
24062306a36Sopenharmony_ci		__entry->opcode = opcode;
24162306a36Sopenharmony_ci	),
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci	TP_printk("opcode=%lu", __entry->opcode),
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	opal_tracepoint_regfunc, opal_tracepoint_unregfunc
24662306a36Sopenharmony_ci);
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ciTRACE_EVENT_FN(opal_exit,
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	TP_PROTO(unsigned long opcode, unsigned long retval),
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci	TP_ARGS(opcode, retval),
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	TP_STRUCT__entry(
25562306a36Sopenharmony_ci		__field(unsigned long, opcode)
25662306a36Sopenharmony_ci		__field(unsigned long, retval)
25762306a36Sopenharmony_ci	),
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci	TP_fast_assign(
26062306a36Sopenharmony_ci		__entry->opcode = opcode;
26162306a36Sopenharmony_ci		__entry->retval = retval;
26262306a36Sopenharmony_ci	),
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci	TP_printk("opcode=%lu retval=%lu", __entry->opcode, __entry->retval),
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci	opal_tracepoint_regfunc, opal_tracepoint_unregfunc
26762306a36Sopenharmony_ci);
26862306a36Sopenharmony_ci#endif
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ciTRACE_EVENT(hash_fault,
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci	    TP_PROTO(unsigned long addr, unsigned long access, unsigned long trap),
27362306a36Sopenharmony_ci	    TP_ARGS(addr, access, trap),
27462306a36Sopenharmony_ci	    TP_STRUCT__entry(
27562306a36Sopenharmony_ci		    __field(unsigned long, addr)
27662306a36Sopenharmony_ci		    __field(unsigned long, access)
27762306a36Sopenharmony_ci		    __field(unsigned long, trap)
27862306a36Sopenharmony_ci		    ),
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci	    TP_fast_assign(
28162306a36Sopenharmony_ci		    __entry->addr = addr;
28262306a36Sopenharmony_ci		    __entry->access = access;
28362306a36Sopenharmony_ci		    __entry->trap = trap;
28462306a36Sopenharmony_ci		    ),
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci	    TP_printk("hash fault with addr 0x%lx and access = 0x%lx trap = 0x%lx",
28762306a36Sopenharmony_ci		      __entry->addr, __entry->access, __entry->trap)
28862306a36Sopenharmony_ci);
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ciTRACE_EVENT(tlbie,
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci	TP_PROTO(unsigned long lpid, unsigned long local, unsigned long rb,
29462306a36Sopenharmony_ci		unsigned long rs, unsigned long ric, unsigned long prs,
29562306a36Sopenharmony_ci		unsigned long r),
29662306a36Sopenharmony_ci	TP_ARGS(lpid, local, rb, rs, ric, prs, r),
29762306a36Sopenharmony_ci	TP_STRUCT__entry(
29862306a36Sopenharmony_ci		__field(unsigned long, lpid)
29962306a36Sopenharmony_ci		__field(unsigned long, local)
30062306a36Sopenharmony_ci		__field(unsigned long, rb)
30162306a36Sopenharmony_ci		__field(unsigned long, rs)
30262306a36Sopenharmony_ci		__field(unsigned long, ric)
30362306a36Sopenharmony_ci		__field(unsigned long, prs)
30462306a36Sopenharmony_ci		__field(unsigned long, r)
30562306a36Sopenharmony_ci		),
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	TP_fast_assign(
30862306a36Sopenharmony_ci		__entry->lpid = lpid;
30962306a36Sopenharmony_ci		__entry->local = local;
31062306a36Sopenharmony_ci		__entry->rb = rb;
31162306a36Sopenharmony_ci		__entry->rs = rs;
31262306a36Sopenharmony_ci		__entry->ric = ric;
31362306a36Sopenharmony_ci		__entry->prs = prs;
31462306a36Sopenharmony_ci		__entry->r = r;
31562306a36Sopenharmony_ci		),
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci	TP_printk("lpid=%ld, local=%ld, rb=0x%lx, rs=0x%lx, ric=0x%lx, "
31862306a36Sopenharmony_ci		"prs=0x%lx, r=0x%lx", __entry->lpid, __entry->local,
31962306a36Sopenharmony_ci		__entry->rb, __entry->rs, __entry->ric, __entry->prs,
32062306a36Sopenharmony_ci		__entry->r)
32162306a36Sopenharmony_ci);
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ciTRACE_EVENT(tlbia,
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci	TP_PROTO(unsigned long id),
32662306a36Sopenharmony_ci	TP_ARGS(id),
32762306a36Sopenharmony_ci	TP_STRUCT__entry(
32862306a36Sopenharmony_ci		__field(unsigned long, id)
32962306a36Sopenharmony_ci		),
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci	TP_fast_assign(
33262306a36Sopenharmony_ci		__entry->id = id;
33362306a36Sopenharmony_ci		),
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci	TP_printk("ctx.id=0x%lx", __entry->id)
33662306a36Sopenharmony_ci);
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci#endif /* _TRACE_POWERPC_H */
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci#undef TRACE_INCLUDE_PATH
34162306a36Sopenharmony_ci#undef TRACE_INCLUDE_FILE
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_ci#define TRACE_INCLUDE_PATH asm
34462306a36Sopenharmony_ci#define TRACE_INCLUDE_FILE trace
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci#include <trace/define_trace.h>
347