/* SPDX-License-Identifier: GPL-2.0 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM dma_buf

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

#include <linux/dma-buf.h>
#include <linux/tracepoint.h>

DECLARE_EVENT_CLASS(dma_buf,

	TP_PROTO(struct dma_buf *dmabuf),

	TP_ARGS(dmabuf),

	TP_STRUCT__entry(
		__string(	exp_name,		dmabuf->exp_name)
		__field(	size_t,			size)
		__field(	ino_t,			ino)
	),

	TP_fast_assign(
		__assign_str(exp_name);
		__entry->size	= dmabuf->size;
		__entry->ino	= dmabuf->file->f_inode->i_ino;
	),

	TP_printk("exp_name=%s size=%zu ino=%lu",
		  __get_str(exp_name),
		  __entry->size,
		  __entry->ino)
);

DECLARE_EVENT_CLASS(dma_buf_attach_dev,

	TP_PROTO(struct dma_buf *dmabuf, struct dma_buf_attachment *attach,
		bool is_dynamic, struct device *dev),

	TP_ARGS(dmabuf, attach, is_dynamic, dev),

	TP_STRUCT__entry(
		__string(	dev_name,			dev_name(dev))
		__string(	exp_name,			dmabuf->exp_name)
		__field(	size_t,				size)
		__field(	ino_t,				ino)
		__field(	struct dma_buf_attachment *,	attach)
		__field(	bool,				is_dynamic)
	),

	TP_fast_assign(
		__assign_str(dev_name);
		__assign_str(exp_name);
		__entry->size		= dmabuf->size;
		__entry->ino		= dmabuf->file->f_inode->i_ino;
		__entry->is_dynamic	= is_dynamic;
		__entry->attach		= attach;
	),

	TP_printk("exp_name=%s size=%zu ino=%lu attachment:%p is_dynamic=%d dev_name=%s",
		  __get_str(exp_name),
		  __entry->size,
		  __entry->ino,
		  __entry->attach,
		  __entry->is_dynamic,
		  __get_str(dev_name))
);

DECLARE_EVENT_CLASS(dma_buf_fd,

	TP_PROTO(struct dma_buf *dmabuf, int fd),

	TP_ARGS(dmabuf, fd),

	TP_STRUCT__entry(
		__string(	exp_name,		dmabuf->exp_name)
		__field(	size_t,			size)
		__field(	ino_t,			ino)
		__field(	int,			fd)
	),

	TP_fast_assign(
		__assign_str(exp_name);
		__entry->size	= dmabuf->size;
		__entry->ino	= dmabuf->file->f_inode->i_ino;
		__entry->fd	= fd;
	),

	TP_printk("exp_name=%s size=%zu ino=%lu fd=%d",
		  __get_str(exp_name),
		  __entry->size,
		  __entry->ino,
		  __entry->fd)
);

DEFINE_EVENT(dma_buf, dma_buf_export,

	TP_PROTO(struct dma_buf *dmabuf),

	TP_ARGS(dmabuf)
);

DEFINE_EVENT(dma_buf, dma_buf_mmap_internal,

	TP_PROTO(struct dma_buf *dmabuf),

	TP_ARGS(dmabuf)
);

DEFINE_EVENT(dma_buf, dma_buf_mmap,

	TP_PROTO(struct dma_buf *dmabuf),

	TP_ARGS(dmabuf)
);

DEFINE_EVENT(dma_buf, dma_buf_put,

	TP_PROTO(struct dma_buf *dmabuf),

	TP_ARGS(dmabuf)
);

DEFINE_EVENT(dma_buf_attach_dev, dma_buf_dynamic_attach,

	TP_PROTO(struct dma_buf *dmabuf, struct dma_buf_attachment *attach,
		bool is_dynamic, struct device *dev),

	TP_ARGS(dmabuf, attach, is_dynamic, dev)
);

DEFINE_EVENT(dma_buf_attach_dev, dma_buf_detach,

	TP_PROTO(struct dma_buf *dmabuf, struct dma_buf_attachment *attach,
		bool is_dynamic, struct device *dev),

	TP_ARGS(dmabuf, attach, is_dynamic, dev)
);

DEFINE_EVENT_CONDITION(dma_buf_fd, dma_buf_fd,

	TP_PROTO(struct dma_buf *dmabuf, int fd),

	TP_ARGS(dmabuf, fd),

	TP_CONDITION(fd >= 0)
);

DEFINE_EVENT(dma_buf_fd, dma_buf_get,

	TP_PROTO(struct dma_buf *dmabuf, int fd),

	TP_ARGS(dmabuf, fd)
);

#endif /* _TRACE_DMA_BUF_H */

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