/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2021, The Linux Foundation. All rights reserved.
 * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
 */

#undef TRACE_SYSTEM
#define TRACE_SYSTEM smcinvoke

#if !defined(_TRACE_SMCINVOKE_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_SMCINVOKE_H
#include <linux/types.h>
#include <linux/tracepoint.h>
#include "smcinvoke.h"

TRACE_EVENT(put_pending_cbobj_locked,
	TP_PROTO(uint16_t srvr_id, uint16_t obj_id),
	TP_ARGS(srvr_id, obj_id),
	TP_STRUCT__entry(
		__field(uint16_t,	srvr_id)
		__field(uint16_t,	obj_id)
	),
	TP_fast_assign(
		__entry->srvr_id	= srvr_id;
		__entry->obj_id		= obj_id;
	),
	TP_printk("srvr_id=0x%x obj_id=0x%x",
			__entry->srvr_id, __entry->obj_id)
);

TRACE_EVENT(release_mem_obj_locked,
	TP_PROTO(uint32_t tzhandle, size_t buf_len),
	TP_ARGS(tzhandle, buf_len),
	TP_STRUCT__entry(
		__field(uint32_t,	tzhandle)
		__field(size_t,		buf_len)
	),
	TP_fast_assign(
		__entry->tzhandle	= tzhandle;
		__entry->buf_len	= buf_len;
	),
	TP_printk("tzhandle=0x%08x, buf_len=%zu",
			__entry->tzhandle, __entry->buf_len)
);

TRACE_EVENT(invoke_cmd_handler,
	TP_PROTO(int cmd, uint64_t response_type, int32_t result, int ret),
	TP_ARGS(cmd, response_type, result, ret),
	TP_STRUCT__entry(
		__field(int,		cmd)
		__field(uint64_t,	response_type)
		__field(int32_t,	result)
		__field(int,		ret)
	),
	TP_fast_assign(
		__entry->response_type	= response_type;
		__entry->result		= result;
		__entry->ret		= ret;
		__entry->cmd		= cmd;
	),
	TP_printk("cmd=0x%x (%d), response_type=%llu, result=0x%x (%d), ret=%d",
			__entry->cmd, __entry->cmd, __entry->response_type,
			__entry->result, __entry->result, __entry->ret)
);

TRACE_EVENT(process_tzcb_req_handle,
	TP_PROTO(uint32_t tzhandle, uint32_t op, uint32_t counts),
	TP_ARGS(tzhandle, op, counts),
	TP_STRUCT__entry(
		__field(uint32_t,	tzhandle)
		__field(uint32_t,	op)
		__field(uint32_t,	counts)
	),
	TP_fast_assign(
		__entry->tzhandle	= tzhandle;
		__entry->op		= op;
		__entry->counts		= counts;
	),
	TP_printk("tzhandle=0x%08x op=0x%02x counts=0x%04x",
			__entry->tzhandle, __entry->op, __entry->counts)
);

TRACE_EVENT(process_tzcb_req_wait,
	TP_PROTO(uint32_t tzhandle, int cbobj_retries, uint32_t txn_id, pid_t pid, pid_t tgid,
			uint16_t server_state, uint16_t server_id, unsigned int cb_reqs_inflight),
	TP_ARGS(tzhandle, cbobj_retries, txn_id, pid, tgid, server_state, server_id,
			cb_reqs_inflight),
	TP_STRUCT__entry(
		__field(uint32_t,	tzhandle)
		__field(int,		cbobj_retries)
		__field(uint32_t,	txn_id)
		__field(pid_t,		pid)
		__field(pid_t,		tgid)
		__field(uint16_t,	server_state)
		__field(uint16_t,	server_id)
		__field(unsigned int,	cb_reqs_inflight)
	),
	TP_fast_assign(
		__entry->tzhandle		= tzhandle;
		__entry->cbobj_retries		= cbobj_retries;
		__entry->txn_id			= txn_id;
		__entry->pid			= pid;
		__entry->tgid			= tgid;
		__entry->server_state		= server_state;
		__entry->server_id		= server_id;
		__entry->cb_reqs_inflight	= cb_reqs_inflight;
	),
	TP_printk("tzhandle=0x%08x, retries=%d, txn_id=%d, pid %x,tid %x, srvr state=%d, server_id=0x%x, cb_reqs_inflight=%d",
			__entry->tzhandle, __entry->cbobj_retries, __entry->txn_id,
			__entry->pid, __entry->tgid, __entry->server_state,
			__entry->server_id, __entry->cb_reqs_inflight)
);

