Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
7c202575
K
Kernel
项目概览
openeuler
/
Kernel
大约 2 年 前同步成功
通知
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看板
提交
7c202575
编写于
11月 04, 2019
作者:
M
Michael Ellerman
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'fixes' into next
Merge our fixes branch, primarily to bring in the powernv CPU hotplug warning fix.
上级
e44ff9ea
7d647505
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
57 addition
and
18 deletion
+57
-18
arch/powerpc/include/asm/book3s/32/kup.h
arch/powerpc/include/asm/book3s/32/kup.h
+1
-0
arch/powerpc/include/asm/elf.h
arch/powerpc/include/asm/elf.h
+3
-0
arch/powerpc/kernel/prom_init.c
arch/powerpc/kernel/prom_init.c
+13
-0
arch/powerpc/kernel/prom_init_check.sh
arch/powerpc/kernel/prom_init_check.sh
+2
-1
arch/powerpc/platforms/powernv/eeh-powernv.c
arch/powerpc/platforms/powernv/eeh-powernv.c
+1
-1
arch/powerpc/platforms/powernv/smp.c
arch/powerpc/platforms/powernv/smp.c
+37
-16
未找到文件。
arch/powerpc/include/asm/book3s/32/kup.h
浏览文件 @
7c202575
...
@@ -91,6 +91,7 @@
...
@@ -91,6 +91,7 @@
static
inline
void
kuap_update_sr
(
u32
sr
,
u32
addr
,
u32
end
)
static
inline
void
kuap_update_sr
(
u32
sr
,
u32
addr
,
u32
end
)
{
{
addr
&=
0xf0000000
;
/* align addr to start of segment */
barrier
();
/* make sure thread.kuap is updated before playing with SRs */
barrier
();
/* make sure thread.kuap is updated before playing with SRs */
while
(
addr
<
end
)
{
while
(
addr
<
end
)
{
mtsrin
(
sr
,
addr
);
mtsrin
(
sr
,
addr
);
...
...
arch/powerpc/include/asm/elf.h
浏览文件 @
7c202575
...
@@ -175,4 +175,7 @@ do { \
...
@@ -175,4 +175,7 @@ do { \
ARCH_DLINFO_CACHE_GEOMETRY; \
ARCH_DLINFO_CACHE_GEOMETRY; \
} while (0)
} while (0)
/* Relocate the kernel image to @final_address */
void
relocate
(
unsigned
long
final_address
);
#endif
/* _ASM_POWERPC_ELF_H */
#endif
/* _ASM_POWERPC_ELF_H */
arch/powerpc/kernel/prom_init.c
浏览文件 @
7c202575
...
@@ -3249,7 +3249,20 @@ static void setup_secure_guest(unsigned long kbase, unsigned long fdt)
...
@@ -3249,7 +3249,20 @@ static void setup_secure_guest(unsigned long kbase, unsigned long fdt)
/* Switch to secure mode. */
/* Switch to secure mode. */
prom_printf
(
"Switching to secure mode.
\n
"
);
prom_printf
(
"Switching to secure mode.
\n
"
);
/*
* The ultravisor will do an integrity check of the kernel image but we
* relocated it so the check will fail. Restore the original image by
* relocating it back to the kernel virtual base address.
*/
if
(
IS_ENABLED
(
CONFIG_RELOCATABLE
))
relocate
(
KERNELBASE
);
ret
=
enter_secure_mode
(
kbase
,
fdt
);
ret
=
enter_secure_mode
(
kbase
,
fdt
);
/* Relocate the kernel again. */
if
(
IS_ENABLED
(
CONFIG_RELOCATABLE
))
relocate
(
kbase
);
if
(
ret
!=
U_SUCCESS
)
{
if
(
ret
!=
U_SUCCESS
)
{
prom_printf
(
"Returned %d from switching to secure mode.
\n
"
,
ret
);
prom_printf
(
"Returned %d from switching to secure mode.
\n
"
,
ret
);
prom_rtas_os_term
(
"Switch to secure mode failed.
\n
"
);
prom_rtas_os_term
(
"Switch to secure mode failed.
\n
"
);
...
...
arch/powerpc/kernel/prom_init_check.sh
浏览文件 @
7c202575
...
@@ -26,7 +26,8 @@ _end enter_prom $MEM_FUNCS reloc_offset __secondary_hold
...
@@ -26,7 +26,8 @@ _end enter_prom $MEM_FUNCS reloc_offset __secondary_hold
__secondary_hold_acknowledge __secondary_hold_spinloop __start
__secondary_hold_acknowledge __secondary_hold_spinloop __start
logo_linux_clut224 btext_prepare_BAT
logo_linux_clut224 btext_prepare_BAT
reloc_got2 kernstart_addr memstart_addr linux_banner _stext
reloc_got2 kernstart_addr memstart_addr linux_banner _stext
__prom_init_toc_start __prom_init_toc_end btext_setup_display TOC."
__prom_init_toc_start __prom_init_toc_end btext_setup_display TOC.
relocate"
NM
=
"
$1
"
NM
=
"
$1
"
OBJ
=
"
$2
"
OBJ
=
"
$2
"
...
...
arch/powerpc/platforms/powernv/eeh-powernv.c
浏览文件 @
7c202575
...
@@ -42,7 +42,7 @@ void pnv_pcibios_bus_add_device(struct pci_dev *pdev)
...
@@ -42,7 +42,7 @@ void pnv_pcibios_bus_add_device(struct pci_dev *pdev)
{
{
struct
pci_dn
*
pdn
=
pci_get_pdn
(
pdev
);
struct
pci_dn
*
pdn
=
pci_get_pdn
(
pdev
);
if
(
eeh_has_flag
(
EEH_FORCE_DISABLED
))
if
(
!
pdn
||
eeh_has_flag
(
EEH_FORCE_DISABLED
))
return
;
return
;
dev_dbg
(
&
pdev
->
dev
,
"EEH: Setting up device
\n
"
);
dev_dbg
(
&
pdev
->
dev
,
"EEH: Setting up device
\n
"
);
...
...
arch/powerpc/platforms/powernv/smp.c
浏览文件 @
7c202575
...
@@ -146,20 +146,25 @@ static int pnv_smp_cpu_disable(void)
...
@@ -146,20 +146,25 @@ static int pnv_smp_cpu_disable(void)
return
0
;
return
0
;
}
}
static
void
pnv_flush_interrupts
(
void
)
{
if
(
cpu_has_feature
(
CPU_FTR_ARCH_300
))
{
if
(
xive_enabled
())
xive_flush_interrupt
();
else
icp_opal_flush_interrupt
();
}
else
{
icp_native_flush_interrupt
();
}
}
static
void
pnv_smp_cpu_kill_self
(
void
)
static
void
pnv_smp_cpu_kill_self
(
void
)
{
{
unsigned
long
srr1
,
unexpected_mask
,
wmask
;
unsigned
int
cpu
;
unsigned
int
cpu
;
unsigned
long
srr1
,
wmask
;
u64
lpcr_val
;
u64
lpcr_val
;
/* Standard hot unplug procedure */
/* Standard hot unplug procedure */
/*
* This hard disables local interurpts, ensuring we have no lazy
* irqs pending.
*/
WARN_ON
(
irqs_disabled
());
hard_irq_disable
();
WARN_ON
(
lazy_irq_pending
());
idle_task_exit
();
idle_task_exit
();
current
->
active_mm
=
NULL
;
/* for sanity */
current
->
active_mm
=
NULL
;
/* for sanity */
...
@@ -172,6 +177,27 @@ static void pnv_smp_cpu_kill_self(void)
...
@@ -172,6 +177,27 @@ static void pnv_smp_cpu_kill_self(void)
if
(
cpu_has_feature
(
CPU_FTR_ARCH_207S
))
if
(
cpu_has_feature
(
CPU_FTR_ARCH_207S
))
wmask
=
SRR1_WAKEMASK_P8
;
wmask
=
SRR1_WAKEMASK_P8
;
/*
* This turns the irq soft-disabled state we're called with, into a
* hard-disabled state with pending irq_happened interrupts cleared.
*
* PACA_IRQ_DEC - Decrementer should be ignored.
* PACA_IRQ_HMI - Can be ignored, processing is done in real mode.
* PACA_IRQ_DBELL, EE, PMI - Unexpected.
*/
hard_irq_disable
();
if
(
generic_check_cpu_restart
(
cpu
))
goto
out
;
unexpected_mask
=
~
(
PACA_IRQ_DEC
|
PACA_IRQ_HMI
|
PACA_IRQ_HARD_DIS
);
if
(
local_paca
->
irq_happened
&
unexpected_mask
)
{
if
(
local_paca
->
irq_happened
&
PACA_IRQ_EE
)
pnv_flush_interrupts
();
DBG
(
"CPU%d Unexpected exit while offline irq_happened=%lx!
\n
"
,
cpu
,
local_paca
->
irq_happened
);
}
local_paca
->
irq_happened
=
PACA_IRQ_HARD_DIS
;
/*
/*
* We don't want to take decrementer interrupts while we are
* We don't want to take decrementer interrupts while we are
* offline, so clear LPCR:PECE1. We keep PECE2 (and
* offline, so clear LPCR:PECE1. We keep PECE2 (and
...
@@ -197,6 +223,7 @@ static void pnv_smp_cpu_kill_self(void)
...
@@ -197,6 +223,7 @@ static void pnv_smp_cpu_kill_self(void)
srr1
=
pnv_cpu_offline
(
cpu
);
srr1
=
pnv_cpu_offline
(
cpu
);
WARN_ON_ONCE
(
!
irqs_disabled
());
WARN_ON
(
lazy_irq_pending
());
WARN_ON
(
lazy_irq_pending
());
/*
/*
...
@@ -212,13 +239,7 @@ static void pnv_smp_cpu_kill_self(void)
...
@@ -212,13 +239,7 @@ static void pnv_smp_cpu_kill_self(void)
*/
*/
if
(((
srr1
&
wmask
)
==
SRR1_WAKEEE
)
||
if
(((
srr1
&
wmask
)
==
SRR1_WAKEEE
)
||
((
srr1
&
wmask
)
==
SRR1_WAKEHVI
))
{
((
srr1
&
wmask
)
==
SRR1_WAKEHVI
))
{
if
(
cpu_has_feature
(
CPU_FTR_ARCH_300
))
{
pnv_flush_interrupts
();
if
(
xive_enabled
())
xive_flush_interrupt
();
else
icp_opal_flush_interrupt
();
}
else
icp_native_flush_interrupt
();
}
else
if
((
srr1
&
wmask
)
==
SRR1_WAKEHDBELL
)
{
}
else
if
((
srr1
&
wmask
)
==
SRR1_WAKEHDBELL
)
{
unsigned
long
msg
=
PPC_DBELL_TYPE
(
PPC_DBELL_SERVER
);
unsigned
long
msg
=
PPC_DBELL_TYPE
(
PPC_DBELL_SERVER
);
asm
volatile
(
PPC_MSGCLR
(
%
0
)
:
:
"r"
(
msg
));
asm
volatile
(
PPC_MSGCLR
(
%
0
)
:
:
"r"
(
msg
));
...
@@ -266,7 +287,7 @@ static void pnv_smp_cpu_kill_self(void)
...
@@ -266,7 +287,7 @@ static void pnv_smp_cpu_kill_self(void)
*/
*/
lpcr_val
=
mfspr
(
SPRN_LPCR
)
|
(
u64
)
LPCR_PECE1
;
lpcr_val
=
mfspr
(
SPRN_LPCR
)
|
(
u64
)
LPCR_PECE1
;
pnv_program_cpu_hotplug_lpcr
(
cpu
,
lpcr_val
);
pnv_program_cpu_hotplug_lpcr
(
cpu
,
lpcr_val
);
out:
DBG
(
"CPU%d coming online...
\n
"
,
cpu
);
DBG
(
"CPU%d coming online...
\n
"
,
cpu
);
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录