On 6/7/19 1:48 AM, Madhavan Srinivasan wrote: > > On 06/06/19 11:06 PM, Claudio Carvalho wrote: >> When the ultravisor firmware is available, it takes control over the >> LDBAR register. In this case, thread-imc updates and save/restore >> operations on the LDBAR register are handled by ultravisor. >> >> Signed-off-by: Claudio Carvalho <cclaudio@xxxxxxxxxxxxx> >> Signed-off-by: Ram Pai <linuxram@xxxxxxxxxx> >> --- >> arch/powerpc/kvm/book3s_hv_rmhandlers.S | 2 ++ >> arch/powerpc/platforms/powernv/idle.c | 6 ++++-- >> arch/powerpc/platforms/powernv/opal-imc.c | 7 +++++++ >> 3 files changed, 13 insertions(+), 2 deletions(-) >> >> diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S >> b/arch/powerpc/kvm/book3s_hv_rmhandlers.S >> index f9b2620fbecd..cffb365d9d02 100644 >> --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S >> +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S >> @@ -375,8 +375,10 @@ BEGIN_FTR_SECTION >> mtspr SPRN_RPR, r0 >> ld r0, KVM_SPLIT_PMMAR(r6) >> mtspr SPRN_PMMAR, r0 >> +BEGIN_FW_FTR_SECTION_NESTED(70) >> ld r0, KVM_SPLIT_LDBAR(r6) >> mtspr SPRN_LDBAR, r0 >> +END_FW_FTR_SECTION_NESTED(FW_FEATURE_ULTRAVISOR, 0, 70) >> isync >> FTR_SECTION_ELSE >> /* On P9 we use the split_info for coordinating LPCR changes */ >> diff --git a/arch/powerpc/platforms/powernv/idle.c >> b/arch/powerpc/platforms/powernv/idle.c >> index c9133f7908ca..fd62435e3267 100644 >> --- a/arch/powerpc/platforms/powernv/idle.c >> +++ b/arch/powerpc/platforms/powernv/idle.c >> @@ -679,7 +679,8 @@ static unsigned long power9_idle_stop(unsigned long >> psscr, bool mmu_on) >> sprs.ptcr = mfspr(SPRN_PTCR); >> sprs.rpr = mfspr(SPRN_RPR); >> sprs.tscr = mfspr(SPRN_TSCR); >> - sprs.ldbar = mfspr(SPRN_LDBAR); >> + if (!firmware_has_feature(FW_FEATURE_ULTRAVISOR)) >> + sprs.ldbar = mfspr(SPRN_LDBAR); >> >> sprs_saved = true; >> >> @@ -762,7 +763,8 @@ static unsigned long power9_idle_stop(unsigned long >> psscr, bool mmu_on) >> mtspr(SPRN_PTCR, sprs.ptcr); >> mtspr(SPRN_RPR, sprs.rpr); >> mtspr(SPRN_TSCR, sprs.tscr); >> - mtspr(SPRN_LDBAR, sprs.ldbar); >> + if (!firmware_has_feature(FW_FEATURE_ULTRAVISOR)) >> + mtspr(SPRN_LDBAR, sprs.ldbar); >> >> if (pls >= pnv_first_tb_loss_level) { >> /* TB loss */ >> diff --git a/arch/powerpc/platforms/powernv/opal-imc.c >> b/arch/powerpc/platforms/powernv/opal-imc.c >> index 1b6932890a73..e9b641d313fb 100644 >> --- a/arch/powerpc/platforms/powernv/opal-imc.c >> +++ b/arch/powerpc/platforms/powernv/opal-imc.c >> @@ -254,6 +254,13 @@ static int opal_imc_counters_probe(struct >> platform_device *pdev) >> bool core_imc_reg = false, thread_imc_reg = false; >> u32 type; >> >> + /* >> + * When the Ultravisor is enabled, it is responsible for thread-imc >> + * updates >> + */ > > Would prefer the comment to be "Disable IMC devices, when Ultravisor is > enabled" > Rest looks good. > Acked-by: Madhavan Srinivasan <maddy@xxxxxxxxxxxxxxxxxx> Thanks Maddy. I applied that change to the next version. Claudio > >> + if (firmware_has_feature(FW_FEATURE_ULTRAVISOR)) >> + return -EACCES; >> + >> /* >> * Check whether this is kdump kernel. If yes, force the engines to >> * stop and return.