18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#undef TRACE_SYSTEM 38c2ecf20Sopenharmony_ci#define TRACE_SYSTEM snd_pcm 48c2ecf20Sopenharmony_ci#define TRACE_INCLUDE_FILE pcm_trace 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#if !defined(_PCM_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 78c2ecf20Sopenharmony_ci#define _PCM_TRACE_H 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/tracepoint.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ciTRACE_EVENT(hwptr, 128c2ecf20Sopenharmony_ci TP_PROTO(struct snd_pcm_substream *substream, snd_pcm_uframes_t pos, bool irq), 138c2ecf20Sopenharmony_ci TP_ARGS(substream, pos, irq), 148c2ecf20Sopenharmony_ci TP_STRUCT__entry( 158c2ecf20Sopenharmony_ci __field( bool, in_interrupt ) 168c2ecf20Sopenharmony_ci __field( unsigned int, card ) 178c2ecf20Sopenharmony_ci __field( unsigned int, device ) 188c2ecf20Sopenharmony_ci __field( unsigned int, number ) 198c2ecf20Sopenharmony_ci __field( unsigned int, stream ) 208c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, pos ) 218c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, period_size ) 228c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, buffer_size ) 238c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, old_hw_ptr ) 248c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, hw_ptr_base ) 258c2ecf20Sopenharmony_ci ), 268c2ecf20Sopenharmony_ci TP_fast_assign( 278c2ecf20Sopenharmony_ci __entry->in_interrupt = (irq); 288c2ecf20Sopenharmony_ci __entry->card = (substream)->pcm->card->number; 298c2ecf20Sopenharmony_ci __entry->device = (substream)->pcm->device; 308c2ecf20Sopenharmony_ci __entry->number = (substream)->number; 318c2ecf20Sopenharmony_ci __entry->stream = (substream)->stream; 328c2ecf20Sopenharmony_ci __entry->pos = (pos); 338c2ecf20Sopenharmony_ci __entry->period_size = (substream)->runtime->period_size; 348c2ecf20Sopenharmony_ci __entry->buffer_size = (substream)->runtime->buffer_size; 358c2ecf20Sopenharmony_ci __entry->old_hw_ptr = (substream)->runtime->status->hw_ptr; 368c2ecf20Sopenharmony_ci __entry->hw_ptr_base = (substream)->runtime->hw_ptr_base; 378c2ecf20Sopenharmony_ci ), 388c2ecf20Sopenharmony_ci TP_printk("pcmC%dD%d%s/sub%d: %s: pos=%lu, old=%lu, base=%lu, period=%lu, buf=%lu", 398c2ecf20Sopenharmony_ci __entry->card, __entry->device, 408c2ecf20Sopenharmony_ci __entry->stream == SNDRV_PCM_STREAM_PLAYBACK ? "p" : "c", 418c2ecf20Sopenharmony_ci __entry->number, 428c2ecf20Sopenharmony_ci __entry->in_interrupt ? "IRQ" : "POS", 438c2ecf20Sopenharmony_ci (unsigned long)__entry->pos, 448c2ecf20Sopenharmony_ci (unsigned long)__entry->old_hw_ptr, 458c2ecf20Sopenharmony_ci (unsigned long)__entry->hw_ptr_base, 468c2ecf20Sopenharmony_ci (unsigned long)__entry->period_size, 478c2ecf20Sopenharmony_ci (unsigned long)__entry->buffer_size) 488c2ecf20Sopenharmony_ci); 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ciTRACE_EVENT(xrun, 518c2ecf20Sopenharmony_ci TP_PROTO(struct snd_pcm_substream *substream), 528c2ecf20Sopenharmony_ci TP_ARGS(substream), 538c2ecf20Sopenharmony_ci TP_STRUCT__entry( 548c2ecf20Sopenharmony_ci __field( unsigned int, card ) 558c2ecf20Sopenharmony_ci __field( unsigned int, device ) 568c2ecf20Sopenharmony_ci __field( unsigned int, number ) 578c2ecf20Sopenharmony_ci __field( unsigned int, stream ) 588c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, period_size ) 598c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, buffer_size ) 608c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, old_hw_ptr ) 618c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, hw_ptr_base ) 628c2ecf20Sopenharmony_ci ), 638c2ecf20Sopenharmony_ci TP_fast_assign( 648c2ecf20Sopenharmony_ci __entry->card = (substream)->pcm->card->number; 658c2ecf20Sopenharmony_ci __entry->device = (substream)->pcm->device; 668c2ecf20Sopenharmony_ci __entry->number = (substream)->number; 678c2ecf20Sopenharmony_ci __entry->stream = (substream)->stream; 688c2ecf20Sopenharmony_ci __entry->period_size = (substream)->runtime->period_size; 698c2ecf20Sopenharmony_ci __entry->buffer_size = (substream)->runtime->buffer_size; 708c2ecf20Sopenharmony_ci __entry->old_hw_ptr = (substream)->runtime->status->hw_ptr; 718c2ecf20Sopenharmony_ci __entry->hw_ptr_base = (substream)->runtime->hw_ptr_base; 728c2ecf20Sopenharmony_ci ), 738c2ecf20Sopenharmony_ci TP_printk("pcmC%dD%d%s/sub%d: XRUN: old=%lu, base=%lu, period=%lu, buf=%lu", 748c2ecf20Sopenharmony_ci __entry->card, __entry->device, 758c2ecf20Sopenharmony_ci __entry->stream == SNDRV_PCM_STREAM_PLAYBACK ? "p" : "c", 768c2ecf20Sopenharmony_ci __entry->number, 778c2ecf20Sopenharmony_ci (unsigned long)__entry->old_hw_ptr, 788c2ecf20Sopenharmony_ci (unsigned long)__entry->hw_ptr_base, 798c2ecf20Sopenharmony_ci (unsigned long)__entry->period_size, 808c2ecf20Sopenharmony_ci (unsigned long)__entry->buffer_size) 818c2ecf20Sopenharmony_ci); 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ciTRACE_EVENT(hw_ptr_error, 848c2ecf20Sopenharmony_ci TP_PROTO(struct snd_pcm_substream *substream, const char *why), 858c2ecf20Sopenharmony_ci TP_ARGS(substream, why), 868c2ecf20Sopenharmony_ci TP_STRUCT__entry( 878c2ecf20Sopenharmony_ci __field( unsigned int, card ) 888c2ecf20Sopenharmony_ci __field( unsigned int, device ) 898c2ecf20Sopenharmony_ci __field( unsigned int, number ) 908c2ecf20Sopenharmony_ci __field( unsigned int, stream ) 918c2ecf20Sopenharmony_ci __field( const char *, reason ) 928c2ecf20Sopenharmony_ci ), 938c2ecf20Sopenharmony_ci TP_fast_assign( 948c2ecf20Sopenharmony_ci __entry->card = (substream)->pcm->card->number; 958c2ecf20Sopenharmony_ci __entry->device = (substream)->pcm->device; 968c2ecf20Sopenharmony_ci __entry->number = (substream)->number; 978c2ecf20Sopenharmony_ci __entry->stream = (substream)->stream; 988c2ecf20Sopenharmony_ci __entry->reason = (why); 998c2ecf20Sopenharmony_ci ), 1008c2ecf20Sopenharmony_ci TP_printk("pcmC%dD%d%s/sub%d: ERROR: %s", 1018c2ecf20Sopenharmony_ci __entry->card, __entry->device, 1028c2ecf20Sopenharmony_ci __entry->stream == SNDRV_PCM_STREAM_PLAYBACK ? "p" : "c", 1038c2ecf20Sopenharmony_ci __entry->number, __entry->reason) 1048c2ecf20Sopenharmony_ci); 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ciTRACE_EVENT(applptr, 1078c2ecf20Sopenharmony_ci TP_PROTO(struct snd_pcm_substream *substream, snd_pcm_uframes_t prev, snd_pcm_uframes_t curr), 1088c2ecf20Sopenharmony_ci TP_ARGS(substream, prev, curr), 1098c2ecf20Sopenharmony_ci TP_STRUCT__entry( 1108c2ecf20Sopenharmony_ci __field( unsigned int, card ) 1118c2ecf20Sopenharmony_ci __field( unsigned int, device ) 1128c2ecf20Sopenharmony_ci __field( unsigned int, number ) 1138c2ecf20Sopenharmony_ci __field( unsigned int, stream ) 1148c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, prev ) 1158c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, curr ) 1168c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, avail ) 1178c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, period_size ) 1188c2ecf20Sopenharmony_ci __field( snd_pcm_uframes_t, buffer_size ) 1198c2ecf20Sopenharmony_ci ), 1208c2ecf20Sopenharmony_ci TP_fast_assign( 1218c2ecf20Sopenharmony_ci __entry->card = (substream)->pcm->card->number; 1228c2ecf20Sopenharmony_ci __entry->device = (substream)->pcm->device; 1238c2ecf20Sopenharmony_ci __entry->number = (substream)->number; 1248c2ecf20Sopenharmony_ci __entry->stream = (substream)->stream; 1258c2ecf20Sopenharmony_ci __entry->prev = (prev); 1268c2ecf20Sopenharmony_ci __entry->curr = (curr); 1278c2ecf20Sopenharmony_ci __entry->avail = (substream)->stream ? snd_pcm_capture_avail(substream->runtime) : snd_pcm_playback_avail(substream->runtime); 1288c2ecf20Sopenharmony_ci __entry->period_size = (substream)->runtime->period_size; 1298c2ecf20Sopenharmony_ci __entry->buffer_size = (substream)->runtime->buffer_size; 1308c2ecf20Sopenharmony_ci ), 1318c2ecf20Sopenharmony_ci TP_printk("pcmC%dD%d%s/sub%d: prev=%lu, curr=%lu, avail=%lu, period=%lu, buf=%lu", 1328c2ecf20Sopenharmony_ci __entry->card, 1338c2ecf20Sopenharmony_ci __entry->device, 1348c2ecf20Sopenharmony_ci __entry->stream ? "c" : "p", 1358c2ecf20Sopenharmony_ci __entry->number, 1368c2ecf20Sopenharmony_ci __entry->prev, 1378c2ecf20Sopenharmony_ci __entry->curr, 1388c2ecf20Sopenharmony_ci __entry->avail, 1398c2ecf20Sopenharmony_ci __entry->period_size, 1408c2ecf20Sopenharmony_ci __entry->buffer_size 1418c2ecf20Sopenharmony_ci ) 1428c2ecf20Sopenharmony_ci); 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci#endif /* _PCM_TRACE_H */ 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci/* This part must be outside protection */ 1478c2ecf20Sopenharmony_ci#undef TRACE_INCLUDE_PATH 1488c2ecf20Sopenharmony_ci#define TRACE_INCLUDE_PATH . 1498c2ecf20Sopenharmony_ci#include <trace/define_trace.h> 150