TRACE_EVENT(process_tzcb_req_result,
	TP_PROTO(int32_t result, uint32_t tzhandle, uint32_t op, uint32_t counts,
			unsigned int cb_reqs_inflight),
	TP_ARGS(result, tzhandle, op, counts, cb_reqs_inflight),
	TP_STRUCT__entry(
		__field(int32_t,	result)
		__field(uint32_t,	tzhandle)
		__field(uint32_t,	op)
		__field(uint32_t,	counts)
		__field(unsigned int,	cb_reqs_inflight)
	),
	TP_fast_assign(
		__entry->result			= result;
		__entry->tzhandle		= tzhandle;
		__entry->op			= op;
		__entry->counts			= counts;
		__entry->cb_reqs_inflight	= cb_reqs_inflight;
	),
	TP_printk("result=%d tzhandle=0x%08x op=0x%02x counts=0x%04x, cb_reqs_inflight=%d",
			__entry->result, __entry->tzhandle, __entry->op, __entry->counts,
			__entry->cb_reqs_inflight)
);

TRACE_EVENT(marshal_out_invoke_req,
	TP_PROTO(int i, uint32_t tzhandle, uint16_t server, uint32_t fd),
	TP_ARGS(i, tzhandle, server, fd),
	TP_STRUCT__entry(
		__field(int,		i)
		__field(uint32_t,	tzhandle)
		__field(uint16_t,	server)
		__field(uint32_t,	fd)
	),
	TP_fast_assign(
		__entry->i		= i;
		__entry->tzhandle	= tzhandle;
		__entry->server		= server;
		__entry->fd		= fd;
	),
	TP_printk("OO[%d]: tzhandle=0x%x server=0x%x fd=0x%x",
			__entry->i, __entry->tzhandle, __entry->server, __entry->fd)
);

TRACE_EVENT(prepare_send_scm_msg,
	TP_PROTO(uint64_t response_type, int32_t result),
	TP_ARGS(response_type, result),
	TP_STRUCT__entry(
		__field(uint64_t,	response_type)
		__field(int32_t,	result)
	),
	TP_fast_assign(
		__entry->response_type	= response_type;
		__entry->result		= result;
	),
	TP_printk("response_type=%llu (%llu), result=0x%x (%d)",
			__entry->response_type, __entry->response_type,
			__entry->result, __entry->result)
);

TRACE_EVENT(marshal_in_invoke_req,
	TP_PROTO(int i, int64_t fd, int32_t cb_server_fd, uint32_t tzhandle),
	TP_ARGS(i, fd, cb_server_fd, tzhandle),
	TP_STRUCT__entry(
		__field(int,		i)
		__field(int64_t,	fd)
		__field(int32_t,	cb_server_fd)
		__field(uint32_t,	tzhandle)
	),
	TP_fast_assign(
		__entry->i		= i;
		__entry->fd		= fd;
		__entry->cb_server_fd	= cb_server_fd;
		__entry->tzhandle	= tzhandle;
	),
	TP_printk("OI[%d]: fd=%lld cb_server_fd=0x%x tzhandle=0x%x",
			__entry->i, __entry->fd, __entry->cb_server_fd, __entry->tzhandle)
);

