Lines Matching +full:i +full:- +full:tlb +full:- +full:sets

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2008-2013 Freescale Semiconductor, Inc. All rights reserved.
41 victim = vcpu_e500->gtlb_nv[0]++; in gtlb0_get_next_victim()
42 if (unlikely(vcpu_e500->gtlb_nv[0] >= vcpu_e500->gtlb_params[0].ways)) in gtlb0_get_next_victim()
43 vcpu_e500->gtlb_nv[0] = 0; in gtlb0_get_next_victim()
48 static int tlb0_set_base(gva_t addr, int sets, int ways) in tlb0_set_base() argument
52 set_base = (addr >> PAGE_SHIFT) & (sets - 1); in tlb0_set_base()
60 return tlb0_set_base(addr, vcpu_e500->gtlb_params[0].sets, in gtlb0_set_base()
61 vcpu_e500->gtlb_params[0].ways); in gtlb0_set_base()
70 esel &= vcpu_e500->gtlb_params[0].ways - 1; in get_tlb_esel()
71 esel += gtlb0_set_base(vcpu_e500, vcpu->arch.shared->mas2); in get_tlb_esel()
73 esel &= vcpu_e500->gtlb_params[tlbsel].entries - 1; in get_tlb_esel()
79 /* Search the guest TLB for a matching entry. */
83 int size = vcpu_e500->gtlb_params[tlbsel].entries; in kvmppc_e500_tlb_index()
85 int i; in kvmppc_e500_tlb_index() local
89 size = vcpu_e500->gtlb_params[0].ways; in kvmppc_e500_tlb_index()
91 if (eaddr < vcpu_e500->tlb1_min_eaddr || in kvmppc_e500_tlb_index()
92 eaddr > vcpu_e500->tlb1_max_eaddr) in kvmppc_e500_tlb_index()
93 return -1; in kvmppc_e500_tlb_index()
97 offset = vcpu_e500->gtlb_offset[tlbsel]; in kvmppc_e500_tlb_index()
99 for (i = 0; i < size; i++) { in kvmppc_e500_tlb_index()
101 &vcpu_e500->gtlb_arch[offset + set_base + i]; in kvmppc_e500_tlb_index()
117 if (get_tlb_ts(tlbe) != as && as != -1) in kvmppc_e500_tlb_index()
120 return set_base + i; in kvmppc_e500_tlb_index()
123 return -1; in kvmppc_e500_tlb_index()
134 tlbsel = (vcpu->arch.shared->mas4 >> 28) & 0x1; in kvmppc_e500_deliver_tlb_miss()
136 tsized = (vcpu->arch.shared->mas4 >> 7) & 0x1f; in kvmppc_e500_deliver_tlb_miss()
138 vcpu->arch.shared->mas0 = MAS0_TLBSEL(tlbsel) | MAS0_ESEL(victim) in kvmppc_e500_deliver_tlb_miss()
139 | MAS0_NV(vcpu_e500->gtlb_nv[tlbsel]); in kvmppc_e500_deliver_tlb_miss()
140 vcpu->arch.shared->mas1 = MAS1_VALID | (as ? MAS1_TS : 0) in kvmppc_e500_deliver_tlb_miss()
143 vcpu->arch.shared->mas2 = (eaddr & MAS2_EPN) in kvmppc_e500_deliver_tlb_miss()
144 | (vcpu->arch.shared->mas4 & MAS2_ATTRIB_MASK); in kvmppc_e500_deliver_tlb_miss()
145 vcpu->arch.shared->mas7_3 &= MAS3_U0 | MAS3_U1 | MAS3_U2 | MAS3_U3; in kvmppc_e500_deliver_tlb_miss()
146 vcpu->arch.shared->mas6 = (vcpu->arch.shared->mas6 & MAS6_SPID1) in kvmppc_e500_deliver_tlb_miss()
153 int size = vcpu_e500->gtlb_params[1].entries; in kvmppc_recalc_tlb1map_range()
156 int i; in kvmppc_recalc_tlb1map_range() local
158 vcpu_e500->tlb1_min_eaddr = ~0UL; in kvmppc_recalc_tlb1map_range()
159 vcpu_e500->tlb1_max_eaddr = 0; in kvmppc_recalc_tlb1map_range()
160 offset = vcpu_e500->gtlb_offset[1]; in kvmppc_recalc_tlb1map_range()
162 for (i = 0; i < size; i++) { in kvmppc_recalc_tlb1map_range()
164 &vcpu_e500->gtlb_arch[offset + i]; in kvmppc_recalc_tlb1map_range()
170 vcpu_e500->tlb1_min_eaddr = in kvmppc_recalc_tlb1map_range()
171 min(vcpu_e500->tlb1_min_eaddr, eaddr); in kvmppc_recalc_tlb1map_range()
174 vcpu_e500->tlb1_max_eaddr = in kvmppc_recalc_tlb1map_range()
175 max(vcpu_e500->tlb1_max_eaddr, eaddr); in kvmppc_recalc_tlb1map_range()
185 start = get_tlb_eaddr(gtlbe) & ~(size - 1); in kvmppc_need_recalc_tlb1map_range()
186 end = start + size - 1; in kvmppc_need_recalc_tlb1map_range()
188 return vcpu_e500->tlb1_min_eaddr == start || in kvmppc_need_recalc_tlb1map_range()
189 vcpu_e500->tlb1_max_eaddr == end; in kvmppc_need_recalc_tlb1map_range()
192 /* This function is supposed to be called for a adding a new valid tlb entry */
203 start = get_tlb_eaddr(gtlbe) & ~(size - 1); in kvmppc_set_tlb1map_range()
204 end = start + size - 1; in kvmppc_set_tlb1map_range()
206 vcpu_e500->tlb1_min_eaddr = min(vcpu_e500->tlb1_min_eaddr, start); in kvmppc_set_tlb1map_range()
207 vcpu_e500->tlb1_max_eaddr = max(vcpu_e500->tlb1_max_eaddr, end); in kvmppc_set_tlb1map_range()
218 return -1; in kvmppc_e500_gtlbe_invalidate()
223 gtlbe->mas1 = 0; in kvmppc_e500_gtlbe_invalidate()
233 for (esel = 0; esel < vcpu_e500->gtlb_params[0].entries; esel++) in kvmppc_e500_emul_mt_mmucsr0()
236 for (esel = 0; esel < vcpu_e500->gtlb_params[1].entries; esel++) in kvmppc_e500_emul_mt_mmucsr0()
240 kvmppc_core_flush_tlb(&vcpu_e500->vcpu); in kvmppc_e500_emul_mt_mmucsr0()
258 for (esel = 0; esel < vcpu_e500->gtlb_params[tlbsel].entries; in kvmppc_e500_emul_tlbivax()
264 get_cur_pid(vcpu), -1); in kvmppc_e500_emul_tlbivax()
270 kvmppc_core_flush_tlb(&vcpu_e500->vcpu); in kvmppc_e500_emul_tlbivax()
282 for (esel = 0; esel < vcpu_e500->gtlb_params[tlbsel].entries; esel++) { in tlbilx_all()
298 esel = kvmppc_e500_tlb_index(vcpu_e500, ea, tlbsel, pid, -1); in tlbilx_one()
332 vcpu->arch.shared->mas0 &= ~MAS0_NV(~0); in kvmppc_e500_emul_tlbre()
333 vcpu->arch.shared->mas0 |= MAS0_NV(vcpu_e500->gtlb_nv[tlbsel]); in kvmppc_e500_emul_tlbre()
334 vcpu->arch.shared->mas1 = gtlbe->mas1; in kvmppc_e500_emul_tlbre()
335 vcpu->arch.shared->mas2 = gtlbe->mas2; in kvmppc_e500_emul_tlbre()
336 vcpu->arch.shared->mas7_3 = gtlbe->mas7_3; in kvmppc_e500_emul_tlbre()
358 esel &= vcpu_e500->gtlb_params[tlbsel].ways - 1; in kvmppc_e500_emul_tlbsx()
360 vcpu->arch.shared->mas0 = MAS0_TLBSEL(tlbsel) | MAS0_ESEL(esel) in kvmppc_e500_emul_tlbsx()
361 | MAS0_NV(vcpu_e500->gtlb_nv[tlbsel]); in kvmppc_e500_emul_tlbsx()
362 vcpu->arch.shared->mas1 = gtlbe->mas1; in kvmppc_e500_emul_tlbsx()
363 vcpu->arch.shared->mas2 = gtlbe->mas2; in kvmppc_e500_emul_tlbsx()
364 vcpu->arch.shared->mas7_3 = gtlbe->mas7_3; in kvmppc_e500_emul_tlbsx()
369 tlbsel = vcpu->arch.shared->mas4 >> 28 & 0x1; in kvmppc_e500_emul_tlbsx()
372 vcpu->arch.shared->mas0 = MAS0_TLBSEL(tlbsel) in kvmppc_e500_emul_tlbsx()
374 | MAS0_NV(vcpu_e500->gtlb_nv[tlbsel]); in kvmppc_e500_emul_tlbsx()
375 vcpu->arch.shared->mas1 = in kvmppc_e500_emul_tlbsx()
376 (vcpu->arch.shared->mas6 & MAS6_SPID0) in kvmppc_e500_emul_tlbsx()
377 | ((vcpu->arch.shared->mas6 & MAS6_SAS) ? MAS1_TS : 0) in kvmppc_e500_emul_tlbsx()
378 | (vcpu->arch.shared->mas4 & MAS4_TSIZED(~0)); in kvmppc_e500_emul_tlbsx()
379 vcpu->arch.shared->mas2 &= MAS2_EPN; in kvmppc_e500_emul_tlbsx()
380 vcpu->arch.shared->mas2 |= vcpu->arch.shared->mas4 & in kvmppc_e500_emul_tlbsx()
382 vcpu->arch.shared->mas7_3 &= MAS3_U0 | MAS3_U1 | in kvmppc_e500_emul_tlbsx()
410 gtlbe->mas1 = vcpu->arch.shared->mas1; in kvmppc_e500_emul_tlbwe()
411 gtlbe->mas2 = vcpu->arch.shared->mas2; in kvmppc_e500_emul_tlbwe()
412 if (!(vcpu->arch.shared->msr & MSR_CM)) in kvmppc_e500_emul_tlbwe()
413 gtlbe->mas2 &= 0xffffffffUL; in kvmppc_e500_emul_tlbwe()
414 gtlbe->mas7_3 = vcpu->arch.shared->mas7_3; in kvmppc_e500_emul_tlbwe()
416 trace_kvm_booke206_gtlb_write(vcpu->arch.shared->mas0, gtlbe->mas1, in kvmppc_e500_emul_tlbwe()
417 gtlbe->mas2, gtlbe->mas7_3); in kvmppc_e500_emul_tlbwe()
431 idx = srcu_read_lock(&vcpu->kvm->srcu); in kvmppc_e500_emul_tlbwe()
433 /* Invalidate shadow mappings for the about-to-be-clobbered TLBE. */ in kvmppc_e500_emul_tlbwe()
439 gtlbe->mas1 &= ~MAS1_TSIZE(~0); in kvmppc_e500_emul_tlbwe()
440 gtlbe->mas1 |= MAS1_TSIZE(BOOK3E_PAGESZ_4K); in kvmppc_e500_emul_tlbwe()
447 srcu_read_unlock(&vcpu->kvm->srcu, idx); in kvmppc_e500_emul_tlbwe()
465 return -1; in kvmppc_e500_tlb_search()
477 eaddr = tr->linear_address; in kvmppc_core_vcpu_translate()
478 pid = (tr->linear_address >> 32) & 0xff; in kvmppc_core_vcpu_translate()
479 as = (tr->linear_address >> 40) & 0x1; in kvmppc_core_vcpu_translate()
483 tr->valid = 0; in kvmppc_core_vcpu_translate()
487 tr->physical_address = kvmppc_mmu_xlate(vcpu, index, eaddr); in kvmppc_core_vcpu_translate()
489 tr->valid = 1; in kvmppc_core_vcpu_translate()
497 unsigned int as = !!(vcpu->arch.shared->msr & MSR_IS); in kvmppc_mmu_itlb_index()
504 unsigned int as = !!(vcpu->arch.shared->msr & MSR_DS); in kvmppc_mmu_dtlb_index()
511 unsigned int as = !!(vcpu->arch.shared->msr & MSR_IS); in kvmppc_mmu_itlb_miss()
513 kvmppc_e500_deliver_tlb_miss(vcpu, vcpu->arch.regs.nip, as); in kvmppc_mmu_itlb_miss()
518 unsigned int as = !!(vcpu->arch.shared->msr & MSR_DS); in kvmppc_mmu_dtlb_miss()
520 kvmppc_e500_deliver_tlb_miss(vcpu, vcpu->arch.fault_dear, as); in kvmppc_mmu_dtlb_miss()
531 pgmask = get_tlb_bytes(gtlbe) - 1; in kvmppc_mmu_xlate()
540 int i; in free_gtlb() local
542 kvmppc_core_flush_tlb(&vcpu_e500->vcpu); in free_gtlb()
543 kfree(vcpu_e500->g2h_tlb1_map); in free_gtlb()
544 kfree(vcpu_e500->gtlb_priv[0]); in free_gtlb()
545 kfree(vcpu_e500->gtlb_priv[1]); in free_gtlb()
547 if (vcpu_e500->shared_tlb_pages) { in free_gtlb()
548 vfree((void *)(round_down((uintptr_t)vcpu_e500->gtlb_arch, in free_gtlb()
551 for (i = 0; i < vcpu_e500->num_shared_tlb_pages; i++) { in free_gtlb()
552 set_page_dirty_lock(vcpu_e500->shared_tlb_pages[i]); in free_gtlb()
553 put_page(vcpu_e500->shared_tlb_pages[i]); in free_gtlb()
556 vcpu_e500->num_shared_tlb_pages = 0; in free_gtlb()
558 kfree(vcpu_e500->shared_tlb_pages); in free_gtlb()
559 vcpu_e500->shared_tlb_pages = NULL; in free_gtlb()
561 kfree(vcpu_e500->gtlb_arch); in free_gtlb()
564 vcpu_e500->gtlb_arch = NULL; in free_gtlb()
569 sregs->u.e.mas0 = vcpu->arch.shared->mas0; in kvmppc_get_sregs_e500_tlb()
570 sregs->u.e.mas1 = vcpu->arch.shared->mas1; in kvmppc_get_sregs_e500_tlb()
571 sregs->u.e.mas2 = vcpu->arch.shared->mas2; in kvmppc_get_sregs_e500_tlb()
572 sregs->u.e.mas7_3 = vcpu->arch.shared->mas7_3; in kvmppc_get_sregs_e500_tlb()
573 sregs->u.e.mas4 = vcpu->arch.shared->mas4; in kvmppc_get_sregs_e500_tlb()
574 sregs->u.e.mas6 = vcpu->arch.shared->mas6; in kvmppc_get_sregs_e500_tlb()
576 sregs->u.e.mmucfg = vcpu->arch.mmucfg; in kvmppc_get_sregs_e500_tlb()
577 sregs->u.e.tlbcfg[0] = vcpu->arch.tlbcfg[0]; in kvmppc_get_sregs_e500_tlb()
578 sregs->u.e.tlbcfg[1] = vcpu->arch.tlbcfg[1]; in kvmppc_get_sregs_e500_tlb()
579 sregs->u.e.tlbcfg[2] = 0; in kvmppc_get_sregs_e500_tlb()
580 sregs->u.e.tlbcfg[3] = 0; in kvmppc_get_sregs_e500_tlb()
585 if (sregs->u.e.features & KVM_SREGS_E_ARCH206_MMU) { in kvmppc_set_sregs_e500_tlb()
586 vcpu->arch.shared->mas0 = sregs->u.e.mas0; in kvmppc_set_sregs_e500_tlb()
587 vcpu->arch.shared->mas1 = sregs->u.e.mas1; in kvmppc_set_sregs_e500_tlb()
588 vcpu->arch.shared->mas2 = sregs->u.e.mas2; in kvmppc_set_sregs_e500_tlb()
589 vcpu->arch.shared->mas7_3 = sregs->u.e.mas7_3; in kvmppc_set_sregs_e500_tlb()
590 vcpu->arch.shared->mas4 = sregs->u.e.mas4; in kvmppc_set_sregs_e500_tlb()
591 vcpu->arch.shared->mas6 = sregs->u.e.mas6; in kvmppc_set_sregs_e500_tlb()
601 long int i; in kvmppc_get_one_reg_e500_tlb() local
605 *val = get_reg_val(id, vcpu->arch.shared->mas0); in kvmppc_get_one_reg_e500_tlb()
608 *val = get_reg_val(id, vcpu->arch.shared->mas1); in kvmppc_get_one_reg_e500_tlb()
611 *val = get_reg_val(id, vcpu->arch.shared->mas2); in kvmppc_get_one_reg_e500_tlb()
614 *val = get_reg_val(id, vcpu->arch.shared->mas7_3); in kvmppc_get_one_reg_e500_tlb()
617 *val = get_reg_val(id, vcpu->arch.shared->mas4); in kvmppc_get_one_reg_e500_tlb()
620 *val = get_reg_val(id, vcpu->arch.shared->mas6); in kvmppc_get_one_reg_e500_tlb()
623 *val = get_reg_val(id, vcpu->arch.mmucfg); in kvmppc_get_one_reg_e500_tlb()
626 *val = get_reg_val(id, vcpu->arch.eptcfg); in kvmppc_get_one_reg_e500_tlb()
632 i = id - KVM_REG_PPC_TLB0CFG; in kvmppc_get_one_reg_e500_tlb()
633 *val = get_reg_val(id, vcpu->arch.tlbcfg[i]); in kvmppc_get_one_reg_e500_tlb()
639 i = id - KVM_REG_PPC_TLB0PS; in kvmppc_get_one_reg_e500_tlb()
640 *val = get_reg_val(id, vcpu->arch.tlbps[i]); in kvmppc_get_one_reg_e500_tlb()
643 r = -EINVAL; in kvmppc_get_one_reg_e500_tlb()
654 long int i; in kvmppc_set_one_reg_e500_tlb() local
658 vcpu->arch.shared->mas0 = set_reg_val(id, *val); in kvmppc_set_one_reg_e500_tlb()
661 vcpu->arch.shared->mas1 = set_reg_val(id, *val); in kvmppc_set_one_reg_e500_tlb()
664 vcpu->arch.shared->mas2 = set_reg_val(id, *val); in kvmppc_set_one_reg_e500_tlb()
667 vcpu->arch.shared->mas7_3 = set_reg_val(id, *val); in kvmppc_set_one_reg_e500_tlb()
670 vcpu->arch.shared->mas4 = set_reg_val(id, *val); in kvmppc_set_one_reg_e500_tlb()
673 vcpu->arch.shared->mas6 = set_reg_val(id, *val); in kvmppc_set_one_reg_e500_tlb()
678 if (reg != vcpu->arch.mmucfg) in kvmppc_set_one_reg_e500_tlb()
679 r = -EINVAL; in kvmppc_set_one_reg_e500_tlb()
684 if (reg != vcpu->arch.eptcfg) in kvmppc_set_one_reg_e500_tlb()
685 r = -EINVAL; in kvmppc_set_one_reg_e500_tlb()
694 i = id - KVM_REG_PPC_TLB0CFG; in kvmppc_set_one_reg_e500_tlb()
695 if (reg != vcpu->arch.tlbcfg[i]) in kvmppc_set_one_reg_e500_tlb()
696 r = -EINVAL; in kvmppc_set_one_reg_e500_tlb()
704 i = id - KVM_REG_PPC_TLB0PS; in kvmppc_set_one_reg_e500_tlb()
705 if (reg != vcpu->arch.tlbps[i]) in kvmppc_set_one_reg_e500_tlb()
706 r = -EINVAL; in kvmppc_set_one_reg_e500_tlb()
710 r = -EINVAL; in kvmppc_set_one_reg_e500_tlb()
720 vcpu->arch.tlbcfg[0] &= ~(TLBnCFG_N_ENTRY | TLBnCFG_ASSOC); in vcpu_mmu_geometry_update()
721 if (params->tlb_sizes[0] <= 2048) in vcpu_mmu_geometry_update()
722 vcpu->arch.tlbcfg[0] |= params->tlb_sizes[0]; in vcpu_mmu_geometry_update()
723 vcpu->arch.tlbcfg[0] |= params->tlb_ways[0] << TLBnCFG_ASSOC_SHIFT; in vcpu_mmu_geometry_update()
725 vcpu->arch.tlbcfg[1] &= ~(TLBnCFG_N_ENTRY | TLBnCFG_ASSOC); in vcpu_mmu_geometry_update()
726 vcpu->arch.tlbcfg[1] |= params->tlb_sizes[1]; in vcpu_mmu_geometry_update()
727 vcpu->arch.tlbcfg[1] |= params->tlb_ways[1] << TLBnCFG_ASSOC_SHIFT; in vcpu_mmu_geometry_update()
741 u32 sets; in kvm_vcpu_ioctl_config_tlb() local
742 int num_pages, ret, i; in kvm_vcpu_ioctl_config_tlb() local
744 if (cfg->mmu_type != KVM_MMU_FSL_BOOKE_NOHV) in kvm_vcpu_ioctl_config_tlb()
745 return -EINVAL; in kvm_vcpu_ioctl_config_tlb()
747 if (copy_from_user(&params, (void __user *)(uintptr_t)cfg->params, in kvm_vcpu_ioctl_config_tlb()
749 return -EFAULT; in kvm_vcpu_ioctl_config_tlb()
752 return -EINVAL; in kvm_vcpu_ioctl_config_tlb()
754 return -EINVAL; in kvm_vcpu_ioctl_config_tlb()
756 return -EINVAL; in kvm_vcpu_ioctl_config_tlb()
758 return -EINVAL; in kvm_vcpu_ioctl_config_tlb()
761 return -EINVAL; in kvm_vcpu_ioctl_config_tlb()
763 sets = params.tlb_sizes[0] >> ilog2(params.tlb_ways[0]); in kvm_vcpu_ioctl_config_tlb()
764 if (!is_power_of_2(sets)) in kvm_vcpu_ioctl_config_tlb()
765 return -EINVAL; in kvm_vcpu_ioctl_config_tlb()
770 if (cfg->array_len < array_len) in kvm_vcpu_ioctl_config_tlb()
771 return -EINVAL; in kvm_vcpu_ioctl_config_tlb()
773 num_pages = DIV_ROUND_UP(cfg->array + array_len - 1, PAGE_SIZE) - in kvm_vcpu_ioctl_config_tlb()
774 cfg->array / PAGE_SIZE; in kvm_vcpu_ioctl_config_tlb()
777 return -ENOMEM; in kvm_vcpu_ioctl_config_tlb()
779 ret = get_user_pages_fast(cfg->array, num_pages, FOLL_WRITE, pages); in kvm_vcpu_ioctl_config_tlb()
785 ret = -EFAULT; in kvm_vcpu_ioctl_config_tlb()
791 ret = -ENOMEM; in kvm_vcpu_ioctl_config_tlb()
797 ret = -ENOMEM; in kvm_vcpu_ioctl_config_tlb()
803 ret = -ENOMEM; in kvm_vcpu_ioctl_config_tlb()
811 ret = -ENOMEM; in kvm_vcpu_ioctl_config_tlb()
817 vcpu_e500->gtlb_priv[0] = privs[0]; in kvm_vcpu_ioctl_config_tlb()
818 vcpu_e500->gtlb_priv[1] = privs[1]; in kvm_vcpu_ioctl_config_tlb()
819 vcpu_e500->g2h_tlb1_map = g2h_bitmap; in kvm_vcpu_ioctl_config_tlb()
821 vcpu_e500->gtlb_arch = (struct kvm_book3e_206_tlb_entry *) in kvm_vcpu_ioctl_config_tlb()
822 (virt + (cfg->array & (PAGE_SIZE - 1))); in kvm_vcpu_ioctl_config_tlb()
824 vcpu_e500->gtlb_params[0].entries = params.tlb_sizes[0]; in kvm_vcpu_ioctl_config_tlb()
825 vcpu_e500->gtlb_params[1].entries = params.tlb_sizes[1]; in kvm_vcpu_ioctl_config_tlb()
827 vcpu_e500->gtlb_offset[0] = 0; in kvm_vcpu_ioctl_config_tlb()
828 vcpu_e500->gtlb_offset[1] = params.tlb_sizes[0]; in kvm_vcpu_ioctl_config_tlb()
833 vcpu_e500->shared_tlb_pages = pages; in kvm_vcpu_ioctl_config_tlb()
834 vcpu_e500->num_shared_tlb_pages = num_pages; in kvm_vcpu_ioctl_config_tlb()
836 vcpu_e500->gtlb_params[0].ways = params.tlb_ways[0]; in kvm_vcpu_ioctl_config_tlb()
837 vcpu_e500->gtlb_params[0].sets = sets; in kvm_vcpu_ioctl_config_tlb()
839 vcpu_e500->gtlb_params[1].ways = params.tlb_sizes[1]; in kvm_vcpu_ioctl_config_tlb()
840 vcpu_e500->gtlb_params[1].sets = 1; in kvm_vcpu_ioctl_config_tlb()
849 for (i = 0; i < num_pages; i++) in kvm_vcpu_ioctl_config_tlb()
850 put_page(pages[i]); in kvm_vcpu_ioctl_config_tlb()
870 vcpu->arch.mmucfg = mfspr(SPRN_MMUCFG) & ~MMUCFG_LPIDSIZE; in vcpu_mmu_init()
873 vcpu->arch.tlbcfg[0] = mfspr(SPRN_TLB0CFG) & in vcpu_mmu_init()
875 vcpu->arch.tlbcfg[0] |= params[0].entries; in vcpu_mmu_init()
876 vcpu->arch.tlbcfg[0] |= params[0].ways << TLBnCFG_ASSOC_SHIFT; in vcpu_mmu_init()
878 vcpu->arch.tlbcfg[1] = mfspr(SPRN_TLB1CFG) & in vcpu_mmu_init()
880 vcpu->arch.tlbcfg[1] |= params[1].entries; in vcpu_mmu_init()
881 vcpu->arch.tlbcfg[1] |= params[1].ways << TLBnCFG_ASSOC_SHIFT; in vcpu_mmu_init()
884 vcpu->arch.tlbps[0] = mfspr(SPRN_TLB0PS); in vcpu_mmu_init()
885 vcpu->arch.tlbps[1] = mfspr(SPRN_TLB1PS); in vcpu_mmu_init()
887 vcpu->arch.mmucfg &= ~MMUCFG_LRAT; in vcpu_mmu_init()
890 vcpu->arch.eptcfg = 0; in vcpu_mmu_init()
891 vcpu->arch.tlbcfg[0] &= ~TLBnCFG_PT; in vcpu_mmu_init()
892 vcpu->arch.tlbcfg[1] &= ~TLBnCFG_IND; in vcpu_mmu_init()
900 struct kvm_vcpu *vcpu = &vcpu_e500->vcpu; in kvmppc_e500_tlb_init()
905 vcpu_e500->gtlb_params[0].entries = KVM_E500_TLB0_SIZE; in kvmppc_e500_tlb_init()
906 vcpu_e500->gtlb_params[1].entries = KVM_E500_TLB1_SIZE; in kvmppc_e500_tlb_init()
908 vcpu_e500->gtlb_params[0].ways = KVM_E500_TLB0_WAY_NUM; in kvmppc_e500_tlb_init()
909 vcpu_e500->gtlb_params[0].sets = in kvmppc_e500_tlb_init()
912 vcpu_e500->gtlb_params[1].ways = KVM_E500_TLB1_SIZE; in kvmppc_e500_tlb_init()
913 vcpu_e500->gtlb_params[1].sets = 1; in kvmppc_e500_tlb_init()
915 vcpu_e500->gtlb_arch = kmalloc_array(KVM_E500_TLB0_SIZE + in kvmppc_e500_tlb_init()
917 sizeof(*vcpu_e500->gtlb_arch), in kvmppc_e500_tlb_init()
919 if (!vcpu_e500->gtlb_arch) in kvmppc_e500_tlb_init()
920 return -ENOMEM; in kvmppc_e500_tlb_init()
922 vcpu_e500->gtlb_offset[0] = 0; in kvmppc_e500_tlb_init()
923 vcpu_e500->gtlb_offset[1] = KVM_E500_TLB0_SIZE; in kvmppc_e500_tlb_init()
925 vcpu_e500->gtlb_priv[0] = kcalloc(vcpu_e500->gtlb_params[0].entries, in kvmppc_e500_tlb_init()
928 if (!vcpu_e500->gtlb_priv[0]) in kvmppc_e500_tlb_init()
931 vcpu_e500->gtlb_priv[1] = kcalloc(vcpu_e500->gtlb_params[1].entries, in kvmppc_e500_tlb_init()
934 if (!vcpu_e500->gtlb_priv[1]) in kvmppc_e500_tlb_init()
937 vcpu_e500->g2h_tlb1_map = kcalloc(vcpu_e500->gtlb_params[1].entries, in kvmppc_e500_tlb_init()
938 sizeof(*vcpu_e500->g2h_tlb1_map), in kvmppc_e500_tlb_init()
940 if (!vcpu_e500->g2h_tlb1_map) in kvmppc_e500_tlb_init()
943 vcpu_mmu_init(vcpu, vcpu_e500->gtlb_params); in kvmppc_e500_tlb_init()
949 return -1; in kvmppc_e500_tlb_init()