/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Trace events for the ChromeOS Embedded Controller
 *
 * Copyright 2019 Google LLC.
 */

#undef TRACE_SYSTEM
#define TRACE_SYSTEM cros_ec

#if !defined(_CROS_EC_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
#define _CROS_EC_TRACE_H_

#include <linux/bits.h>
#include <linux/types.h>
#include <linux/platform_data/cros_ec_commands.h>
#include <linux/platform_data/cros_ec_proto.h>

#include <linux/tracepoint.h>

TRACE_EVENT(cros_ec_request_start,
	TP_PROTO(struct cros_ec_command *cmd),
	TP_ARGS(cmd),
	TP_STRUCT__entry(
		__field(uint32_t, version)
		__field(uint32_t, offset)
		__field(uint32_t, command)
		__field(uint32_t, outsize)
		__field(uint32_t, insize)
	),
	TP_fast_assign(
		__entry->version = cmd->version;
		__entry->offset = cmd->command / EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX);
		__entry->command = cmd->command % EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX);
		__entry->outsize = cmd->outsize;
		__entry->insize = cmd->insize;
	),
	TP_printk("version: %u, offset: %d, command: %s, outsize: %u, insize: %u",
		  __entry->version, __entry->offset,
		  __print_symbolic(__entry->command, EC_CMDS),
		  __entry->outsize, __entry->insize)
);

TRACE_EVENT(cros_ec_request_done,
	TP_PROTO(struct cros_ec_command *cmd, int retval),
	TP_ARGS(cmd, retval),
	TP_STRUCT__entry(
		__field(uint32_t, version)
		__field(uint32_t, offset)
		__field(uint32_t, command)
		__field(uint32_t, outsize)
		__field(uint32_t, insize)
		__field(uint32_t, result)
		__field(int, retval)
	),
	TP_fast_assign(
		__entry->version = cmd->version;
		__entry->offset = cmd->command / EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX);
		__entry->command = cmd->command % EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX);
		__entry->outsize = cmd->outsize;
		__entry->insize = cmd->insize;
		__entry->result = cmd->result;
		__entry->retval = retval;
	),
	TP_printk("version: %u, offset: %d, command: %s, outsize: %u, insize: %u, ec result: %s, retval: %u",
		  __entry->version, __entry->offset,
		  __print_symbolic(__entry->command, EC_CMDS),
		  __entry->outsize, __entry->insize,
		  __print_symbolic(__entry->result, EC_RESULT),
		  __entry->retval)
);

#endif /* _CROS_EC_TRACE_H_ */

/* this part must be outside header guard */

#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .

#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE cros_ec_trace

#include <trace/define_trace.h>