TRACE_EVENT(marshal_in_tzcb_req_handle,
	TP_PROTO(uint32_t tzhandle, int srvr_id, int32_t cbobj_id, uint32_t op, uint32_t counts),
	TP_ARGS(tzhandle, srvr_id, cbobj_id, op, counts),
	TP_STRUCT__entry(
		__field(uint32_t,	tzhandle)
		__field(int,		srvr_id)
		__field(int32_t,	cbobj_id)
		__field(uint32_t,	op)
		__field(uint32_t,	counts)
	),
	TP_fast_assign(
		__entry->tzhandle	= tzhandle;
		__entry->srvr_id	= srvr_id;
		__entry->cbobj_id	= cbobj_id;
		__entry->op		= op;
		__entry->counts		= counts;
	),
	TP_printk("tzhandle=0x%x srvr_id=0x%x cbobj_id=0x%08x op=0x%02x counts=0x%04x",
			__entry->tzhandle, __entry->srvr_id, __entry->cbobj_id,
			__entry->op, __entry->counts)
);

TRACE_EVENT(marshal_in_tzcb_req_fd,
	TP_PROTO(int i, uint32_t tzhandle, int srvr_id, int32_t fd),
	TP_ARGS(i, tzhandle, srvr_id, fd),
	TP_STRUCT__entry(
		__field(int,		i)
		__field(uint32_t,	tzhandle)
		__field(int,		srvr_id)
		__field(int32_t,	fd)
	),
	TP_fast_assign(
		__entry->i		= i;
		__entry->tzhandle	= tzhandle;
		__entry->srvr_id	= srvr_id;
		__entry->fd		= fd;
	),
	TP_printk("OI[%d]: tzhandle=0x%x srvr_id=0x%x fd=0x%x",
			__entry->i, __entry->tzhandle, __entry->srvr_id, __entry->fd)
);

TRACE_EVENT(marshal_out_tzcb_req,
	TP_PROTO(uint32_t i, int32_t fd, int32_t cb_server_fd, uint32_t tzhandle),
	TP_ARGS(i, fd, cb_server_fd, tzhandle),
	TP_STRUCT__entry(
		__field(int,		i)
		__field(int32_t,	fd)
		__field(int32_t,	cb_server_fd)
		__field(uint32_t,	tzhandle)
	),
	TP_fast_assign(
		__entry->i		= i;
		__entry->fd		= fd;
		__entry->cb_server_fd	= cb_server_fd;
		__entry->tzhandle	= tzhandle;
	),
	TP_printk("OO[%d]: fd=0x%x cb_server_fd=0x%x tzhandle=0x%x",
			__entry->i, __entry->fd, __entry->cb_server_fd, __entry->tzhandle)
);

TRACE_EVENT(process_invoke_req_tzhandle,
	TP_PROTO(uint32_t tzhandle, uint32_t op, uint32_t counts),
	TP_ARGS(tzhandle, op, counts),
	TP_STRUCT__entry(
		__field(uint32_t, tzhandle)
		__field(uint32_t, op)
		__field(uint32_t, counts)
	),
	TP_fast_assign(
		__entry->tzhandle	= tzhandle;
		__entry->op		= op;
		__entry->counts		= counts;
	),
	TP_printk("tzhandle=0x%08x op=0x%02x counts=0x%04x",
			__entry->tzhandle, __entry->op, __entry->counts)
);

TRACE_EVENT(process_invoke_req_result,
	TP_PROTO(int ret, int32_t result, uint32_t tzhandle, uint32_t op, uint32_t counts),
	TP_ARGS(ret, result, tzhandle, op, counts),
	TP_STRUCT__entry(
		__field(int,		ret)
		__field(int32_t,	result)
		__field(uint32_t,	tzhandle)
		__field(uint32_t,	op)
		__field(uint32_t,	counts)
	),
	TP_fast_assign(
		__entry->ret		= ret;
		__entry->result		= result;
		__entry->tzhandle	= tzhandle;
		__entry->op		= op;
		__entry->counts		= counts;
	),
	TP_printk("ret=%d result=%d tzhandle=0x%08x op=0x%02x counts=0x%04x",
			__entry->ret, __entry->result, __entry->tzhandle,
			__entry->op, __entry->counts)
);

