diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2006-02-12 00:57:54 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-03-20 04:12:25 -0500 |
commit | c4bce90ea2069e5a87beac806de3090ab32128d5 (patch) | |
tree | 3983a206c8060ef65ba17945d1c9f69e68d88b3d /arch/sparc64/mm/tsb.c | |
parent | 490384e752a43aa281ed533e9de2da36df25c337 (diff) |
[SPARC64]: Deal with PTE layout differences in SUN4V.
Yes, you heard it right, they changed the PTE layout for
SUN4V. Ho hum...
This is the simple and inefficient way to support this.
It'll get optimized, don't worry.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/mm/tsb.c')
-rw-r--r-- | arch/sparc64/mm/tsb.c | 12 |
1 files changed, 2 insertions, 10 deletions
diff --git a/arch/sparc64/mm/tsb.c b/arch/sparc64/mm/tsb.c index c5dc4b0cc1c5..975242ab88ee 100644 --- a/arch/sparc64/mm/tsb.c +++ b/arch/sparc64/mm/tsb.c | |||
@@ -85,8 +85,7 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_bytes) | |||
85 | mm->context.tsb_nentries = tsb_bytes / sizeof(struct tsb); | 85 | mm->context.tsb_nentries = tsb_bytes / sizeof(struct tsb); |
86 | 86 | ||
87 | base = TSBMAP_BASE; | 87 | base = TSBMAP_BASE; |
88 | tte = (_PAGE_VALID | _PAGE_L | _PAGE_CP | | 88 | tte = pgprot_val(PAGE_KERNEL_LOCKED); |
89 | _PAGE_CV | _PAGE_P | _PAGE_W); | ||
90 | tsb_paddr = __pa(mm->context.tsb); | 89 | tsb_paddr = __pa(mm->context.tsb); |
91 | BUG_ON(tsb_paddr & (tsb_bytes - 1UL)); | 90 | BUG_ON(tsb_paddr & (tsb_bytes - 1UL)); |
92 | 91 | ||
@@ -99,55 +98,48 @@ static void setup_tsb_params(struct mm_struct *mm, unsigned long tsb_bytes) | |||
99 | #ifdef DCACHE_ALIASING_POSSIBLE | 98 | #ifdef DCACHE_ALIASING_POSSIBLE |
100 | base += (tsb_paddr & 8192); | 99 | base += (tsb_paddr & 8192); |
101 | #endif | 100 | #endif |
102 | tte |= _PAGE_SZ8K; | ||
103 | page_sz = 8192; | 101 | page_sz = 8192; |
104 | break; | 102 | break; |
105 | 103 | ||
106 | case 8192 << 1: | 104 | case 8192 << 1: |
107 | tsb_reg = 0x1UL; | 105 | tsb_reg = 0x1UL; |
108 | tte |= _PAGE_SZ64K; | ||
109 | page_sz = 64 * 1024; | 106 | page_sz = 64 * 1024; |
110 | break; | 107 | break; |
111 | 108 | ||
112 | case 8192 << 2: | 109 | case 8192 << 2: |
113 | tsb_reg = 0x2UL; | 110 | tsb_reg = 0x2UL; |
114 | tte |= _PAGE_SZ64K; | ||
115 | page_sz = 64 * 1024; | 111 | page_sz = 64 * 1024; |
116 | break; | 112 | break; |
117 | 113 | ||
118 | case 8192 << 3: | 114 | case 8192 << 3: |
119 | tsb_reg = 0x3UL; | 115 | tsb_reg = 0x3UL; |
120 | tte |= _PAGE_SZ64K; | ||
121 | page_sz = 64 * 1024; | 116 | page_sz = 64 * 1024; |
122 | break; | 117 | break; |
123 | 118 | ||
124 | case 8192 << 4: | 119 | case 8192 << 4: |
125 | tsb_reg = 0x4UL; | 120 | tsb_reg = 0x4UL; |
126 | tte |= _PAGE_SZ512K; | ||
127 | page_sz = 512 * 1024; | 121 | page_sz = 512 * 1024; |
128 | break; | 122 | break; |
129 | 123 | ||
130 | case 8192 << 5: | 124 | case 8192 << 5: |
131 | tsb_reg = 0x5UL; | 125 | tsb_reg = 0x5UL; |
132 | tte |= _PAGE_SZ512K; | ||
133 | page_sz = 512 * 1024; | 126 | page_sz = 512 * 1024; |
134 | break; | 127 | break; |
135 | 128 | ||
136 | case 8192 << 6: | 129 | case 8192 << 6: |
137 | tsb_reg = 0x6UL; | 130 | tsb_reg = 0x6UL; |
138 | tte |= _PAGE_SZ512K; | ||
139 | page_sz = 512 * 1024; | 131 | page_sz = 512 * 1024; |
140 | break; | 132 | break; |
141 | 133 | ||
142 | case 8192 << 7: | 134 | case 8192 << 7: |
143 | tsb_reg = 0x7UL; | 135 | tsb_reg = 0x7UL; |
144 | tte |= _PAGE_SZ4MB; | ||
145 | page_sz = 4 * 1024 * 1024; | 136 | page_sz = 4 * 1024 * 1024; |
146 | break; | 137 | break; |
147 | 138 | ||
148 | default: | 139 | default: |
149 | BUG(); | 140 | BUG(); |
150 | }; | 141 | }; |
142 | tte |= pte_sz_bits(page_sz); | ||
151 | 143 | ||
152 | if (tlb_type == cheetah_plus || tlb_type == hypervisor) { | 144 | if (tlb_type == cheetah_plus || tlb_type == hypervisor) { |
153 | /* Physical mapping, no locked TLB entry for TSB. */ | 145 | /* Physical mapping, no locked TLB entry for TSB. */ |