Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
dab16336
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
dab16336
编写于
1月 26, 2015
作者:
T
Thierry Reding
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/tegra: sor: Dump registers via debugfs
Signed-off-by:
N
Thierry Reding
<
treding@nvidia.com
>
上级
28fe2076
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
165 addition
and
6 deletion
+165
-6
drivers/gpu/drm/tegra/sor.c
drivers/gpu/drm/tegra/sor.c
+165
-6
未找到文件。
drivers/gpu/drm/tegra/sor.c
浏览文件 @
dab16336
...
...
@@ -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
remov
e
;
goto
fre
e
;
}
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
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录