root/arch/openrisc/include/asm/pgalloc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. pmd_populate
  2. pgd_alloc
  3. pgd_alloc
  4. pgd_free
  5. pte_alloc_one
  6. pte_free_kernel
  7. pte_free

   1 /* SPDX-License-Identifier: GPL-2.0-or-later */
   2 /*
   3  * OpenRISC Linux
   4  *
   5  * Linux architectural port borrowing liberally from similar works of
   6  * others.  All original copyrights apply as per the original source
   7  * declaration.
   8  *
   9  * OpenRISC implementation:
  10  * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com>
  11  * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
  12  * et al.
  13  */
  14 
  15 #ifndef __ASM_OPENRISC_PGALLOC_H
  16 #define __ASM_OPENRISC_PGALLOC_H
  17 
  18 #include <asm/page.h>
  19 #include <linux/threads.h>
  20 #include <linux/mm.h>
  21 #include <linux/memblock.h>
  22 
  23 extern int mem_init_done;
  24 
  25 #define pmd_populate_kernel(mm, pmd, pte) \
  26         set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte)))
  27 
  28 static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
  29                                 struct page *pte)
  30 {
  31         set_pmd(pmd, __pmd(_KERNPG_TABLE +
  32                      ((unsigned long)page_to_pfn(pte) <<
  33                      (unsigned long) PAGE_SHIFT)));
  34 }
  35 
  36 /*
  37  * Allocate and free page tables.
  38  */
  39 static inline pgd_t *pgd_alloc(struct mm_struct *mm)
  40 {
  41         pgd_t *ret = (pgd_t *)__get_free_page(GFP_KERNEL);
  42 
  43         if (ret) {
  44                 memset(ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
  45                 memcpy(ret + USER_PTRS_PER_PGD,
  46                        swapper_pg_dir + USER_PTRS_PER_PGD,
  47                        (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
  48 
  49         }
  50         return ret;
  51 }
  52 
  53 #if 0
  54 /* FIXME: This seems to be the preferred style, but we are using
  55  * current_pgd (from mm->pgd) to load kernel pages so we need it
  56  * initialized.  This needs to be looked into.
  57  */
  58 extern inline pgd_t *pgd_alloc(struct mm_struct *mm)
  59 {
  60         return (pgd_t *)get_zeroed_page(GFP_KERNEL);
  61 }
  62 #endif
  63 
  64 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
  65 {
  66         free_page((unsigned long)pgd);
  67 }
  68 
  69 extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm);
  70 
  71 static inline struct page *pte_alloc_one(struct mm_struct *mm)
  72 {
  73         struct page *pte;
  74         pte = alloc_pages(GFP_KERNEL, 0);
  75         if (!pte)
  76                 return NULL;
  77         clear_page(page_address(pte));
  78         if (!pgtable_pte_page_ctor(pte)) {
  79                 __free_page(pte);
  80                 return NULL;
  81         }
  82         return pte;
  83 }
  84 
  85 static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
  86 {
  87         free_page((unsigned long)pte);
  88 }
  89 
  90 static inline void pte_free(struct mm_struct *mm, struct page *pte)
  91 {
  92         pgtable_pte_page_dtor(pte);
  93         __free_page(pte);
  94 }
  95 
  96 #define __pte_free_tlb(tlb, pte, addr)  \
  97 do {                                    \
  98         pgtable_pte_page_dtor(pte);     \
  99         tlb_remove_page((tlb), (pte));  \
 100 } while (0)
 101 
 102 #define pmd_pgtable(pmd) pmd_page(pmd)
 103 
 104 #endif

/* [<][>][^][v][top][bottom][index][help] */