Commit 31a14fae authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Michael Ellerman

powerpc/mm: Abstraction for vmemmap and map_kernel_page()

For hash we create vmemmap mapping using bolted hash page table entries.
For radix we fill the radix page table. The next patch will add the
radix details for creating vmemmap mappings.
Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 2bfd65e4
...@@ -193,6 +193,14 @@ static inline void hpte_do_hugepage_flush(struct mm_struct *mm, ...@@ -193,6 +193,14 @@ static inline void hpte_do_hugepage_flush(struct mm_struct *mm,
} }
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
extern int hash__map_kernel_page(unsigned long ea, unsigned long pa,
unsigned long flags);
extern int __meminit hash__vmemmap_create_mapping(unsigned long start,
unsigned long page_size,
unsigned long phys);
extern void hash__vmemmap_remove_mapping(unsigned long start,
unsigned long page_size);
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _ASM_POWERPC_BOOK3S_64_HASH_H */ #endif /* _ASM_POWERPC_BOOK3S_64_HASH_H */
...@@ -722,6 +722,26 @@ extern struct page *pgd_page(pgd_t pgd); ...@@ -722,6 +722,26 @@ extern struct page *pgd_page(pgd_t pgd);
void pgtable_cache_add(unsigned shift, void (*ctor)(void *)); void pgtable_cache_add(unsigned shift, void (*ctor)(void *));
void pgtable_cache_init(void); void pgtable_cache_init(void);
static inline int map_kernel_page(unsigned long ea, unsigned long pa,
unsigned long flags)
{
return hash__map_kernel_page(ea, pa, flags);
}
static inline int __meminit vmemmap_create_mapping(unsigned long start,
unsigned long page_size,
unsigned long phys)
{
return hash__vmemmap_create_mapping(start, page_size, phys);
}
#ifdef CONFIG_MEMORY_HOTPLUG
static inline void vmemmap_remove_mapping(unsigned long start,
unsigned long page_size)
{
return hash__vmemmap_remove_mapping(start, page_size);
}
#endif
struct page *realmode_pfn_to_page(unsigned long pfn); struct page *realmode_pfn_to_page(unsigned long pfn);
#ifdef CONFIG_TRANSPARENT_HUGEPAGE #ifdef CONFIG_TRANSPARENT_HUGEPAGE
......
...@@ -362,6 +362,13 @@ static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry) ...@@ -362,6 +362,13 @@ static inline void __ptep_set_access_flags(pte_t *ptep, pte_t entry)
void pgtable_cache_add(unsigned shift, void (*ctor)(void *)); void pgtable_cache_add(unsigned shift, void (*ctor)(void *));
void pgtable_cache_init(void); void pgtable_cache_init(void);
extern int map_kernel_page(unsigned long ea, unsigned long pa,
unsigned long flags);
extern int __meminit vmemmap_create_mapping(unsigned long start,
unsigned long page_size,
unsigned long phys);
extern void vmemmap_remove_mapping(unsigned long start,
unsigned long page_size);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* _ASM_POWERPC_NOHASH_64_PGTABLE_H */ #endif /* _ASM_POWERPC_NOHASH_64_PGTABLE_H */
...@@ -240,9 +240,6 @@ static __meminit void vmemmap_list_populate(unsigned long phys, ...@@ -240,9 +240,6 @@ static __meminit void vmemmap_list_populate(unsigned long phys,
vmemmap_list = vmem_back; vmemmap_list = vmem_back;
} }
extern int __meminit vmemmap_create_mapping(unsigned long start,
unsigned long page_size,
unsigned long phys);
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node) int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
{ {
unsigned long page_size = 1 << mmu_psize_defs[mmu_vmemmap_psize].shift; unsigned long page_size = 1 << mmu_psize_defs[mmu_vmemmap_psize].shift;
...@@ -281,8 +278,6 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node) ...@@ -281,8 +278,6 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
} }
#ifdef CONFIG_MEMORY_HOTPLUG #ifdef CONFIG_MEMORY_HOTPLUG
extern void vmemmap_remove_mapping(unsigned long start,
unsigned long page_size);
static unsigned long vmemmap_list_free(unsigned long start) static unsigned long vmemmap_list_free(unsigned long start)
{ {
struct vmemmap_backing *vmem_back, *vmem_back_prev; struct vmemmap_backing *vmem_back, *vmem_back_prev;
......
...@@ -108,11 +108,6 @@ extern unsigned long Hash_size, Hash_mask; ...@@ -108,11 +108,6 @@ extern unsigned long Hash_size, Hash_mask;
#endif /* CONFIG_PPC32 */ #endif /* CONFIG_PPC32 */
#ifdef CONFIG_PPC64
extern int map_kernel_page(unsigned long ea, unsigned long pa,
unsigned long flags);
#endif /* CONFIG_PPC64 */
extern unsigned long ioremap_bot; extern unsigned long ioremap_bot;
extern unsigned long __max_low_memory; extern unsigned long __max_low_memory;
extern phys_addr_t __initial_memory_limit_addr; extern phys_addr_t __initial_memory_limit_addr;
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
* On hash-based CPUs, the vmemmap is bolted in the hash table. * On hash-based CPUs, the vmemmap is bolted in the hash table.
* *
*/ */
int __meminit vmemmap_create_mapping(unsigned long start, int __meminit hash__vmemmap_create_mapping(unsigned long start,
unsigned long page_size, unsigned long page_size,
unsigned long phys) unsigned long phys)
{ {
...@@ -37,7 +37,7 @@ int __meminit vmemmap_create_mapping(unsigned long start, ...@@ -37,7 +37,7 @@ int __meminit vmemmap_create_mapping(unsigned long start,
} }
#ifdef CONFIG_MEMORY_HOTPLUG #ifdef CONFIG_MEMORY_HOTPLUG
void vmemmap_remove_mapping(unsigned long start, void hash__vmemmap_remove_mapping(unsigned long start,
unsigned long page_size) unsigned long page_size)
{ {
int rc = htab_remove_mapping(start, start + page_size, int rc = htab_remove_mapping(start, start + page_size,
...@@ -54,7 +54,7 @@ void vmemmap_remove_mapping(unsigned long start, ...@@ -54,7 +54,7 @@ void vmemmap_remove_mapping(unsigned long start,
* map_kernel_page adds an entry to the ioremap page table * map_kernel_page adds an entry to the ioremap page table
* and adds an entry to the HPT, possibly bolting it * and adds an entry to the HPT, possibly bolting it
*/ */
int map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags) int hash__map_kernel_page(unsigned long ea, unsigned long pa, unsigned long flags)
{ {
pgd_t *pgdp; pgd_t *pgdp;
pud_t *pudp; pud_t *pudp;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment