From: Kumar Gala Updates the Freescale Book-E MMU usage to match the architecture spec. This is mainly growing the widths of fields in various registers to match the architecture spec instead of the implementation. Signed-off-by: Becky Gill Signed-off-by: Kumar Gala Signed-off-by: Andrew Morton --- 25-akpm/arch/ppc/kernel/head_e500.S | 20 +++++++++----------- 25-akpm/arch/ppc/mm/fsl_booke_mmu.c | 6 +++--- 25-akpm/include/asm-ppc/mmu.h | 24 +++++++++++++----------- 3 files changed, 25 insertions(+), 25 deletions(-) diff -puN arch/ppc/kernel/head_e500.S~ppc32-freescale-book-e-mmu-cleanup arch/ppc/kernel/head_e500.S --- 25/arch/ppc/kernel/head_e500.S~ppc32-freescale-book-e-mmu-cleanup 2004-11-16 23:43:36.406134032 -0800 +++ 25-akpm/arch/ppc/kernel/head_e500.S 2004-11-16 23:43:36.414132816 -0800 @@ -119,7 +119,7 @@ invstr: mflr r6 /* Make it accessible tlbsx 0,r6 /* Fall through, we had to match */ match_TLB: mfspr r7,SPRN_MAS0 - rlwinm r3,r7,16,28,31 /* Extract MAS0(Entry) */ + rlwinm r3,r7,16,20,31 /* Extract MAS0(Entry) */ mfspr r7,SPRN_MAS1 /* Insure IPROT set */ oris r7,r7,MAS1_IPROT@h @@ -131,7 +131,7 @@ match_TLB: andi. r9,r9,0xfff li r6,0 /* Set Entry counter to 0 */ 1: lis r7,0x1000 /* Set MAS0(TLBSEL) = 1 */ - rlwimi r7,r6,16,12,15 /* Setup MAS0 = TLBSEL | ESEL(r6) */ + rlwimi r7,r6,16,4,15 /* Setup MAS0 = TLBSEL | ESEL(r6) */ mtspr SPRN_MAS0,r7 tlbre mfspr r7,SPRN_MAS1 @@ -163,13 +163,13 @@ skpinv: addi r6,r6,1 /* Increment */ andi. r5, r3, 0x1 /* Find an entry not used and is non-zero */ addi r5, r5, 0x1 lis r7,0x1000 /* Set MAS0(TLBSEL) = 1 */ - rlwimi r7,r3,16,12,15 /* Setup MAS0 = TLBSEL | ESEL(r3) */ + rlwimi r7,r3,16,4,15 /* Setup MAS0 = TLBSEL | ESEL(r3) */ mtspr SPRN_MAS0,r7 tlbre /* Just modify the entry ID and EPN for the temp mapping */ lis r7,0x1000 /* Set MAS0(TLBSEL) = 1 */ - rlwimi r7,r5,16,12,15 /* Setup MAS0 = TLBSEL | ESEL(r5) */ + rlwimi r7,r5,16,4,15 /* Setup MAS0 = TLBSEL | ESEL(r5) */ mtspr SPRN_MAS0,r7 xori r6,r4,1 /* Setup TMP mapping in the other Address space */ slwi r6,r6,12 @@ -201,7 +201,7 @@ skpinv: addi r6,r6,1 /* Increment */ /* 5. Invalidate mapping we started in */ lis r7,0x1000 /* Set MAS0(TLBSEL) = 1 */ - rlwimi r7,r3,16,12,15 /* Setup MAS0 = TLBSEL | ESEL(r3) */ + rlwimi r7,r3,16,4,15 /* Setup MAS0 = TLBSEL | ESEL(r3) */ mtspr SPRN_MAS0,r7 tlbre li r6,0 @@ -242,7 +242,7 @@ skpinv: addi r6,r6,1 /* Increment */ /* 8. Clear out the temp mapping */ lis r7,0x1000 /* Set MAS0(TLBSEL) = 1 */ - rlwimi r7,r5,16,12,15 /* Setup MAS0 = TLBSEL | ESEL(r5) */ + rlwimi r7,r5,16,4,15 /* Setup MAS0 = TLBSEL | ESEL(r5) */ mtspr SPRN_MAS0,r7 tlbre mtspr SPRN_MAS1,r8 @@ -282,7 +282,7 @@ skpinv: addi r6,r6,1 /* Increment */ mtspr SPRN_IVPR,r4 /* Setup the defaults for TLB entries */ - li r2,MAS4_TSIZED(BOOKE_PAGESZ_4K) + li r2,(MAS4_TSIZED(BOOKE_PAGESZ_4K))@l mtspr SPRN_MAS4, r2 #if 0 @@ -539,8 +539,7 @@ interrupt_base: ori r11, r11, swapper_pg_dir@l mfspr r12,SPRN_MAS1 /* Set TID to 0 */ - li r13,MAS1_TID@l - andc r12,r12,r13 + rlwinm r12,r12,0,16,1 mtspr SPRN_MAS1,r12 b 4f @@ -604,8 +603,7 @@ interrupt_base: ori r11, r11, swapper_pg_dir@l mfspr r12,SPRN_MAS1 /* Set TID to 0 */ - li r13,MAS1_TID@l - andc r12,r12,r13 + rlwinm r12,r12,0,16,1 mtspr SPRN_MAS1,r12 b 4f diff -puN arch/ppc/mm/fsl_booke_mmu.c~ppc32-freescale-book-e-mmu-cleanup arch/ppc/mm/fsl_booke_mmu.c --- 25/arch/ppc/mm/fsl_booke_mmu.c~ppc32-freescale-book-e-mmu-cleanup 2004-11-16 23:43:36.408133728 -0800 +++ 25-akpm/arch/ppc/mm/fsl_booke_mmu.c 2004-11-16 23:43:36.414132816 -0800 @@ -124,8 +124,8 @@ void settlbcam(int index, unsigned long flags |= _PAGE_COHERENT; #endif - TLBCAM[index].MAS0 = MAS0_TLBSEL | (index << 16); - TLBCAM[index].MAS1 = MAS1_VALID | MAS1_IPROT | MAS1_TSIZE(tsize) | ((pid << 16) & MAS1_TID); + TLBCAM[index].MAS0 = MAS0_TLBSEL(1) | MAS0_ESEL(index); + TLBCAM[index].MAS1 = MAS1_VALID | MAS1_IPROT | MAS1_TSIZE(tsize) | MAS1_TID(pid); TLBCAM[index].MAS2 = virt & PAGE_MASK; TLBCAM[index].MAS2 |= (flags & _PAGE_WRITETHRU) ? MAS2_W : 0; @@ -156,7 +156,7 @@ void settlbcam(int index, unsigned long void invalidate_tlbcam_entry(int index) { - TLBCAM[index].MAS0 = MAS0_TLBSEL | (index << 16); + TLBCAM[index].MAS0 = MAS0_TLBSEL(1) | MAS0_ESEL(index); TLBCAM[index].MAS1 = ~MAS1_VALID; loadcam_entry(index); diff -puN include/asm-ppc/mmu.h~ppc32-freescale-book-e-mmu-cleanup include/asm-ppc/mmu.h --- 25/include/asm-ppc/mmu.h~ppc32-freescale-book-e-mmu-cleanup 2004-11-16 23:43:36.409133576 -0800 +++ 25-akpm/include/asm-ppc/mmu.h 2004-11-16 23:43:36.415132664 -0800 @@ -401,18 +401,17 @@ typedef struct _P601_BAT { * Freescale Book-E MMU support */ -#define MAS0_TLBSEL 0x10000000 -#define MAS0_ESEL 0x000F0000 -#define MAS0_NV 0x00000001 +#define MAS0_TLBSEL(x) ((x << 28) & 0x30000000) +#define MAS0_ESEL(x) ((x << 16) & 0x0FFF0000) +#define MAS0_NV 0x00000FFF #define MAS1_VALID 0x80000000 #define MAS1_IPROT 0x40000000 -#define MAS1_TID 0x03FF0000 +#define MAS1_TID(x) ((x << 16) & 0x3FFF0000) #define MAS1_TS 0x00001000 -#define MAS1_TSIZE(x) (x << 8) +#define MAS1_TSIZE(x) ((x << 8) & 0x00000F00) #define MAS2_EPN 0xFFFFF000 -#define MAS2_SHAREN 0x00000200 #define MAS2_X0 0x00000040 #define MAS2_X1 0x00000020 #define MAS2_W 0x00000010 @@ -433,10 +432,9 @@ typedef struct _P601_BAT { #define MAS3_UR 0x00000002 #define MAS3_SR 0x00000001 -#define MAS4_TLBSELD 0x10000000 -#define MAS4_TIDDSEL 0x00030000 -#define MAS4_DSHAREN 0x00001000 -#define MAS4_TSIZED(x) (x << 8) +#define MAS4_TLBSELD(x) MAS0_TLBSEL(x) +#define MAS4_TIDDSEL 0x000F0000 +#define MAS4_TSIZED(x) MAS1_TSIZE(x) #define MAS4_X0D 0x00000040 #define MAS4_X1D 0x00000020 #define MAS4_WD 0x00000010 @@ -445,8 +443,12 @@ typedef struct _P601_BAT { #define MAS4_GD 0x00000002 #define MAS4_ED 0x00000001 -#define MAS6_SPID 0x00FF0000 +#define MAS6_SPID0 0x3FFF0000 +#define MAS6_SPID1 0x00007FFE #define MAS6_SAS 0x00000001 +#define MAS6_SPID MAS6_SPID0 + +#define MAS7_RPN 0xFFFFFFFF #endif /* _PPC_MMU_H_ */ #endif /* __KERNEL__ */ _