Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2013-15 Synopsys, Inc. (www.synopsys.com)
0004  */
0005 
0006 
0007 #ifndef _ASM_ARC_HUGEPAGE_H
0008 #define _ASM_ARC_HUGEPAGE_H
0009 
0010 #include <linux/types.h>
0011 #include <asm-generic/pgtable-nopmd.h>
0012 
0013 static inline pte_t pmd_pte(pmd_t pmd)
0014 {
0015     return __pte(pmd_val(pmd));
0016 }
0017 
0018 static inline pmd_t pte_pmd(pte_t pte)
0019 {
0020     return __pmd(pte_val(pte));
0021 }
0022 
0023 #define pmd_wrprotect(pmd)  pte_pmd(pte_wrprotect(pmd_pte(pmd)))
0024 #define pmd_mkwrite(pmd)    pte_pmd(pte_mkwrite(pmd_pte(pmd)))
0025 #define pmd_mkdirty(pmd)    pte_pmd(pte_mkdirty(pmd_pte(pmd)))
0026 #define pmd_mkold(pmd)      pte_pmd(pte_mkold(pmd_pte(pmd)))
0027 #define pmd_mkyoung(pmd)    pte_pmd(pte_mkyoung(pmd_pte(pmd)))
0028 #define pmd_mkhuge(pmd)     pte_pmd(pte_mkhuge(pmd_pte(pmd)))
0029 #define pmd_mkinvalid(pmd)  pte_pmd(pte_mknotpresent(pmd_pte(pmd)))
0030 #define pmd_mkclean(pmd)    pte_pmd(pte_mkclean(pmd_pte(pmd)))
0031 
0032 #define pmd_write(pmd)      pte_write(pmd_pte(pmd))
0033 #define pmd_young(pmd)      pte_young(pmd_pte(pmd))
0034 #define pmd_dirty(pmd)      pte_dirty(pmd_pte(pmd))
0035 
0036 #define mk_pmd(page, prot)  pte_pmd(mk_pte(page, prot))
0037 
0038 #define pmd_trans_huge(pmd) (pmd_val(pmd) & _PAGE_HW_SZ)
0039 
0040 #define pfn_pmd(pfn, prot)  (__pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot)))
0041 
0042 static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
0043 {
0044         /*
0045          * open-coded pte_modify() with additional retaining of HW_SZ bit
0046          * so that pmd_trans_huge() remains true for this PMD
0047          */
0048         return __pmd((pmd_val(pmd) & (_PAGE_CHG_MASK | _PAGE_HW_SZ)) | pgprot_val(newprot));
0049 }
0050 
0051 static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,
0052                   pmd_t *pmdp, pmd_t pmd)
0053 {
0054     *pmdp = pmd;
0055 }
0056 
0057 extern void update_mmu_cache_pmd(struct vm_area_struct *vma, unsigned long addr,
0058                  pmd_t *pmd);
0059 
0060 #define __HAVE_ARCH_FLUSH_PMD_TLB_RANGE
0061 extern void flush_pmd_tlb_range(struct vm_area_struct *vma, unsigned long start,
0062                 unsigned long end);
0063 
0064 /* We don't have hardware dirty/accessed bits, generic_pmdp_establish is fine.*/
0065 #define pmdp_establish generic_pmdp_establish
0066 
0067 #endif