TRACE_EVENT(process_log_info,
	TP_PROTO(char *buf, uint32_t context_type, uint32_t tzhandle),
	TP_ARGS(buf, context_type, tzhandle),
	TP_STRUCT__entry(
		__string(str,		buf)
		__field(uint32_t,	context_type)
		__field(uint32_t,	tzhandle)
	),
	TP_fast_assign(
		__assign_str(str, buf);
		__entry->context_type	= context_type;
		__entry->tzhandle	= tzhandle;
	),
	TP_printk("%s context_type=%d tzhandle=0x%08x",
			__get_str(str),
			__entry->context_type, __entry->tzhandle)
);

TRACE_EVENT_CONDITION(smcinvoke_ioctl,
	TP_PROTO(unsigned int cmd, long ret),
	TP_ARGS(cmd, ret),
	TP_CONDITION(ret),
	TP_STRUCT__entry(
		__field(unsigned int,	cmd)
		__field(long,		ret)
	),
	TP_fast_assign(
		__entry->cmd = cmd;
		__entry->ret = ret;
	),
	TP_printk("cmd=%s ret=%ld",
			__print_symbolic(__entry->cmd,
				{SMCINVOKE_IOCTL_INVOKE_REQ,	"SMCINVOKE_IOCTL_INVOKE_REQ"},
				{SMCINVOKE_IOCTL_ACCEPT_REQ,	"SMCINVOKE_IOCTL_ACCEPT_REQ"},
				{SMCINVOKE_IOCTL_SERVER_REQ,	"SMCINVOKE_IOCTL_SERVER_REQ"},
				{SMCINVOKE_IOCTL_ACK_LOCAL_OBJ,	"SMCINVOKE_IOCTL_ACK_LOCAL_OBJ"},
				{SMCINVOKE_IOCTL_LOG,		"SMCINVOKE_IOCTL_LOG"}
			), __entry->ret)
);

TRACE_EVENT(smcinvoke_create_bridge,
	TP_PROTO(uint64_t shmbridge_handle, uint16_t mem_region_id),
	TP_ARGS(shmbridge_handle, mem_region_id),
	TP_STRUCT__entry(
		__field(uint64_t,	shmbridge_handle)
		__field(uint16_t,	mem_region_id)
	),
	TP_fast_assign(
		__entry->shmbridge_handle	= shmbridge_handle;
		__entry->mem_region_id		= mem_region_id;
	),
	TP_printk("created shm bridge handle %llu for mem_region_id %u",
			__entry->shmbridge_handle, __entry->mem_region_id)
);

TRACE_EVENT(status,
	TP_PROTO(const char *func, const char *status),
	TP_ARGS(func, status),
	TP_STRUCT__entry(
		__string(str,	func)
		__string(str2,	status)
	),
	TP_fast_assign(
		__assign_str(str,	func);
		__assign_str(str2,	status);
	),
	TP_printk("%s status=%s", __get_str(str), __get_str(str2))
);

TRACE_EVENT(process_accept_req_has_response,
	TP_PROTO(pid_t pid, pid_t tgid),
	TP_ARGS(pid, tgid),
	TP_STRUCT__entry(
		__field(pid_t,	pid)
		__field(pid_t,	tgid)
	),
	TP_fast_assign(
		__entry->pid	= pid;
		__entry->tgid	= tgid;
	),
	TP_printk("pid=0x%x, tgid=0x%x", __entry->pid, __entry->tgid)
);

TRACE_EVENT(process_accept_req_ret,
	TP_PROTO(pid_t pid, pid_t tgid, int ret),
	TP_ARGS(pid, tgid, ret),
	TP_STRUCT__entry(
		__field(pid_t,	pid)
		__field(pid_t,	tgid)
		__field(int,	ret)
	),
	TP_fast_assign(
		__entry->pid	= pid;
		__entry->tgid	= tgid;
		__entry->ret	= ret;
	),
	TP_printk("pid=0x%x tgid=0x%x ret=%d", __entry->pid, __entry->tgid, __entry->ret)
);

