Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
26fdd78c
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看板
提交
26fdd78c
编写于
10月 15, 2013
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau: implement a simple sysfs interface to new pm code
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
9838366c
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
191 addition
and
5 deletion
+191
-5
drivers/gpu/drm/nouveau/Makefile
drivers/gpu/drm/nouveau/Makefile
+1
-1
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nouveau_drm.c
+3
-0
drivers/gpu/drm/nouveau/nouveau_drm.h
drivers/gpu/drm/nouveau/nouveau_drm.h
+6
-4
drivers/gpu/drm/nouveau/nouveau_sysfs.c
drivers/gpu/drm/nouveau/nouveau_sysfs.c
+162
-0
drivers/gpu/drm/nouveau/nouveau_sysfs.h
drivers/gpu/drm/nouveau/nouveau_sysfs.h
+19
-0
未找到文件。
drivers/gpu/drm/nouveau/Makefile
浏览文件 @
26fdd78c
...
...
@@ -300,7 +300,7 @@ include $(src)/dispnv04/Makefile
nouveau-y
+=
nv50_display.o
# drm/pm
nouveau-y
+=
nouveau_hwmon.o
nouveau-y
+=
nouveau_hwmon.o
nouveau_sysfs.o
# other random bits
nouveau-$(CONFIG_COMPAT)
+=
nouveau_ioc32.o
...
...
drivers/gpu/drm/nouveau/nouveau_drm.c
浏览文件 @
26fdd78c
...
...
@@ -46,6 +46,7 @@
#include "nouveau_gem.h"
#include "nouveau_agp.h"
#include "nouveau_vga.h"
#include "nouveau_sysfs.h"
#include "nouveau_hwmon.h"
#include "nouveau_acpi.h"
#include "nouveau_bios.h"
...
...
@@ -384,6 +385,7 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
goto
fail_dispinit
;
}
nouveau_sysfs_init
(
dev
);
nouveau_hwmon_init
(
dev
);
nouveau_accel_init
(
drm
);
nouveau_fbcon_init
(
dev
);
...
...
@@ -421,6 +423,7 @@ nouveau_drm_unload(struct drm_device *dev)
nouveau_fbcon_fini
(
dev
);
nouveau_accel_fini
(
drm
);
nouveau_hwmon_fini
(
dev
);
nouveau_sysfs_fini
(
dev
);
if
(
dev
->
mode_config
.
num_crtc
)
nouveau_display_fini
(
dev
);
...
...
drivers/gpu/drm/nouveau/nouveau_drm.h
浏览文件 @
26fdd78c
...
...
@@ -51,10 +51,11 @@ struct nouveau_drm_tile {
};
enum
nouveau_drm_handle
{
NVDRM_CLIENT
=
0xffffffff
,
NVDRM_DEVICE
=
0xdddddddd
,
NVDRM_PUSH
=
0xbbbb0000
,
/* |= client chid */
NVDRM_CHAN
=
0xcccc0000
,
/* |= client chid */
NVDRM_CLIENT
=
0xffffffff
,
NVDRM_DEVICE
=
0xdddddddd
,
NVDRM_CONTROL
=
0xdddddddc
,
NVDRM_PUSH
=
0xbbbb0000
,
/* |= client chid */
NVDRM_CHAN
=
0xcccc0000
,
/* |= client chid */
};
struct
nouveau_cli
{
...
...
@@ -130,6 +131,7 @@ struct nouveau_drm {
/* power management */
struct
nouveau_hwmon
*
hwmon
;
struct
nouveau_sysfs
*
sysfs
;
/* display power reference */
bool
have_disp_power_ref
;
...
...
drivers/gpu/drm/nouveau/nouveau_sysfs.c
0 → 100644
浏览文件 @
26fdd78c
/*
* Copyright 2013 Red Hat Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
#include "nouveau_sysfs.h"
#include <core/object.h>
#include <core/class.h>
static
inline
struct
drm_device
*
drm_device
(
struct
device
*
d
)
{
return
pci_get_drvdata
(
to_pci_dev
(
d
));
}
#define snappendf(p,r,f,a...) do { \
snprintf(p, r, f, ##a); \
r -= strlen(p); \
p += strlen(p); \
} while(0)
static
ssize_t
nouveau_sysfs_pstate_get
(
struct
device
*
d
,
struct
device_attribute
*
a
,
char
*
b
)
{
struct
nouveau_sysfs
*
sysfs
=
nouveau_sysfs
(
drm_device
(
d
));
struct
nv_control_pstate_info
info
;
size_t
cnt
=
PAGE_SIZE
;
char
*
buf
=
b
;
int
ret
,
i
;
ret
=
nv_exec
(
sysfs
->
ctrl
,
NV_CONTROL_PSTATE_INFO
,
&
info
,
sizeof
(
info
));
if
(
ret
)
return
ret
;
for
(
i
=
0
;
i
<
info
.
count
+
1
;
i
++
)
{
const
s32
state
=
i
<
info
.
count
?
i
:
NV_CONTROL_PSTATE_ATTR_STATE_CURRENT
;
struct
nv_control_pstate_attr
attr
=
{
.
state
=
state
,
.
index
=
0
,
};
ret
=
nv_exec
(
sysfs
->
ctrl
,
NV_CONTROL_PSTATE_ATTR
,
&
attr
,
sizeof
(
attr
));
if
(
ret
)
return
ret
;
if
(
i
<
info
.
count
)
snappendf
(
buf
,
cnt
,
"%02x:"
,
attr
.
state
);
else
snappendf
(
buf
,
cnt
,
"--:"
);
attr
.
index
=
0
;
do
{
attr
.
state
=
state
;
ret
=
nv_exec
(
sysfs
->
ctrl
,
NV_CONTROL_PSTATE_ATTR
,
&
attr
,
sizeof
(
attr
));
if
(
ret
)
return
ret
;
snappendf
(
buf
,
cnt
,
" %s %d"
,
attr
.
name
,
attr
.
min
);
if
(
attr
.
min
!=
attr
.
max
)
snappendf
(
buf
,
cnt
,
"-%d"
,
attr
.
max
);
snappendf
(
buf
,
cnt
,
" %s"
,
attr
.
unit
);
}
while
(
attr
.
index
);
if
((
state
>=
0
&&
info
.
pstate
==
state
)
||
(
state
<
0
&&
info
.
ustate
<
0
))
snappendf
(
buf
,
cnt
,
" *"
);
snappendf
(
buf
,
cnt
,
"
\n
"
);
}
return
strlen
(
b
);
}
static
ssize_t
nouveau_sysfs_pstate_set
(
struct
device
*
d
,
struct
device_attribute
*
a
,
const
char
*
buf
,
size_t
count
)
{
struct
nouveau_sysfs
*
sysfs
=
nouveau_sysfs
(
drm_device
(
d
));
struct
nv_control_pstate_user
args
;
long
value
,
ret
;
char
*
tmp
;
if
((
tmp
=
strchr
(
buf
,
'\n'
)))
*
tmp
=
'\0'
;
if
(
!
strcasecmp
(
buf
,
"none"
))
args
.
state
=
NV_CONTROL_PSTATE_USER_STATE_UNKNOWN
;
else
if
(
!
strcasecmp
(
buf
,
"auto"
))
args
.
state
=
NV_CONTROL_PSTATE_USER_STATE_PERFMON
;
else
{
ret
=
kstrtol
(
buf
,
16
,
&
value
);
if
(
ret
)
return
ret
;
args
.
state
=
value
;
}
ret
=
nv_exec
(
sysfs
->
ctrl
,
NV_CONTROL_PSTATE_USER
,
&
args
,
sizeof
(
args
));
if
(
ret
<
0
)
return
ret
;
return
count
;
}
static
DEVICE_ATTR
(
pstate
,
S_IRUGO
|
S_IWUSR
,
nouveau_sysfs_pstate_get
,
nouveau_sysfs_pstate_set
);
void
nouveau_sysfs_fini
(
struct
drm_device
*
dev
)
{
struct
nouveau_sysfs
*
sysfs
=
nouveau_sysfs
(
dev
);
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
if
(
sysfs
->
ctrl
)
{
device_remove_file
(
&
dev
->
pdev
->
dev
,
&
dev_attr_pstate
);
nouveau_object_del
(
nv_object
(
drm
),
NVDRM_DEVICE
,
NVDRM_CONTROL
);
}
drm
->
sysfs
=
NULL
;
kfree
(
sysfs
);
}
int
nouveau_sysfs_init
(
struct
drm_device
*
dev
)
{
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
struct
nouveau_sysfs
*
sysfs
;
int
ret
;
sysfs
=
drm
->
sysfs
=
kzalloc
(
sizeof
(
*
sysfs
),
GFP_KERNEL
);
if
(
!
sysfs
)
return
-
ENOMEM
;
ret
=
nouveau_object_new
(
nv_object
(
drm
),
NVDRM_DEVICE
,
NVDRM_CONTROL
,
NV_CONTROL_CLASS
,
NULL
,
0
,
&
sysfs
->
ctrl
);
if
(
ret
==
0
)
device_create_file
(
&
dev
->
pdev
->
dev
,
&
dev_attr_pstate
);
return
0
;
}
drivers/gpu/drm/nouveau/nouveau_sysfs.h
0 → 100644
浏览文件 @
26fdd78c
#ifndef __NOUVEAU_SYSFS_H__
#define __NOUVEAU_SYSFS_H__
#include "nouveau_drm.h"
struct
nouveau_sysfs
{
struct
nouveau_object
*
ctrl
;
};
static
inline
struct
nouveau_sysfs
*
nouveau_sysfs
(
struct
drm_device
*
dev
)
{
return
nouveau_drm
(
dev
)
->
sysfs
;
}
int
nouveau_sysfs_init
(
struct
drm_device
*
);
void
nouveau_sysfs_fini
(
struct
drm_device
*
);
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录