Commit 44ae3ab3 authored by Matt Evans's avatar Matt Evans Committed by Benjamin Herrenschmidt

powerpc: Free up some CPU feature bits by moving out MMU-related features

Some of the 64bit PPC CPU features are MMU-related, so this patch moves
them to MMU_FTR_ bits.  All cpu_has_feature()-style tests are moved to
mmu_has_feature(), and seven feature bits are freed as a result.
Signed-off-by: default avatarMatt Evans <matt@ozlabs.org>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent eca590f4
...@@ -178,23 +178,17 @@ extern const char *powerpc_base_platform; ...@@ -178,23 +178,17 @@ extern const char *powerpc_base_platform;
#define LONG_ASM_CONST(x) 0 #define LONG_ASM_CONST(x) 0
#endif #endif
#define CPU_FTR_SLB LONG_ASM_CONST(0x0000000100000000)
#define CPU_FTR_16M_PAGE LONG_ASM_CONST(0x0000000200000000)
#define CPU_FTR_TLBIEL LONG_ASM_CONST(0x0000000400000000)
#define CPU_FTR_HVMODE_206 LONG_ASM_CONST(0x0000000800000000) #define CPU_FTR_HVMODE_206 LONG_ASM_CONST(0x0000000800000000)
#define CPU_FTR_IABR LONG_ASM_CONST(0x0000002000000000) #define CPU_FTR_IABR LONG_ASM_CONST(0x0000002000000000)
#define CPU_FTR_MMCRA LONG_ASM_CONST(0x0000004000000000) #define CPU_FTR_MMCRA LONG_ASM_CONST(0x0000004000000000)
#define CPU_FTR_CTRL LONG_ASM_CONST(0x0000008000000000) #define CPU_FTR_CTRL LONG_ASM_CONST(0x0000008000000000)
#define CPU_FTR_SMT LONG_ASM_CONST(0x0000010000000000) #define CPU_FTR_SMT LONG_ASM_CONST(0x0000010000000000)
#define CPU_FTR_LOCKLESS_TLBIE LONG_ASM_CONST(0x0000040000000000)
#define CPU_FTR_CI_LARGE_PAGE LONG_ASM_CONST(0x0000100000000000)
#define CPU_FTR_PAUSE_ZERO LONG_ASM_CONST(0x0000200000000000) #define CPU_FTR_PAUSE_ZERO LONG_ASM_CONST(0x0000200000000000)
#define CPU_FTR_PURR LONG_ASM_CONST(0x0000400000000000) #define CPU_FTR_PURR LONG_ASM_CONST(0x0000400000000000)
#define CPU_FTR_CELL_TB_BUG LONG_ASM_CONST(0x0000800000000000) #define CPU_FTR_CELL_TB_BUG LONG_ASM_CONST(0x0000800000000000)
#define CPU_FTR_SPURR LONG_ASM_CONST(0x0001000000000000) #define CPU_FTR_SPURR LONG_ASM_CONST(0x0001000000000000)
#define CPU_FTR_DSCR LONG_ASM_CONST(0x0002000000000000) #define CPU_FTR_DSCR LONG_ASM_CONST(0x0002000000000000)
#define CPU_FTR_1T_SEGMENT LONG_ASM_CONST(0x0004000000000000)
#define CPU_FTR_NO_SLBIE_B LONG_ASM_CONST(0x0008000000000000)
#define CPU_FTR_VSX LONG_ASM_CONST(0x0010000000000000) #define CPU_FTR_VSX LONG_ASM_CONST(0x0010000000000000)
#define CPU_FTR_SAO LONG_ASM_CONST(0x0020000000000000) #define CPU_FTR_SAO LONG_ASM_CONST(0x0020000000000000)
#define CPU_FTR_CP_USE_DCBTZ LONG_ASM_CONST(0x0040000000000000) #define CPU_FTR_CP_USE_DCBTZ LONG_ASM_CONST(0x0040000000000000)
...@@ -206,9 +200,10 @@ extern const char *powerpc_base_platform; ...@@ -206,9 +200,10 @@ extern const char *powerpc_base_platform;
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#define CPU_FTR_PPCAS_ARCH_V2 (CPU_FTR_SLB | \ #define CPU_FTR_PPCAS_ARCH_V2 (CPU_FTR_NOEXECUTE | CPU_FTR_NODSISRALIGN)
CPU_FTR_TLBIEL | CPU_FTR_NOEXECUTE | \
CPU_FTR_NODSISRALIGN | CPU_FTR_16M_PAGE) #define MMU_FTR_PPCAS_ARCH_V2 (MMU_FTR_SLB | MMU_FTR_TLBIEL | \
MMU_FTR_16M_PAGE)
/* We only set the altivec features if the kernel was compiled with altivec /* We only set the altivec features if the kernel was compiled with altivec
* support * support
...@@ -408,38 +403,34 @@ extern const char *powerpc_base_platform; ...@@ -408,38 +403,34 @@ extern const char *powerpc_base_platform;
#define CPU_FTRS_POWER5 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ #define CPU_FTRS_POWER5 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
CPU_FTR_MMCRA | CPU_FTR_SMT | \ CPU_FTR_MMCRA | CPU_FTR_SMT | \
CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ CPU_FTR_COHERENT_ICACHE | CPU_FTR_PURR | \
CPU_FTR_PURR | CPU_FTR_STCX_CHECKS_ADDRESS | \ CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB)
CPU_FTR_POPCNTB)
#define CPU_FTRS_POWER6 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ #define CPU_FTRS_POWER6 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
CPU_FTR_MMCRA | CPU_FTR_SMT | \ CPU_FTR_MMCRA | CPU_FTR_SMT | \
CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ CPU_FTR_COHERENT_ICACHE | \
CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
CPU_FTR_DSCR | CPU_FTR_UNALIGNED_LD_STD | \ CPU_FTR_DSCR | CPU_FTR_UNALIGNED_LD_STD | \
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB) CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB)
#define CPU_FTRS_POWER7 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ #define CPU_FTRS_POWER7 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_HVMODE_206 |\ CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_HVMODE_206 |\
CPU_FTR_MMCRA | CPU_FTR_SMT | \ CPU_FTR_MMCRA | CPU_FTR_SMT | \
CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE | \ CPU_FTR_COHERENT_ICACHE | \
CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \
CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYM_SMT | \ CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYM_SMT | \
CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD) CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD)
#define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ #define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \
CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \
CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \
CPU_FTR_PAUSE_ZERO | CPU_FTR_CI_LARGE_PAGE | \ CPU_FTR_PAUSE_ZERO | CPU_FTR_CELL_TB_BUG | CPU_FTR_CP_USE_DCBTZ | \
CPU_FTR_CELL_TB_BUG | CPU_FTR_CP_USE_DCBTZ | \
CPU_FTR_UNALIGNED_LD_STD) CPU_FTR_UNALIGNED_LD_STD)
#define CPU_FTRS_PA6T (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ #define CPU_FTRS_PA6T (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \
CPU_FTR_PPCAS_ARCH_V2 | \ CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | \
CPU_FTR_ALTIVEC_COMP | CPU_FTR_CI_LARGE_PAGE | \ CPU_FTR_PURR | CPU_FTR_REAL_LE)
CPU_FTR_PURR | CPU_FTR_REAL_LE | CPU_FTR_NO_SLBIE_B)
#define CPU_FTRS_COMPATIBLE (CPU_FTR_USE_TB | CPU_FTR_PPCAS_ARCH_V2) #define CPU_FTRS_COMPATIBLE (CPU_FTR_USE_TB | CPU_FTR_PPCAS_ARCH_V2)
#define CPU_FTRS_A2 (CPU_FTR_USE_TB | CPU_FTR_SMT | CPU_FTR_DBELL | \ #define CPU_FTRS_A2 (CPU_FTR_USE_TB | CPU_FTR_SMT | CPU_FTR_DBELL | \
CPU_FTR_TLBIEL | CPU_FTR_NOEXECUTE | CPU_FTR_NODSISRALIGN | \ CPU_FTR_NOEXECUTE | CPU_FTR_NODSISRALIGN)
CPU_FTR_16M_PAGE)
#ifdef __powerpc64__ #ifdef __powerpc64__
#ifdef CONFIG_PPC_BOOK3E #ifdef CONFIG_PPC_BOOK3E
...@@ -449,7 +440,7 @@ extern const char *powerpc_base_platform; ...@@ -449,7 +440,7 @@ extern const char *powerpc_base_platform;
(CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | \ (CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | \
CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_POWER6 | \ CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_POWER6 | \
CPU_FTRS_POWER7 | CPU_FTRS_CELL | CPU_FTRS_PA6T | \ CPU_FTRS_POWER7 | CPU_FTRS_CELL | CPU_FTRS_PA6T | \
CPU_FTR_1T_SEGMENT | CPU_FTR_VSX) CPU_FTR_VSX)
#endif #endif
#else #else
enum { enum {
......
...@@ -70,6 +70,54 @@ ...@@ -70,6 +70,54 @@
*/ */
#define MMU_FTR_USE_PAIRED_MAS ASM_CONST(0x01000000) #define MMU_FTR_USE_PAIRED_MAS ASM_CONST(0x01000000)
/* MMU is SLB-based
*/
#define MMU_FTR_SLB ASM_CONST(0x02000000)
/* Support 16M large pages
*/
#define MMU_FTR_16M_PAGE ASM_CONST(0x04000000)
/* Supports TLBIEL variant
*/
#define MMU_FTR_TLBIEL ASM_CONST(0x08000000)
/* Supports tlbies w/o locking
*/
#define MMU_FTR_LOCKLESS_TLBIE ASM_CONST(0x10000000)
/* Large pages can be marked CI
*/
#define MMU_FTR_CI_LARGE_PAGE ASM_CONST(0x20000000)
/* 1T segments available
*/
#define MMU_FTR_1T_SEGMENT ASM_CONST(0x40000000)
/* Doesn't support the B bit (1T segment) in SLBIE
*/
#define MMU_FTR_NO_SLBIE_B ASM_CONST(0x80000000)
/* MMU feature bit sets for various CPUs */
#define MMU_FTRS_DEFAULT_HPTE_ARCH_V2 \
MMU_FTR_HPTE_TABLE | MMU_FTR_PPCAS_ARCH_V2
#define MMU_FTRS_POWER4 MMU_FTRS_DEFAULT_HPTE_ARCH_V2
#define MMU_FTRS_PPC970 MMU_FTRS_POWER4
#define MMU_FTRS_POWER5 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
#define MMU_FTRS_POWER6 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
#define MMU_FTRS_POWER7 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | \
MMU_FTR_TLBIE_206
#define MMU_FTRS_CELL MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \
MMU_FTR_CI_LARGE_PAGE
#define MMU_FTRS_PA6T MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \
MMU_FTR_CI_LARGE_PAGE | MMU_FTR_NO_SLBIE_B
#define MMU_FTRS_A2 MMU_FTR_TYPE_3E | MMU_FTR_USE_TLBILX | \
MMU_FTR_USE_TLBIVAX_BCAST | \
MMU_FTR_LOCK_BCAST_INVAL | \
MMU_FTR_USE_TLBRSRV | \
MMU_FTR_USE_PAIRED_MAS | \
MMU_FTR_TLBIEL | \
MMU_FTR_16M_PAGE
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <asm/cputable.h> #include <asm/cputable.h>
......
...@@ -67,7 +67,7 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, ...@@ -67,7 +67,7 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
* sub architectures. * sub architectures.
*/ */
#ifdef CONFIG_PPC_STD_MMU_64 #ifdef CONFIG_PPC_STD_MMU_64
if (cpu_has_feature(CPU_FTR_SLB)) if (mmu_has_feature(MMU_FTR_SLB))
switch_slb(tsk, next); switch_slb(tsk, next);
else else
switch_stab(tsk, next); switch_stab(tsk, next);
......
...@@ -201,7 +201,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -201,7 +201,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "POWER4 (gp)", .cpu_name = "POWER4 (gp)",
.cpu_features = CPU_FTRS_POWER4, .cpu_features = CPU_FTRS_POWER4,
.cpu_user_features = COMMON_USER_POWER4, .cpu_user_features = COMMON_USER_POWER4,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_POWER4,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 8, .num_pmcs = 8,
...@@ -216,7 +216,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -216,7 +216,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "POWER4+ (gq)", .cpu_name = "POWER4+ (gq)",
.cpu_features = CPU_FTRS_POWER4, .cpu_features = CPU_FTRS_POWER4,
.cpu_user_features = COMMON_USER_POWER4, .cpu_user_features = COMMON_USER_POWER4,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_POWER4,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 8, .num_pmcs = 8,
...@@ -232,7 +232,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -232,7 +232,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_features = CPU_FTRS_PPC970, .cpu_features = CPU_FTRS_PPC970,
.cpu_user_features = COMMON_USER_POWER4 | .cpu_user_features = COMMON_USER_POWER4 |
PPC_FEATURE_HAS_ALTIVEC_COMP, PPC_FEATURE_HAS_ALTIVEC_COMP,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_PPC970,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 8, .num_pmcs = 8,
...@@ -250,7 +250,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -250,7 +250,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_features = CPU_FTRS_PPC970, .cpu_features = CPU_FTRS_PPC970,
.cpu_user_features = COMMON_USER_POWER4 | .cpu_user_features = COMMON_USER_POWER4 |
PPC_FEATURE_HAS_ALTIVEC_COMP, PPC_FEATURE_HAS_ALTIVEC_COMP,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_PPC970,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 8, .num_pmcs = 8,
...@@ -286,7 +286,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -286,7 +286,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_features = CPU_FTRS_PPC970, .cpu_features = CPU_FTRS_PPC970,
.cpu_user_features = COMMON_USER_POWER4 | .cpu_user_features = COMMON_USER_POWER4 |
PPC_FEATURE_HAS_ALTIVEC_COMP, PPC_FEATURE_HAS_ALTIVEC_COMP,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_PPC970,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 8, .num_pmcs = 8,
...@@ -304,7 +304,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -304,7 +304,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_features = CPU_FTRS_PPC970, .cpu_features = CPU_FTRS_PPC970,
.cpu_user_features = COMMON_USER_POWER4 | .cpu_user_features = COMMON_USER_POWER4 |
PPC_FEATURE_HAS_ALTIVEC_COMP, PPC_FEATURE_HAS_ALTIVEC_COMP,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_PPC970,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 8, .num_pmcs = 8,
...@@ -320,7 +320,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -320,7 +320,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "POWER5 (gr)", .cpu_name = "POWER5 (gr)",
.cpu_features = CPU_FTRS_POWER5, .cpu_features = CPU_FTRS_POWER5,
.cpu_user_features = COMMON_USER_POWER5, .cpu_user_features = COMMON_USER_POWER5,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_POWER5,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 6, .num_pmcs = 6,
...@@ -340,7 +340,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -340,7 +340,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "POWER5+ (gs)", .cpu_name = "POWER5+ (gs)",
.cpu_features = CPU_FTRS_POWER5, .cpu_features = CPU_FTRS_POWER5,
.cpu_user_features = COMMON_USER_POWER5_PLUS, .cpu_user_features = COMMON_USER_POWER5_PLUS,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_POWER5,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 6, .num_pmcs = 6,
...@@ -356,7 +356,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -356,7 +356,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "POWER5+ (gs)", .cpu_name = "POWER5+ (gs)",
.cpu_features = CPU_FTRS_POWER5, .cpu_features = CPU_FTRS_POWER5,
.cpu_user_features = COMMON_USER_POWER5_PLUS, .cpu_user_features = COMMON_USER_POWER5_PLUS,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_POWER5,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 6, .num_pmcs = 6,
...@@ -373,7 +373,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -373,7 +373,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "POWER5+", .cpu_name = "POWER5+",
.cpu_features = CPU_FTRS_POWER5, .cpu_features = CPU_FTRS_POWER5,
.cpu_user_features = COMMON_USER_POWER5_PLUS, .cpu_user_features = COMMON_USER_POWER5_PLUS,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_POWER5,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.oprofile_cpu_type = "ppc64/ibm-compat-v1", .oprofile_cpu_type = "ppc64/ibm-compat-v1",
...@@ -387,7 +387,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -387,7 +387,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_features = CPU_FTRS_POWER6, .cpu_features = CPU_FTRS_POWER6,
.cpu_user_features = COMMON_USER_POWER6 | .cpu_user_features = COMMON_USER_POWER6 |
PPC_FEATURE_POWER6_EXT, PPC_FEATURE_POWER6_EXT,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_POWER6,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 6, .num_pmcs = 6,
...@@ -406,7 +406,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -406,7 +406,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "POWER6 (architected)", .cpu_name = "POWER6 (architected)",
.cpu_features = CPU_FTRS_POWER6, .cpu_features = CPU_FTRS_POWER6,
.cpu_user_features = COMMON_USER_POWER6, .cpu_user_features = COMMON_USER_POWER6,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_POWER6,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.oprofile_cpu_type = "ppc64/ibm-compat-v1", .oprofile_cpu_type = "ppc64/ibm-compat-v1",
...@@ -419,8 +419,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -419,8 +419,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "POWER7 (architected)", .cpu_name = "POWER7 (architected)",
.cpu_features = CPU_FTRS_POWER7, .cpu_features = CPU_FTRS_POWER7,
.cpu_user_features = COMMON_USER_POWER7, .cpu_user_features = COMMON_USER_POWER7,
.mmu_features = MMU_FTR_HPTE_TABLE | .mmu_features = MMU_FTRS_POWER7,
MMU_FTR_TLBIE_206,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.oprofile_type = PPC_OPROFILE_POWER4, .oprofile_type = PPC_OPROFILE_POWER4,
...@@ -435,8 +434,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -435,8 +434,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "POWER7 (raw)", .cpu_name = "POWER7 (raw)",
.cpu_features = CPU_FTRS_POWER7, .cpu_features = CPU_FTRS_POWER7,
.cpu_user_features = COMMON_USER_POWER7, .cpu_user_features = COMMON_USER_POWER7,
.mmu_features = MMU_FTR_HPTE_TABLE | .mmu_features = MMU_FTRS_POWER7,
MMU_FTR_TLBIE_206,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 6, .num_pmcs = 6,
...@@ -453,8 +451,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -453,8 +451,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "POWER7+ (raw)", .cpu_name = "POWER7+ (raw)",
.cpu_features = CPU_FTRS_POWER7, .cpu_features = CPU_FTRS_POWER7,
.cpu_user_features = COMMON_USER_POWER7, .cpu_user_features = COMMON_USER_POWER7,
.mmu_features = MMU_FTR_HPTE_TABLE | .mmu_features = MMU_FTRS_POWER7,
MMU_FTR_TLBIE_206,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 6, .num_pmcs = 6,
...@@ -473,7 +470,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -473,7 +470,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_user_features = COMMON_USER_PPC64 | .cpu_user_features = COMMON_USER_PPC64 |
PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP |
PPC_FEATURE_SMT, PPC_FEATURE_SMT,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_CELL,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 4, .num_pmcs = 4,
...@@ -488,7 +485,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -488,7 +485,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "PA6T", .cpu_name = "PA6T",
.cpu_features = CPU_FTRS_PA6T, .cpu_features = CPU_FTRS_PA6T,
.cpu_user_features = COMMON_USER_PA6T, .cpu_user_features = COMMON_USER_PA6T,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_PA6T,
.icache_bsize = 64, .icache_bsize = 64,
.dcache_bsize = 64, .dcache_bsize = 64,
.num_pmcs = 6, .num_pmcs = 6,
...@@ -505,7 +502,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -505,7 +502,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "POWER4 (compatible)", .cpu_name = "POWER4 (compatible)",
.cpu_features = CPU_FTRS_COMPATIBLE, .cpu_features = CPU_FTRS_COMPATIBLE,
.cpu_user_features = COMMON_USER_PPC64, .cpu_user_features = COMMON_USER_PPC64,
.mmu_features = MMU_FTR_HPTE_TABLE, .mmu_features = MMU_FTRS_DEFAULT_HPTE_ARCH_V2,
.icache_bsize = 128, .icache_bsize = 128,
.dcache_bsize = 128, .dcache_bsize = 128,
.num_pmcs = 6, .num_pmcs = 6,
...@@ -2020,11 +2017,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -2020,11 +2017,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_name = "A2 (>= DD2)", .cpu_name = "A2 (>= DD2)",
.cpu_features = CPU_FTRS_A2, .cpu_features = CPU_FTRS_A2,
.cpu_user_features = COMMON_USER_PPC64, .cpu_user_features = COMMON_USER_PPC64,
.mmu_features = MMU_FTR_TYPE_3E | MMU_FTR_USE_TLBILX | .mmu_features = MMU_FTRS_A2,
MMU_FTR_USE_TLBIVAX_BCAST |
MMU_FTR_LOCK_BCAST_INVAL |
MMU_FTR_USE_TLBRSRV |
MMU_FTR_USE_PAIRED_MAS,
.icache_bsize = 64, .icache_bsize = 64,
.dcache_bsize = 64, .dcache_bsize = 64,
.num_pmcs = 0, .num_pmcs = 0,
......
...@@ -468,10 +468,10 @@ BEGIN_FTR_SECTION ...@@ -468,10 +468,10 @@ BEGIN_FTR_SECTION
FTR_SECTION_ELSE_NESTED(95) FTR_SECTION_ELSE_NESTED(95)
clrrdi r6,r8,40 /* get its 1T ESID */ clrrdi r6,r8,40 /* get its 1T ESID */
clrrdi r9,r1,40 /* get current sp 1T ESID */ clrrdi r9,r1,40 /* get current sp 1T ESID */
ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_1T_SEGMENT, 95) ALT_MMU_FTR_SECTION_END_NESTED_IFCLR(MMU_FTR_1T_SEGMENT, 95)
FTR_SECTION_ELSE FTR_SECTION_ELSE
b 2f b 2f
ALT_FTR_SECTION_END_IFSET(CPU_FTR_SLB) ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_SLB)
clrldi. r0,r6,2 /* is new ESID c00000000? */ clrldi. r0,r6,2 /* is new ESID c00000000? */
cmpd cr1,r6,r9 /* or is new ESID the same as current ESID? */ cmpd cr1,r6,r9 /* or is new ESID the same as current ESID? */
cror eq,4*cr1+eq,eq cror eq,4*cr1+eq,eq
...@@ -485,7 +485,7 @@ BEGIN_FTR_SECTION ...@@ -485,7 +485,7 @@ BEGIN_FTR_SECTION
li r9,MMU_SEGSIZE_1T /* insert B field */ li r9,MMU_SEGSIZE_1T /* insert B field */
oris r6,r6,(MMU_SEGSIZE_1T << SLBIE_SSIZE_SHIFT)@h oris r6,r6,(MMU_SEGSIZE_1T << SLBIE_SSIZE_SHIFT)@h
rldimi r7,r9,SLB_VSID_SSIZE_SHIFT,0 rldimi r7,r9,SLB_VSID_SSIZE_SHIFT,0
END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT) END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
/* Update the last bolted SLB. No write barriers are needed /* Update the last bolted SLB. No write barriers are needed
* here, provided we only update the current CPU's SLB shadow * here, provided we only update the current CPU's SLB shadow
...@@ -497,7 +497,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT) ...@@ -497,7 +497,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT)
std r7,SLBSHADOW_STACKVSID(r9) /* Save VSID */ std r7,SLBSHADOW_STACKVSID(r9) /* Save VSID */
std r0,SLBSHADOW_STACKESID(r9) /* Save ESID */ std r0,SLBSHADOW_STACKESID(r9) /* Save ESID */
/* No need to check for CPU_FTR_NO_SLBIE_B here, since when /* No need to check for MMU_FTR_NO_SLBIE_B here, since when
* we have 1TB segments, the only CPUs known to have the errata * we have 1TB segments, the only CPUs known to have the errata
* only support less than 1TB of system memory and we'll never * only support less than 1TB of system memory and we'll never
* actually hit this code path. * actually hit this code path.
......
...@@ -102,7 +102,7 @@ BEGIN_FTR_SECTION ...@@ -102,7 +102,7 @@ BEGIN_FTR_SECTION
EXCEPTION_PROLOG_PSERIES_1(data_access_common, EXC_STD) EXCEPTION_PROLOG_PSERIES_1(data_access_common, EXC_STD)
FTR_SECTION_ELSE FTR_SECTION_ELSE
EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common, EXC_STD) EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common, EXC_STD)
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_SLB) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_SLB)
. = 0x380 . = 0x380
.globl data_access_slb_pSeries .globl data_access_slb_pSeries
...@@ -840,7 +840,7 @@ _STATIC(do_hash_page) ...@@ -840,7 +840,7 @@ _STATIC(do_hash_page)
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
andis. r0,r4,0x0020 /* Is it a segment table fault? */ andis. r0,r4,0x0020 /* Is it a segment table fault? */
bne- do_ste_alloc /* If so handle it */ bne- do_ste_alloc /* If so handle it */
END_FTR_SECTION_IFCLR(CPU_FTR_SLB) END_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB)
clrrdi r11,r1,THREAD_SHIFT clrrdi r11,r1,THREAD_SHIFT
lwz r0,TI_PREEMPT(r11) /* If we're in an "NMI" */ lwz r0,TI_PREEMPT(r11) /* If we're in an "NMI" */
......
...@@ -757,11 +757,11 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, ...@@ -757,11 +757,11 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
_ALIGN_UP(sizeof(struct thread_info), 16); _ALIGN_UP(sizeof(struct thread_info), 16);
#ifdef CONFIG_PPC_STD_MMU_64 #ifdef CONFIG_PPC_STD_MMU_64
if (cpu_has_feature(CPU_FTR_SLB)) { if (mmu_has_feature(MMU_FTR_SLB)) {
unsigned long sp_vsid; unsigned long sp_vsid;
unsigned long llp = mmu_psize_defs[mmu_linear_psize].sllp; unsigned long llp = mmu_psize_defs[mmu_linear_psize].sllp;
if (cpu_has_feature(CPU_FTR_1T_SEGMENT)) if (mmu_has_feature(MMU_FTR_1T_SEGMENT))
sp_vsid = get_kernel_vsid(sp, MMU_SEGSIZE_1T) sp_vsid = get_kernel_vsid(sp, MMU_SEGSIZE_1T)
<< SLB_VSID_SHIFT_1T; << SLB_VSID_SHIFT_1T;
else else
......
...@@ -123,18 +123,19 @@ static void __init move_device_tree(void) ...@@ -123,18 +123,19 @@ static void __init move_device_tree(void)
*/ */
static struct ibm_pa_feature { static struct ibm_pa_feature {
unsigned long cpu_features; /* CPU_FTR_xxx bit */ unsigned long cpu_features; /* CPU_FTR_xxx bit */
unsigned long mmu_features; /* MMU_FTR_xxx bit */
unsigned int cpu_user_ftrs; /* PPC_FEATURE_xxx bit */ unsigned int cpu_user_ftrs; /* PPC_FEATURE_xxx bit */
unsigned char pabyte; /* byte number in ibm,pa-features */ unsigned char pabyte; /* byte number in ibm,pa-features */
unsigned char pabit; /* bit number (big-endian) */ unsigned char pabit; /* bit number (big-endian) */
unsigned char invert; /* if 1, pa bit set => clear feature */ unsigned char invert; /* if 1, pa bit set => clear feature */
} ibm_pa_features[] __initdata = { } ibm_pa_features[] __initdata = {
{0, PPC_FEATURE_HAS_MMU, 0, 0, 0}, {0, 0, PPC_FEATURE_HAS_MMU, 0, 0, 0},
{0, PPC_FEATURE_HAS_FPU, 0, 1, 0}, {0, 0, PPC_FEATURE_HAS_FPU, 0, 1, 0},
{CPU_FTR_SLB, 0, 0, 2, 0}, {0, MMU_FTR_SLB, 0, 0, 2, 0},
{CPU_FTR_CTRL, 0, 0, 3, 0}, {CPU_FTR_CTRL, 0, 0, 0, 3, 0},
{CPU_FTR_NOEXECUTE, 0, 0, 6, 0}, {CPU_FTR_NOEXECUTE, 0, 0, 0, 6, 0},
{CPU_FTR_NODSISRALIGN, 0, 1, 1, 1}, {CPU_FTR_NODSISRALIGN, 0, 0, 1, 1, 1},
{CPU_FTR_CI_LARGE_PAGE, 0, 1, 2, 0}, {0, MMU_FTR_CI_LARGE_PAGE, 0, 1, 2, 0},
{CPU_FTR_REAL_LE, PPC_FEATURE_TRUE_LE, 5, 0, 0}, {CPU_FTR_REAL_LE, PPC_FEATURE_TRUE_LE, 5, 0, 0},
}; };
...@@ -166,9 +167,11 @@ static void __init scan_features(unsigned long node, unsigned char *ftrs, ...@@ -166,9 +167,11 @@ static void __init scan_features(unsigned long node, unsigned char *ftrs,
if (bit ^ fp->invert) { if (bit ^ fp->invert) {
cur_cpu_spec->cpu_features |= fp->cpu_features; cur_cpu_spec->cpu_features |= fp->cpu_features;
cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftrs; cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftrs;
cur_cpu_spec->mmu_features |= fp->mmu_features;
} else { } else {
cur_cpu_spec->cpu_features &= ~fp->cpu_features; cur_cpu_spec->cpu_features &= ~fp->cpu_features;
cur_cpu_spec->cpu_user_features &= ~fp->cpu_user_ftrs; cur_cpu_spec->cpu_user_features &= ~fp->cpu_user_ftrs;
cur_cpu_spec->mmu_features &= ~fp->mmu_features;
} }
} }
} }
......
...@@ -436,7 +436,7 @@ void __init setup_system(void) ...@@ -436,7 +436,7 @@ void __init setup_system(void)
static u64 slb0_limit(void) static u64 slb0_limit(void)
{ {
if (cpu_has_feature(CPU_FTR_1T_SEGMENT)) { if (mmu_has_feature(MMU_FTR_1T_SEGMENT)) {
return 1UL << SID_SHIFT_1T; return 1UL << SID_SHIFT_1T;
} }
return 1UL << SID_SHIFT; return 1UL << SID_SHIFT;
......
...@@ -118,7 +118,7 @@ _GLOBAL(__hash_page_4K) ...@@ -118,7 +118,7 @@ _GLOBAL(__hash_page_4K)
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
cmpdi r9,0 /* check segment size */ cmpdi r9,0 /* check segment size */
bne 3f bne 3f
END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT) END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
/* Calc va and put it in r29 */ /* Calc va and put it in r29 */
rldicr r29,r5,28,63-28 rldicr r29,r5,28,63-28
rldicl r3,r3,0,36 rldicl r3,r3,0,36
...@@ -401,7 +401,7 @@ _GLOBAL(__hash_page_4K) ...@@ -401,7 +401,7 @@ _GLOBAL(__hash_page_4K)
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
cmpdi r9,0 /* check segment size */ cmpdi r9,0 /* check segment size */
bne 3f bne 3f
END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT) END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
/* Calc va and put it in r29 */ /* Calc va and put it in r29 */
rldicr r29,r5,28,63-28 /* r29 = (vsid << 28) */ rldicr r29,r5,28,63-28 /* r29 = (vsid << 28) */
rldicl r3,r3,0,36 /* r3 = (ea & 0x0fffffff) */ rldicl r3,r3,0,36 /* r3 = (ea & 0x0fffffff) */
...@@ -715,7 +715,7 @@ BEGIN_FTR_SECTION ...@@ -715,7 +715,7 @@ BEGIN_FTR_SECTION
andi. r0,r31,_PAGE_NO_CACHE andi. r0,r31,_PAGE_NO_CACHE
/* If so, bail out and refault as a 4k page */ /* If so, bail out and refault as a 4k page */
bne- ht64_bail_ok bne- ht64_bail_ok
END_FTR_SECTION_IFCLR(CPU_FTR_CI_LARGE_PAGE) END_MMU_FTR_SECTION_IFCLR(MMU_FTR_CI_LARGE_PAGE)
/* Prepare new PTE value (turn access RW into DIRTY, then /* Prepare new PTE value (turn access RW into DIRTY, then
* add BUSY and ACCESSED) * add BUSY and ACCESSED)
*/ */
...@@ -736,7 +736,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_CI_LARGE_PAGE) ...@@ -736,7 +736,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_CI_LARGE_PAGE)
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
cmpdi r9,0 /* check segment size */ cmpdi r9,0 /* check segment size */
bne 3f bne 3f
END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT) END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
/* Calc va and put it in r29 */ /* Calc va and put it in r29 */
rldicr r29,r5,28,63-28 rldicr r29,r5,28,63-28
rldicl r3,r3,0,36 rldicl r3,r3,0,36
......
...@@ -98,8 +98,8 @@ static inline void __tlbiel(unsigned long va, int psize, int ssize) ...@@ -98,8 +98,8 @@ static inline void __tlbiel(unsigned long va, int psize, int ssize)
static inline void tlbie(unsigned long va, int psize, int ssize, int local) static inline void tlbie(unsigned long va, int psize, int ssize, int local)
{ {
unsigned int use_local = local && cpu_has_feature(CPU_FTR_TLBIEL); unsigned int use_local = local && mmu_has_feature(MMU_FTR_TLBIEL);
int lock_tlbie = !cpu_has_feature(CPU_FTR_LOCKLESS_TLBIE); int lock_tlbie = !mmu_has_feature(MMU_FTR_LOCKLESS_TLBIE);
if (use_local) if (use_local)
use_local = mmu_psize_defs[psize].tlbiel; use_local = mmu_psize_defs[psize].tlbiel;
...@@ -503,7 +503,7 @@ static void native_flush_hash_range(unsigned long number, int local) ...@@ -503,7 +503,7 @@ static void native_flush_hash_range(unsigned long number, int local)
} pte_iterate_hashed_end(); } pte_iterate_hashed_end();
} }
if (cpu_has_feature(CPU_FTR_TLBIEL) && if (mmu_has_feature(MMU_FTR_TLBIEL) &&
mmu_psize_defs[psize].tlbiel && local) { mmu_psize_defs[psize].tlbiel && local) {
asm volatile("ptesync":::"memory"); asm volatile("ptesync":::"memory");
for (i = 0; i < number; i++) { for (i = 0; i < number; i++) {
...@@ -517,7 +517,7 @@ static void native_flush_hash_range(unsigned long number, int local) ...@@ -517,7 +517,7 @@ static void native_flush_hash_range(unsigned long number, int local)
} }
asm volatile("ptesync":::"memory"); asm volatile("ptesync":::"memory");
} else { } else {
int lock_tlbie = !cpu_has_feature(CPU_FTR_LOCKLESS_TLBIE); int lock_tlbie = !mmu_has_feature(MMU_FTR_LOCKLESS_TLBIE);
if (lock_tlbie) if (lock_tlbie)
raw_spin_lock(&native_tlbie_lock); raw_spin_lock(&native_tlbie_lock);
......
...@@ -259,11 +259,11 @@ static int __init htab_dt_scan_seg_sizes(unsigned long node, ...@@ -259,11 +259,11 @@ static int __init htab_dt_scan_seg_sizes(unsigned long node,
for (; size >= 4; size -= 4, ++prop) { for (; size >= 4; size -= 4, ++prop) {
if (prop[0] == 40) { if (prop[0] == 40) {
DBG("1T segment support detected\n"); DBG("1T segment support detected\n");
cur_cpu_spec->cpu_features |= CPU_FTR_1T_SEGMENT; cur_cpu_spec->mmu_features |= MMU_FTR_1T_SEGMENT;
return 1; return 1;
} }
} }
cur_cpu_spec->cpu_features &= ~CPU_FTR_NO_SLBIE_B; cur_cpu_spec->mmu_features &= ~MMU_FTR_NO_SLBIE_B;
return 0; return 0;
} }
...@@ -289,7 +289,7 @@ static int __init htab_dt_scan_page_sizes(unsigned long node, ...@@ -289,7 +289,7 @@ static int __init htab_dt_scan_page_sizes(unsigned long node,
if (prop != NULL) { if (prop != NULL) {
DBG("Page sizes from device-tree:\n"); DBG("Page sizes from device-tree:\n");
size /= 4; size /= 4;
cur_cpu_spec->cpu_features &= ~(CPU_FTR_16M_PAGE); cur_cpu_spec->mmu_features &= ~(MMU_FTR_16M_PAGE);
while(size > 0) { while(size > 0) {
unsigned int shift = prop[0]; unsigned int shift = prop[0];
unsigned int slbenc = prop[1]; unsigned int slbenc = prop[1];
...@@ -317,7 +317,7 @@ static int __init htab_dt_scan_page_sizes(unsigned long node, ...@@ -317,7 +317,7 @@ static int __init htab_dt_scan_page_sizes(unsigned long node,
break; break;
case 0x18: case 0x18:
idx = MMU_PAGE_16M; idx = MMU_PAGE_16M;
cur_cpu_spec->cpu_features |= CPU_FTR_16M_PAGE; cur_cpu_spec->mmu_features |= MMU_FTR_16M_PAGE;
break; break;
case 0x22: case 0x22:
idx = MMU_PAGE_16G; idx = MMU_PAGE_16G;
...@@ -412,7 +412,7 @@ static void __init htab_init_page_sizes(void) ...@@ -412,7 +412,7 @@ static void __init htab_init_page_sizes(void)
* Not in the device-tree, let's fallback on known size * Not in the device-tree, let's fallback on known size
* list for 16M capable GP & GR * list for 16M capable GP & GR
*/ */
if (cpu_has_feature(CPU_FTR_16M_PAGE)) if (mmu_has_feature(MMU_FTR_16M_PAGE))
memcpy(mmu_psize_defs, mmu_psize_defaults_gp, memcpy(mmu_psize_defs, mmu_psize_defaults_gp,
sizeof(mmu_psize_defaults_gp)); sizeof(mmu_psize_defaults_gp));
found: found:
...@@ -442,7 +442,7 @@ static void __init htab_init_page_sizes(void) ...@@ -442,7 +442,7 @@ static void __init htab_init_page_sizes(void)
mmu_vmalloc_psize = MMU_PAGE_64K; mmu_vmalloc_psize = MMU_PAGE_64K;
if (mmu_linear_psize == MMU_PAGE_4K) if (mmu_linear_psize == MMU_PAGE_4K)
mmu_linear_psize = MMU_PAGE_64K; mmu_linear_psize = MMU_PAGE_64K;
if (cpu_has_feature(CPU_FTR_CI_LARGE_PAGE)) { if (mmu_has_feature(MMU_FTR_CI_LARGE_PAGE)) {
/* /*
* Don't use 64k pages for ioremap on pSeries, since * Don't use 64k pages for ioremap on pSeries, since
* that would stop us accessing the HEA ethernet. * that would stop us accessing the HEA ethernet.
...@@ -608,7 +608,7 @@ static void __init htab_initialize(void) ...@@ -608,7 +608,7 @@ static void __init htab_initialize(void)
/* Initialize page sizes */ /* Initialize page sizes */
htab_init_page_sizes(); htab_init_page_sizes();
if (cpu_has_feature(CPU_FTR_1T_SEGMENT)) { if (mmu_has_feature(MMU_FTR_1T_SEGMENT)) {
mmu_kernel_ssize = MMU_SEGSIZE_1T; mmu_kernel_ssize = MMU_SEGSIZE_1T;
mmu_highuser_ssize = MMU_SEGSIZE_1T; mmu_highuser_ssize = MMU_SEGSIZE_1T;
printk(KERN_INFO "Using 1TB segments\n"); printk(KERN_INFO "Using 1TB segments\n");
...@@ -749,7 +749,7 @@ void __init early_init_mmu(void) ...@@ -749,7 +749,7 @@ void __init early_init_mmu(void)
/* Initialize stab / SLB management except on iSeries /* Initialize stab / SLB management except on iSeries
*/ */
if (cpu_has_feature(CPU_FTR_SLB)) if (mmu_has_feature(MMU_FTR_SLB))
slb_initialize(); slb_initialize();
else if (!firmware_has_feature(FW_FEATURE_ISERIES)) else if (!firmware_has_feature(FW_FEATURE_ISERIES))
stab_initialize(get_paca()->stab_real); stab_initialize(get_paca()->stab_real);
...@@ -766,7 +766,7 @@ void __cpuinit early_init_mmu_secondary(void) ...@@ -766,7 +766,7 @@ void __cpuinit early_init_mmu_secondary(void)
* in real mode on pSeries and we want a virtual address on * in real mode on pSeries and we want a virtual address on
* iSeries anyway * iSeries anyway
*/ */
if (cpu_has_feature(CPU_FTR_SLB)) if (mmu_has_feature(MMU_FTR_SLB))
slb_initialize(); slb_initialize();
else else
stab_initialize(get_paca()->stab_addr); stab_initialize(get_paca()->stab_addr);
......
...@@ -529,7 +529,7 @@ static int __init hugetlbpage_init(void) ...@@ -529,7 +529,7 @@ static int __init hugetlbpage_init(void)
{ {
int psize; int psize;
if (!cpu_has_feature(CPU_FTR_16M_PAGE)) if (!mmu_has_feature(MMU_FTR_16M_PAGE))
return -ENODEV; return -ENODEV;
for (psize = 0; psize < MMU_PAGE_COUNT; ++psize) { for (psize = 0; psize < MMU_PAGE_COUNT; ++psize) {
......
...@@ -167,7 +167,7 @@ static inline int esids_match(unsigned long addr1, unsigned long addr2) ...@@ -167,7 +167,7 @@ static inline int esids_match(unsigned long addr1, unsigned long addr2)
int esid_1t_count; int esid_1t_count;
/* System is not 1T segment size capable. */ /* System is not 1T segment size capable. */
if (!cpu_has_feature(CPU_FTR_1T_SEGMENT)) if (!mmu_has_feature(MMU_FTR_1T_SEGMENT))
return (GET_ESID(addr1) == GET_ESID(addr2)); return (GET_ESID(addr1) == GET_ESID(addr2));
esid_1t_count = (((addr1 >> SID_SHIFT_1T) != 0) + esid_1t_count = (((addr1 >> SID_SHIFT_1T) != 0) +
...@@ -202,7 +202,7 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm) ...@@ -202,7 +202,7 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
*/ */
hard_irq_disable(); hard_irq_disable();
offset = get_paca()->slb_cache_ptr; offset = get_paca()->slb_cache_ptr;
if (!cpu_has_feature(CPU_FTR_NO_SLBIE_B) && if (!mmu_has_feature(MMU_FTR_NO_SLBIE_B) &&
offset <= SLB_CACHE_ENTRIES) { offset <= SLB_CACHE_ENTRIES) {
int i; int i;
asm volatile("isync" : : : "memory"); asm volatile("isync" : : : "memory");
......
...@@ -58,7 +58,7 @@ _GLOBAL(slb_miss_kernel_load_linear) ...@@ -58,7 +58,7 @@ _GLOBAL(slb_miss_kernel_load_linear)
li r11,0 li r11,0
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
b slb_finish_load b slb_finish_load
END_FTR_SECTION_IFCLR(CPU_FTR_1T_SEGMENT) END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
b slb_finish_load_1T b slb_finish_load_1T
1: 1:
...@@ -87,7 +87,7 @@ _GLOBAL(slb_miss_kernel_load_vmemmap) ...@@ -87,7 +87,7 @@ _GLOBAL(slb_miss_kernel_load_vmemmap)
6: 6:
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
b slb_finish_load b slb_finish_load
END_FTR_SECTION_IFCLR(CPU_FTR_1T_SEGMENT) END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
b slb_finish_load_1T b slb_finish_load_1T
0: /* user address: proto-VSID = context << 15 | ESID. First check 0: /* user address: proto-VSID = context << 15 | ESID. First check
...@@ -138,11 +138,11 @@ END_FTR_SECTION_IFCLR(CPU_FTR_1T_SEGMENT) ...@@ -138,11 +138,11 @@ END_FTR_SECTION_IFCLR(CPU_FTR_1T_SEGMENT)
ld r9,PACACONTEXTID(r13) ld r9,PACACONTEXTID(r13)
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
cmpldi r10,0x1000 cmpldi r10,0x1000
END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT) END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
rldimi r10,r9,USER_ESID_BITS,0 rldimi r10,r9,USER_ESID_BITS,0
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
bge slb_finish_load_1T bge slb_finish_load_1T
END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT) END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
b slb_finish_load b slb_finish_load
8: /* invalid EA */ 8: /* invalid EA */
......
...@@ -243,7 +243,7 @@ void __init stabs_alloc(void) ...@@ -243,7 +243,7 @@ void __init stabs_alloc(void)
{ {
int cpu; int cpu;
if (cpu_has_feature(CPU_FTR_SLB)) if (mmu_has_feature(MMU_FTR_SLB))
return; return;
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <asm/thread_info.h> #include <asm/thread_info.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/cputable.h> #include <asm/cputable.h>
#include <asm/mmu.h>
#include "exception.h" #include "exception.h"
...@@ -157,7 +158,7 @@ BEGIN_FTR_SECTION ...@@ -157,7 +158,7 @@ BEGIN_FTR_SECTION
FTR_SECTION_ELSE FTR_SECTION_ELSE
EXCEPTION_PROLOG_1(PACA_EXGEN) EXCEPTION_PROLOG_1(PACA_EXGEN)
EXCEPTION_PROLOG_ISERIES_1 EXCEPTION_PROLOG_ISERIES_1
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_SLB) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_SLB)
b data_access_common b data_access_common
.do_stab_bolted_iSeries: .do_stab_bolted_iSeries:
......
...@@ -249,7 +249,7 @@ static unsigned long iSeries_process_mainstore_vpd(struct MemoryBlock *mb_array, ...@@ -249,7 +249,7 @@ static unsigned long iSeries_process_mainstore_vpd(struct MemoryBlock *mb_array,
unsigned long i; unsigned long i;
unsigned long mem_blocks = 0; unsigned long mem_blocks = 0;
if (cpu_has_feature(CPU_FTR_SLB)) if (mmu_has_feature(MMU_FTR_SLB))
mem_blocks = iSeries_process_Regatta_mainstore_vpd(mb_array, mem_blocks = iSeries_process_Regatta_mainstore_vpd(mb_array,
max_entries); max_entries);
else else
...@@ -634,7 +634,7 @@ static int __init iseries_probe(void) ...@@ -634,7 +634,7 @@ static int __init iseries_probe(void)
hpte_init_iSeries(); hpte_init_iSeries();
/* iSeries does not support 16M pages */ /* iSeries does not support 16M pages */
cur_cpu_spec->cpu_features &= ~CPU_FTR_16M_PAGE; cur_cpu_spec->mmu_features &= ~MMU_FTR_16M_PAGE;
return 1; return 1;
} }
......
...@@ -573,7 +573,7 @@ static void pSeries_lpar_flush_hash_range(unsigned long number, int local) ...@@ -573,7 +573,7 @@ static void pSeries_lpar_flush_hash_range(unsigned long number, int local)
unsigned long i, pix, rc; unsigned long i, pix, rc;
unsigned long flags = 0; unsigned long flags = 0;
struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch); struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch);
int lock_tlbie = !cpu_has_feature(CPU_FTR_LOCKLESS_TLBIE); int lock_tlbie = !mmu_has_feature(MMU_FTR_LOCKLESS_TLBIE);
unsigned long param[9]; unsigned long param[9];
unsigned long va; unsigned long va;
unsigned long hash, index, shift, hidx, slot; unsigned long hash, index, shift, hidx, slot;
......
...@@ -2663,7 +2663,7 @@ static void dump_stab(void) ...@@ -2663,7 +2663,7 @@ static void dump_stab(void)
void dump_segments(void) void dump_segments(void)
{ {
if (cpu_has_feature(CPU_FTR_SLB)) if (mmu_has_feature(MMU_FTR_SLB))
dump_slb(); dump_slb();
else else
dump_stab(); dump_stab();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment