ALSA: hda - Re-add tracepoints to HD-audio core driver

Now let's take the basic tracepoints back to the HD-audio driver.
The three bus tracepoints, hda_send_cmd, hda_get_response and
hda_unsol_event are revived but in a slightly different form.
Since we don't assign the card number there, print the bus device name
instead.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2015-03-10 15:16:28 +01:00
parent c4c2533f80
commit e311782acd
6 changed files with 77 additions and 121 deletions

View File

@ -1,3 +1,6 @@
snd-hda-core-objs := hda_bus_type.o hdac_bus.o hdac_device.o hdac_sysfs.o
snd-hda-core-objs += trace.o
CFLAGS_trace.o := -I$(src)
obj-$(CONFIG_SND_HDA_CORE) += snd-hda-core.o

View File

@ -7,6 +7,7 @@
#include <linux/module.h>
#include <linux/export.h>
#include <sound/hdaudio.h>
#include "trace.h"
static void process_unsol_events(struct work_struct *work);
@ -82,6 +83,7 @@ int snd_hdac_bus_exec_verb_unlocked(struct hdac_bus *bus, unsigned int addr,
else if (bus->sync_write)
res = &tmp;
for (;;) {
trace_hda_send_cmd(bus, cmd);
err = bus->ops->command(bus, cmd);
if (err != -EAGAIN)
break;
@ -90,8 +92,10 @@ int snd_hdac_bus_exec_verb_unlocked(struct hdac_bus *bus, unsigned int addr,
if (err)
break;
}
if (!err && res)
if (!err && res) {
err = bus->ops->get_response(bus, addr, res);
trace_hda_get_response(bus, addr, *res);
}
return err;
}
EXPORT_SYMBOL_GPL(snd_hdac_bus_exec_verb_unlocked);
@ -113,6 +117,7 @@ void snd_hdac_bus_queue_event(struct hdac_bus *bus, u32 res, u32 res_ex)
if (!bus)
return;
trace_hda_unsol_event(bus, res, res_ex);
wp = (bus->unsol_wp + 1) % HDA_UNSOL_QUEUE_SIZE;
bus->unsol_wp = wp;

6
sound/hda/trace.c Normal file
View File

@ -0,0 +1,6 @@
/*
* tracepoint definitions for HD-audio core drivers
*/
#define CREATE_TRACE_POINTS
#include "trace.h"

62
sound/hda/trace.h Normal file
View File

@ -0,0 +1,62 @@
#undef TRACE_SYSTEM
#define TRACE_SYSTEM hda
#if !defined(__HDAC_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
#define __HDAC_TRACE_H
#include <linux/tracepoint.h>
#include <linux/device.h>
#include <sound/hdaudio.h>
#ifndef HDAC_MSG_MAX
#define HDAC_MSG_MAX 500
#endif
struct hdac_bus;
struct hdac_codec;
TRACE_EVENT(hda_send_cmd,
TP_PROTO(struct hdac_bus *bus, unsigned int cmd),
TP_ARGS(bus, cmd),
TP_STRUCT__entry(__dynamic_array(char, msg, HDAC_MSG_MAX)),
TP_fast_assign(
snprintf(__get_str(msg), HDAC_MSG_MAX,
"[%s:%d] val=0x%08x",
dev_name((bus)->dev), (cmd) >> 28, cmd);
),
TP_printk("%s", __get_str(msg))
);
TRACE_EVENT(hda_get_response,
TP_PROTO(struct hdac_bus *bus, unsigned int addr, unsigned int res),
TP_ARGS(bus, addr, res),
TP_STRUCT__entry(__dynamic_array(char, msg, HDAC_MSG_MAX)),
TP_fast_assign(
snprintf(__get_str(msg), HDAC_MSG_MAX,
"[%s:%d] val=0x%08x",
dev_name((bus)->dev), addr, res);
),
TP_printk("%s", __get_str(msg))
);
TRACE_EVENT(hda_unsol_event,
TP_PROTO(struct hdac_bus *bus, u32 res, u32 res_ex),
TP_ARGS(bus, res, res_ex),
TP_STRUCT__entry(__dynamic_array(char, msg, HDAC_MSG_MAX)),
TP_fast_assign(
snprintf(__get_str(msg), HDAC_MSG_MAX,
"[%s:%d] res=0x%08x, res_ex=0x%08x",
dev_name((bus)->dev), res_ex & 0x0f, res, res_ex);
),
TP_printk("%s", __get_str(msg))
);
#endif /* __HDAC_TRACE_H */
/* This part must be outside protection */
#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE trace
#include <trace/define_trace.h>

View File

@ -10,7 +10,6 @@ snd-hda-codec-$(CONFIG_SND_HDA_HWDEP) += hda_hwdep.o
snd-hda-codec-$(CONFIG_SND_HDA_INPUT_BEEP) += hda_beep.o
# for trace-points
CFLAGS_hda_codec.o := -I$(src)
CFLAGS_hda_controller.o := -I$(src)
snd-hda-codec-generic-objs := hda_generic.o

View File

@ -1,119 +0,0 @@
#undef TRACE_SYSTEM
#define TRACE_SYSTEM hda
#define TRACE_INCLUDE_FILE hda_trace
#if !defined(_TRACE_HDA_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_HDA_H
#include <linux/tracepoint.h>
struct hda_bus;
struct hda_codec;
DECLARE_EVENT_CLASS(hda_cmd,
TP_PROTO(struct hda_codec *codec, unsigned int val),
TP_ARGS(codec, val),
TP_STRUCT__entry(
__field( unsigned int, card )
__field( unsigned int, addr )
__field( unsigned int, val )
),
TP_fast_assign(
__entry->card = (codec)->card->number;
__entry->addr = (codec)->addr;
__entry->val = (val);
),
TP_printk("[%d:%d] val=%x", __entry->card, __entry->addr, __entry->val)
);
DEFINE_EVENT(hda_cmd, hda_send_cmd,
TP_PROTO(struct hda_codec *codec, unsigned int val),
TP_ARGS(codec, val)
);
DEFINE_EVENT(hda_cmd, hda_get_response,
TP_PROTO(struct hda_codec *codec, unsigned int val),
TP_ARGS(codec, val)
);
TRACE_EVENT(hda_bus_reset,
TP_PROTO(struct hda_bus *bus),
TP_ARGS(bus),
TP_STRUCT__entry(
__field( unsigned int, card )
),
TP_fast_assign(
__entry->card = (bus)->card->number;
),
TP_printk("[%d]", __entry->card)
);
#ifdef CONFIG_PM
DECLARE_EVENT_CLASS(hda_power,
TP_PROTO(struct hda_codec *codec),
TP_ARGS(codec),
TP_STRUCT__entry(
__field( unsigned int, card )
__field( unsigned int, addr )
),
TP_fast_assign(
__entry->card = (codec)->card->number;
__entry->addr = (codec)->addr;
),
TP_printk("[%d:%d]", __entry->card, __entry->addr)
);
DEFINE_EVENT(hda_power, hda_power_down,
TP_PROTO(struct hda_codec *codec),
TP_ARGS(codec)
);
DEFINE_EVENT(hda_power, hda_power_up,
TP_PROTO(struct hda_codec *codec),
TP_ARGS(codec)
);
#endif /* CONFIG_PM */
TRACE_EVENT(hda_unsol_event,
TP_PROTO(struct hda_bus *bus, u32 res, u32 res_ex),
TP_ARGS(bus, res, res_ex),
TP_STRUCT__entry(
__field( unsigned int, card )
__field( u32, res )
__field( u32, res_ex )
),
TP_fast_assign(
__entry->card = (bus)->card->number;
__entry->res = res;
__entry->res_ex = res_ex;
),
TP_printk("[%d] res=%x, res_ex=%x", __entry->card,
__entry->res, __entry->res_ex)
);
#endif /* _TRACE_HDA_H */
/* This part must be outside protection */
#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#include <trace/define_trace.h>