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; |
