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