1 /* SPDX-License-Identifier: GPL-2.0 */
3 #define TRACE_SYSTEM snd_pcm
4 #define TRACE_INCLUDE_FILE pcm_trace
6 #if !defined(_PCM_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
9 #include <linux/tracepoint.h>
12 TP_PROTO(struct snd_pcm_substream
*substream
, snd_pcm_uframes_t pos
, bool irq
),
13 TP_ARGS(substream
, pos
, irq
),
15 __field( bool, in_interrupt
)
16 __field( unsigned int, card
)
17 __field( unsigned int, device
)
18 __field( unsigned int, number
)
19 __field( unsigned int, stream
)
20 __field( snd_pcm_uframes_t
, pos
)
21 __field( snd_pcm_uframes_t
, period_size
)
22 __field( snd_pcm_uframes_t
, buffer_size
)
23 __field( snd_pcm_uframes_t
, old_hw_ptr
)
24 __field( snd_pcm_uframes_t
, hw_ptr_base
)
27 __entry
->in_interrupt
= (irq
);
28 __entry
->card
= (substream
)->pcm
->card
->number
;
29 __entry
->device
= (substream
)->pcm
->device
;
30 __entry
->number
= (substream
)->number
;
31 __entry
->stream
= (substream
)->stream
;
33 __entry
->period_size
= (substream
)->runtime
->period_size
;
34 __entry
->buffer_size
= (substream
)->runtime
->buffer_size
;
35 __entry
->old_hw_ptr
= (substream
)->runtime
->status
->hw_ptr
;
36 __entry
->hw_ptr_base
= (substream
)->runtime
->hw_ptr_base
;
38 TP_printk("pcmC%dD%d%s/sub%d: %s: pos=%lu, old=%lu, base=%lu, period=%lu, buf=%lu",
39 __entry
->card
, __entry
->device
,
40 __entry
->stream
== SNDRV_PCM_STREAM_PLAYBACK
? "p" : "c",
42 __entry
->in_interrupt
? "IRQ" : "POS",
43 (unsigned long)__entry
->pos
,
44 (unsigned long)__entry
->old_hw_ptr
,
45 (unsigned long)__entry
->hw_ptr_base
,
46 (unsigned long)__entry
->period_size
,
47 (unsigned long)__entry
->buffer_size
)
51 TP_PROTO(struct snd_pcm_substream
*substream
),
54 __field( unsigned int, card
)
55 __field( unsigned int, device
)
56 __field( unsigned int, number
)
57 __field( unsigned int, stream
)
58 __field( snd_pcm_uframes_t
, period_size
)
59 __field( snd_pcm_uframes_t
, buffer_size
)
60 __field( snd_pcm_uframes_t
, old_hw_ptr
)
61 __field( snd_pcm_uframes_t
, hw_ptr_base
)
64 __entry
->card
= (substream
)->pcm
->card
->number
;
65 __entry
->device
= (substream
)->pcm
->device
;
66 __entry
->number
= (substream
)->number
;
67 __entry
->stream
= (substream
)->stream
;
68 __entry
->period_size
= (substream
)->runtime
->period_size
;
69 __entry
->buffer_size
= (substream
)->runtime
->buffer_size
;
70 __entry
->old_hw_ptr
= (substream
)->runtime
->status
->hw_ptr
;
71 __entry
->hw_ptr_base
= (substream
)->runtime
->hw_ptr_base
;
73 TP_printk("pcmC%dD%d%s/sub%d: XRUN: old=%lu, base=%lu, period=%lu, buf=%lu",
74 __entry
->card
, __entry
->device
,
75 __entry
->stream
== SNDRV_PCM_STREAM_PLAYBACK
? "p" : "c",
77 (unsigned long)__entry
->old_hw_ptr
,
78 (unsigned long)__entry
->hw_ptr_base
,
79 (unsigned long)__entry
->period_size
,
80 (unsigned long)__entry
->buffer_size
)
83 TRACE_EVENT(hw_ptr_error
,
84 TP_PROTO(struct snd_pcm_substream
*substream
, const char *why
),
85 TP_ARGS(substream
, why
),
87 __field( unsigned int, card
)
88 __field( unsigned int, device
)
89 __field( unsigned int, number
)
90 __field( unsigned int, stream
)
91 __field( const char *, reason
)
94 __entry
->card
= (substream
)->pcm
->card
->number
;
95 __entry
->device
= (substream
)->pcm
->device
;
96 __entry
->number
= (substream
)->number
;
97 __entry
->stream
= (substream
)->stream
;
98 __entry
->reason
= (why
);
100 TP_printk("pcmC%dD%d%s/sub%d: ERROR: %s",
101 __entry
->card
, __entry
->device
,
102 __entry
->stream
== SNDRV_PCM_STREAM_PLAYBACK
? "p" : "c",
103 __entry
->number
, __entry
->reason
)
107 TP_PROTO(struct snd_pcm_substream
*substream
, snd_pcm_uframes_t prev
, snd_pcm_uframes_t curr
),
108 TP_ARGS(substream
, prev
, curr
),
110 __field( unsigned int, card
)
111 __field( unsigned int, device
)
112 __field( unsigned int, number
)
113 __field( unsigned int, stream
)
114 __field( snd_pcm_uframes_t
, prev
)
115 __field( snd_pcm_uframes_t
, curr
)
116 __field( snd_pcm_uframes_t
, avail
)
117 __field( snd_pcm_uframes_t
, period_size
)
118 __field( snd_pcm_uframes_t
, buffer_size
)
121 __entry
->card
= (substream
)->pcm
->card
->number
;
122 __entry
->device
= (substream
)->pcm
->device
;
123 __entry
->number
= (substream
)->number
;
124 __entry
->stream
= (substream
)->stream
;
125 __entry
->prev
= (prev
);
126 __entry
->curr
= (curr
);
127 __entry
->avail
= (substream
)->stream
? snd_pcm_capture_avail(substream
->runtime
) : snd_pcm_playback_avail(substream
->runtime
);
128 __entry
->period_size
= (substream
)->runtime
->period_size
;
129 __entry
->buffer_size
= (substream
)->runtime
->buffer_size
;
131 TP_printk("pcmC%dD%d%s/sub%d: prev=%lu, curr=%lu, avail=%lu, period=%lu, buf=%lu",
134 __entry
->stream
? "c" : "p",
139 __entry
->period_size
,
144 #endif /* _PCM_TRACE_H */
146 /* This part must be outside protection */
147 #undef TRACE_INCLUDE_PATH
148 #define TRACE_INCLUDE_PATH .
149 #include <trace/define_trace.h>