Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dab16336 authored by Thierry Reding's avatar Thierry Reding
Browse files

drm/tegra: sor: Dump registers via debugfs

parent 28fe2076
Loading
Loading
Loading
Loading
+165 −6
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@ struct tegra_sor {
	struct mutex lock;
	bool enabled;

	struct drm_info_list *debugfs_files;
	struct drm_minor *minor;
	struct dentry *debugfs;
};

@@ -673,38 +675,195 @@ static const struct file_operations tegra_sor_crc_fops = {
	.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,
				  struct drm_minor *minor)
{
	struct dentry *entry;
	unsigned int i;
	int err = 0;

	sor->debugfs = debugfs_create_dir("sor", minor->debugfs_root);
	if (!sor->debugfs)
		return -ENOMEM;

	sor->debugfs_files = kmemdup(debugfs_files, sizeof(debugfs_files),
				     GFP_KERNEL);
	if (!sor->debugfs_files) {
		err = -ENOMEM;
		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) {
		dev_err(sor->dev,
			"cannot create /sys/kernel/debug/dri/%s/sor/crc\n",
			minor->debugfs_root->d_name.name);
		err = -ENOMEM;
		goto remove;
		goto free;
	}

	return err;

free:
	kfree(sor->debugfs_files);
	sor->debugfs_files = NULL;
remove:
	debugfs_remove(sor->debugfs);
	debugfs_remove_recursive(sor->debugfs);
	sor->debugfs = NULL;
	return err;
}

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;

	debugfs_remove_recursive(sor->debugfs);
	sor->debugfs_files = NULL;
}

static void tegra_sor_connector_dpms(struct drm_connector *connector, int mode)