Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
3b0582d3
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
3b0582d3
编写于
6月 17, 2011
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nva3/pm: rewrite clock readback functions, far more correct now
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
03ce8d9e
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
62 addition
and
33 deletion
+62
-33
drivers/gpu/drm/nouveau/nva3_pm.c
drivers/gpu/drm/nouveau/nva3_pm.c
+62
-33
未找到文件。
drivers/gpu/drm/nouveau/nva3_pm.c
浏览文件 @
3b0582d3
...
@@ -27,11 +27,59 @@
...
@@ -27,11 +27,59 @@
#include "nouveau_bios.h"
#include "nouveau_bios.h"
#include "nouveau_pm.h"
#include "nouveau_pm.h"
/* This is actually a lot more complex than it appears here, but hopefully
static
u32
read_pll
(
struct
drm_device
*
dev
,
u32
pll
,
int
clk
);
* this should be able to deal with what the VBIOS leaves for us..
static
u32
read_clk
(
struct
drm_device
*
dev
,
int
clk
);
*
* If not, well, I'll jump off that bridge when I come to it.
static
u32
*/
read_clk
(
struct
drm_device
*
dev
,
int
clk
)
{
u32
sctl
,
sdiv
,
sclk
;
if
(
clk
>=
0x40
)
return
27000
;
sctl
=
nv_rd32
(
dev
,
0x4120
+
(
clk
*
4
));
switch
(
sctl
&
0x00003100
)
{
case
0x00000100
:
return
27000
;
case
0x00002100
:
if
(
sctl
&
0x00000040
)
return
108000
;
return
100000
;
case
0x00003100
:
sdiv
=
((
sctl
&
0x003f0000
)
>>
16
)
+
2
;
if
((
sctl
&
0x00000030
)
!=
0x00000030
)
sclk
=
read_pll
(
dev
,
0x00e820
,
0x41
);
else
sclk
=
read_pll
(
dev
,
0x00e8a0
,
0x42
);
return
(
sclk
*
2
)
/
sdiv
;
default:
return
0
;
}
}
static
u32
read_pll
(
struct
drm_device
*
dev
,
u32
pll
,
int
clk
)
{
u32
ctrl
=
nv_rd32
(
dev
,
pll
+
0
);
u32
sclk
,
P
=
1
,
N
=
1
,
M
=
1
;
if
(
!
(
ctrl
&
0x00000008
))
{
u32
coef
=
nv_rd32
(
dev
,
pll
+
4
);
M
=
(
coef
&
0x000000ff
)
>>
0
;
N
=
(
coef
&
0x0000ff00
)
>>
8
;
P
=
(
coef
&
0x003f0000
)
>>
16
;
if
((
pll
&
0x00ff00
)
==
0x00e800
)
P
=
1
;
sclk
=
read_clk
(
dev
,
0x00
+
clk
);
}
else
{
sclk
=
read_clk
(
dev
,
0x10
+
clk
);
}
return
sclk
*
N
/
(
M
*
P
);
}
struct
nva3_pm_state
{
struct
nva3_pm_state
{
enum
pll_types
type
;
enum
pll_types
type
;
...
@@ -67,35 +115,16 @@ nva3_pm_pll_offset(u32 id)
...
@@ -67,35 +115,16 @@ nva3_pm_pll_offset(u32 id)
int
int
nva3_pm_clock_get
(
struct
drm_device
*
dev
,
u32
id
)
nva3_pm_clock_get
(
struct
drm_device
*
dev
,
u32
id
)
{
{
u32
src0
,
src1
,
ctrl
,
coef
;
switch
(
id
)
{
struct
pll_lims
pll
;
case
PLL_CORE
:
int
ret
,
off
;
return
read_pll
(
dev
,
0x4200
,
0
);
int
P
,
N
,
M
;
case
PLL_SHADER
:
return
read_pll
(
dev
,
0x4220
,
1
);
ret
=
get_pll_limits
(
dev
,
id
,
&
pll
);
case
PLL_MEMORY
:
if
(
ret
)
return
read_pll
(
dev
,
0x4000
,
2
);
return
ret
;
default:
return
-
ENOENT
;
off
=
nva3_pm_pll_offset
(
id
);
if
(
off
<
0
)
return
off
;
src0
=
nv_rd32
(
dev
,
0x4120
+
(
off
*
4
));
src1
=
nv_rd32
(
dev
,
0x4160
+
(
off
*
4
));
ctrl
=
nv_rd32
(
dev
,
pll
.
reg
+
0
);
coef
=
nv_rd32
(
dev
,
pll
.
reg
+
4
);
NV_DEBUG
(
dev
,
"PLL %02x: 0x%08x 0x%08x 0x%08x 0x%08x
\n
"
,
id
,
src0
,
src1
,
ctrl
,
coef
);
if
(
ctrl
&
0x00000008
)
{
u32
div
=
((
src1
&
0x003c0000
)
>>
18
)
+
1
;
return
(
pll
.
refclk
*
2
)
/
div
;
}
}
P
=
(
coef
&
0x003f0000
)
>>
16
;
N
=
(
coef
&
0x0000ff00
)
>>
8
;
M
=
(
coef
&
0x000000ff
);
return
pll
.
refclk
*
N
/
M
/
P
;
}
}
void
*
void
*
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录