Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
8ad200d7
cloud-kernel
项目概览
openanolis
/
cloud-kernel
12 个月 前同步成功
通知
152
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,发现更多精彩内容 >>
提交
8ad200d7
编写于
11月 04, 2005
作者:
P
Paul Mackerras
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
powerpc: Merge smp-tbsync.c (the generic timebase sync routine)
Signed-off-by:
N
Paul Mackerras
<
paulus@samba.org
>
上级
d3ab57eb
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
65 addition
and
65 deletion
+65
-65
arch/powerpc/Kconfig
arch/powerpc/Kconfig
+7
-0
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/Makefile
+1
-0
arch/powerpc/kernel/smp-tbsync.c
arch/powerpc/kernel/smp-tbsync.c
+52
-60
arch/ppc64/Kconfig
arch/ppc64/Kconfig
+5
-0
arch/ppc64/kernel/Makefile
arch/ppc64/kernel/Makefile
+0
-5
未找到文件。
arch/powerpc/Kconfig
浏览文件 @
8ad200d7
...
...
@@ -300,6 +300,7 @@ config PPC_PMAC64
bool
depends on PPC_PMAC && POWER4
select U3_DART
select GENERIC_TBSYNC
default y
config PPC_PREP
...
...
@@ -314,6 +315,7 @@ config PPC_MAPLE
bool " Maple 970FX Evaluation Board"
select U3_DART
select MPIC_BROKEN_U3
select GENERIC_TBSYNC
default n
help
This option enables support for the Maple 970FX Evaluation Board.
...
...
@@ -386,6 +388,11 @@ config PPC_MPC106
bool
default n
config GENERIC_TBSYNC
bool
default y if CONFIG_PPC32 && CONFIG_SMP
default n
source "drivers/cpufreq/Kconfig"
config CPU_FREQ_PMAC
...
...
arch/powerpc/kernel/Makefile
浏览文件 @
8ad200d7
...
...
@@ -21,6 +21,7 @@ obj-$(CONFIG_PPC_RTAS) += rtas.o
obj-$(CONFIG_RTAS_FLASH)
+=
rtas_flash.o
obj-$(CONFIG_RTAS_PROC)
+=
rtas-proc.o
obj-$(CONFIG_IBMVIO)
+=
vio.o
obj-$(CONFIG_GENERIC_TBSYNC)
+=
smp-tbsync.o
ifeq
($(CONFIG_PPC_MERGE),y)
...
...
arch/p
pc64
/kernel/smp-tbsync.c
→
arch/p
owerpc
/kernel/smp-tbsync.c
浏览文件 @
8ad200d7
...
...
@@ -22,11 +22,11 @@ enum {
};
static
struct
{
volatile
long
tb
;
volatile
long
mark
;
volatile
u64
tb
;
volatile
u64
mark
;
volatile
int
cmd
;
volatile
int
handshake
;
int
filler
[
3
];
int
filler
[
2
];
volatile
int
ack
;
int
filler2
[
7
];
...
...
@@ -36,89 +36,80 @@ static struct {
static
volatile
int
running
;
static
void
__devinit
enter_contest
(
long
mark
,
long
add
)
static
void
__devinit
enter_contest
(
u64
mark
,
long
add
)
{
while
(
(
long
)(
mftb
()
-
mark
)
<
0
)
while
(
get_tb
()
<
mark
)
tbsync
->
race_result
=
add
;
}
void
__devinit
smp_generic_take_timebase
(
void
)
void
__devinit
smp_generic_take_timebase
(
void
)
{
int
cmd
;
long
tb
;
u64
tb
;
local_irq_disable
();
while
(
!
running
)
;
while
(
!
running
)
barrier
()
;
rmb
();
for
(
;;
)
{
for
(;;
)
{
tbsync
->
ack
=
1
;
while
(
!
tbsync
->
handshake
)
;
while
(
!
tbsync
->
handshake
)
barrier
()
;
rmb
();
cmd
=
tbsync
->
cmd
;
tb
=
tbsync
->
tb
;
mb
();
tbsync
->
ack
=
0
;
if
(
cmd
==
kExit
)
return
;
if
(
cmd
==
kSetAndTest
)
{
while
(
tbsync
->
handshake
)
;
asm
volatile
(
"mttbl %0"
::
"r"
(
tb
&
0xfffffffful
)
);
asm
volatile
(
"mttbu %0"
::
"r"
(
tb
>>
32
)
);
}
else
{
while
(
tbsync
->
handshake
)
;
}
enter_contest
(
tbsync
->
mark
,
-
1
);
if
(
cmd
==
kExit
)
break
;
while
(
tbsync
->
handshake
)
barrier
();
if
(
cmd
==
kSetAndTest
)
set_tb
(
tb
>>
32
,
tb
&
0xfffffffful
);
enter_contest
(
tbsync
->
mark
,
-
1
);
}
local_irq_enable
();
}
static
int
__devinit
start_contest
(
int
cmd
,
long
offset
,
long
num
)
static
int
__devinit
start_contest
(
int
cmd
,
long
offset
,
int
num
)
{
int
i
,
score
=
0
;
long
tb
,
mark
;
u64
tb
;
long
mark
;
tbsync
->
cmd
=
cmd
;
local_irq_disable
();
for
(
i
=-
3
;
i
<
num
;
)
{
tb
=
(
long
)
mf
tb
()
+
400
;
for
(
i
=
-
3
;
i
<
num
;
)
{
tb
=
get_
tb
()
+
400
;
tbsync
->
tb
=
tb
+
offset
;
tbsync
->
mark
=
mark
=
tb
+
400
;
wmb
();
tbsync
->
handshake
=
1
;
while
(
tbsync
->
ack
)
;
while
(
tbsync
->
ack
)
barrier
()
;
while
(
(
long
)(
mftb
()
-
tb
)
<=
0
)
;
while
(
get_tb
()
<=
tb
)
barrier
()
;
tbsync
->
handshake
=
0
;
enter_contest
(
mark
,
1
);
enter_contest
(
mark
,
1
);
while
(
!
tbsync
->
ack
)
;
while
(
!
tbsync
->
ack
)
barrier
()
;
if
((
tbsync
->
tb
^
(
long
)
mftb
())
&
0x8000000000000000ul
)
continue
;
if
(
i
++
>
0
)
if
(
i
++
>
0
)
score
+=
tbsync
->
race_result
;
}
local_irq_enable
();
return
score
;
}
void
__devinit
smp_generic_give_timebase
(
void
)
void
__devinit
smp_generic_give_timebase
(
void
)
{
int
i
,
score
,
score2
,
old
,
min
=
0
,
max
=
5000
,
offset
=
1000
;
...
...
@@ -130,14 +121,14 @@ smp_generic_give_timebase( void )
mb
();
running
=
1
;
while
(
!
tbsync
->
ack
)
;
while
(
!
tbsync
->
ack
)
barrier
()
;
printk
(
"Got ack
\n
"
);
/* binary search */
for
(
old
=-
1
;
old
!=
offset
;
offset
=
(
min
+
max
)
/
2
)
{
score
=
start_contest
(
kSetAndTest
,
offset
,
NUM_ITER
);
for
(
old
=
-
1
;
old
!=
offset
;
offset
=
(
min
+
max
)
/
2
)
{
score
=
start_contest
(
kSetAndTest
,
offset
,
NUM_ITER
);
printk
(
"score %d, offset %d
\n
"
,
score
,
offset
);
...
...
@@ -147,21 +138,22 @@ smp_generic_give_timebase( void )
min
=
offset
;
old
=
offset
;
}
score
=
start_contest
(
kSetAndTest
,
min
,
NUM_ITER
);
score2
=
start_contest
(
kSetAndTest
,
max
,
NUM_ITER
);
score
=
start_contest
(
kSetAndTest
,
min
,
NUM_ITER
);
score2
=
start_contest
(
kSetAndTest
,
max
,
NUM_ITER
);
printk
(
"Min %d (score %d), Max %d (score %d)
\n
"
,
min
,
score
,
max
,
score2
);
score
=
abs
(
score
);
score2
=
abs
(
score2
);
printk
(
"Min %d (score %d), Max %d (score %d)
\n
"
,
min
,
score
,
max
,
score2
);
score
=
abs
(
score
);
score2
=
abs
(
score2
);
offset
=
(
score
<
score2
)
?
min
:
max
;
/* guard against inaccurate mttb */
for
(
i
=
0
;
i
<
10
;
i
++
)
{
start_contest
(
kSetAndTest
,
offset
,
NUM_ITER
/
10
);
for
(
i
=
0
;
i
<
10
;
i
++
)
{
start_contest
(
kSetAndTest
,
offset
,
NUM_ITER
/
10
);
if
(
(
score2
=
start_contest
(
kTest
,
offset
,
NUM_ITER
))
<
0
)
if
((
score2
=
start_contest
(
kTest
,
offset
,
NUM_ITER
))
<
0
)
score2
=
-
score2
;
if
(
score2
<=
score
||
score2
<
20
)
if
(
score2
<=
score
||
score2
<
20
)
break
;
}
printk
(
"Final offset: %d (%d/%d)
\n
"
,
offset
,
score2
,
NUM_ITER
);
...
...
@@ -170,10 +162,10 @@ smp_generic_give_timebase( void )
tbsync
->
cmd
=
kExit
;
wmb
();
tbsync
->
handshake
=
1
;
while
(
tbsync
->
ack
)
;
while
(
tbsync
->
ack
)
barrier
()
;
tbsync
->
handshake
=
0
;
kfree
(
tbsync
);
kfree
(
tbsync
);
tbsync
=
NULL
;
running
=
0
;
}
arch/ppc64/Kconfig
浏览文件 @
8ad200d7
...
...
@@ -89,12 +89,14 @@ config PPC_PMAC
bool " Apple G5 based machines"
default y
select U3_DART
select GENERIC_TBSYNC
config PPC_MAPLE
depends on PPC_MULTIPLATFORM
bool " Maple 970FX Evaluation Board"
select U3_DART
select MPIC_BROKEN_U3
select GENERIC_TBSYNC
default n
help
This option enables support for the Maple 970FX Evaluation Board.
...
...
@@ -182,6 +184,9 @@ config MPIC_BROKEN_U3
depends on PPC_MAPLE
default y
config GENERIC_TBSYNC
def_bool n
config PPC_PMAC64
bool
depends on PPC_PMAC
...
...
arch/ppc64/kernel/Makefile
浏览文件 @
8ad200d7
...
...
@@ -51,11 +51,6 @@ obj-$(CONFIG_PPC_PMAC) += udbg_scc.o
obj-$(CONFIG_PPC_MAPLE)
+=
udbg_16550.o
ifdef
CONFIG_SMP
obj-$(CONFIG_PPC_PMAC)
+=
smp-tbsync.o
obj-$(CONFIG_PPC_MAPLE)
+=
smp-tbsync.o
endif
obj-$(CONFIG_KPROBES)
+=
kprobes.o
CFLAGS_ioctl32.o
+=
-Ifs
/
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录