linux/arch/openrisc/include/asm/pgalloc.h
<<
>>
Prefs
   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
  26extern int mem_init_done;
  27
  28#define pmd_populate_kernel(mm, pmd, pte) \
  29        set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte)))
  30
  31static 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 */
  42static 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 */
  61extern inline pgd_t *pgd_alloc(struct mm_struct *mm)
  62{
  63        return (pgd_t *)get_zeroed_page(GFP_KERNEL);
  64}
  65#endif
  66
  67extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm);
  68
  69#define __pte_free_tlb(tlb, pte, addr)  \
  70do {                                    \
  71        pgtable_pte_page_dtor(pte);     \
  72        tlb_remove_page((tlb), (pte));  \
  73} while (0)
  74
  75#define pmd_pgtable(pmd) pmd_page(pmd)
  76
  77#endif
  78