diff options
author | Mihai Caraman <mihai.caraman@freescale.com> | 2013-04-10 20:03:09 -0400 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2013-04-26 14:27:07 -0400 |
commit | 8893a188b13160ee4b228fab02d802cf4f0a3e78 (patch) | |
tree | ae9198f68cf900088290e200ac746eb1d1dc73f3 /arch/powerpc/kvm | |
parent | a85d2aa23e51a9460e034e283da2513930b4f183 (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.c | 60 |
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 | ||
693 | static 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 | |||
693 | int kvm_vcpu_ioctl_config_tlb(struct kvm_vcpu *vcpu, | 707 | int 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, ¶ms); | |
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 */ | ||
841 | static 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 | |||
834 | int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *vcpu_e500) | 861 | int 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; |