Merge branch 'topic/ppc-kvm' into next
Merge our ppc-kvm topic branch to bring in the Ultravisor support patches.
This commit is contained in:
@@ -62,6 +62,7 @@
|
||||
#include <asm/ps3.h>
|
||||
#include <asm/pte-walk.h>
|
||||
#include <asm/asm-prototypes.h>
|
||||
#include <asm/ultravisor.h>
|
||||
|
||||
#include <mm/mmu_decl.h>
|
||||
|
||||
@@ -1076,8 +1077,8 @@ void hash__early_init_mmu_secondary(void)
|
||||
if (!cpu_has_feature(CPU_FTR_ARCH_300))
|
||||
mtspr(SPRN_SDR1, _SDR1);
|
||||
else
|
||||
mtspr(SPRN_PTCR,
|
||||
__pa(partition_tb) | (PATB_SIZE_SHIFT - 12));
|
||||
set_ptcr_when_no_uv(__pa(partition_tb) |
|
||||
(PATB_SIZE_SHIFT - 12));
|
||||
}
|
||||
/* Initialize SLB */
|
||||
slb_initialize();
|
||||
|
@@ -12,6 +12,8 @@
|
||||
#include <asm/tlb.h>
|
||||
#include <asm/trace.h>
|
||||
#include <asm/powernv.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/ultravisor.h>
|
||||
|
||||
#include <mm/mmu_decl.h>
|
||||
#include <trace/events/thp.h>
|
||||
@@ -205,25 +207,14 @@ void __init mmu_partition_table_init(void)
|
||||
* 64 K size.
|
||||
*/
|
||||
ptcr = __pa(partition_tb) | (PATB_SIZE_SHIFT - 12);
|
||||
mtspr(SPRN_PTCR, ptcr);
|
||||
set_ptcr_when_no_uv(ptcr);
|
||||
powernv_set_nmmu_ptcr(ptcr);
|
||||
}
|
||||
|
||||
void mmu_partition_table_set_entry(unsigned int lpid, unsigned long dw0,
|
||||
unsigned long dw1)
|
||||
static void flush_partition(unsigned int lpid, bool radix)
|
||||
{
|
||||
unsigned long old = be64_to_cpu(partition_tb[lpid].patb0);
|
||||
|
||||
partition_tb[lpid].patb0 = cpu_to_be64(dw0);
|
||||
partition_tb[lpid].patb1 = cpu_to_be64(dw1);
|
||||
|
||||
/*
|
||||
* Global flush of TLBs and partition table caches for this lpid.
|
||||
* The type of flush (hash or radix) depends on what the previous
|
||||
* use of this partition ID was, not the new use.
|
||||
*/
|
||||
asm volatile("ptesync" : : : "memory");
|
||||
if (old & PATB_HR) {
|
||||
if (radix) {
|
||||
asm volatile(PPC_TLBIE_5(%0,%1,2,0,1) : :
|
||||
"r" (TLBIEL_INVAL_SET_LPID), "r" (lpid));
|
||||
asm volatile(PPC_TLBIE_5(%0,%1,2,1,1) : :
|
||||
@@ -237,6 +228,39 @@ void mmu_partition_table_set_entry(unsigned int lpid, unsigned long dw0,
|
||||
/* do we need fixup here ?*/
|
||||
asm volatile("eieio; tlbsync; ptesync" : : : "memory");
|
||||
}
|
||||
|
||||
void mmu_partition_table_set_entry(unsigned int lpid, unsigned long dw0,
|
||||
unsigned long dw1)
|
||||
{
|
||||
unsigned long old = be64_to_cpu(partition_tb[lpid].patb0);
|
||||
|
||||
/*
|
||||
* When ultravisor is enabled, the partition table is stored in secure
|
||||
* memory and can only be accessed doing an ultravisor call. However, we
|
||||
* maintain a copy of the partition table in normal memory to allow Nest
|
||||
* MMU translations to occur (for normal VMs).
|
||||
*
|
||||
* Therefore, here we always update partition_tb, regardless of whether
|
||||
* we are running under an ultravisor or not.
|
||||
*/
|
||||
partition_tb[lpid].patb0 = cpu_to_be64(dw0);
|
||||
partition_tb[lpid].patb1 = cpu_to_be64(dw1);
|
||||
|
||||
/*
|
||||
* If ultravisor is enabled, we do an ultravisor call to register the
|
||||
* partition table entry (PATE), which also do a global flush of TLBs
|
||||
* and partition table caches for the lpid. Otherwise, just do the
|
||||
* flush. The type of flush (hash or radix) depends on what the previous
|
||||
* use of the partition ID was, not the new use.
|
||||
*/
|
||||
if (firmware_has_feature(FW_FEATURE_ULTRAVISOR)) {
|
||||
uv_register_pate(lpid, dw0, dw1);
|
||||
pr_info("PATE registered by ultravisor: dw0 = 0x%lx, dw1 = 0x%lx\n",
|
||||
dw0, dw1);
|
||||
} else {
|
||||
flush_partition(lpid, (old & PATB_HR));
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mmu_partition_table_set_entry);
|
||||
|
||||
static pmd_t *get_pmd_from_cache(struct mm_struct *mm)
|
||||
|
@@ -27,6 +27,7 @@
|
||||
#include <asm/sections.h>
|
||||
#include <asm/trace.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/ultravisor.h>
|
||||
|
||||
#include <trace/events/thp.h>
|
||||
|
||||
@@ -650,8 +651,9 @@ void radix__early_init_mmu_secondary(void)
|
||||
lpcr = mfspr(SPRN_LPCR);
|
||||
mtspr(SPRN_LPCR, lpcr | LPCR_UPRT | LPCR_HR);
|
||||
|
||||
mtspr(SPRN_PTCR,
|
||||
__pa(partition_tb) | (PATB_SIZE_SHIFT - 12));
|
||||
set_ptcr_when_no_uv(__pa(partition_tb) |
|
||||
(PATB_SIZE_SHIFT - 12));
|
||||
|
||||
radix_init_amor();
|
||||
}
|
||||
|
||||
@@ -667,7 +669,7 @@ void radix__mmu_cleanup_all(void)
|
||||
if (!firmware_has_feature(FW_FEATURE_LPAR)) {
|
||||
lpcr = mfspr(SPRN_LPCR);
|
||||
mtspr(SPRN_LPCR, lpcr & ~LPCR_UPRT);
|
||||
mtspr(SPRN_PTCR, 0);
|
||||
set_ptcr_when_no_uv(0);
|
||||
powernv_set_nmmu_ptcr(0);
|
||||
radix__flush_tlb_all();
|
||||
}
|
||||
|
مرجع در شماره جدید
Block a user