Add radix variants of the memory hotplug mapping functions.

Signed-off-by: Reza Arbab <ar...@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/book3s/64/radix.h |  5 +++++
 arch/powerpc/include/asm/sparsemem.h       |  8 ++++++++
 arch/powerpc/mm/pgtable-radix.c            | 23 +++++++++++++++++++++++
 3 files changed, 36 insertions(+)

diff --git a/arch/powerpc/include/asm/book3s/64/radix.h 
b/arch/powerpc/include/asm/book3s/64/radix.h
index df29422..97e71cb 100644
--- a/arch/powerpc/include/asm/book3s/64/radix.h
+++ b/arch/powerpc/include/asm/book3s/64/radix.h
@@ -229,6 +229,11 @@ extern void radix__vmemmap_remove_mapping(unsigned long 
start,
 extern int radix__map_kernel_page(unsigned long ea, unsigned long pa,
                                 pgprot_t flags, unsigned int psz);
 
+#ifdef CONFIG_MEMORY_HOTPLUG
+int radix__create_section_mapping(unsigned long start, unsigned long end);
+void radix__remove_section_mapping(unsigned long start, unsigned long end);
+#endif /* CONFIG_MEMORY_HOTPLUG */
+
 static inline unsigned long radix__get_tree_size(void)
 {
        unsigned long rts_field;
diff --git a/arch/powerpc/include/asm/sparsemem.h 
b/arch/powerpc/include/asm/sparsemem.h
index 5014e0d..42fe87e 100644
--- a/arch/powerpc/include/asm/sparsemem.h
+++ b/arch/powerpc/include/asm/sparsemem.h
@@ -19,12 +19,20 @@
 static inline int create_section_mapping(unsigned long start,
                                         unsigned long end)
 {
+       if (radix_enabled())
+               return radix__create_section_mapping(start, end);
+
        return hash__create_section_mapping(start, end);
 }
 
 static inline int remove_section_mapping(unsigned long start,
                                         unsigned long end)
 {
+       if (radix_enabled()) {
+               radix__remove_section_mapping(start, end);
+               return 0;
+       }
+
        return hash__remove_section_mapping(start, end);
 }
 
diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c
index af897d9..ee0286c 100644
--- a/arch/powerpc/mm/pgtable-radix.c
+++ b/arch/powerpc/mm/pgtable-radix.c
@@ -527,3 +527,26 @@ int radix__has_transparent_hugepage(void)
        return 0;
 }
 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
+
+#ifdef CONFIG_MEMORY_HOTPLUG
+int radix__create_section_mapping(unsigned long start, unsigned long end)
+{
+       unsigned long page_size = 1 << mmu_psize_defs[mmu_linear_psize].shift;
+
+       /* Align to the page size of the linear mapping. */
+       start = _ALIGN_DOWN(start, page_size);
+
+       for (; start < end; start += page_size) {
+               int rc = radix__map_kernel_page(start, __pa(start),
+                                               PAGE_KERNEL, page_size);
+               if (rc)
+                       return rc;
+       }
+
+       return 0;
+}
+
+void radix__remove_section_mapping(unsigned long start, unsigned long end)
+{
+}
+#endif /* CONFIG_MEMORY_HOTPLUG */
-- 
1.8.3.1

Reply via email to