162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _PGTABLE_NOPMD_H 362306a36Sopenharmony_ci#define _PGTABLE_NOPMD_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <asm-generic/pgtable-nopud.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_cistruct mm_struct; 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define __PAGETABLE_PMD_FOLDED 1 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* 1462306a36Sopenharmony_ci * Having the pmd type consist of a pud gets the size right, and allows 1562306a36Sopenharmony_ci * us to conceptually access the pud entry that this pmd is folded into 1662306a36Sopenharmony_ci * without casting. 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_citypedef struct { pud_t pud; } pmd_t; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define PMD_SHIFT PUD_SHIFT 2162306a36Sopenharmony_ci#define PTRS_PER_PMD 1 2262306a36Sopenharmony_ci#define PMD_SIZE (1UL << PMD_SHIFT) 2362306a36Sopenharmony_ci#define PMD_MASK (~(PMD_SIZE-1)) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* 2662306a36Sopenharmony_ci * The "pud_xxx()" functions here are trivial for a folded two-level 2762306a36Sopenharmony_ci * setup: the pmd is never bad, and a pmd always exists (as it's folded 2862306a36Sopenharmony_ci * into the pud entry) 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_cistatic inline int pud_none(pud_t pud) { return 0; } 3162306a36Sopenharmony_cistatic inline int pud_bad(pud_t pud) { return 0; } 3262306a36Sopenharmony_cistatic inline int pud_present(pud_t pud) { return 1; } 3362306a36Sopenharmony_cistatic inline int pud_user(pud_t pud) { return 0; } 3462306a36Sopenharmony_cistatic inline int pud_leaf(pud_t pud) { return 0; } 3562306a36Sopenharmony_cistatic inline void pud_clear(pud_t *pud) { } 3662306a36Sopenharmony_ci#define pmd_ERROR(pmd) (pud_ERROR((pmd).pud)) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define pud_populate(mm, pmd, pte) do { } while (0) 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci/* 4162306a36Sopenharmony_ci * (pmds are folded into puds so this doesn't get actually called, 4262306a36Sopenharmony_ci * but the define is needed for a generic inline function.) 4362306a36Sopenharmony_ci */ 4462306a36Sopenharmony_ci#define set_pud(pudptr, pudval) set_pmd((pmd_t *)(pudptr), (pmd_t) { pudval }) 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic inline pmd_t * pmd_offset(pud_t * pud, unsigned long address) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci return (pmd_t *)pud; 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci#define pmd_offset pmd_offset 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci#define pmd_val(x) (pud_val((x).pud)) 5362306a36Sopenharmony_ci#define __pmd(x) ((pmd_t) { __pud(x) } ) 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#define pud_page(pud) (pmd_page((pmd_t){ pud })) 5662306a36Sopenharmony_ci#define pud_pgtable(pud) ((pmd_t *)(pmd_page_vaddr((pmd_t){ pud }))) 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/* 5962306a36Sopenharmony_ci * allocating and freeing a pmd is trivial: the 1-entry pmd is 6062306a36Sopenharmony_ci * inside the pud, so has no extra memory associated with it. 6162306a36Sopenharmony_ci */ 6262306a36Sopenharmony_ci#define pmd_alloc_one(mm, address) NULL 6362306a36Sopenharmony_cistatic inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) 6462306a36Sopenharmony_ci{ 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci#define pmd_free_tlb(tlb, x, a) do { } while (0) 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci#undef pmd_addr_end 6962306a36Sopenharmony_ci#define pmd_addr_end(addr, end) (end) 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci#endif /* __ASSEMBLY__ */ 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#endif /* _PGTABLE_NOPMD_H */ 74