diff options
author | Josh Boyer <jwboyer@linux.vnet.ibm.com> | 2007-08-20 08:28:48 -0400 |
---|---|---|
committer | Josh Boyer <jwboyer@linux.vnet.ibm.com> | 2007-08-20 08:28:48 -0400 |
commit | 4d922c8dc332f4c7bc156fa832187661d4899cee (patch) | |
tree | d123df4223b040d0c361c5e8a02d349523bc8c6c | |
parent | e90f3b74d884d0f2826e06dbab4f615ca346eaa4 (diff) |
[POWERPC] 40x MMU
Add MMU definitions for 40x platforms. Also fixes two warnings in 40x_mmu.c.
Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
Acked-by: David Gibson <david@gibson.dropbear.id.au>
-rw-r--r-- | arch/powerpc/kernel/head_40x.S | 2 | ||||
-rw-r--r-- | arch/powerpc/mm/40x_mmu.c | 4 | ||||
-rw-r--r-- | include/asm-powerpc/mmu-40x.h | 65 | ||||
-rw-r--r-- | include/asm-powerpc/mmu.h | 3 |
4 files changed, 71 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S index adc7f8097cd4..fe8afb60290e 100644 --- a/arch/powerpc/kernel/head_40x.S +++ b/arch/powerpc/kernel/head_40x.S | |||
@@ -772,7 +772,7 @@ finish_tlb_load: | |||
772 | */ | 772 | */ |
773 | lwz r9, tlb_4xx_index@l(0) | 773 | lwz r9, tlb_4xx_index@l(0) |
774 | addi r9, r9, 1 | 774 | addi r9, r9, 1 |
775 | andi. r9, r9, (PPC4XX_TLB_SIZE-1) | 775 | andi. r9, r9, (PPC40X_TLB_SIZE-1) |
776 | stw r9, tlb_4xx_index@l(0) | 776 | stw r9, tlb_4xx_index@l(0) |
777 | 777 | ||
778 | 6: | 778 | 6: |
diff --git a/arch/powerpc/mm/40x_mmu.c b/arch/powerpc/mm/40x_mmu.c index 7ff2609b64d1..e067df836be2 100644 --- a/arch/powerpc/mm/40x_mmu.c +++ b/arch/powerpc/mm/40x_mmu.c | |||
@@ -108,7 +108,7 @@ unsigned long __init mmu_mapin_ram(void) | |||
108 | pmd_t *pmdp; | 108 | pmd_t *pmdp; |
109 | unsigned long val = p | _PMD_SIZE_16M | _PAGE_HWEXEC | _PAGE_HWWRITE; | 109 | unsigned long val = p | _PMD_SIZE_16M | _PAGE_HWEXEC | _PAGE_HWWRITE; |
110 | 110 | ||
111 | pmdp = pmd_offset(pgd_offset_k(v), v); | 111 | pmdp = pmd_offset(pud_offset(pgd_offset_k(v), v), v); |
112 | pmd_val(*pmdp++) = val; | 112 | pmd_val(*pmdp++) = val; |
113 | pmd_val(*pmdp++) = val; | 113 | pmd_val(*pmdp++) = val; |
114 | pmd_val(*pmdp++) = val; | 114 | pmd_val(*pmdp++) = val; |
@@ -123,7 +123,7 @@ unsigned long __init mmu_mapin_ram(void) | |||
123 | pmd_t *pmdp; | 123 | pmd_t *pmdp; |
124 | unsigned long val = p | _PMD_SIZE_4M | _PAGE_HWEXEC | _PAGE_HWWRITE; | 124 | unsigned long val = p | _PMD_SIZE_4M | _PAGE_HWEXEC | _PAGE_HWWRITE; |
125 | 125 | ||
126 | pmdp = pmd_offset(pgd_offset_k(v), v); | 126 | pmdp = pmd_offset(pud_offset(pgd_offset_k(v), v), v); |
127 | pmd_val(*pmdp) = val; | 127 | pmd_val(*pmdp) = val; |
128 | 128 | ||
129 | v += LARGE_PAGE_SIZE_4M; | 129 | v += LARGE_PAGE_SIZE_4M; |
diff --git a/include/asm-powerpc/mmu-40x.h b/include/asm-powerpc/mmu-40x.h new file mode 100644 index 000000000000..7d37f77043ac --- /dev/null +++ b/include/asm-powerpc/mmu-40x.h | |||
@@ -0,0 +1,65 @@ | |||
1 | #ifndef _ASM_POWERPC_MMU_40X_H_ | ||
2 | #define _ASM_POWERPC_MMU_40X_H_ | ||
3 | |||
4 | /* | ||
5 | * PPC40x support | ||
6 | */ | ||
7 | |||
8 | #define PPC40X_TLB_SIZE 64 | ||
9 | |||
10 | /* | ||
11 | * TLB entries are defined by a "high" tag portion and a "low" data | ||
12 | * portion. On all architectures, the data portion is 32-bits. | ||
13 | * | ||
14 | * TLB entries are managed entirely under software control by reading, | ||
15 | * writing, and searchoing using the 4xx-specific tlbre, tlbwr, and tlbsx | ||
16 | * instructions. | ||
17 | */ | ||
18 | |||
19 | #define TLB_LO 1 | ||
20 | #define TLB_HI 0 | ||
21 | |||
22 | #define TLB_DATA TLB_LO | ||
23 | #define TLB_TAG TLB_HI | ||
24 | |||
25 | /* Tag portion */ | ||
26 | |||
27 | #define TLB_EPN_MASK 0xFFFFFC00 /* Effective Page Number */ | ||
28 | #define TLB_PAGESZ_MASK 0x00000380 | ||
29 | #define TLB_PAGESZ(x) (((x) & 0x7) << 7) | ||
30 | #define PAGESZ_1K 0 | ||
31 | #define PAGESZ_4K 1 | ||
32 | #define PAGESZ_16K 2 | ||
33 | #define PAGESZ_64K 3 | ||
34 | #define PAGESZ_256K 4 | ||
35 | #define PAGESZ_1M 5 | ||
36 | #define PAGESZ_4M 6 | ||
37 | #define PAGESZ_16M 7 | ||
38 | #define TLB_VALID 0x00000040 /* Entry is valid */ | ||
39 | |||
40 | /* Data portion */ | ||
41 | |||
42 | #define TLB_RPN_MASK 0xFFFFFC00 /* Real Page Number */ | ||
43 | #define TLB_PERM_MASK 0x00000300 | ||
44 | #define TLB_EX 0x00000200 /* Instruction execution allowed */ | ||
45 | #define TLB_WR 0x00000100 /* Writes permitted */ | ||
46 | #define TLB_ZSEL_MASK 0x000000F0 | ||
47 | #define TLB_ZSEL(x) (((x) & 0xF) << 4) | ||
48 | #define TLB_ATTR_MASK 0x0000000F | ||
49 | #define TLB_W 0x00000008 /* Caching is write-through */ | ||
50 | #define TLB_I 0x00000004 /* Caching is inhibited */ | ||
51 | #define TLB_M 0x00000002 /* Memory is coherent */ | ||
52 | #define TLB_G 0x00000001 /* Memory is guarded from prefetch */ | ||
53 | |||
54 | #ifndef __ASSEMBLY__ | ||
55 | |||
56 | typedef unsigned long phys_addr_t; | ||
57 | |||
58 | typedef struct { | ||
59 | unsigned long id; | ||
60 | unsigned long vdso_base; | ||
61 | } mm_context_t; | ||
62 | |||
63 | #endif /* !__ASSEMBLY__ */ | ||
64 | |||
65 | #endif /* _ASM_POWERPC_MMU_40X_H_ */ | ||
diff --git a/include/asm-powerpc/mmu.h b/include/asm-powerpc/mmu.h index d44d211e7588..4c0e1b4f975c 100644 --- a/include/asm-powerpc/mmu.h +++ b/include/asm-powerpc/mmu.h | |||
@@ -8,6 +8,9 @@ | |||
8 | #elif defined(CONFIG_PPC_STD_MMU) | 8 | #elif defined(CONFIG_PPC_STD_MMU) |
9 | /* 32-bit classic hash table MMU */ | 9 | /* 32-bit classic hash table MMU */ |
10 | # include <asm/mmu-hash32.h> | 10 | # include <asm/mmu-hash32.h> |
11 | #elif defined(CONFIG_40x) | ||
12 | /* 40x-style software loaded TLB */ | ||
13 | # include <asm/mmu-40x.h> | ||
11 | #elif defined(CONFIG_44x) | 14 | #elif defined(CONFIG_44x) |
12 | /* 44x-style software loaded TLB */ | 15 | /* 44x-style software loaded TLB */ |
13 | # include <asm/mmu-44x.h> | 16 | # include <asm/mmu-44x.h> |