Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
5344303c
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看板
提交
5344303c
编写于
8月 17, 2012
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
sparc64: Abstract PMC read/write behind sparc_pmu.
Signed-off-by:
N
David S. Miller
<
davem@davemloft.net
>
上级
59660495
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
38 addition
and
30 deletion
+38
-30
arch/sparc/kernel/perf_event.c
arch/sparc/kernel/perf_event.c
+38
-30
未找到文件。
arch/sparc/kernel/perf_event.c
浏览文件 @
5344303c
...
...
@@ -141,6 +141,8 @@ struct sparc_pmu {
const
struct
perf_event_map
*
(
*
event_map
)(
int
);
const
cache_map_t
*
cache_map
;
int
max_events
;
u32
(
*
read_pmc
)(
int
);
void
(
*
write_pmc
)(
int
,
u64
);
int
upper_shift
;
int
lower_shift
;
int
event_mask
;
...
...
@@ -154,6 +156,34 @@ struct sparc_pmu {
int
max_hw_events
;
};
static
u32
sparc_default_read_pmc
(
int
idx
)
{
u64
val
;
val
=
pcr_ops
->
read_pic
(
0
);
if
(
idx
==
PIC_UPPER_INDEX
)
val
>>=
32
;
return
val
&
0xffffffff
;
}
static
void
sparc_default_write_pmc
(
int
idx
,
u64
val
)
{
u64
shift
,
mask
,
pic
;
shift
=
0
;
if
(
idx
==
PIC_UPPER_INDEX
)
shift
=
32
;
mask
=
((
u64
)
0xffffffff
)
<<
shift
;
val
<<=
shift
;
pic
=
pcr_ops
->
read_pic
(
0
);
pic
&=
~
mask
;
pic
|=
val
;
pcr_ops
->
write_pic
(
0
,
pic
);
}
static
const
struct
perf_event_map
ultra3_perfmon_event_map
[]
=
{
[
PERF_COUNT_HW_CPU_CYCLES
]
=
{
0x0000
,
PIC_UPPER
|
PIC_LOWER
},
[
PERF_COUNT_HW_INSTRUCTIONS
]
=
{
0x0001
,
PIC_UPPER
|
PIC_LOWER
},
...
...
@@ -271,6 +301,8 @@ static const struct sparc_pmu ultra3_pmu = {
.
event_map
=
ultra3_event_map
,
.
cache_map
=
&
ultra3_cache_map
,
.
max_events
=
ARRAY_SIZE
(
ultra3_perfmon_event_map
),
.
read_pmc
=
sparc_default_read_pmc
,
.
write_pmc
=
sparc_default_write_pmc
,
.
upper_shift
=
11
,
.
lower_shift
=
4
,
.
event_mask
=
0x3f
,
...
...
@@ -403,6 +435,8 @@ static const struct sparc_pmu niagara1_pmu = {
.
event_map
=
niagara1_event_map
,
.
cache_map
=
&
niagara1_cache_map
,
.
max_events
=
ARRAY_SIZE
(
niagara1_perfmon_event_map
),
.
read_pmc
=
sparc_default_read_pmc
,
.
write_pmc
=
sparc_default_write_pmc
,
.
upper_shift
=
0
,
.
lower_shift
=
4
,
.
event_mask
=
0x7
,
...
...
@@ -532,6 +566,8 @@ static const struct sparc_pmu niagara2_pmu = {
.
event_map
=
niagara2_event_map
,
.
cache_map
=
&
niagara2_cache_map
,
.
max_events
=
ARRAY_SIZE
(
niagara2_perfmon_event_map
),
.
read_pmc
=
sparc_default_read_pmc
,
.
write_pmc
=
sparc_default_write_pmc
,
.
upper_shift
=
19
,
.
lower_shift
=
6
,
.
event_mask
=
0xfff
,
...
...
@@ -593,34 +629,6 @@ static inline void sparc_pmu_disable_event(struct cpu_hw_events *cpuc, struct hw
pcr_ops
->
write_pcr
(
0
,
cpuc
->
pcr
);
}
static
u32
read_pmc
(
int
idx
)
{
u64
val
;
val
=
pcr_ops
->
read_pic
(
0
);
if
(
idx
==
PIC_UPPER_INDEX
)
val
>>=
32
;
return
val
&
0xffffffff
;
}
static
void
write_pmc
(
int
idx
,
u64
val
)
{
u64
shift
,
mask
,
pic
;
shift
=
0
;
if
(
idx
==
PIC_UPPER_INDEX
)
shift
=
32
;
mask
=
((
u64
)
0xffffffff
)
<<
shift
;
val
<<=
shift
;
pic
=
pcr_ops
->
read_pic
(
0
);
pic
&=
~
mask
;
pic
|=
val
;
pcr_ops
->
write_pic
(
0
,
pic
);
}
static
u64
sparc_perf_event_update
(
struct
perf_event
*
event
,
struct
hw_perf_event
*
hwc
,
int
idx
)
{
...
...
@@ -630,7 +638,7 @@ static u64 sparc_perf_event_update(struct perf_event *event,
again:
prev_raw_count
=
local64_read
(
&
hwc
->
prev_count
);
new_raw_count
=
read_pmc
(
idx
);
new_raw_count
=
sparc_pmu
->
read_pmc
(
idx
);
if
(
local64_cmpxchg
(
&
hwc
->
prev_count
,
prev_raw_count
,
new_raw_count
)
!=
prev_raw_count
)
...
...
@@ -670,7 +678,7 @@ static int sparc_perf_event_set_period(struct perf_event *event,
local64_set
(
&
hwc
->
prev_count
,
(
u64
)
-
left
);
write_pmc
(
idx
,
(
u64
)(
-
left
)
&
0xffffffff
);
sparc_pmu
->
write_pmc
(
idx
,
(
u64
)(
-
left
)
&
0xffffffff
);
perf_event_update_userpage
(
event
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录