0001
0002
0003 #ifndef __ASM_CSKY_PGALLOC_H
0004 #define __ASM_CSKY_PGALLOC_H
0005
0006 #include <linux/highmem.h>
0007 #include <linux/mm.h>
0008 #include <linux/sched.h>
0009
0010 #define __HAVE_ARCH_PTE_ALLOC_ONE_KERNEL
0011 #include <asm-generic/pgalloc.h>
0012
0013 static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
0014 pte_t *pte)
0015 {
0016 set_pmd(pmd, __pmd(__pa(pte)));
0017 }
0018
0019 static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
0020 pgtable_t pte)
0021 {
0022 set_pmd(pmd, __pmd(__pa(page_address(pte))));
0023 }
0024
0025 extern void pgd_init(unsigned long *p);
0026
0027 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
0028 {
0029 pte_t *pte;
0030 unsigned long i;
0031
0032 pte = (pte_t *) __get_free_page(GFP_KERNEL);
0033 if (!pte)
0034 return NULL;
0035
0036 for (i = 0; i < PAGE_SIZE/sizeof(pte_t); i++)
0037 (pte + i)->pte_low = _PAGE_GLOBAL;
0038
0039 return pte;
0040 }
0041
0042 static inline pgd_t *pgd_alloc(struct mm_struct *mm)
0043 {
0044 pgd_t *ret;
0045 pgd_t *init;
0046
0047 ret = (pgd_t *) __get_free_page(GFP_KERNEL);
0048 if (ret) {
0049 init = pgd_offset(&init_mm, 0UL);
0050 pgd_init((unsigned long *)ret);
0051 memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD,
0052 (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
0053
0054 smp_mb();
0055 #ifdef CONFIG_CPU_NEED_TLBSYNC
0056 dcache_wb_range((unsigned int)ret,
0057 (unsigned int)(ret + PTRS_PER_PGD));
0058 #endif
0059 }
0060
0061 return ret;
0062 }
0063
0064 #define __pte_free_tlb(tlb, pte, address) \
0065 do { \
0066 pgtable_pte_page_dtor(pte); \
0067 tlb_remove_page(tlb, pte); \
0068 } while (0)
0069
0070 extern void pagetable_init(void);
0071 extern void mmu_init(unsigned long min_pfn, unsigned long max_pfn);
0072 extern void pre_trap_init(void);
0073
0074 #endif