-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[POWERPC] Remove arch/powerpc's dependence on asm-ppc/pg{alloc,table}.h
Currently, all 32-bit powerpc platforms use asm-ppc/pgtable.h and asm-ppc/pgalloc.h, even when otherwise compiled with ARCH=powerpc. Those asm-ppc files are a fairly nasty tangle of #ifdefs including a bunch of things which shouldn't be necessary any more in arch/powerpc. Cleaning up that mess is going to take a while, but this patch is a first step. It separates the asm-powerpc/pg{alloc,table}.h into 64 bit and 32 bit versions in asm-powerpc, which the basic .h files in asm-powerpc select based on config. We make a few tiny tweaks to the innards of the files along the way, making the outermost ifdefs (double-inclusion protection and __KERNEL__) a little cleaner, and #including asm-generic/pgtable.h from the top-level asm-powerpc/pgtable.h (since both the old 32-bit and 64-bit versions ended with such an #include). Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
- Loading branch information
David Gibson
authored and
Paul Mackerras
committed
May 2, 2007
1 parent
69d48b4
commit f88df14
Showing
8 changed files
with
1,532 additions
and
646 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
#ifndef _ASM_POWERPC_PGALLOC_32_H | ||
#define _ASM_POWERPC_PGALLOC_32_H | ||
|
||
#include <linux/threads.h> | ||
|
||
extern void __bad_pte(pmd_t *pmd); | ||
|
||
extern pgd_t *pgd_alloc(struct mm_struct *mm); | ||
extern void pgd_free(pgd_t *pgd); | ||
|
||
/* | ||
* We don't have any real pmd's, and this code never triggers because | ||
* the pgd will always be present.. | ||
*/ | ||
#define pmd_alloc_one(mm,address) ({ BUG(); ((pmd_t *)2); }) | ||
#define pmd_free(x) do { } while (0) | ||
#define __pmd_free_tlb(tlb,x) do { } while (0) | ||
#define pgd_populate(mm, pmd, pte) BUG() | ||
|
||
#ifndef CONFIG_BOOKE | ||
#define pmd_populate_kernel(mm, pmd, pte) \ | ||
(pmd_val(*(pmd)) = __pa(pte) | _PMD_PRESENT) | ||
#define pmd_populate(mm, pmd, pte) \ | ||
(pmd_val(*(pmd)) = (page_to_pfn(pte) << PAGE_SHIFT) | _PMD_PRESENT) | ||
#else | ||
#define pmd_populate_kernel(mm, pmd, pte) \ | ||
(pmd_val(*(pmd)) = (unsigned long)pte | _PMD_PRESENT) | ||
#define pmd_populate(mm, pmd, pte) \ | ||
(pmd_val(*(pmd)) = (unsigned long)lowmem_page_address(pte) | _PMD_PRESENT) | ||
#endif | ||
|
||
extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr); | ||
extern struct page *pte_alloc_one(struct mm_struct *mm, unsigned long addr); | ||
extern void pte_free_kernel(pte_t *pte); | ||
extern void pte_free(struct page *pte); | ||
|
||
#define __pte_free_tlb(tlb, pte) pte_free((pte)) | ||
|
||
#define check_pgt_cache() do { } while (0) | ||
|
||
#endif /* _ASM_POWERPC_PGALLOC_32_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,152 @@ | ||
#ifndef _ASM_POWERPC_PGALLOC_64_H | ||
#define _ASM_POWERPC_PGALLOC_64_H | ||
/* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version | ||
* 2 of the License, or (at your option) any later version. | ||
*/ | ||
|
||
#include <linux/mm.h> | ||
#include <linux/slab.h> | ||
#include <linux/cpumask.h> | ||
#include <linux/percpu.h> | ||
|
||
extern struct kmem_cache *pgtable_cache[]; | ||
|
||
#ifdef CONFIG_PPC_64K_PAGES | ||
#define PTE_CACHE_NUM 0 | ||
#define PMD_CACHE_NUM 1 | ||
#define PGD_CACHE_NUM 2 | ||
#define HUGEPTE_CACHE_NUM 3 | ||
#else | ||
#define PTE_CACHE_NUM 0 | ||
#define PMD_CACHE_NUM 1 | ||
#define PUD_CACHE_NUM 1 | ||
#define PGD_CACHE_NUM 0 | ||
#define HUGEPTE_CACHE_NUM 2 | ||
#endif | ||
|
||
static inline pgd_t *pgd_alloc(struct mm_struct *mm) | ||
{ | ||
return kmem_cache_alloc(pgtable_cache[PGD_CACHE_NUM], GFP_KERNEL); | ||
} | ||
|
||
static inline void pgd_free(pgd_t *pgd) | ||
{ | ||
kmem_cache_free(pgtable_cache[PGD_CACHE_NUM], pgd); | ||
} | ||
|
||
#ifndef CONFIG_PPC_64K_PAGES | ||
|
||
#define pgd_populate(MM, PGD, PUD) pgd_set(PGD, PUD) | ||
|
||
static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr) | ||
{ | ||
return kmem_cache_alloc(pgtable_cache[PUD_CACHE_NUM], | ||
GFP_KERNEL|__GFP_REPEAT); | ||
} | ||
|
||
static inline void pud_free(pud_t *pud) | ||
{ | ||
kmem_cache_free(pgtable_cache[PUD_CACHE_NUM], pud); | ||
} | ||
|
||
static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd) | ||
{ | ||
pud_set(pud, (unsigned long)pmd); | ||
} | ||
|
||
#define pmd_populate(mm, pmd, pte_page) \ | ||
pmd_populate_kernel(mm, pmd, page_address(pte_page)) | ||
#define pmd_populate_kernel(mm, pmd, pte) pmd_set(pmd, (unsigned long)(pte)) | ||
|
||
|
||
#else /* CONFIG_PPC_64K_PAGES */ | ||
|
||
#define pud_populate(mm, pud, pmd) pud_set(pud, (unsigned long)pmd) | ||
|
||
static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, | ||
pte_t *pte) | ||
{ | ||
pmd_set(pmd, (unsigned long)pte); | ||
} | ||
|
||
#define pmd_populate(mm, pmd, pte_page) \ | ||
pmd_populate_kernel(mm, pmd, page_address(pte_page)) | ||
|
||
#endif /* CONFIG_PPC_64K_PAGES */ | ||
|
||
static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr) | ||
{ | ||
return kmem_cache_alloc(pgtable_cache[PMD_CACHE_NUM], | ||
GFP_KERNEL|__GFP_REPEAT); | ||
} | ||
|
||
static inline void pmd_free(pmd_t *pmd) | ||
{ | ||
kmem_cache_free(pgtable_cache[PMD_CACHE_NUM], pmd); | ||
} | ||
|
||
static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, | ||
unsigned long address) | ||
{ | ||
return kmem_cache_alloc(pgtable_cache[PTE_CACHE_NUM], | ||
GFP_KERNEL|__GFP_REPEAT); | ||
} | ||
|
||
static inline struct page *pte_alloc_one(struct mm_struct *mm, | ||
unsigned long address) | ||
{ | ||
return virt_to_page(pte_alloc_one_kernel(mm, address)); | ||
} | ||
|
||
static inline void pte_free_kernel(pte_t *pte) | ||
{ | ||
kmem_cache_free(pgtable_cache[PTE_CACHE_NUM], pte); | ||
} | ||
|
||
static inline void pte_free(struct page *ptepage) | ||
{ | ||
pte_free_kernel(page_address(ptepage)); | ||
} | ||
|
||
#define PGF_CACHENUM_MASK 0x3 | ||
|
||
typedef struct pgtable_free { | ||
unsigned long val; | ||
} pgtable_free_t; | ||
|
||
static inline pgtable_free_t pgtable_free_cache(void *p, int cachenum, | ||
unsigned long mask) | ||
{ | ||
BUG_ON(cachenum > PGF_CACHENUM_MASK); | ||
|
||
return (pgtable_free_t){.val = ((unsigned long) p & ~mask) | cachenum}; | ||
} | ||
|
||
static inline void pgtable_free(pgtable_free_t pgf) | ||
{ | ||
void *p = (void *)(pgf.val & ~PGF_CACHENUM_MASK); | ||
int cachenum = pgf.val & PGF_CACHENUM_MASK; | ||
|
||
kmem_cache_free(pgtable_cache[cachenum], p); | ||
} | ||
|
||
extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf); | ||
|
||
#define __pte_free_tlb(tlb, ptepage) \ | ||
pgtable_free_tlb(tlb, pgtable_free_cache(page_address(ptepage), \ | ||
PTE_CACHE_NUM, PTE_TABLE_SIZE-1)) | ||
#define __pmd_free_tlb(tlb, pmd) \ | ||
pgtable_free_tlb(tlb, pgtable_free_cache(pmd, \ | ||
PMD_CACHE_NUM, PMD_TABLE_SIZE-1)) | ||
#ifndef CONFIG_PPC_64K_PAGES | ||
#define __pud_free_tlb(tlb, pud) \ | ||
pgtable_free_tlb(tlb, pgtable_free_cache(pud, \ | ||
PUD_CACHE_NUM, PUD_TABLE_SIZE-1)) | ||
#endif /* CONFIG_PPC_64K_PAGES */ | ||
|
||
#define check_pgt_cache() do { } while (0) | ||
|
||
#endif /* _ASM_POWERPC_PGALLOC_64_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.