Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
d5d7a0fa
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看板
提交
d5d7a0fa
编写于
6月 13, 2014
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/clk: schedule pstate changes through a workqueue
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
ed76a870
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
39 addition
and
11 deletion
+39
-11
drivers/gpu/drm/nouveau/core/include/subdev/clock.h
drivers/gpu/drm/nouveau/core/include/subdev/clock.h
+4
-0
drivers/gpu/drm/nouveau/core/subdev/clock/base.c
drivers/gpu/drm/nouveau/core/subdev/clock/base.c
+35
-11
未找到文件。
drivers/gpu/drm/nouveau/core/include/subdev/clock.h
浏览文件 @
d5d7a0fa
...
...
@@ -71,6 +71,10 @@ struct nouveau_clock {
struct
list_head
states
;
int
state_nr
;
struct
work_struct
work
;
wait_queue_head_t
wait
;
atomic_t
waiting
;
int
pstate
;
/* current */
int
ustate
;
/* user-requested (-1 disabled, -2 perfmon) */
int
astate
;
/* perfmon adjustment (base) */
...
...
drivers/gpu/drm/nouveau/core/subdev/clock/base.c
浏览文件 @
d5d7a0fa
...
...
@@ -194,10 +194,14 @@ nouveau_pstate_prog(struct nouveau_clock *clk, int pstatei)
return
nouveau_cstate_prog
(
clk
,
pstate
,
0
);
}
static
int
nouveau_pstate_
calc
(
struct
nouveau_clock
*
cl
k
)
static
void
nouveau_pstate_
work
(
struct
work_struct
*
wor
k
)
{
int
pstate
,
ret
=
0
;
struct
nouveau_clock
*
clk
=
container_of
(
work
,
typeof
(
*
clk
),
work
);
int
pstate
;
if
(
!
atomic_xchg
(
&
clk
->
waiting
,
0
))
return
;
nv_trace
(
clk
,
"P %d U %d A %d T %d D %d
\n
"
,
clk
->
pstate
,
clk
->
ustate
,
clk
->
astate
,
clk
->
tstate
,
clk
->
dstate
);
...
...
@@ -211,9 +215,25 @@ nouveau_pstate_calc(struct nouveau_clock *clk)
}
nv_trace
(
clk
,
"-> %d
\n
"
,
pstate
);
if
(
pstate
!=
clk
->
pstate
)
ret
=
nouveau_pstate_prog
(
clk
,
pstate
);
return
ret
;
if
(
pstate
!=
clk
->
pstate
)
{
int
ret
=
nouveau_pstate_prog
(
clk
,
pstate
);
if
(
ret
)
{
nv_error
(
clk
,
"error setting pstate %d: %d
\n
"
,
pstate
,
ret
);
}
}
wake_up_all
(
&
clk
->
wait
);
}
static
int
nouveau_pstate_calc
(
struct
nouveau_clock
*
clk
,
bool
wait
)
{
atomic_set
(
&
clk
->
waiting
,
1
);
schedule_work
(
&
clk
->
work
);
if
(
wait
)
wait_event
(
clk
->
wait
,
!
atomic_read
(
&
clk
->
waiting
));
return
0
;
}
static
void
...
...
@@ -371,7 +391,7 @@ nouveau_clock_ustate(struct nouveau_clock *clk, int req)
int
ret
=
nouveau_clock_ustate_update
(
clk
,
req
);
if
(
ret
)
return
ret
;
return
nouveau_pstate_calc
(
clk
);
return
nouveau_pstate_calc
(
clk
,
true
);
}
int
...
...
@@ -381,7 +401,7 @@ nouveau_clock_astate(struct nouveau_clock *clk, int req, int rel)
if
(
rel
)
clk
->
astate
+=
rel
;
clk
->
astate
=
min
(
clk
->
astate
,
clk
->
state_nr
-
1
);
clk
->
astate
=
max
(
clk
->
astate
,
0
);
return
nouveau_pstate_calc
(
clk
);
return
nouveau_pstate_calc
(
clk
,
true
);
}
int
...
...
@@ -391,7 +411,7 @@ nouveau_clock_tstate(struct nouveau_clock *clk, int req, int rel)
if
(
rel
)
clk
->
tstate
+=
rel
;
clk
->
tstate
=
min
(
clk
->
tstate
,
0
);
clk
->
tstate
=
max
(
clk
->
tstate
,
-
(
clk
->
state_nr
-
1
));
return
nouveau_pstate_calc
(
clk
);
return
nouveau_pstate_calc
(
clk
,
true
);
}
int
...
...
@@ -401,7 +421,7 @@ nouveau_clock_dstate(struct nouveau_clock *clk, int req, int rel)
if
(
rel
)
clk
->
dstate
+=
rel
;
clk
->
dstate
=
min
(
clk
->
dstate
,
clk
->
state_nr
-
1
);
clk
->
dstate
=
max
(
clk
->
dstate
,
0
);
return
nouveau_pstate_calc
(
clk
);
return
nouveau_pstate_calc
(
clk
,
true
);
}
/******************************************************************************
...
...
@@ -434,7 +454,7 @@ _nouveau_clock_init(struct nouveau_object *object)
clk
->
tstate
=
0
;
clk
->
dstate
=
0
;
clk
->
pstate
=
-
1
;
nouveau_pstate_calc
(
clk
);
nouveau_pstate_calc
(
clk
,
true
);
return
0
;
}
...
...
@@ -474,6 +494,10 @@ nouveau_clock_create_(struct nouveau_object *parent,
clk
->
domains
=
clocks
;
clk
->
ustate
=
-
1
;
INIT_WORK
(
&
clk
->
work
,
nouveau_pstate_work
);
init_waitqueue_head
(
&
clk
->
wait
);
atomic_set
(
&
clk
->
waiting
,
0
);
idx
=
0
;
do
{
ret
=
nouveau_pstate_new
(
clk
,
idx
++
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录