diff options
author | Michael Ellerman <michael@ellerman.id.au> | 2005-09-23 00:47:58 -0400 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2005-09-23 00:47:58 -0400 |
commit | 4c55130b2aa93370f1bf52d2304394e91cf8ee39 (patch) | |
tree | 522c7f510775f221c4e8046bc238a618db4768df /arch/ppc64/mm/hash_utils.c | |
parent | ba293fff085fde5b9f1b5a57c8abb1a8098d0c59 (diff) |
ppc64 iSeries: Update create_pte_mapping to replace iSeries_bolt_kernel()
early_setup() calls htab_initialize() which is similar, but not identical
to iSeries_bolt_kernel().
On iSeries the Hypervisor has already inserted some ptes for us, and we
simply have to detect that and bolt them. iSeries_hpte_bolt_or_insert()
implements that logic.
For the case of a non-existing pte we just call iSeries_hpte_insert(). This
appears to work, although it's not entirely equivalent to the old code in
iSeries_make_pte() which panicked if we got a secondary slot. Not sure if
that's important.
Finally we call iSeries_hpte_bolt_or_insert() from create_pte_mapping(),
which is called from htab_initialize() for each lmb region.
Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Diffstat (limited to 'arch/ppc64/mm/hash_utils.c')
-rw-r--r-- | arch/ppc64/mm/hash_utils.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/arch/ppc64/mm/hash_utils.c b/arch/ppc64/mm/hash_utils.c index 36cf474b3d36..83507438d6a0 100644 --- a/arch/ppc64/mm/hash_utils.c +++ b/arch/ppc64/mm/hash_utils.c | |||
@@ -90,7 +90,6 @@ static inline void loop_forever(void) | |||
90 | ; | 90 | ; |
91 | } | 91 | } |
92 | 92 | ||
93 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
94 | static inline void create_pte_mapping(unsigned long start, unsigned long end, | 93 | static inline void create_pte_mapping(unsigned long start, unsigned long end, |
95 | unsigned long mode, int large) | 94 | unsigned long mode, int large) |
96 | { | 95 | { |
@@ -111,7 +110,7 @@ static inline void create_pte_mapping(unsigned long start, unsigned long end, | |||
111 | unsigned long vpn, hash, hpteg; | 110 | unsigned long vpn, hash, hpteg; |
112 | unsigned long vsid = get_kernel_vsid(addr); | 111 | unsigned long vsid = get_kernel_vsid(addr); |
113 | unsigned long va = (vsid << 28) | (addr & 0xfffffff); | 112 | unsigned long va = (vsid << 28) | (addr & 0xfffffff); |
114 | int ret; | 113 | int ret = -1; |
115 | 114 | ||
116 | if (large) | 115 | if (large) |
117 | vpn = va >> HPAGE_SHIFT; | 116 | vpn = va >> HPAGE_SHIFT; |
@@ -129,16 +128,25 @@ static inline void create_pte_mapping(unsigned long start, unsigned long end, | |||
129 | 128 | ||
130 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); | 129 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); |
131 | 130 | ||
131 | #ifdef CONFIG_PPC_ISERIES | ||
132 | if (systemcfg->platform & PLATFORM_ISERIES_LPAR) | ||
133 | ret = iSeries_hpte_bolt_or_insert(hpteg, va, | ||
134 | virt_to_abs(addr) >> PAGE_SHIFT, | ||
135 | vflags, tmp_mode); | ||
136 | else | ||
137 | #endif | ||
132 | #ifdef CONFIG_PPC_PSERIES | 138 | #ifdef CONFIG_PPC_PSERIES |
133 | if (systemcfg->platform & PLATFORM_LPAR) | 139 | if (systemcfg->platform & PLATFORM_LPAR) |
134 | ret = pSeries_lpar_hpte_insert(hpteg, va, | 140 | ret = pSeries_lpar_hpte_insert(hpteg, va, |
135 | virt_to_abs(addr) >> PAGE_SHIFT, | 141 | virt_to_abs(addr) >> PAGE_SHIFT, |
136 | vflags, tmp_mode); | 142 | vflags, tmp_mode); |
137 | else | 143 | else |
138 | #endif /* CONFIG_PPC_PSERIES */ | 144 | #endif |
145 | #ifdef CONFIG_PPC_MULTIPLATFORM | ||
139 | ret = native_hpte_insert(hpteg, va, | 146 | ret = native_hpte_insert(hpteg, va, |
140 | virt_to_abs(addr) >> PAGE_SHIFT, | 147 | virt_to_abs(addr) >> PAGE_SHIFT, |
141 | vflags, tmp_mode); | 148 | vflags, tmp_mode); |
149 | #endif | ||
142 | 150 | ||
143 | if (ret == -1) { | 151 | if (ret == -1) { |
144 | ppc64_terminate_msg(0x20, "create_pte_mapping"); | 152 | ppc64_terminate_msg(0x20, "create_pte_mapping"); |
@@ -261,7 +269,6 @@ void __init htab_initialize(void) | |||
261 | } | 269 | } |
262 | #undef KB | 270 | #undef KB |
263 | #undef MB | 271 | #undef MB |
264 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | ||
265 | 272 | ||
266 | /* | 273 | /* |
267 | * Called by asm hashtable.S for doing lazy icache flush | 274 | * Called by asm hashtable.S for doing lazy icache flush |