• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  #define __HAVE_ARCH_PTE_ALLOC_ONE_KERNEL
24  #include <asm-generic/pgalloc.h>
25  
26  extern int mem_init_done;
27  
28  #define pmd_populate_kernel(mm, pmd, pte) \
29  	set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte)))
30  
pmd_populate(struct mm_struct * mm,pmd_t * pmd,struct page * pte)31  static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
32  				struct page *pte)
33  {
34  	set_pmd(pmd, __pmd(_KERNPG_TABLE +
35  		     ((unsigned long)page_to_pfn(pte) <<
36  		     (unsigned long) PAGE_SHIFT)));
37  }
38  
39  /*
40   * Allocate and free page tables.
41   */
pgd_alloc(struct mm_struct * mm)42  static inline pgd_t *pgd_alloc(struct mm_struct *mm)
43  {
44  	pgd_t *ret = (pgd_t *)__get_free_page(GFP_KERNEL);
45  
46  	if (ret) {
47  		memset(ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
48  		memcpy(ret + USER_PTRS_PER_PGD,
49  		       swapper_pg_dir + USER_PTRS_PER_PGD,
50  		       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
51  
52  	}
53  	return ret;
54  }
55  
56  #if 0
57  /* FIXME: This seems to be the preferred style, but we are using
58   * current_pgd (from mm->pgd) to load kernel pages so we need it
59   * initialized.  This needs to be looked into.
60   */
61  extern inline pgd_t *pgd_alloc(struct mm_struct *mm)
62  {
63  	return (pgd_t *)get_zeroed_page(GFP_KERNEL);
64  }
65  #endif
66  
67  extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm);
68  
69  #define __pte_free_tlb(tlb, pte, addr)				\
70  do {								\
71  	pagetable_pte_dtor(page_ptdesc(pte));			\
72  	tlb_remove_page_ptdesc((tlb), (page_ptdesc(pte)));	\
73  } while (0)
74  
75  #endif
76