drm/tegra: sor: Dump registers via debugfs

Signed-off-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
Thierry Reding 2015-01-26 16:04:08 +01:00
parent 28fe207600
commit dab163366a

View File

@ -41,6 +41,8 @@ struct tegra_sor {
struct mutex lock; struct mutex lock;
bool enabled; bool enabled;
struct drm_info_list *debugfs_files;
struct drm_minor *minor;
struct dentry *debugfs; struct dentry *debugfs;
}; };
@ -673,38 +675,195 @@ static const struct file_operations tegra_sor_crc_fops = {
.release = tegra_sor_crc_release, .release = tegra_sor_crc_release,
}; };
static int tegra_sor_show_regs(struct seq_file *s, void *data)
{
struct drm_info_node *node = s->private;
struct tegra_sor *sor = node->info_ent->data;
#define DUMP_REG(name) \
seq_printf(s, "%-38s %#05x %08x\n", #name, name, \
tegra_sor_readl(sor, name))
DUMP_REG(SOR_CTXSW);
DUMP_REG(SOR_SUPER_STATE_0);
DUMP_REG(SOR_SUPER_STATE_1);
DUMP_REG(SOR_STATE_0);
DUMP_REG(SOR_STATE_1);
DUMP_REG(SOR_HEAD_STATE_0(0));
DUMP_REG(SOR_HEAD_STATE_0(1));
DUMP_REG(SOR_HEAD_STATE_1(0));
DUMP_REG(SOR_HEAD_STATE_1(1));
DUMP_REG(SOR_HEAD_STATE_2(0));
DUMP_REG(SOR_HEAD_STATE_2(1));
DUMP_REG(SOR_HEAD_STATE_3(0));
DUMP_REG(SOR_HEAD_STATE_3(1));
DUMP_REG(SOR_HEAD_STATE_4(0));
DUMP_REG(SOR_HEAD_STATE_4(1));
DUMP_REG(SOR_HEAD_STATE_5(0));
DUMP_REG(SOR_HEAD_STATE_5(1));
DUMP_REG(SOR_CRC_CNTRL);
DUMP_REG(SOR_DP_DEBUG_MVID);
DUMP_REG(SOR_CLK_CNTRL);
DUMP_REG(SOR_CAP);
DUMP_REG(SOR_PWR);
DUMP_REG(SOR_TEST);
DUMP_REG(SOR_PLL_0);
DUMP_REG(SOR_PLL_1);
DUMP_REG(SOR_PLL_2);
DUMP_REG(SOR_PLL_3);
DUMP_REG(SOR_CSTM);
DUMP_REG(SOR_LVDS);
DUMP_REG(SOR_CRC_A);
DUMP_REG(SOR_CRC_B);
DUMP_REG(SOR_BLANK);
DUMP_REG(SOR_SEQ_CTL);
DUMP_REG(SOR_LANE_SEQ_CTL);
DUMP_REG(SOR_SEQ_INST(0));
DUMP_REG(SOR_SEQ_INST(1));
DUMP_REG(SOR_SEQ_INST(2));
DUMP_REG(SOR_SEQ_INST(3));
DUMP_REG(SOR_SEQ_INST(4));
DUMP_REG(SOR_SEQ_INST(5));
DUMP_REG(SOR_SEQ_INST(6));
DUMP_REG(SOR_SEQ_INST(7));
DUMP_REG(SOR_SEQ_INST(8));
DUMP_REG(SOR_SEQ_INST(9));
DUMP_REG(SOR_SEQ_INST(10));
DUMP_REG(SOR_SEQ_INST(11));
DUMP_REG(SOR_SEQ_INST(12));
DUMP_REG(SOR_SEQ_INST(13));
DUMP_REG(SOR_SEQ_INST(14));
DUMP_REG(SOR_SEQ_INST(15));
DUMP_REG(SOR_PWM_DIV);
DUMP_REG(SOR_PWM_CTL);
DUMP_REG(SOR_VCRC_A_0);
DUMP_REG(SOR_VCRC_A_1);
DUMP_REG(SOR_VCRC_B_0);
DUMP_REG(SOR_VCRC_B_1);
DUMP_REG(SOR_CCRC_A_0);
DUMP_REG(SOR_CCRC_A_1);
DUMP_REG(SOR_CCRC_B_0);
DUMP_REG(SOR_CCRC_B_1);
DUMP_REG(SOR_EDATA_A_0);
DUMP_REG(SOR_EDATA_A_1);
DUMP_REG(SOR_EDATA_B_0);
DUMP_REG(SOR_EDATA_B_1);
DUMP_REG(SOR_COUNT_A_0);
DUMP_REG(SOR_COUNT_A_1);
DUMP_REG(SOR_COUNT_B_0);
DUMP_REG(SOR_COUNT_B_1);
DUMP_REG(SOR_DEBUG_A_0);
DUMP_REG(SOR_DEBUG_A_1);
DUMP_REG(SOR_DEBUG_B_0);
DUMP_REG(SOR_DEBUG_B_1);
DUMP_REG(SOR_TRIG);
DUMP_REG(SOR_MSCHECK);
DUMP_REG(SOR_XBAR_CTRL);
DUMP_REG(SOR_XBAR_POL);
DUMP_REG(SOR_DP_LINKCTL_0);
DUMP_REG(SOR_DP_LINKCTL_1);
DUMP_REG(SOR_LANE_DRIVE_CURRENT_0);
DUMP_REG(SOR_LANE_DRIVE_CURRENT_1);
DUMP_REG(SOR_LANE4_DRIVE_CURRENT_0);
DUMP_REG(SOR_LANE4_DRIVE_CURRENT_1);
DUMP_REG(SOR_LANE_PREEMPHASIS_0);
DUMP_REG(SOR_LANE_PREEMPHASIS_1);
DUMP_REG(SOR_LANE4_PREEMPHASIS_0);
DUMP_REG(SOR_LANE4_PREEMPHASIS_1);
DUMP_REG(SOR_LANE_POST_CURSOR_0);
DUMP_REG(SOR_LANE_POST_CURSOR_1);
DUMP_REG(SOR_DP_CONFIG_0);
DUMP_REG(SOR_DP_CONFIG_1);
DUMP_REG(SOR_DP_MN_0);
DUMP_REG(SOR_DP_MN_1);
DUMP_REG(SOR_DP_PADCTL_0);
DUMP_REG(SOR_DP_PADCTL_1);
DUMP_REG(SOR_DP_DEBUG_0);
DUMP_REG(SOR_DP_DEBUG_1);
DUMP_REG(SOR_DP_SPARE_0);
DUMP_REG(SOR_DP_SPARE_1);
DUMP_REG(SOR_DP_AUDIO_CTRL);
DUMP_REG(SOR_DP_AUDIO_HBLANK_SYMBOLS);
DUMP_REG(SOR_DP_AUDIO_VBLANK_SYMBOLS);
DUMP_REG(SOR_DP_GENERIC_INFOFRAME_HEADER);
DUMP_REG(SOR_DP_GENERIC_INFOFRAME_SUBPACK_0);
DUMP_REG(SOR_DP_GENERIC_INFOFRAME_SUBPACK_1);
DUMP_REG(SOR_DP_GENERIC_INFOFRAME_SUBPACK_2);
DUMP_REG(SOR_DP_GENERIC_INFOFRAME_SUBPACK_3);
DUMP_REG(SOR_DP_GENERIC_INFOFRAME_SUBPACK_4);
DUMP_REG(SOR_DP_GENERIC_INFOFRAME_SUBPACK_5);
DUMP_REG(SOR_DP_GENERIC_INFOFRAME_SUBPACK_6);
DUMP_REG(SOR_DP_TPG);
DUMP_REG(SOR_DP_TPG_CONFIG);
DUMP_REG(SOR_DP_LQ_CSTM_0);
DUMP_REG(SOR_DP_LQ_CSTM_1);
DUMP_REG(SOR_DP_LQ_CSTM_2);
#undef DUMP_REG
return 0;
}
static const struct drm_info_list debugfs_files[] = {
{ "regs", tegra_sor_show_regs, 0, NULL },
};
static int tegra_sor_debugfs_init(struct tegra_sor *sor, static int tegra_sor_debugfs_init(struct tegra_sor *sor,
struct drm_minor *minor) struct drm_minor *minor)
{ {
struct dentry *entry; struct dentry *entry;
unsigned int i;
int err = 0; int err = 0;
sor->debugfs = debugfs_create_dir("sor", minor->debugfs_root); sor->debugfs = debugfs_create_dir("sor", minor->debugfs_root);
if (!sor->debugfs) if (!sor->debugfs)
return -ENOMEM; return -ENOMEM;
entry = debugfs_create_file("crc", 0644, sor->debugfs, sor, sor->debugfs_files = kmemdup(debugfs_files, sizeof(debugfs_files),
&tegra_sor_crc_fops); GFP_KERNEL);
if (!entry) { if (!sor->debugfs_files) {
dev_err(sor->dev,
"cannot create /sys/kernel/debug/dri/%s/sor/crc\n",
minor->debugfs_root->d_name.name);
err = -ENOMEM; err = -ENOMEM;
goto remove; goto remove;
} }
for (i = 0; i < ARRAY_SIZE(debugfs_files); i++)
sor->debugfs_files[i].data = sor;
err = drm_debugfs_create_files(sor->debugfs_files,
ARRAY_SIZE(debugfs_files),
sor->debugfs, minor);
if (err < 0)
goto free;
entry = debugfs_create_file("crc", 0644, sor->debugfs, sor,
&tegra_sor_crc_fops);
if (!entry) {
err = -ENOMEM;
goto free;
}
return err; return err;
free:
kfree(sor->debugfs_files);
sor->debugfs_files = NULL;
remove: remove:
debugfs_remove(sor->debugfs); debugfs_remove_recursive(sor->debugfs);
sor->debugfs = NULL; sor->debugfs = NULL;
return err; return err;
} }
static void tegra_sor_debugfs_exit(struct tegra_sor *sor) static void tegra_sor_debugfs_exit(struct tegra_sor *sor)
{ {
debugfs_remove_recursive(sor->debugfs); drm_debugfs_remove_files(sor->debugfs_files, ARRAY_SIZE(debugfs_files),
sor->minor);
sor->minor = NULL;
kfree(sor->debugfs_files);
sor->debugfs = NULL; sor->debugfs = NULL;
debugfs_remove_recursive(sor->debugfs);
sor->debugfs_files = NULL;
} }
static void tegra_sor_connector_dpms(struct drm_connector *connector, int mode) static void tegra_sor_connector_dpms(struct drm_connector *connector, int mode)