Warning: This file is not a C or C++ file. It does not have highlighting.

1/* SPDX-License-Identifier: GPL-2.0 */
2#undef TRACE_SYSTEM
3#define TRACE_SYSTEM dma
4
5#if !defined(_TRACE_DMA_H) || defined(TRACE_HEADER_MULTI_READ)
6#define _TRACE_DMA_H
7
8#include <linux/tracepoint.h>
9#include <linux/dma-direction.h>
10#include <linux/dma-mapping.h>
11#include <trace/events/mmflags.h>
12
13TRACE_DEFINE_ENUM(DMA_BIDIRECTIONAL);
14TRACE_DEFINE_ENUM(DMA_TO_DEVICE);
15TRACE_DEFINE_ENUM(DMA_FROM_DEVICE);
16TRACE_DEFINE_ENUM(DMA_NONE);
17
18#define decode_dma_data_direction(dir) \
19 __print_symbolic(dir, \
20 { DMA_BIDIRECTIONAL, "BIDIRECTIONAL" }, \
21 { DMA_TO_DEVICE, "TO_DEVICE" }, \
22 { DMA_FROM_DEVICE, "FROM_DEVICE" }, \
23 { DMA_NONE, "NONE" })
24
25#define decode_dma_attrs(attrs) \
26 __print_flags(attrs, "|", \
27 { DMA_ATTR_WEAK_ORDERING, "WEAK_ORDERING" }, \
28 { DMA_ATTR_WRITE_COMBINE, "WRITE_COMBINE" }, \
29 { DMA_ATTR_NO_KERNEL_MAPPING, "NO_KERNEL_MAPPING" }, \
30 { DMA_ATTR_SKIP_CPU_SYNC, "SKIP_CPU_SYNC" }, \
31 { DMA_ATTR_FORCE_CONTIGUOUS, "FORCE_CONTIGUOUS" }, \
32 { DMA_ATTR_ALLOC_SINGLE_PAGES, "ALLOC_SINGLE_PAGES" }, \
33 { DMA_ATTR_NO_WARN, "NO_WARN" }, \
34 { DMA_ATTR_PRIVILEGED, "PRIVILEGED" }, \
35 { DMA_ATTR_MMIO, "MMIO" })
36
37DECLARE_EVENT_CLASS(dma_map,
38 TP_PROTO(struct device *dev, phys_addr_t phys_addr, dma_addr_t dma_addr,
39 size_t size, enum dma_data_direction dir, unsigned long attrs),
40 TP_ARGS(dev, phys_addr, dma_addr, size, dir, attrs),
41
42 TP_STRUCT__entry(
43 __string(device, dev_name(dev))
44 __field(u64, phys_addr)
45 __field(u64, dma_addr)
46 __field(size_t, size)
47 __field(enum dma_data_direction, dir)
48 __field(unsigned long, attrs)
49 ),
50
51 TP_fast_assign(
52 __assign_str(device);
53 __entry->phys_addr = phys_addr;
54 __entry->dma_addr = dma_addr;
55 __entry->size = size;
56 __entry->dir = dir;
57 __entry->attrs = attrs;
58 ),
59
60 TP_printk("%s dir=%s dma_addr=%llx size=%zu phys_addr=%llx attrs=%s",
61 __get_str(device),
62 decode_dma_data_direction(__entry->dir),
63 __entry->dma_addr,
64 __entry->size,
65 __entry->phys_addr,
66 decode_dma_attrs(__entry->attrs))
67);
68
69#define DEFINE_MAP_EVENT(name) \
70DEFINE_EVENT(dma_map, name, \
71 TP_PROTO(struct device *dev, phys_addr_t phys_addr, dma_addr_t dma_addr, \
72 size_t size, enum dma_data_direction dir, unsigned long attrs), \
73 TP_ARGS(dev, phys_addr, dma_addr, size, dir, attrs))
74
75DEFINE_MAP_EVENT(dma_map_phys);
76
77DECLARE_EVENT_CLASS(dma_unmap,
78 TP_PROTO(struct device *dev, dma_addr_t addr, size_t size,
79 enum dma_data_direction dir, unsigned long attrs),
80 TP_ARGS(dev, addr, size, dir, attrs),
81
82 TP_STRUCT__entry(
83 __string(device, dev_name(dev))
84 __field(u64, addr)
85 __field(size_t, size)
86 __field(enum dma_data_direction, dir)
87 __field(unsigned long, attrs)
88 ),
89
90 TP_fast_assign(
91 __assign_str(device);
92 __entry->addr = addr;
93 __entry->size = size;
94 __entry->dir = dir;
95 __entry->attrs = attrs;
96 ),
97
98 TP_printk("%s dir=%s dma_addr=%llx size=%zu attrs=%s",
99 __get_str(device),
100 decode_dma_data_direction(__entry->dir),
101 __entry->addr,
102 __entry->size,
103 decode_dma_attrs(__entry->attrs))
104);
105
106#define DEFINE_UNMAP_EVENT(name) \
107DEFINE_EVENT(dma_unmap, name, \
108 TP_PROTO(struct device *dev, dma_addr_t addr, size_t size, \
109 enum dma_data_direction dir, unsigned long attrs), \
110 TP_ARGS(dev, addr, size, dir, attrs))
111
112DEFINE_UNMAP_EVENT(dma_unmap_phys);
113
114DECLARE_EVENT_CLASS(dma_alloc_class,
115 TP_PROTO(struct device *dev, void *virt_addr, dma_addr_t dma_addr,
116 size_t size, enum dma_data_direction dir, gfp_t flags,
117 unsigned long attrs),
118 TP_ARGS(dev, virt_addr, dma_addr, size, dir, flags, attrs),
119
120 TP_STRUCT__entry(
121 __string(device, dev_name(dev))
122 __field(void *, virt_addr)
123 __field(u64, dma_addr)
124 __field(size_t, size)
125 __field(gfp_t, flags)
126 __field(enum dma_data_direction, dir)
127 __field(unsigned long, attrs)
128 ),
129
130 TP_fast_assign(
131 __assign_str(device);
132 __entry->virt_addr = virt_addr;
133 __entry->dma_addr = dma_addr;
134 __entry->size = size;
135 __entry->flags = flags;
136 __entry->dir = dir;
137 __entry->attrs = attrs;
138 ),
139
140 TP_printk("%s dir=%s dma_addr=%llx size=%zu virt_addr=%p flags=%s attrs=%s",
141 __get_str(device),
142 decode_dma_data_direction(__entry->dir),
143 __entry->dma_addr,
144 __entry->size,
145 __entry->virt_addr,
146 show_gfp_flags(__entry->flags),
147 decode_dma_attrs(__entry->attrs))
148);
149
150#define DEFINE_ALLOC_EVENT(name) \
151DEFINE_EVENT(dma_alloc_class, name, \
152 TP_PROTO(struct device *dev, void *virt_addr, dma_addr_t dma_addr, \
153 size_t size, enum dma_data_direction dir, gfp_t flags, \
154 unsigned long attrs), \
155 TP_ARGS(dev, virt_addr, dma_addr, size, dir, flags, attrs))
156
157DEFINE_ALLOC_EVENT(dma_alloc);
158DEFINE_ALLOC_EVENT(dma_alloc_pages);
159DEFINE_ALLOC_EVENT(dma_alloc_sgt_err);
160
161TRACE_EVENT(dma_alloc_sgt,
162 TP_PROTO(struct device *dev, struct sg_table *sgt, size_t size,
163 enum dma_data_direction dir, gfp_t flags, unsigned long attrs),
164 TP_ARGS(dev, sgt, size, dir, flags, attrs),
165
166 TP_STRUCT__entry(
167 __string(device, dev_name(dev))
168 __dynamic_array(u64, phys_addrs, sgt->orig_nents)
169 __field(u64, dma_addr)
170 __field(size_t, size)
171 __field(enum dma_data_direction, dir)
172 __field(gfp_t, flags)
173 __field(unsigned long, attrs)
174 ),
175
176 TP_fast_assign(
177 struct scatterlist *sg;
178 int i;
179
180 __assign_str(device);
181 for_each_sg(sgt->sgl, sg, sgt->orig_nents, i)
182 ((u64 *)__get_dynamic_array(phys_addrs))[i] = sg_phys(sg);
183 __entry->dma_addr = sg_dma_address(sgt->sgl);
184 __entry->size = size;
185 __entry->dir = dir;
186 __entry->flags = flags;
187 __entry->attrs = attrs;
188 ),
189
190 TP_printk("%s dir=%s dma_addr=%llx size=%zu phys_addrs=%s flags=%s attrs=%s",
191 __get_str(device),
192 decode_dma_data_direction(__entry->dir),
193 __entry->dma_addr,
194 __entry->size,
195 __print_array(__get_dynamic_array(phys_addrs),
196 __get_dynamic_array_len(phys_addrs) /
197 sizeof(u64), sizeof(u64)),
198 show_gfp_flags(__entry->flags),
199 decode_dma_attrs(__entry->attrs))
200);
201
202DECLARE_EVENT_CLASS(dma_free_class,
203 TP_PROTO(struct device *dev, void *virt_addr, dma_addr_t dma_addr,
204 size_t size, enum dma_data_direction dir, unsigned long attrs),
205 TP_ARGS(dev, virt_addr, dma_addr, size, dir, attrs),
206
207 TP_STRUCT__entry(
208 __string(device, dev_name(dev))
209 __field(void *, virt_addr)
210 __field(u64, dma_addr)
211 __field(size_t, size)
212 __field(enum dma_data_direction, dir)
213 __field(unsigned long, attrs)
214 ),
215
216 TP_fast_assign(
217 __assign_str(device);
218 __entry->virt_addr = virt_addr;
219 __entry->dma_addr = dma_addr;
220 __entry->size = size;
221 __entry->dir = dir;
222 __entry->attrs = attrs;
223 ),
224
225 TP_printk("%s dir=%s dma_addr=%llx size=%zu virt_addr=%p attrs=%s",
226 __get_str(device),
227 decode_dma_data_direction(__entry->dir),
228 __entry->dma_addr,
229 __entry->size,
230 __entry->virt_addr,
231 decode_dma_attrs(__entry->attrs))
232);
233
234#define DEFINE_FREE_EVENT(name) \
235DEFINE_EVENT(dma_free_class, name, \
236 TP_PROTO(struct device *dev, void *virt_addr, dma_addr_t dma_addr, \
237 size_t size, enum dma_data_direction dir, unsigned long attrs), \
238 TP_ARGS(dev, virt_addr, dma_addr, size, dir, attrs))
239
240DEFINE_FREE_EVENT(dma_free);
241DEFINE_FREE_EVENT(dma_free_pages);
242
243TRACE_EVENT(dma_free_sgt,
244 TP_PROTO(struct device *dev, struct sg_table *sgt, size_t size,
245 enum dma_data_direction dir),
246 TP_ARGS(dev, sgt, size, dir),
247
248 TP_STRUCT__entry(
249 __string(device, dev_name(dev))
250 __dynamic_array(u64, phys_addrs, sgt->orig_nents)
251 __field(u64, dma_addr)
252 __field(size_t, size)
253 __field(enum dma_data_direction, dir)
254 ),
255
256 TP_fast_assign(
257 struct scatterlist *sg;
258 int i;
259
260 __assign_str(device);
261 for_each_sg(sgt->sgl, sg, sgt->orig_nents, i)
262 ((u64 *)__get_dynamic_array(phys_addrs))[i] = sg_phys(sg);
263 __entry->dma_addr = sg_dma_address(sgt->sgl);
264 __entry->size = size;
265 __entry->dir = dir;
266 ),
267
268 TP_printk("%s dir=%s dma_addr=%llx size=%zu phys_addrs=%s",
269 __get_str(device),
270 decode_dma_data_direction(__entry->dir),
271 __entry->dma_addr,
272 __entry->size,
273 __print_array(__get_dynamic_array(phys_addrs),
274 __get_dynamic_array_len(phys_addrs) /
275 sizeof(u64), sizeof(u64)))
276);
277
278#define DMA_TRACE_MAX_ENTRIES 128
279
280TRACE_EVENT(dma_map_sg,
281 TP_PROTO(struct device *dev, struct scatterlist *sgl, int nents,
282 int ents, enum dma_data_direction dir, unsigned long attrs),
283 TP_ARGS(dev, sgl, nents, ents, dir, attrs),
284
285 TP_STRUCT__entry(
286 __string(device, dev_name(dev))
287 __field(int, full_nents)
288 __field(int, full_ents)
289 __field(bool, truncated)
290 __dynamic_array(u64, phys_addrs, min(nents, DMA_TRACE_MAX_ENTRIES))
291 __dynamic_array(u64, dma_addrs, min(ents, DMA_TRACE_MAX_ENTRIES))
292 __dynamic_array(unsigned int, lengths, min(ents, DMA_TRACE_MAX_ENTRIES))
293 __field(enum dma_data_direction, dir)
294 __field(unsigned long, attrs)
295 ),
296
297 TP_fast_assign(
298 struct scatterlist *sg;
299 int i;
300 int traced_nents = min_t(int, nents, DMA_TRACE_MAX_ENTRIES);
301 int traced_ents = min_t(int, ents, DMA_TRACE_MAX_ENTRIES);
302
303 __assign_str(device);
304 __entry->full_nents = nents;
305 __entry->full_ents = ents;
306 __entry->truncated = (nents > DMA_TRACE_MAX_ENTRIES) || (ents > DMA_TRACE_MAX_ENTRIES);
307 for_each_sg(sgl, sg, traced_nents, i)
308 ((u64 *)__get_dynamic_array(phys_addrs))[i] = sg_phys(sg);
309 for_each_sg(sgl, sg, traced_ents, i) {
310 ((u64 *)__get_dynamic_array(dma_addrs))[i] =
311 sg_dma_address(sg);
312 ((unsigned int *)__get_dynamic_array(lengths))[i] =
313 sg_dma_len(sg);
314 }
315 __entry->dir = dir;
316 __entry->attrs = attrs;
317 ),
318
319 TP_printk("%s dir=%s nents=%d/%d ents=%d/%d%s dma_addrs=%s sizes=%s phys_addrs=%s attrs=%s",
320 __get_str(device),
321 decode_dma_data_direction(__entry->dir),
322 min_t(int, __entry->full_nents, DMA_TRACE_MAX_ENTRIES), __entry->full_nents,
323 min_t(int, __entry->full_ents, DMA_TRACE_MAX_ENTRIES), __entry->full_ents,
324 __entry->truncated ? " [TRUNCATED]" : "",
325 __print_array(__get_dynamic_array(dma_addrs),
326 __get_dynamic_array_len(dma_addrs) /
327 sizeof(u64), sizeof(u64)),
328 __print_array(__get_dynamic_array(lengths),
329 __get_dynamic_array_len(lengths) /
330 sizeof(unsigned int), sizeof(unsigned int)),
331 __print_array(__get_dynamic_array(phys_addrs),
332 __get_dynamic_array_len(phys_addrs) /
333 sizeof(u64), sizeof(u64)),
334 decode_dma_attrs(__entry->attrs))
335);
336
337TRACE_EVENT(dma_map_sg_err,
338 TP_PROTO(struct device *dev, struct scatterlist *sgl, int nents,
339 int err, enum dma_data_direction dir, unsigned long attrs),
340 TP_ARGS(dev, sgl, nents, err, dir, attrs),
341
342 TP_STRUCT__entry(
343 __string(device, dev_name(dev))
344 __dynamic_array(u64, phys_addrs, nents)
345 __field(int, err)
346 __field(enum dma_data_direction, dir)
347 __field(unsigned long, attrs)
348 ),
349
350 TP_fast_assign(
351 struct scatterlist *sg;
352 int i;
353
354 __assign_str(device);
355 for_each_sg(sgl, sg, nents, i)
356 ((u64 *)__get_dynamic_array(phys_addrs))[i] = sg_phys(sg);
357 __entry->err = err;
358 __entry->dir = dir;
359 __entry->attrs = attrs;
360 ),
361
362 TP_printk("%s dir=%s dma_addrs=%s err=%d attrs=%s",
363 __get_str(device),
364 decode_dma_data_direction(__entry->dir),
365 __print_array(__get_dynamic_array(phys_addrs),
366 __get_dynamic_array_len(phys_addrs) /
367 sizeof(u64), sizeof(u64)),
368 __entry->err,
369 decode_dma_attrs(__entry->attrs))
370);
371
372TRACE_EVENT(dma_unmap_sg,
373 TP_PROTO(struct device *dev, struct scatterlist *sgl, int nents,
374 enum dma_data_direction dir, unsigned long attrs),
375 TP_ARGS(dev, sgl, nents, dir, attrs),
376
377 TP_STRUCT__entry(
378 __string(device, dev_name(dev))
379 __dynamic_array(u64, addrs, nents)
380 __field(enum dma_data_direction, dir)
381 __field(unsigned long, attrs)
382 ),
383
384 TP_fast_assign(
385 struct scatterlist *sg;
386 int i;
387
388 __assign_str(device);
389 for_each_sg(sgl, sg, nents, i)
390 ((u64 *)__get_dynamic_array(addrs))[i] = sg_phys(sg);
391 __entry->dir = dir;
392 __entry->attrs = attrs;
393 ),
394
395 TP_printk("%s dir=%s phys_addrs=%s attrs=%s",
396 __get_str(device),
397 decode_dma_data_direction(__entry->dir),
398 __print_array(__get_dynamic_array(addrs),
399 __get_dynamic_array_len(addrs) /
400 sizeof(u64), sizeof(u64)),
401 decode_dma_attrs(__entry->attrs))
402);
403
404DECLARE_EVENT_CLASS(dma_sync_single,
405 TP_PROTO(struct device *dev, dma_addr_t dma_addr, size_t size,
406 enum dma_data_direction dir),
407 TP_ARGS(dev, dma_addr, size, dir),
408
409 TP_STRUCT__entry(
410 __string(device, dev_name(dev))
411 __field(u64, dma_addr)
412 __field(size_t, size)
413 __field(enum dma_data_direction, dir)
414 ),
415
416 TP_fast_assign(
417 __assign_str(device);
418 __entry->dma_addr = dma_addr;
419 __entry->size = size;
420 __entry->dir = dir;
421 ),
422
423 TP_printk("%s dir=%s dma_addr=%llx size=%zu",
424 __get_str(device),
425 decode_dma_data_direction(__entry->dir),
426 __entry->dma_addr,
427 __entry->size)
428);
429
430#define DEFINE_SYNC_SINGLE_EVENT(name) \
431DEFINE_EVENT(dma_sync_single, name, \
432 TP_PROTO(struct device *dev, dma_addr_t dma_addr, size_t size, \
433 enum dma_data_direction dir), \
434 TP_ARGS(dev, dma_addr, size, dir))
435
436DEFINE_SYNC_SINGLE_EVENT(dma_sync_single_for_cpu);
437DEFINE_SYNC_SINGLE_EVENT(dma_sync_single_for_device);
438
439DECLARE_EVENT_CLASS(dma_sync_sg,
440 TP_PROTO(struct device *dev, struct scatterlist *sgl, int nents,
441 enum dma_data_direction dir),
442 TP_ARGS(dev, sgl, nents, dir),
443
444 TP_STRUCT__entry(
445 __string(device, dev_name(dev))
446 __dynamic_array(u64, dma_addrs, nents)
447 __dynamic_array(unsigned int, lengths, nents)
448 __field(enum dma_data_direction, dir)
449 ),
450
451 TP_fast_assign(
452 struct scatterlist *sg;
453 int i;
454
455 __assign_str(device);
456 for_each_sg(sgl, sg, nents, i) {
457 ((u64 *)__get_dynamic_array(dma_addrs))[i] =
458 sg_dma_address(sg);
459 ((unsigned int *)__get_dynamic_array(lengths))[i] =
460 sg_dma_len(sg);
461 }
462 __entry->dir = dir;
463 ),
464
465 TP_printk("%s dir=%s dma_addrs=%s sizes=%s",
466 __get_str(device),
467 decode_dma_data_direction(__entry->dir),
468 __print_array(__get_dynamic_array(dma_addrs),
469 __get_dynamic_array_len(dma_addrs) /
470 sizeof(u64), sizeof(u64)),
471 __print_array(__get_dynamic_array(lengths),
472 __get_dynamic_array_len(lengths) /
473 sizeof(unsigned int), sizeof(unsigned int)))
474);
475
476#define DEFINE_SYNC_SG_EVENT(name) \
477DEFINE_EVENT(dma_sync_sg, name, \
478 TP_PROTO(struct device *dev, struct scatterlist *sg, int nents, \
479 enum dma_data_direction dir), \
480 TP_ARGS(dev, sg, nents, dir))
481
482DEFINE_SYNC_SG_EVENT(dma_sync_sg_for_cpu);
483DEFINE_SYNC_SG_EVENT(dma_sync_sg_for_device);
484
485#endif /* _TRACE_DMA_H */
486
487/* This part must be outside protection */
488#include <trace/define_trace.h>
489

Warning: This file is not a C or C++ file. It does not have highlighting.

source code of linux/include/trace/events/dma.h