aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm
diff options
context:
space:
mode:
authorMihai Caraman <mihai.caraman@freescale.com>2013-04-10 20:03:09 -0400
committerAlexander Graf <agraf@suse.de>2013-04-26 14:27:07 -0400
commit8893a188b13160ee4b228fab02d802cf4f0a3e78 (patch)
treeae9198f68cf900088290e200ac746eb1d1dc73f3 /arch/powerpc/kvm
parenta85d2aa23e51a9460e034e283da2513930b4f183 (diff)
KVM: PPC: e500: Move vcpu's MMU configuration to dedicated functions
Vcpu's MMU default configuration and geometry update logic was buried in a chunk of code. Move them to dedicated functions to add more clarity. Signed-off-by: Mihai Caraman <mihai.caraman@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'arch/powerpc/kvm')
-rw-r--r--arch/powerpc/kvm/e500_mmu.c60
1 files changed, 38 insertions, 22 deletions
diff --git a/arch/powerpc/kvm/e500_mmu.c b/arch/powerpc/kvm/e500_mmu.c
index 44f7762694ba..08a5b0d296fa 100644
--- a/arch/powerpc/kvm/e500_mmu.c
+++ b/arch/powerpc/kvm/e500_mmu.c
@@ -690,6 +690,20 @@ int kvmppc_set_one_reg_e500_tlb(struct kvm_vcpu *vcpu, u64 id,
690 return r; 690 return r;
691} 691}
692 692
693static int vcpu_mmu_geometry_update(struct kvm_vcpu *vcpu,
694 struct kvm_book3e_206_tlb_params *params)
695{
696 vcpu->arch.tlbcfg[0] &= ~(TLBnCFG_N_ENTRY | TLBnCFG_ASSOC);
697 if (params->tlb_sizes[0] <= 2048)
698 vcpu->arch.tlbcfg[0] |= params->tlb_sizes[0];
699 vcpu->arch.tlbcfg[0] |= params->tlb_ways[0] << TLBnCFG_ASSOC_SHIFT;
700
701 vcpu->arch.tlbcfg[1] &= ~(TLBnCFG_N_ENTRY | TLBnCFG_ASSOC);
702 vcpu->arch.tlbcfg[1] |= params->tlb_sizes[1];
703 vcpu->arch.tlbcfg[1] |= params->tlb_ways[1] << TLBnCFG_ASSOC_SHIFT;
704 return 0;
705}
706
693int kvm_vcpu_ioctl_config_tlb(struct kvm_vcpu *vcpu, 707int kvm_vcpu_ioctl_config_tlb(struct kvm_vcpu *vcpu,
694 struct kvm_config_tlb *cfg) 708 struct kvm_config_tlb *cfg)
695{ 709{
@@ -786,16 +800,8 @@ int kvm_vcpu_ioctl_config_tlb(struct kvm_vcpu *vcpu,
786 vcpu_e500->gtlb_offset[0] = 0; 800 vcpu_e500->gtlb_offset[0] = 0;
787 vcpu_e500->gtlb_offset[1] = params.tlb_sizes[0]; 801 vcpu_e500->gtlb_offset[1] = params.tlb_sizes[0];
788 802
789 vcpu->arch.mmucfg = mfspr(SPRN_MMUCFG) & ~MMUCFG_LPIDSIZE; 803 /* Update vcpu's MMU geometry based on SW_TLB input */
790 804 vcpu_mmu_geometry_update(vcpu, &params);
791 vcpu->arch.tlbcfg[0] &= ~(TLBnCFG_N_ENTRY | TLBnCFG_ASSOC);
792 if (params.tlb_sizes[0] <= 2048)
793 vcpu->arch.tlbcfg[0] |= params.tlb_sizes[0];
794 vcpu->arch.tlbcfg[0] |= params.tlb_ways[0] << TLBnCFG_ASSOC_SHIFT;
795
796 vcpu->arch.tlbcfg[1] &= ~(TLBnCFG_N_ENTRY | TLBnCFG_ASSOC);
797 vcpu->arch.tlbcfg[1] |= params.tlb_sizes[1];
798 vcpu->arch.tlbcfg[1] |= params.tlb_ways[1] << TLBnCFG_ASSOC_SHIFT;
799 805
800 vcpu_e500->shared_tlb_pages = pages; 806 vcpu_e500->shared_tlb_pages = pages;
801 vcpu_e500->num_shared_tlb_pages = num_pages; 807 vcpu_e500->num_shared_tlb_pages = num_pages;
@@ -831,6 +837,27 @@ int kvm_vcpu_ioctl_dirty_tlb(struct kvm_vcpu *vcpu,
831 return 0; 837 return 0;
832} 838}
833 839
840/* Vcpu's MMU default configuration */
841static int vcpu_mmu_init(struct kvm_vcpu *vcpu,
842 struct kvmppc_e500_tlb_params *params)
843{
844 /* Initialize RASIZE, PIDSIZE, NTLBS and MAVN fields with host values*/
845 vcpu->arch.mmucfg = mfspr(SPRN_MMUCFG) & ~MMUCFG_LPIDSIZE;
846
847 /* Initialize TLBnCFG fields with host values and SW_TLB geometry*/
848 vcpu->arch.tlbcfg[0] = mfspr(SPRN_TLB0CFG) &
849 ~(TLBnCFG_N_ENTRY | TLBnCFG_ASSOC);
850 vcpu->arch.tlbcfg[0] |= params[0].entries;
851 vcpu->arch.tlbcfg[0] |= params[0].ways << TLBnCFG_ASSOC_SHIFT;
852
853 vcpu->arch.tlbcfg[1] = mfspr(SPRN_TLB1CFG) &
854 ~(TLBnCFG_N_ENTRY | TLBnCFG_ASSOC);
855 vcpu->arch.tlbcfg[1] |= params[1].entries;
856 vcpu->arch.tlbcfg[1] |= params[1].ways << TLBnCFG_ASSOC_SHIFT;
857
858 return 0;
859}
860
834int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *vcpu_e500) 861int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *vcpu_e500)
835{ 862{
836 struct kvm_vcpu *vcpu = &vcpu_e500->vcpu; 863 struct kvm_vcpu *vcpu = &vcpu_e500->vcpu;
@@ -875,18 +902,7 @@ int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *vcpu_e500)
875 if (!vcpu_e500->g2h_tlb1_map) 902 if (!vcpu_e500->g2h_tlb1_map)
876 goto err; 903 goto err;
877 904
878 /* Init TLB configuration register */ 905 vcpu_mmu_init(vcpu, vcpu_e500->gtlb_params);
879 vcpu->arch.tlbcfg[0] = mfspr(SPRN_TLB0CFG) &
880 ~(TLBnCFG_N_ENTRY | TLBnCFG_ASSOC);
881 vcpu->arch.tlbcfg[0] |= vcpu_e500->gtlb_params[0].entries;
882 vcpu->arch.tlbcfg[0] |=
883 vcpu_e500->gtlb_params[0].ways << TLBnCFG_ASSOC_SHIFT;
884
885 vcpu->arch.tlbcfg[1] = mfspr(SPRN_TLB1CFG) &
886 ~(TLBnCFG_N_ENTRY | TLBnCFG_ASSOC);
887 vcpu->arch.tlbcfg[1] |= vcpu_e500->gtlb_params[1].entries;
888 vcpu->arch.tlbcfg[1] |=
889 vcpu_e500->gtlb_params[1].ways << TLBnCFG_ASSOC_SHIFT;
890 906
891 kvmppc_recalc_tlb1map_range(vcpu_e500); 907 kvmppc_recalc_tlb1map_range(vcpu_e500);
892 return 0; 908 return 0;