KVM: PPC: e500: Emulate power management control SPR
authorMihai Caraman <mihai.caraman@freescale.com>
Fri, 4 Jul 2014 08:17:28 +0000 (11:17 +0300)
committerAlexander Graf <agraf@suse.de>
Mon, 28 Jul 2014 13:22:27 +0000 (15:22 +0200)
For FSL e6500 core the kernel uses power management SPR register (PWRMGTCR0)
to enable idle power down for cores and devices by setting up the idle count
period at boot time. With the host already controlling the power management
configuration the guest could simply benefit from it, so emulate guest request
as a general store.

Signed-off-by: Mihai Caraman <mihai.caraman@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
arch/powerpc/include/asm/kvm_host.h
arch/powerpc/kvm/e500_emulate.c

index 62b2cee450a54c89204e6026edbc3ece7a2b821c..faf2f0e56bb83a882fd81c4b8360baacb41066c3 100644 (file)
@@ -584,6 +584,7 @@ struct kvm_vcpu_arch {
        u32 mmucfg;
        u32 eptcfg;
        u32 epr;
+       u32 pwrmgtcr0;
        u32 crit_save;
        /* guest debug registers*/
        struct debug_reg dbg_reg;
index 002d51764143b7a8b0275ae0b3590a5d82932385..c99c40e9182a2abee92627360fc4290190ac63ca 100644 (file)
@@ -250,6 +250,14 @@ int kvmppc_core_emulate_mtspr_e500(struct kvm_vcpu *vcpu, int sprn, ulong spr_va
                                spr_val);
                break;
 
+       case SPRN_PWRMGTCR0:
+               /*
+                * Guest relies on host power management configurations
+                * Treat the request as a general store
+                */
+               vcpu->arch.pwrmgtcr0 = spr_val;
+               break;
+
        /* extra exceptions */
        case SPRN_IVOR32:
                vcpu->arch.ivor[BOOKE_IRQPRIO_SPE_UNAVAIL] = spr_val;
@@ -368,6 +376,10 @@ int kvmppc_core_emulate_mfspr_e500(struct kvm_vcpu *vcpu, int sprn, ulong *spr_v
                *spr_val = vcpu->arch.eptcfg;
                break;
 
+       case SPRN_PWRMGTCR0:
+               *spr_val = vcpu->arch.pwrmgtcr0;
+               break;
+
        /* extra exceptions */
        case SPRN_IVOR32:
                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_SPE_UNAVAIL];