1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * iommu trace points
4  *
5  * Copyright (C) 2013 Shuah Khan <shuah.kh@samsung.com>
6  *
7  */
8 #undef TRACE_SYSTEM
9 #define TRACE_SYSTEM iommu
10 
11 #if !defined(_TRACE_IOMMU_H) || defined(TRACE_HEADER_MULTI_READ)
12 #define _TRACE_IOMMU_H
13 
14 #include <linux/tracepoint.h>
15 
16 struct device;
17 
18 DECLARE_EVENT_CLASS(iommu_group_event,
19 
20 	TP_PROTO(int group_id, struct device *dev),
21 
22 	TP_ARGS(group_id, dev),
23 
24 	TP_STRUCT__entry(
25 		__field(int, gid)
26 		__string(device, dev_name(dev))
27 	),
28 
29 	TP_fast_assign(
30 		__entry->gid = group_id;
31 		__assign_str(device, dev_name(dev));
32 	),
33 
34 	TP_printk("IOMMU: groupID=%d device=%s",
35 			__entry->gid, __get_str(device)
36 	)
37 );
38 
39 DEFINE_EVENT(iommu_group_event, add_device_to_group,
40 
41 	TP_PROTO(int group_id, struct device *dev),
42 
43 	TP_ARGS(group_id, dev)
44 
45 );
46 
47 DEFINE_EVENT(iommu_group_event, remove_device_from_group,
48 
49 	TP_PROTO(int group_id, struct device *dev),
50 
51 	TP_ARGS(group_id, dev)
52 );
53 
54 DECLARE_EVENT_CLASS(iommu_device_event,
55 
56 	TP_PROTO(struct device *dev),
57 
58 	TP_ARGS(dev),
59 
60 	TP_STRUCT__entry(
61 		__string(device, dev_name(dev))
62 	),
63 
64 	TP_fast_assign(
65 		__assign_str(device, dev_name(dev));
66 	),
67 
68 	TP_printk("IOMMU: device=%s", __get_str(device)
69 	)
70 );
71 
72 DEFINE_EVENT(iommu_device_event, attach_device_to_domain,
73 
74 	TP_PROTO(struct device *dev),
75 
76 	TP_ARGS(dev)
77 );
78 
79 TRACE_EVENT(map,
80 
81 	TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size),
82 
83 	TP_ARGS(iova, paddr, size),
84 
85 	TP_STRUCT__entry(
86 		__field(u64, iova)
87 		__field(u64, paddr)
88 		__field(size_t, size)
89 	),
90 
91 	TP_fast_assign(
92 		__entry->iova = iova;
93 		__entry->paddr = paddr;
94 		__entry->size = size;
95 	),
96 
97 	TP_printk("IOMMU: iova=0x%016llx - 0x%016llx paddr=0x%016llx size=%zu",
98 		  __entry->iova, __entry->iova + __entry->size, __entry->paddr,
99 		  __entry->size
100 	)
101 );
102 
103 TRACE_EVENT(unmap,
104 
105 	TP_PROTO(unsigned long iova, size_t size, size_t unmapped_size),
106 
107 	TP_ARGS(iova, size, unmapped_size),
108 
109 	TP_STRUCT__entry(
110 		__field(u64, iova)
111 		__field(size_t, size)
112 		__field(size_t, unmapped_size)
113 	),
114 
115 	TP_fast_assign(
116 		__entry->iova = iova;
117 		__entry->size = size;
118 		__entry->unmapped_size = unmapped_size;
119 	),
120 
121 	TP_printk("IOMMU: iova=0x%016llx - 0x%016llx size=%zu unmapped_size=%zu",
122 		  __entry->iova, __entry->iova + __entry->size,
123 		  __entry->size, __entry->unmapped_size
124 	)
125 );
126 
127 DECLARE_EVENT_CLASS(iommu_error,
128 
129 	TP_PROTO(struct device *dev, unsigned long iova, int flags),
130 
131 	TP_ARGS(dev, iova, flags),
132 
133 	TP_STRUCT__entry(
134 		__string(device, dev_name(dev))
135 		__string(driver, dev_driver_string(dev))
136 		__field(u64, iova)
137 		__field(int, flags)
138 	),
139 
140 	TP_fast_assign(
141 		__assign_str(device, dev_name(dev));
142 		__assign_str(driver, dev_driver_string(dev));
143 		__entry->iova = iova;
144 		__entry->flags = flags;
145 	),
146 
147 	TP_printk("IOMMU:%s %s iova=0x%016llx flags=0x%04x",
148 			__get_str(driver), __get_str(device),
149 			__entry->iova, __entry->flags
150 	)
151 );
152 
153 DEFINE_EVENT(iommu_error, io_page_fault,
154 
155 	TP_PROTO(struct device *dev, unsigned long iova, int flags),
156 
157 	TP_ARGS(dev, iova, flags)
158 );
159 #endif /* _TRACE_IOMMU_H */
160 
161 /* This part must be outside protection */
162 #include <trace/define_trace.h>
163