Merge branch 'topic/ppc-kvm' into next
This brings in two series from Paul, one of which touches KVM code and may need to be merged into the kvm-ppc tree to resolve conflicts.
This commit is contained in:
@@ -568,6 +568,7 @@ int main(void)
|
||||
OFFSET(VCPU_TFHAR, kvm_vcpu, arch.tfhar);
|
||||
OFFSET(VCPU_TFIAR, kvm_vcpu, arch.tfiar);
|
||||
OFFSET(VCPU_TEXASR, kvm_vcpu, arch.texasr);
|
||||
OFFSET(VCPU_ORIG_TEXASR, kvm_vcpu, arch.orig_texasr);
|
||||
OFFSET(VCPU_GPR_TM, kvm_vcpu, arch.gpr_tm);
|
||||
OFFSET(VCPU_FPRS_TM, kvm_vcpu, arch.fp_tm.fpr);
|
||||
OFFSET(VCPU_VRS_TM, kvm_vcpu, arch.vr_tm.vr);
|
||||
@@ -650,6 +651,7 @@ int main(void)
|
||||
HSTATE_FIELD(HSTATE_HOST_IPI, host_ipi);
|
||||
HSTATE_FIELD(HSTATE_PTID, ptid);
|
||||
HSTATE_FIELD(HSTATE_TID, tid);
|
||||
HSTATE_FIELD(HSTATE_FAKE_SUSPEND, fake_suspend);
|
||||
HSTATE_FIELD(HSTATE_MMCR0, host_mmcr[0]);
|
||||
HSTATE_FIELD(HSTATE_MMCR1, host_mmcr[1]);
|
||||
HSTATE_FIELD(HSTATE_MMCRA, host_mmcr[2]);
|
||||
@@ -759,6 +761,7 @@ int main(void)
|
||||
OFFSET(PACA_SUBCORE_SIBLING_MASK, paca_struct, subcore_sibling_mask);
|
||||
OFFSET(PACA_SIBLING_PACA_PTRS, paca_struct, thread_sibling_pacas);
|
||||
OFFSET(PACA_REQ_PSSCR, paca_struct, requested_psscr);
|
||||
OFFSET(PACA_DONT_STOP, paca_struct, dont_stop);
|
||||
#define STOP_SPR(x, f) OFFSET(x, paca_struct, stop_sprs.f)
|
||||
STOP_SPR(STOP_PID, pid);
|
||||
STOP_SPR(STOP_LDBAR, ldbar);
|
||||
|
@@ -226,7 +226,7 @@ BEGIN_FTR_SECTION
|
||||
beq 1f
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_L3CR)
|
||||
lwz r6,CPU_SPEC_FEATURES(r4)
|
||||
andi. r0,r6,CPU_FTR_L3_DISABLE_NAP
|
||||
andis. r0,r6,CPU_FTR_L3_DISABLE_NAP@h
|
||||
beq 1f
|
||||
li r7,CPU_FTR_CAN_NAP
|
||||
andc r6,r6,r7
|
||||
|
@@ -162,7 +162,7 @@ _GLOBAL(__setup_cpu_e5500)
|
||||
* the feature on the primary core, avoid doing it on the
|
||||
* secondary core.
|
||||
*/
|
||||
andis. r6, r3, CPU_FTR_EMB_HV@h
|
||||
andi. r6, r3, CPU_FTR_EMB_HV
|
||||
beq 2f
|
||||
rlwinm r3, r3, 0, ~CPU_FTR_EMB_HV
|
||||
stw r3, CPU_SPEC_FEATURES(r4)
|
||||
|
@@ -553,11 +553,30 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||
.machine_check_early = __machine_check_early_realmode_p9,
|
||||
.platform = "power9",
|
||||
},
|
||||
{ /* Power9 DD 2.1 or later (see DD2.0 above) */
|
||||
{ /* Power9 DD 2.1 */
|
||||
.pvr_mask = 0xffffefff,
|
||||
.pvr_value = 0x004e0201,
|
||||
.cpu_name = "POWER9 (raw)",
|
||||
.cpu_features = CPU_FTRS_POWER9_DD2_1,
|
||||
.cpu_user_features = COMMON_USER_POWER9,
|
||||
.cpu_user_features2 = COMMON_USER2_POWER9,
|
||||
.mmu_features = MMU_FTRS_POWER9,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 6,
|
||||
.pmc_type = PPC_PMC_IBM,
|
||||
.oprofile_cpu_type = "ppc64/power9",
|
||||
.oprofile_type = PPC_OPROFILE_INVALID,
|
||||
.cpu_setup = __setup_cpu_power9,
|
||||
.cpu_restore = __restore_cpu_power9,
|
||||
.machine_check_early = __machine_check_early_realmode_p9,
|
||||
.platform = "power9",
|
||||
},
|
||||
{ /* Power9 DD2.2 or later */
|
||||
.pvr_mask = 0xffff0000,
|
||||
.pvr_value = 0x004e0000,
|
||||
.cpu_name = "POWER9 (raw)",
|
||||
.cpu_features = CPU_FTRS_POWER9_DD2_1,
|
||||
.cpu_features = CPU_FTRS_POWER9_DD2_2,
|
||||
.cpu_user_features = COMMON_USER_POWER9,
|
||||
.cpu_user_features2 = COMMON_USER2_POWER9,
|
||||
.mmu_features = MMU_FTRS_POWER9,
|
||||
|
@@ -54,8 +54,7 @@ struct dt_cpu_feature {
|
||||
};
|
||||
|
||||
#define CPU_FTRS_BASE \
|
||||
(CPU_FTR_USE_TB | \
|
||||
CPU_FTR_LWSYNC | \
|
||||
(CPU_FTR_LWSYNC | \
|
||||
CPU_FTR_FPU_UNAVAILABLE |\
|
||||
CPU_FTR_NODSISRALIGN |\
|
||||
CPU_FTR_NOEXECUTE |\
|
||||
@@ -590,6 +589,8 @@ static struct dt_cpu_feature_match __initdata
|
||||
{"virtual-page-class-key-protection", feat_enable, 0},
|
||||
{"transactional-memory", feat_enable_tm, CPU_FTR_TM},
|
||||
{"transactional-memory-v3", feat_enable_tm, 0},
|
||||
{"tm-suspend-hypervisor-assist", feat_enable, CPU_FTR_P9_TM_HV_ASSIST},
|
||||
{"tm-suspend-xer-so-bug", feat_enable, CPU_FTR_P9_TM_XER_SO_BUG},
|
||||
{"idle-nap", feat_enable_idle_nap, 0},
|
||||
{"alignment-interrupt-dsisr", feat_enable_align_dsisr, 0},
|
||||
{"idle-stop", feat_enable_idle_stop, 0},
|
||||
@@ -709,6 +710,9 @@ static __init void cpufeatures_cpu_quirks(void)
|
||||
cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD1;
|
||||
else if ((version & 0xffffefff) == 0x004e0201)
|
||||
cur_cpu_spec->cpu_features |= CPU_FTR_POWER9_DD2_1;
|
||||
else if ((version & 0xffffefff) == 0x004e0202)
|
||||
cur_cpu_spec->cpu_features |= CPU_FTR_P9_TM_HV_ASSIST |
|
||||
CPU_FTR_P9_TM_XER_SO_BUG;
|
||||
}
|
||||
|
||||
static void __init cpufeatures_setup_finished(void)
|
||||
|
@@ -1273,7 +1273,7 @@ EXC_REAL_BEGIN(denorm_exception_hv, 0x1500, 0x100)
|
||||
bne+ denorm_assist
|
||||
#endif
|
||||
|
||||
KVMTEST_PR(0x1500)
|
||||
KVMTEST_HV(0x1500)
|
||||
EXCEPTION_PROLOG_PSERIES_1(denorm_common, EXC_HV)
|
||||
EXC_REAL_END(denorm_exception_hv, 0x1500, 0x100)
|
||||
|
||||
@@ -1285,7 +1285,7 @@ EXC_VIRT_END(denorm_exception, 0x5500, 0x100)
|
||||
EXC_VIRT_NONE(0x5500, 0x100)
|
||||
#endif
|
||||
|
||||
TRAMP_KVM_SKIP(PACA_EXGEN, 0x1500)
|
||||
TRAMP_KVM_HV(PACA_EXGEN, 0x1500)
|
||||
|
||||
#ifdef CONFIG_PPC_DENORMALISATION
|
||||
TRAMP_REAL_BEGIN(denorm_assist)
|
||||
|
@@ -339,6 +339,7 @@ power_enter_stop:
|
||||
bne .Lhandle_esl_ec_set
|
||||
PPC_STOP
|
||||
li r3,0 /* Since we didn't lose state, return 0 */
|
||||
std r3, PACA_REQ_PSSCR(r13)
|
||||
|
||||
/*
|
||||
* pnv_wakeup_noloss() expects r12 to contain the SRR1 value so
|
||||
@@ -429,11 +430,29 @@ ALT_FTR_SECTION_END_NESTED_IFSET(CPU_FTR_ARCH_207S, 66); \
|
||||
* r3 contains desired PSSCR register value.
|
||||
*/
|
||||
_GLOBAL(power9_idle_stop)
|
||||
BEGIN_FTR_SECTION
|
||||
lwz r5, PACA_DONT_STOP(r13)
|
||||
cmpwi r5, 0
|
||||
bne 1f
|
||||
std r3, PACA_REQ_PSSCR(r13)
|
||||
sync
|
||||
lwz r5, PACA_DONT_STOP(r13)
|
||||
cmpwi r5, 0
|
||||
bne 1f
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_P9_TM_XER_SO_BUG)
|
||||
mtspr SPRN_PSSCR,r3
|
||||
LOAD_REG_ADDR(r4,power_enter_stop)
|
||||
b pnv_powersave_common
|
||||
/* No return */
|
||||
1:
|
||||
/*
|
||||
* We get here when TM / thread reconfiguration bug workaround
|
||||
* code wants to get the CPU into SMT4 mode, and therefore
|
||||
* we are being asked not to stop.
|
||||
*/
|
||||
li r3, 0
|
||||
std r3, PACA_REQ_PSSCR(r13)
|
||||
blr /* return 0 for wakeup cause / SRR1 value */
|
||||
|
||||
/*
|
||||
* On waking up from stop 0,1,2 with ESL=1 on POWER9 DD1,
|
||||
@@ -584,6 +603,8 @@ FTR_SECTION_ELSE_NESTED(71)
|
||||
mfspr r5, SPRN_PSSCR
|
||||
rldicl r5,r5,4,60
|
||||
ALT_FTR_SECTION_END_NESTED_IFSET(CPU_FTR_POWER9_DD1, 71)
|
||||
li r0, 0 /* clear requested_psscr to say we're awake */
|
||||
std r0, PACA_REQ_PSSCR(r13)
|
||||
cmpd cr4,r5,r4
|
||||
bge cr4,pnv_wakeup_tb_loss /* returns to caller */
|
||||
|
||||
|
@@ -99,26 +99,28 @@ static struct vdso_patch_def vdso_patches[] = {
|
||||
CPU_FTR_COHERENT_ICACHE, CPU_FTR_COHERENT_ICACHE,
|
||||
"__kernel_sync_dicache", "__kernel_sync_dicache_p5"
|
||||
},
|
||||
#ifdef CONFIG_PPC32
|
||||
{
|
||||
CPU_FTR_USE_TB, 0,
|
||||
CPU_FTR_USE_RTC, CPU_FTR_USE_RTC,
|
||||
"__kernel_gettimeofday", NULL
|
||||
},
|
||||
{
|
||||
CPU_FTR_USE_TB, 0,
|
||||
CPU_FTR_USE_RTC, CPU_FTR_USE_RTC,
|
||||
"__kernel_clock_gettime", NULL
|
||||
},
|
||||
{
|
||||
CPU_FTR_USE_TB, 0,
|
||||
CPU_FTR_USE_RTC, CPU_FTR_USE_RTC,
|
||||
"__kernel_clock_getres", NULL
|
||||
},
|
||||
{
|
||||
CPU_FTR_USE_TB, 0,
|
||||
CPU_FTR_USE_RTC, CPU_FTR_USE_RTC,
|
||||
"__kernel_get_tbfreq", NULL
|
||||
},
|
||||
{
|
||||
CPU_FTR_USE_TB, 0,
|
||||
CPU_FTR_USE_RTC, CPU_FTR_USE_RTC,
|
||||
"__kernel_time", NULL
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user