[alsa-devel] [PATCH] ALSA: hda - Add parameter for dumping processing coefficients
Takashi Iwai
tiwai at suse.de
Wed Jan 29 16:46:02 CET 2014
At Wed, 29 Jan 2014 10:37:10 +0100,
David Henningsson wrote:
>
> Processing coefficients are often a vital part of the codec's configuration,
> so dumping them can be important. However, because they are undocumented and
> secret, we do not want to enable this for all codecs by default.
>
> Therefore instead add this as a debugging parameter.
>
> I have prepared for codecs that want to enable this by default by the extra
> dump_coef bitfield, but unsure if we want to do that as long as the
> (unlikely, but still) race remains.
>
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
Thanks, queued for the next 3.14 merge, as this doesn't look too
intrusive and is still useful for debugging.
Takashi
> ---
> sound/pci/hda/hda_codec.h | 1 +
> sound/pci/hda/hda_proc.c | 34 ++++++++++++++++++++++++++++++++--
> 2 files changed, 33 insertions(+), 2 deletions(-)
>
> diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
> index 2b5d19e..ab2a444 100644
> --- a/sound/pci/hda/hda_codec.h
> +++ b/sound/pci/hda/hda_codec.h
> @@ -361,6 +361,7 @@ struct hda_codec {
> unsigned int epss:1; /* supporting EPSS? */
> unsigned int cached_write:1; /* write only to caches */
> unsigned int dp_mst:1; /* support DP1.2 Multi-stream transport */
> + unsigned int dump_coef:1; /* dump processing coefs in codec proc file */
> #ifdef CONFIG_PM
> unsigned int power_on :1; /* current (global) power-state */
> unsigned int d3_stop_clk:1; /* support D3 operation without BCLK */
> diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c
> index a8cb22e..ce5a6da 100644
> --- a/sound/pci/hda/hda_proc.c
> +++ b/sound/pci/hda/hda_proc.c
> @@ -24,9 +24,14 @@
> #include <linux/init.h>
> #include <linux/slab.h>
> #include <sound/core.h>
> +#include <linux/module.h>
> #include "hda_codec.h"
> #include "hda_local.h"
>
> +static int dump_coef = -1;
> +module_param(dump_coef, int, 0644);
> +MODULE_PARM_DESC(dump_coef, "Dump processing coefficients in codec proc file (-1=auto, 0=disable, 1=enable)");
> +
> static char *bits_names(unsigned int bits, char *names[], int size)
> {
> int i, n;
> @@ -488,14 +493,39 @@ static void print_unsol_cap(struct snd_info_buffer *buffer,
> (unsol & AC_UNSOL_ENABLED) ? 1 : 0);
> }
>
> +static inline bool can_dump_coef(struct hda_codec *codec)
> +{
> + switch (dump_coef) {
> + case 0: return false;
> + case 1: return true;
> + default: return codec->dump_coef;
> + }
> +}
> +
> static void print_proc_caps(struct snd_info_buffer *buffer,
> struct hda_codec *codec, hda_nid_t nid)
> {
> + unsigned int i, ncoeff, oldindex;
> unsigned int proc_caps = snd_hda_param_read(codec, nid,
> AC_PAR_PROC_CAP);
> + ncoeff = (proc_caps & AC_PCAP_NUM_COEF) >> AC_PCAP_NUM_COEF_SHIFT;
> snd_iprintf(buffer, " Processing caps: benign=%d, ncoeff=%d\n",
> - proc_caps & AC_PCAP_BENIGN,
> - (proc_caps & AC_PCAP_NUM_COEF) >> AC_PCAP_NUM_COEF_SHIFT);
> + proc_caps & AC_PCAP_BENIGN, ncoeff);
> +
> + if (!can_dump_coef(codec))
> + return;
> +
> + /* Note: This is racy - another process could run in parallel and change
> + the coef index too. */
> + oldindex = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_COEF_INDEX, 0);
> + for (i = 0; i < ncoeff; i++) {
> + unsigned int val;
> + snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, i);
> + val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF,
> + 0);
> + snd_iprintf(buffer, " Coeff 0x%02x: 0x%04x\n", i, val);
> + }
> + snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, oldindex);
> }
>
> static void print_conn_list(struct snd_info_buffer *buffer,
> --
> 1.7.9.5
>
More information about the Alsa-devel
mailing list