Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
d0f67a48
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d0f67a48
编写于
6月 18, 2011
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nva3/pm: idle graphics engine before changing clocks
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
78e2933d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
40 addition
and
0 deletion
+40
-0
drivers/gpu/drm/nouveau/nva3_pm.c
drivers/gpu/drm/nouveau/nva3_pm.c
+40
-0
未找到文件。
drivers/gpu/drm/nouveau/nva3_pm.c
浏览文件 @
d0f67a48
...
...
@@ -264,10 +264,40 @@ nva3_pm_clocks_pre(struct drm_device *dev, struct nouveau_pm_level *perflvl)
return
info
;
}
static
bool
nva3_pm_grcp_idle
(
void
*
data
)
{
struct
drm_device
*
dev
=
data
;
if
(
!
(
nv_rd32
(
dev
,
0x400304
)
&
0x00000001
))
return
true
;
if
(
nv_rd32
(
dev
,
0x400308
)
==
0x0050001c
)
return
true
;
return
false
;
}
void
nva3_pm_clocks_set
(
struct
drm_device
*
dev
,
void
*
pre_state
)
{
struct
drm_nouveau_private
*
dev_priv
=
dev
->
dev_private
;
struct
nva3_pm_state
*
info
=
pre_state
;
unsigned
long
flags
;
/* prevent any new grctx switches from starting */
spin_lock_irqsave
(
&
dev_priv
->
context_switch_lock
,
flags
);
nv_wr32
(
dev
,
0x400324
,
0x00000000
);
nv_wr32
(
dev
,
0x400328
,
0x0050001c
);
/* wait flag 0x1c */
/* wait for any pending grctx switches to complete */
if
(
!
nv_wait_cb
(
dev
,
nva3_pm_grcp_idle
,
dev
))
{
NV_ERROR
(
dev
,
"pm: ctxprog didn't go idle
\n
"
);
goto
cleanup
;
}
/* freeze PFIFO */
nv_mask
(
dev
,
0x002504
,
0x00000001
,
0x00000001
);
if
(
!
nv_wait
(
dev
,
0x002504
,
0x00000010
,
0x00000010
))
{
NV_ERROR
(
dev
,
"pm: fifo didn't go idle
\n
"
);
goto
cleanup
;
}
prog_pll
(
dev
,
0x00
,
0x004200
,
&
info
->
nclk
);
prog_pll
(
dev
,
0x01
,
0x004220
,
&
info
->
sclk
);
...
...
@@ -285,5 +315,15 @@ nva3_pm_clocks_set(struct drm_device *dev, void *pre_state)
nv_wr32
(
dev
,
0x1002dc
,
0
);
nv_wr32
(
dev
,
0x100210
,
0x80000000
);
cleanup:
/* unfreeze PFIFO */
nv_mask
(
dev
,
0x002504
,
0x00000001
,
0x00000000
);
/* restore ctxprog to normal */
nv_wr32
(
dev
,
0x400324
,
0x00000000
);
nv_wr32
(
dev
,
0x400328
,
0x0070009c
);
/* set flag 0x1c */
/* unblock it if necessary */
if
(
nv_rd32
(
dev
,
0x400308
)
==
0x0050001c
)
nv_mask
(
dev
,
0x400824
,
0x10000000
,
0x10000000
);
spin_unlock_irqrestore
(
&
dev_priv
->
context_switch_lock
,
flags
);
kfree
(
info
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录