TRACE_EVENT(process_accept_req_placed,
	TP_PROTO(pid_t pid, pid_t tgid),
	TP_ARGS(pid, tgid),
	TP_STRUCT__entry(
		__field(pid_t,	pid)
		__field(pid_t,	tgid)
	),
	TP_fast_assign(
		__entry->pid	= pid;
		__entry->tgid	= tgid;
	),
	TP_printk("pid=0x%x, tgid=0x%x", __entry->pid, __entry->tgid)
);

TRACE_EVENT(process_invoke_request_from_kernel_client,
	TP_PROTO(int fd, struct file *filp, int f_count),
	TP_ARGS(fd, filp, f_count),
	TP_STRUCT__entry(
		__field(int,		fd)
		__field(struct file*,	filp)
		__field(int,		f_count)
	),
	TP_fast_assign(
		__entry->fd		= fd;
		__entry->filp		= filp;
		__entry->f_count	= f_count;
	),
	TP_printk("fd=%d, filp=%p, f_count=%d",
			__entry->fd,
			__entry->filp,
			__entry->f_count)
);

TRACE_EVENT(smcinvoke_release_filp,
	TP_PROTO(struct files_struct *files, struct file *filp,
			int f_count, uint32_t context_type),
	TP_ARGS(files, filp, f_count, context_type),
	TP_STRUCT__entry(
		__field(struct files_struct*,	files)
		__field(struct file*,		filp)
		__field(int,			f_count)
		__field(uint32_t,		context_type)
	),
	TP_fast_assign(
		__entry->files		= files;
		__entry->filp		= filp;
		__entry->f_count	= f_count;
		__entry->context_type	= context_type;
	),
	TP_printk("files=%p, filp=%p, f_count=%u, cxt_type=%d",
			__entry->files,
			__entry->filp,
			__entry->f_count,
			__entry->context_type)
);

TRACE_EVENT(smcinvoke_release_from_kernel_client,
	TP_PROTO(struct files_struct *files, struct file *filp, int f_count),
	TP_ARGS(files, filp, f_count),
	TP_STRUCT__entry(
		__field(struct files_struct*,	files)
		__field(struct file*,		filp)
		__field(int,			f_count)
	),
	TP_fast_assign(
		__entry->files		= files;
		__entry->filp		= filp;
		__entry->f_count	= f_count;
	),
	TP_printk("files=%p, filp=%p, f_count=%u",
			__entry->files,
			__entry->filp,
			__entry->f_count)
);

TRACE_EVENT(smcinvoke_release,
	TP_PROTO(struct files_struct *files, struct file *filp,
			int f_count, void *private_data),
	TP_ARGS(files, filp, f_count, private_data),
	TP_STRUCT__entry(
		__field(struct files_struct*,	files)
		__field(struct file*,		filp)
		__field(int,			f_count)
		__field(void*,			private_data)
	),
	TP_fast_assign(
		__entry->files		= files;
		__entry->filp		= filp;
		__entry->f_count	= f_count;
		__entry->private_data	= private_data;
	),
	TP_printk("files=%p, filp=%p, f_count=%d, private_data=%p",
			__entry->files,
			__entry->filp,
			__entry->f_count,
			__entry->private_data)
);

#endif /* _TRACE_SMCINVOKE_H */
/*
* Path must be relative to location of 'define_trace.h' header in kernel
* Define path if not defined in bazel file
 */
#ifndef SMCINVOKE_TRACE_INCLUDE_PATH
#define SMCINVOKE_TRACE_INCLUDE_PATH ../../../../vendor/qcom/opensource/securemsm-kernel/smcinvoke
#endif

#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH SMCINVOKE_TRACE_INCLUDE_PATH
#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE trace_smcinvoke

/* This part must be outside protection */
#include <trace/define_trace.h>