Commit e9965577 authored by Kumar Gala's avatar Kumar Gala

powerpc: Add support for early tlbilx opcode

During the ISA 2.06 development the opcode for tlbilx changed and some
early implementations used to old opcode.  Add support for a MMU_FTR
fixup to deal with this.
Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
parent 7281f5dc
...@@ -52,6 +52,12 @@ ...@@ -52,6 +52,12 @@
*/ */
#define MMU_FTR_NEED_DTLB_SW_LRU ASM_CONST(0x00200000) #define MMU_FTR_NEED_DTLB_SW_LRU ASM_CONST(0x00200000)
/* This indicates that the processor uses the wrong opcode for tlbilx
* instructions. During the ISA 2.06 development the opcode for tlbilx
* changed and some early implementations used to old opcode
*/
#define MMU_FTR_TLBILX_EARLY_OPCODE ASM_CONST(0x00400000)
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <asm/cputable.h> #include <asm/cputable.h>
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#define PPC_INST_STSWI 0x7c0005aa #define PPC_INST_STSWI 0x7c0005aa
#define PPC_INST_STSWX 0x7c00052a #define PPC_INST_STSWX 0x7c00052a
#define PPC_INST_TLBILX 0x7c000024 #define PPC_INST_TLBILX 0x7c000024
#define PPC_INST_TLBILX_EARLY 0x7c000626
#define PPC_INST_WAIT 0x7c00007c #define PPC_INST_WAIT 0x7c00007c
/* macros to insert fields into opcodes */ /* macros to insert fields into opcodes */
...@@ -63,10 +64,18 @@ ...@@ -63,10 +64,18 @@
#define PPC_RFDI stringify_in_c(.long PPC_INST_RFDI) #define PPC_RFDI stringify_in_c(.long PPC_INST_RFDI)
#define PPC_RFMCI stringify_in_c(.long PPC_INST_RFMCI) #define PPC_RFMCI stringify_in_c(.long PPC_INST_RFMCI)
#define PPC_TLBILX(t, a, b) stringify_in_c(.long PPC_INST_TLBILX | \ #define PPC_TLBILX(t, a, b) stringify_in_c(.long PPC_INST_TLBILX | \
__PPC_T_TLB(t) | __PPC_RA(a) | __PPC_RB(b)) __PPC_T_TLB(t) | \
__PPC_RA(a) | __PPC_RB(b))
#define PPC_TLBILX_ALL(a, b) PPC_TLBILX(0, a, b) #define PPC_TLBILX_ALL(a, b) PPC_TLBILX(0, a, b)
#define PPC_TLBILX_PID(a, b) PPC_TLBILX(1, a, b) #define PPC_TLBILX_PID(a, b) PPC_TLBILX(1, a, b)
#define PPC_TLBILX_VA(a, b) PPC_TLBILX(3, a, b) #define PPC_TLBILX_VA(a, b) PPC_TLBILX(3, a, b)
#define PPC_TLBILX_EARLY(t, a, b) stringify_in_c(.long PPC_INST_TLBILX_EARLY | \
__PPC_T_TLB(t) | \
__PPC_RA(a) | __PPC_RB(b))
#define PPC_TLBILX_ALL_EARLY(a, b) PPC_TLBILX_EARLY(0, a, b)
#define PPC_TLBILX_PID_EARLY(a, b) PPC_TLBILX_EARLY(1, a, b)
#define PPC_TLBILX_VA_EARLY(a, b) PPC_TLBILX_EARLY(3, a, b)
#define PPC_WAIT(w) stringify_in_c(.long PPC_INST_WAIT | \ #define PPC_WAIT(w) stringify_in_c(.long PPC_INST_WAIT | \
__PPC_WC(w)) __PPC_WC(w))
......
...@@ -1766,7 +1766,7 @@ static struct cpu_spec __initdata cpu_specs[] = { ...@@ -1766,7 +1766,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
.cpu_features = CPU_FTRS_E500MC, .cpu_features = CPU_FTRS_E500MC,
.cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
.mmu_features = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS | .mmu_features = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS |
MMU_FTR_USE_TLBILX, MMU_FTR_USE_TLBILX | MMU_FTR_TLBILX_EARLY_OPCODE,
.icache_bsize = 64, .icache_bsize = 64,
.dcache_bsize = 64, .dcache_bsize = 64,
.num_pmcs = 4, .num_pmcs = 4,
......
...@@ -138,7 +138,11 @@ BEGIN_MMU_FTR_SECTION ...@@ -138,7 +138,11 @@ BEGIN_MMU_FTR_SECTION
andi. r3,r3,MMUCSR0_TLBFI@l andi. r3,r3,MMUCSR0_TLBFI@l
bne 1b bne 1b
MMU_FTR_SECTION_ELSE MMU_FTR_SECTION_ELSE
PPC_TLBILX_ALL(0,0) BEGIN_MMU_FTR_SECTION_NESTED(96)
PPC_TLBILX_ALL(0,r3)
MMU_FTR_SECTION_ELSE_NESTED(96)
PPC_TLBILX_ALL_EARLY(0,r3)
ALT_MMU_FTR_SECTION_END_NESTED_IFCLR(MMU_FTR_TLBILX_EARLY_OPCODE, 96)
ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_USE_TLBILX) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_USE_TLBILX)
msync msync
isync isync
...@@ -151,7 +155,11 @@ BEGIN_MMU_FTR_SECTION ...@@ -151,7 +155,11 @@ BEGIN_MMU_FTR_SECTION
wrteei 0 wrteei 0
mfspr r4,SPRN_MAS6 /* save MAS6 */ mfspr r4,SPRN_MAS6 /* save MAS6 */
mtspr SPRN_MAS6,r3 mtspr SPRN_MAS6,r3
BEGIN_MMU_FTR_SECTION_NESTED(96)
PPC_TLBILX_PID(0,0) PPC_TLBILX_PID(0,0)
MMU_FTR_SECTION_ELSE_NESTED(96)
PPC_TLBILX_PID_EARLY(0,0)
ALT_MMU_FTR_SECTION_END_NESTED_IFCLR(MMU_FTR_TLBILX_EARLY_OPCODE, 96)
mtspr SPRN_MAS6,r4 /* restore MAS6 */ mtspr SPRN_MAS6,r4 /* restore MAS6 */
wrtee r10 wrtee r10
MMU_FTR_SECTION_ELSE MMU_FTR_SECTION_ELSE
...@@ -185,7 +193,11 @@ BEGIN_MMU_FTR_SECTION ...@@ -185,7 +193,11 @@ BEGIN_MMU_FTR_SECTION
mtspr SPRN_MAS1,r4 mtspr SPRN_MAS1,r4
tlbwe tlbwe
MMU_FTR_SECTION_ELSE MMU_FTR_SECTION_ELSE
BEGIN_MMU_FTR_SECTION_NESTED(96)
PPC_TLBILX_VA(0,r3) PPC_TLBILX_VA(0,r3)
MMU_FTR_SECTION_ELSE_NESTED(96)
PPC_TLBILX_VA_EARLY(0,r3)
ALT_MMU_FTR_SECTION_END_NESTED_IFCLR(MMU_FTR_TLBILX_EARLY_OPCODE, 96)
ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_USE_TLBILX) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_USE_TLBILX)
msync msync
isync isync
......
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