cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

debugfs.c (2389B)


      1// SPDX-License-Identifier: GPL-2.0
      2//
      3// // Renesas R-Car debugfs support
      4//
      5// Copyright (c) 2021 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
      6//
      7//	> mount -t debugfs none /sys/kernel/debug
      8//	> cd /sys/kernel/debug/asoc/rcar-sound/ec500000.sound/rdai{N}/
      9//	> cat playback/xxx
     10//	> cat capture/xxx
     11//
     12#ifdef CONFIG_DEBUG_FS
     13
     14#include <linux/debugfs.h>
     15#include "rsnd.h"
     16
     17static int rsnd_debugfs_show(struct seq_file *m, void *v)
     18{
     19	struct rsnd_dai_stream *io = m->private;
     20	struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
     21	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
     22	int i;
     23
     24	/* adg is out of mods */
     25	rsnd_adg_clk_dbg_info(priv, m);
     26
     27	for_each_rsnd_mod(i, mod, io) {
     28		u32 *status = mod->ops->get_status(mod, io, mod->type);
     29
     30		seq_printf(m, "name: %s\n", rsnd_mod_name(mod));
     31		seq_printf(m, "status: %08x\n", *status);
     32
     33		if (mod->ops->debug_info)
     34			mod->ops->debug_info(m, io, mod);
     35	}
     36
     37	return 0;
     38}
     39DEFINE_SHOW_ATTRIBUTE(rsnd_debugfs);
     40
     41void rsnd_debugfs_reg_show(struct seq_file *m, phys_addr_t _addr,
     42			   void __iomem *base, int offset, int size)
     43{
     44	int i, j;
     45
     46	for (i = 0; i < size; i += 0x10) {
     47		phys_addr_t addr = _addr + offset + i;
     48
     49		seq_printf(m, "%pa:", &addr);
     50		for (j = 0; j < 0x10; j += 0x4)
     51			seq_printf(m, " %08x", __raw_readl(base + offset + i + j));
     52		seq_puts(m, "\n");
     53	}
     54}
     55
     56void rsnd_debugfs_mod_reg_show(struct seq_file *m, struct rsnd_mod *mod,
     57			       int reg_id, int offset, int size)
     58{
     59	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
     60
     61	rsnd_debugfs_reg_show(m,
     62			      rsnd_gen_get_phy_addr(priv, reg_id),
     63			      rsnd_gen_get_base_addr(priv, reg_id),
     64			      offset, size);
     65}
     66
     67int rsnd_debugfs_probe(struct snd_soc_component *component)
     68{
     69	struct rsnd_priv *priv = dev_get_drvdata(component->dev);
     70	struct rsnd_dai *rdai;
     71	struct dentry *dir;
     72	char name[64];
     73	int i;
     74
     75	/* Gen1 is not supported */
     76	if (rsnd_is_gen1(priv))
     77		return 0;
     78
     79	for_each_rsnd_dai(rdai, priv, i) {
     80		/*
     81		 * created debugfs will be automatically
     82		 * removed, nothing to do for _remove.
     83		 * see
     84		 *	soc_cleanup_component_debugfs()
     85		 */
     86		snprintf(name, sizeof(name), "rdai%d", i);
     87		dir = debugfs_create_dir(name, component->debugfs_root);
     88
     89		debugfs_create_file("playback", 0444, dir, &rdai->playback, &rsnd_debugfs_fops);
     90		debugfs_create_file("capture",  0444, dir, &rdai->capture,  &rsnd_debugfs_fops);
     91	}
     92
     93	return 0;
     94}
     95
     96#endif /* CONFIG_DEBUG_FS */