162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2013-15 Synopsys, Inc. (www.synopsys.com) 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef _ASM_ARC_HUGEPAGE_H 862306a36Sopenharmony_ci#define _ASM_ARC_HUGEPAGE_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/types.h> 1162306a36Sopenharmony_ci#include <asm-generic/pgtable-nopmd.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistatic inline pte_t pmd_pte(pmd_t pmd) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci return __pte(pmd_val(pmd)); 1662306a36Sopenharmony_ci} 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistatic inline pmd_t pte_pmd(pte_t pte) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci return __pmd(pte_val(pte)); 2162306a36Sopenharmony_ci} 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define pmd_wrprotect(pmd) pte_pmd(pte_wrprotect(pmd_pte(pmd))) 2462306a36Sopenharmony_ci#define pmd_mkwrite_novma(pmd) pte_pmd(pte_mkwrite_novma(pmd_pte(pmd))) 2562306a36Sopenharmony_ci#define pmd_mkdirty(pmd) pte_pmd(pte_mkdirty(pmd_pte(pmd))) 2662306a36Sopenharmony_ci#define pmd_mkold(pmd) pte_pmd(pte_mkold(pmd_pte(pmd))) 2762306a36Sopenharmony_ci#define pmd_mkyoung(pmd) pte_pmd(pte_mkyoung(pmd_pte(pmd))) 2862306a36Sopenharmony_ci#define pmd_mkhuge(pmd) pte_pmd(pte_mkhuge(pmd_pte(pmd))) 2962306a36Sopenharmony_ci#define pmd_mkinvalid(pmd) pte_pmd(pte_mknotpresent(pmd_pte(pmd))) 3062306a36Sopenharmony_ci#define pmd_mkclean(pmd) pte_pmd(pte_mkclean(pmd_pte(pmd))) 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define pmd_write(pmd) pte_write(pmd_pte(pmd)) 3362306a36Sopenharmony_ci#define pmd_young(pmd) pte_young(pmd_pte(pmd)) 3462306a36Sopenharmony_ci#define pmd_dirty(pmd) pte_dirty(pmd_pte(pmd)) 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define mk_pmd(page, prot) pte_pmd(mk_pte(page, prot)) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define pmd_trans_huge(pmd) (pmd_val(pmd) & _PAGE_HW_SZ) 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define pfn_pmd(pfn, prot) (__pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot))) 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistatic inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci /* 4562306a36Sopenharmony_ci * open-coded pte_modify() with additional retaining of HW_SZ bit 4662306a36Sopenharmony_ci * so that pmd_trans_huge() remains true for this PMD 4762306a36Sopenharmony_ci */ 4862306a36Sopenharmony_ci return __pmd((pmd_val(pmd) & (_PAGE_CHG_MASK | _PAGE_HW_SZ)) | pgprot_val(newprot)); 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic inline void set_pmd_at(struct mm_struct *mm, unsigned long addr, 5262306a36Sopenharmony_ci pmd_t *pmdp, pmd_t pmd) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci *pmdp = pmd; 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ciextern void update_mmu_cache_pmd(struct vm_area_struct *vma, unsigned long addr, 5862306a36Sopenharmony_ci pmd_t *pmd); 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define __HAVE_ARCH_FLUSH_PMD_TLB_RANGE 6162306a36Sopenharmony_ciextern void flush_pmd_tlb_range(struct vm_area_struct *vma, unsigned long start, 6262306a36Sopenharmony_ci unsigned long end); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* We don't have hardware dirty/accessed bits, generic_pmdp_establish is fine.*/ 6562306a36Sopenharmony_ci#define pmdp_establish generic_pmdp_establish 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci#endif 68