Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
gsplhtlxg
clone-Linux
提交
d83ef853
C
clone-Linux
项目概览
gsplhtlxg
/
clone-Linux
通知
2
Star
0
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
clone-Linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d83ef853
编写于
11月 14, 2013
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau: implement hooks for needed for drm vblank timestamping support
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
d2fa7d32
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
86 addition
and
0 deletion
+86
-0
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_display.c
+80
-0
drivers/gpu/drm/nouveau/nouveau_display.h
drivers/gpu/drm/nouveau/nouveau_display.h
+4
-0
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nouveau_drm.c
+2
-0
未找到文件。
drivers/gpu/drm/nouveau/nouveau_display.c
浏览文件 @
d83ef853
...
...
@@ -68,6 +68,86 @@ nouveau_display_vblank_disable(struct drm_device *dev, int head)
nouveau_event_put
(
disp
->
vblank
[
head
]);
}
static
inline
int
calc
(
int
blanks
,
int
blanke
,
int
total
,
int
line
)
{
if
(
blanke
>=
blanks
)
{
if
(
line
>=
blanks
)
line
-=
total
;
}
else
{
if
(
line
>=
blanks
)
line
-=
total
;
line
-=
blanke
+
1
;
}
return
line
;
}
int
nouveau_display_scanoutpos_head
(
struct
drm_crtc
*
crtc
,
int
*
vpos
,
int
*
hpos
,
ktime_t
*
stime
,
ktime_t
*
etime
)
{
const
u32
mthd
=
NV04_DISP_SCANOUTPOS
+
nouveau_crtc
(
crtc
)
->
index
;
struct
nouveau_display
*
disp
=
nouveau_display
(
crtc
->
dev
);
struct
nv04_display_scanoutpos
args
;
int
ret
,
retry
=
1
;
do
{
ret
=
nv_exec
(
disp
->
core
,
mthd
,
&
args
,
sizeof
(
args
));
if
(
ret
!=
0
)
return
0
;
if
(
args
.
vline
)
{
ret
|=
DRM_SCANOUTPOS_ACCURATE
;
ret
|=
DRM_SCANOUTPOS_VALID
;
break
;
}
if
(
retry
)
ndelay
(
crtc
->
linedur_ns
);
}
while
(
retry
--
);
*
hpos
=
calc
(
args
.
hblanks
,
args
.
hblanke
,
args
.
htotal
,
args
.
hline
);
*
vpos
=
calc
(
args
.
vblanks
,
args
.
vblanke
,
args
.
vtotal
,
args
.
vline
);
if
(
stime
)
*
stime
=
ns_to_ktime
(
args
.
time
[
0
]);
if
(
etime
)
*
etime
=
ns_to_ktime
(
args
.
time
[
1
]);
if
(
*
vpos
<
0
)
ret
|=
DRM_SCANOUTPOS_INVBL
;
return
ret
;
}
int
nouveau_display_scanoutpos
(
struct
drm_device
*
dev
,
int
head
,
unsigned
int
flags
,
int
*
vpos
,
int
*
hpos
,
ktime_t
*
stime
,
ktime_t
*
etime
)
{
struct
drm_crtc
*
crtc
;
list_for_each_entry
(
crtc
,
&
dev
->
mode_config
.
crtc_list
,
head
)
{
if
(
nouveau_crtc
(
crtc
)
->
index
==
head
)
{
return
nouveau_display_scanoutpos_head
(
crtc
,
vpos
,
hpos
,
stime
,
etime
);
}
}
return
0
;
}
int
nouveau_display_vblstamp
(
struct
drm_device
*
dev
,
int
head
,
int
*
max_error
,
struct
timeval
*
time
,
unsigned
flags
)
{
struct
drm_crtc
*
crtc
;
list_for_each_entry
(
crtc
,
&
dev
->
mode_config
.
crtc_list
,
head
)
{
if
(
nouveau_crtc
(
crtc
)
->
index
==
head
)
{
return
drm_calc_vbltimestamp_from_scanoutpos
(
dev
,
head
,
max_error
,
time
,
flags
,
crtc
,
&
crtc
->
hwmode
);
}
}
return
-
EINVAL
;
}
static
void
nouveau_display_vblank_fini
(
struct
drm_device
*
dev
)
{
...
...
drivers/gpu/drm/nouveau/nouveau_display.h
浏览文件 @
d83ef853
...
...
@@ -64,6 +64,10 @@ void nouveau_display_repin(struct drm_device *dev);
void
nouveau_display_resume
(
struct
drm_device
*
dev
);
int
nouveau_display_vblank_enable
(
struct
drm_device
*
,
int
);
void
nouveau_display_vblank_disable
(
struct
drm_device
*
,
int
);
int
nouveau_display_scanoutpos
(
struct
drm_device
*
,
int
,
unsigned
int
,
int
*
,
int
*
,
ktime_t
*
,
ktime_t
*
);
int
nouveau_display_vblstamp
(
struct
drm_device
*
,
int
,
int
*
,
struct
timeval
*
,
unsigned
);
int
nouveau_crtc_page_flip
(
struct
drm_crtc
*
crtc
,
struct
drm_framebuffer
*
fb
,
struct
drm_pending_vblank_event
*
event
,
...
...
drivers/gpu/drm/nouveau/nouveau_drm.c
浏览文件 @
d83ef853
...
...
@@ -798,6 +798,8 @@ driver = {
.
get_vblank_counter
=
drm_vblank_count
,
.
enable_vblank
=
nouveau_display_vblank_enable
,
.
disable_vblank
=
nouveau_display_vblank_disable
,
.
get_scanout_position
=
nouveau_display_scanoutpos
,
.
get_vblank_timestamp
=
nouveau_display_vblstamp
,
.
ioctls
=
nouveau_ioctls
,
.
num_ioctls
=
ARRAY_SIZE
(
nouveau_ioctls
),
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录