aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/mm/hash_utils_64.c
diff options
context:
space:
mode:
authorBadari Pulavarty <pbadari@us.ibm.com>2008-01-28 17:19:24 -0500
committerPaul Mackerras <paulus@samba.org>2008-02-26 06:17:03 -0500
commitf8c8803bda4db47cbbdadb9b27b024e903e1d645 (patch)
tree394411edf1626257193e904e25a4dc763528e34f /arch/powerpc/mm/hash_utils_64.c
parentf8303dd3db57bd7ab2062985ad7a9e898a8ac423 (diff)
[POWERPC] Add code for removing HPTEs for parts of the linear mapping
For memory remove, we need to clean up htab mappings for the section of the memory we are removing. This implements support for removing htab bolted mappings for pSeries logical partitions. Other sub-archs may need to implement similar functionality for hotplug memory remove to work on them. Signed-off-by: Badari Pulavarty <pbadari@us.ibm.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/mm/hash_utils_64.c')
-rw-r--r--arch/powerpc/mm/hash_utils_64.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
index 73b78486abfc..4cc53f92377e 100644
--- a/arch/powerpc/mm/hash_utils_64.c
+++ b/arch/powerpc/mm/hash_utils_64.c
@@ -192,6 +192,24 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
192 return ret < 0 ? ret : 0; 192 return ret < 0 ? ret : 0;
193} 193}
194 194
195static void htab_remove_mapping(unsigned long vstart, unsigned long vend,
196 int psize, int ssize)
197{
198 unsigned long vaddr;
199 unsigned int step, shift;
200
201 shift = mmu_psize_defs[psize].shift;
202 step = 1 << shift;
203
204 if (!ppc_md.hpte_removebolted) {
205 printk("Sub-arch doesn't implement hpte_removebolted\n");
206 return;
207 }
208
209 for (vaddr = vstart; vaddr < vend; vaddr += step)
210 ppc_md.hpte_removebolted(vaddr, psize, ssize);
211}
212
195static int __init htab_dt_scan_seg_sizes(unsigned long node, 213static int __init htab_dt_scan_seg_sizes(unsigned long node,
196 const char *uname, int depth, 214 const char *uname, int depth,
197 void *data) 215 void *data)
@@ -430,6 +448,11 @@ void create_section_mapping(unsigned long start, unsigned long end)
430 _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_COHERENT | PP_RWXX, 448 _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_COHERENT | PP_RWXX,
431 mmu_linear_psize, mmu_kernel_ssize)); 449 mmu_linear_psize, mmu_kernel_ssize));
432} 450}
451
452void remove_section_mapping(unsigned long start, unsigned long end)
453{
454 htab_remove_mapping(start, end, mmu_linear_psize, mmu_kernel_ssize);
455}
433#endif /* CONFIG_MEMORY_HOTPLUG */ 456#endif /* CONFIG_MEMORY_HOTPLUG */
434 457
435static inline void make_bl(unsigned int *insn_addr, void *func) 458static inline void make_bl(unsigned int *insn_addr, void *func)