/* SPDX-License-Identifier: GPL-2.0 */ #define ION_TRACE_EMIT #ifdef ION_TRACE_EMIT /* ion_trace_lvl 0: no trace 1: trace iommu 2: trace all */ static int ion_trace_lvl = 0; #define pr_ion_trace(lvl, fmt, ...) \ if (unlikely(ion_trace_lvl>=lvl)) \ printk(KERN_INFO "%15.s-%5.d: %s: "pr_fmt(fmt), current->comm,\ current->pid, __func__, ##__VA_ARGS__) static inline void trace_ion_buffer_alloc(const char* client, void* buf, unsigned int size) { pr_ion_trace(2, "client=%s,buffer=%p:%d\n", client, buf, size); } static inline void trace_ion_buffer_free(const char* client, void* buf, unsigned int size) { pr_ion_trace(2, "client=%s,buffer=%p:%d\n", client, buf, size); } static inline void trace_ion_buffer_import(const char* client, void* buf, unsigned int size) { pr_ion_trace(2, "client=%s,buffer=%p:%d\n", client, buf, size); } static inline void trace_ion_buffer_destroy(const char* client, void* buf, unsigned int size) { pr_ion_trace(2, "client=%s,buffer=%p:%d\n", client, buf, size); } static inline void trace_ion_kernel_unmap(const char* client, void* buf, unsigned int size) { pr_ion_trace(2, "client=%s,buffer=%p:%d\n", client, buf, size); } static inline void trace_ion_buffer_share(const char* client, void* buf, unsigned int size, int fd) { pr_ion_trace(2, "client=%s,buffer=%p:%d,fd=%d\n", client, buf, size, fd); } static inline void trace_ion_client_create(const char* client) { pr_ion_trace(2, "client=%s\n", client); } static inline void trace_ion_client_destroy(const char* client) { pr_ion_trace(2, "client=%s\n", client); } static inline void trace_ion_iommu_map(const char* client, void* buf, unsigned int size, const char* iommu_dev, unsigned int iommu_addr, unsigned int iommu_size, unsigned int map_cnt) { pr_ion_trace(1, "client=%s,buffer=%p:%d,iommu=%s[%08x:%08x]:%d\n", client,buf, size, iommu_dev, iommu_addr, iommu_addr+iommu_size, map_cnt); } static inline void trace_ion_iommu_unmap(const char* client, void* buf, unsigned int size, const char* iommu_dev, unsigned int iommu_addr, unsigned int iommu_size, unsigned int map_cnt) { pr_ion_trace(1, "client=%s,buffer=%p:%d,iommu=%s[%08x:%08x]:%d\n", client,buf, size, iommu_dev, iommu_addr, iommu_addr+iommu_size, map_cnt); } static inline void trace_ion_iommu_release(const char* client, void* buf, unsigned int size, const char* iommu_dev, unsigned int iommu_addr, unsigned int iommu_size, unsigned int map_cnt) { pr_ion_trace(1, "client=%s,buffer=%p:%d,iommu=%s[%08x:%08x]:%d\n", client,buf, size, iommu_dev, iommu_addr, iommu_addr+iommu_size, map_cnt); } static inline void trace_ion_kernel_map(const char* client, void* buf, unsigned int size, void* kaddr) { pr_ion_trace(2, "client=%s,buffer=%p:%d,kaddr=%p\n", client, buf, size, kaddr); } static inline void trace_ion_buffer_mmap(const char* client, void* buf, unsigned int size, unsigned long vm_start, unsigned long vm_end) { pr_ion_trace(2, "client=%s,buffer=%p:%d,vma[%08lx:%08lx]\n", client, buf, size, vm_start, vm_end); } static inline void trace_ion_buffer_munmap(const char* client, void* buf, unsigned int size, unsigned long vm_start, unsigned long vm_end) { pr_ion_trace(2, "client=%s,buffer=%p:%d,vma[%08lx:%08lx]\n", client, buf, size, vm_start, vm_end); } #else #undef TRACE_SYSTEM #define TRACE_INCLUDE_PATH ../../drivers/staging/android/trace #define TRACE_SYSTEM ion #if !defined(_TRACE_ION_H) || defined(TRACE_HEADER_MULTI_READ) #define _TRACE_ION_H #include DECLARE_EVENT_CLASS(ion_buffer_op, TP_PROTO(const char* client, void* buf, unsigned int size), TP_ARGS(client, buf, size), TP_STRUCT__entry( __string(client, client) __field(void*, buf) __field(unsigned int, size) ), TP_fast_assign( __assign_str(client, client); __entry->buf = buf; __entry->size = size; ), TP_printk("client=%s,buffer=%p:%d", __get_str(client), __entry->buf, __entry->size) ); DEFINE_EVENT(ion_buffer_op, ion_buffer_alloc, TP_PROTO(const char* client, void* buffer, unsigned int size), TP_ARGS(client, buffer, size)); DEFINE_EVENT(ion_buffer_op, ion_buffer_free, TP_PROTO(const char* client, void* buffer, unsigned int size), TP_ARGS(client, buffer, size)); DEFINE_EVENT(ion_buffer_op, ion_buffer_import, TP_PROTO(const char* client, void* buffer, unsigned int size), TP_ARGS(client, buffer, size)); DEFINE_EVENT(ion_buffer_op, ion_buffer_destroy, TP_PROTO(const char* client, void* buffer, unsigned int size), TP_ARGS(client, buffer, size)); DEFINE_EVENT(ion_buffer_op, ion_kernel_unmap, TP_PROTO(const char* client, void* buffer, unsigned int size), TP_ARGS(client, buffer, size)); TRACE_EVENT(ion_buffer_share, TP_PROTO(const char* client, void* buf, unsigned int size, int fd), TP_ARGS(client, buf, size, fd), TP_STRUCT__entry( __string(client, client) __field(void*, buf) __field(unsigned int, size) __field(int, fd) ), TP_fast_assign( __assign_str(client, client); __entry->buf = buf; __entry->size = size; __entry->fd = fd; ), TP_printk("client=%s,buffer=%p:%d,fd=%d", __get_str(client), __entry->buf, __entry->size, __entry->fd) ); DECLARE_EVENT_CLASS(ion_client_op, TP_PROTO(const char* client), TP_ARGS(client), TP_STRUCT__entry( __string(client, client) ), TP_fast_assign( __assign_str(client, client); ), TP_printk("client=%s", __get_str(client)) ); DEFINE_EVENT(ion_client_op, ion_client_create, TP_PROTO(const char* client), TP_ARGS(client)); DEFINE_EVENT(ion_client_op, ion_client_destroy, TP_PROTO(const char* client), TP_ARGS(client)); DECLARE_EVENT_CLASS(ion_iommu_op, TP_PROTO(const char* client, void* buf, unsigned int size, const char* iommu_dev, unsigned int iommu_addr, unsigned int iommu_size, unsigned int map_cnt), TP_ARGS(client, buf, size, iommu_dev, iommu_addr, iommu_size, map_cnt), TP_STRUCT__entry( __string(client, client) __field(void*, buf) __field(unsigned int, size) __string(iommu_dev, iommu_dev) __field(unsigned int, iommu_addr) __field(unsigned int, iommu_size) __field(unsigned int, map_cnt) ), TP_fast_assign( __assign_str(client, client); __entry->buf = buf; __entry->size = size; __assign_str(iommu_dev, iommu_dev); __entry->iommu_addr = iommu_addr; __entry->iommu_size = iommu_size; __entry->map_cnt = map_cnt; ), TP_printk("client=%s,buffer=%p:%d,iommu=%s,map=%08x:%d,map_count=%d", __get_str(client), __entry->buf, __entry->size, __get_str(iommu_dev), __entry->iommu_addr, __entry->iommu_size, __entry->map_cnt) ); DEFINE_EVENT(ion_iommu_op, ion_iommu_map, TP_PROTO(const char* client, void* buf, unsigned int size, const char* iommu_dev, unsigned int iommu_addr, unsigned int iommu_size, unsigned int map_cnt), TP_ARGS(client, buf, size, iommu_dev, iommu_addr, iommu_size, map_cnt)); DEFINE_EVENT(ion_iommu_op, ion_iommu_unmap, TP_PROTO(const char* client, void* buf, unsigned int size, const char* iommu_dev, unsigned int iommu_addr, unsigned int iommu_size, unsigned int map_cnt), TP_ARGS(client, buf, size, iommu_dev, iommu_addr, iommu_size, map_cnt)); DEFINE_EVENT(ion_iommu_op, ion_iommu_release, TP_PROTO(const char* client, void* buf, unsigned int size, const char* iommu_dev, unsigned int iommu_addr, unsigned int iommu_size, unsigned int map_cnt), TP_ARGS(client, buf, size, iommu_dev, iommu_addr, iommu_size, map_cnt)); DECLARE_EVENT_CLASS(ion_kmap_op, TP_PROTO(const char* client, void* buf, unsigned int size, void* kaddr), TP_ARGS(client, buf, size, kaddr), TP_STRUCT__entry( __string(client, client) __field(void*, buf) __field(unsigned int, size) __field(void*, kaddr) ), TP_fast_assign( __assign_str(client, client); __entry->buf = buf; __entry->size = size; __entry->kaddr = kaddr; ), TP_printk("client=%s,buffer=%p:%d,kaddr=%p", __get_str(client), __entry->buf, __entry->size, __entry->kaddr) ); DEFINE_EVENT(ion_kmap_op, ion_kernel_map, TP_PROTO(const char* client, void* buffer, unsigned int size, void* kaddr), TP_ARGS(client, buffer, size, kaddr)); DECLARE_EVENT_CLASS(ion_mmap_op, TP_PROTO(const char* client, void* buf, unsigned int size, unsigned long vm_start, unsigned long vm_end), TP_ARGS(client, buf, size, vm_start, vm_end), TP_STRUCT__entry( __string(client, client) __field(void*, buf) __field(unsigned int, size) __field(unsigned long, vm_start) __field(unsigned long, vm_end) ), TP_fast_assign( __assign_str(client, client); __entry->buf = buf; __entry->size = size; __entry->vm_start = vm_start; __entry->vm_end = vm_end; ), TP_printk("client=%s,buffer=%p:%d,vma[%08lx:%08lx]", __get_str(client), __entry->buf, __entry->size, __entry->vm_start, __entry->vm_end) ); DEFINE_EVENT(ion_mmap_op, ion_buffer_mmap, TP_PROTO(const char* client, void* buf, unsigned int size, unsigned long vm_start, unsigned long vm_end), TP_ARGS(client, buf, size, vm_start, vm_end)); DEFINE_EVENT(ion_mmap_op, ion_buffer_munmap, TP_PROTO(const char* client, void* buf, unsigned int size, unsigned long vm_start, unsigned long vm_end), TP_ARGS(client, buf, size, vm_start, vm_end)); #endif /* _TRACE_ION_H */ /* This part must be outside protection */ #include #endif