Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
fcfc7688
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 1 年 前同步成功
通知
158
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
fcfc7688
编写于
4月 20, 2011
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nva3: support for memory timing map table
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
e614b2e7
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
67 addition
and
14 deletion
+67
-14
drivers/gpu/drm/nouveau/nouveau_perf.c
drivers/gpu/drm/nouveau/nouveau_perf.c
+67
-14
未找到文件。
drivers/gpu/drm/nouveau/nouveau_perf.c
浏览文件 @
fcfc7688
...
...
@@ -72,6 +72,66 @@ legacy_perf_init(struct drm_device *dev)
pm
->
nr_perflvl
=
1
;
}
static
struct
nouveau_pm_memtiming
*
nouveau_perf_timing
(
struct
drm_device
*
dev
,
struct
bit_entry
*
P
,
u16
memclk
,
u8
*
entry
,
u8
recordlen
,
u8
entries
)
{
struct
drm_nouveau_private
*
dev_priv
=
dev
->
dev_private
;
struct
nouveau_pm_engine
*
pm
=
&
dev_priv
->
engine
.
pm
;
struct
nvbios
*
bios
=
&
dev_priv
->
vbios
;
u8
ramcfg
;
int
i
;
/* perf v2 has a separate "timing map" table, we have to match
* the target memory clock to a specific entry, *then* use
* ramcfg to select the correct subentry
*/
if
(
P
->
version
==
2
)
{
u8
*
tmap
=
ROMPTR
(
bios
,
P
->
data
[
4
]);
if
(
!
tmap
)
{
NV_DEBUG
(
dev
,
"no timing map pointer
\n
"
);
return
NULL
;
}
if
(
tmap
[
0
]
!=
0x10
)
{
NV_WARN
(
dev
,
"timing map 0x%02x unknown
\n
"
,
tmap
[
0
]);
return
NULL
;
}
entry
=
tmap
+
tmap
[
1
];
recordlen
=
tmap
[
2
]
+
(
tmap
[
4
]
*
tmap
[
3
]);
for
(
i
=
0
;
i
<
tmap
[
5
];
i
++
,
entry
+=
recordlen
)
{
if
(
memclk
>=
ROM16
(
entry
[
0
])
&&
memclk
<=
ROM16
(
entry
[
2
]))
break
;
}
if
(
i
==
tmap
[
5
])
{
NV_WARN
(
dev
,
"no match in timing map table
\n
"
);
return
NULL
;
}
entry
+=
tmap
[
2
];
recordlen
=
tmap
[
3
];
entries
=
tmap
[
4
];
}
ramcfg
=
nv_rd32
(
dev
,
NV_PEXTDEV_BOOT_0
)
&
0x0000003c
;
ramcfg
>>=
2
;
if
(
ramcfg
>=
entries
)
{
NV_WARN
(
dev
,
"ramcfg strap out of bounds!
\n
"
);
return
NULL
;
}
entry
+=
ramcfg
*
recordlen
;
if
(
entry
[
1
]
>=
pm
->
memtimings
.
nr_timing
)
{
NV_WARN
(
dev
,
"timingset %d does not exist
\n
"
,
entry
[
1
]);
return
NULL
;
}
return
&
pm
->
memtimings
.
timing
[
entry
[
1
]];
}
void
nouveau_perf_init
(
struct
drm_device
*
dev
)
{
...
...
@@ -82,7 +142,6 @@ nouveau_perf_init(struct drm_device *dev)
u8
version
,
headerlen
,
recordlen
,
entries
;
u8
*
perf
,
*
entry
;
int
vid
,
i
;
u8
ramcfg
=
(
nv_rd32
(
dev
,
NV_PEXTDEV_BOOT_0
)
&
0x3c
)
>>
2
;
if
(
bios
->
type
==
NVBIOS_BIT
)
{
if
(
bit_table
(
dev
,
'P'
,
&
P
))
...
...
@@ -194,19 +253,13 @@ nouveau_perf_init(struct drm_device *dev)
}
/* get the corresponding memory timings */
if
(
pm
->
memtimings
.
supported
)
{
u8
timing_id
=
0xff
;
u16
extra_data
;
if
(
version
>
0x15
&&
version
<
0x40
&&
ramcfg
<
perf
[
4
])
{
extra_data
=
perf
[
3
]
+
(
ramcfg
*
perf
[
5
]);
timing_id
=
entry
[
extra_data
+
1
];
}
if
(
pm
->
memtimings
.
nr_timing
>
timing_id
)
if
(
pm
->
memtimings
.
supported
&&
version
>
0x15
)
{
/* last 3 args are for < 0x40, ignored for >= 0x40 */
perflvl
->
timing
=
&
pm
->
memtimings
.
timing
[
timing_id
];
nouveau_perf_timing
(
dev
,
&
P
,
perflvl
->
memory
/
1000
,
entry
+
perf
[
3
],
perf
[
5
],
perf
[
4
]);
}
snprintf
(
perflvl
->
name
,
sizeof
(
perflvl
->
name
),
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录