Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _ASM_POWERPC_PGTABLE_BE_TYPES_H
0003 #define _ASM_POWERPC_PGTABLE_BE_TYPES_H
0004 
0005 #include <asm/cmpxchg.h>
0006 
0007 /* PTE level */
0008 typedef struct { __be64 pte; } pte_t;
0009 #define __pte(x)    ((pte_t) { cpu_to_be64(x) })
0010 #define __pte_raw(x)    ((pte_t) { (x) })
0011 static inline unsigned long pte_val(pte_t x)
0012 {
0013     return be64_to_cpu(x.pte);
0014 }
0015 
0016 static inline __be64 pte_raw(pte_t x)
0017 {
0018     return x.pte;
0019 }
0020 
0021 /* PMD level */
0022 #ifdef CONFIG_PPC64
0023 typedef struct { __be64 pmd; } pmd_t;
0024 #define __pmd(x)    ((pmd_t) { cpu_to_be64(x) })
0025 #define __pmd_raw(x)    ((pmd_t) { (x) })
0026 static inline unsigned long pmd_val(pmd_t x)
0027 {
0028     return be64_to_cpu(x.pmd);
0029 }
0030 
0031 static inline __be64 pmd_raw(pmd_t x)
0032 {
0033     return x.pmd;
0034 }
0035 
0036 /* 64 bit always use 4 level table. */
0037 typedef struct { __be64 pud; } pud_t;
0038 #define __pud(x)    ((pud_t) { cpu_to_be64(x) })
0039 #define __pud_raw(x)    ((pud_t) { (x) })
0040 static inline unsigned long pud_val(pud_t x)
0041 {
0042     return be64_to_cpu(x.pud);
0043 }
0044 
0045 static inline __be64 pud_raw(pud_t x)
0046 {
0047     return x.pud;
0048 }
0049 
0050 #endif /* CONFIG_PPC64 */
0051 
0052 /* PGD level */
0053 typedef struct { __be64 pgd; } pgd_t;
0054 #define __pgd(x)    ((pgd_t) { cpu_to_be64(x) })
0055 #define __pgd_raw(x)    ((pgd_t) { (x) })
0056 static inline unsigned long pgd_val(pgd_t x)
0057 {
0058     return be64_to_cpu(x.pgd);
0059 }
0060 
0061 static inline __be64 pgd_raw(pgd_t x)
0062 {
0063     return x.pgd;
0064 }
0065 
0066 /* Page protection bits */
0067 typedef struct { unsigned long pgprot; } pgprot_t;
0068 #define pgprot_val(x)   ((x).pgprot)
0069 #define __pgprot(x) ((pgprot_t) { (x) })
0070 
0071 /*
0072  * With hash config 64k pages additionally define a bigger "real PTE" type that
0073  * gathers the "second half" part of the PTE for pseudo 64k pages
0074  */
0075 #ifdef CONFIG_PPC_64K_PAGES
0076 typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
0077 #else
0078 typedef struct { pte_t pte; } real_pte_t;
0079 #endif
0080 
0081 static inline bool pte_xchg(pte_t *ptep, pte_t old, pte_t new)
0082 {
0083     unsigned long *p = (unsigned long *)ptep;
0084     __be64 prev;
0085 
0086     /* See comment in switch_mm_irqs_off() */
0087     prev = (__force __be64)__cmpxchg_u64(p, (__force unsigned long)pte_raw(old),
0088                          (__force unsigned long)pte_raw(new));
0089 
0090     return pte_raw(old) == prev;
0091 }
0092 
0093 static inline bool pmd_xchg(pmd_t *pmdp, pmd_t old, pmd_t new)
0094 {
0095     unsigned long *p = (unsigned long *)pmdp;
0096     __be64 prev;
0097 
0098     prev = (__force __be64)__cmpxchg_u64(p, (__force unsigned long)pmd_raw(old),
0099                          (__force unsigned long)pmd_raw(new));
0100 
0101     return pmd_raw(old) == prev;
0102 }
0103 
0104 typedef struct { __be64 pdbe; } hugepd_t;
0105 #define __hugepd(x) ((hugepd_t) { cpu_to_be64(x) })
0106 
0107 static inline unsigned long hpd_val(hugepd_t x)
0108 {
0109     return be64_to_cpu(x.pdbe);
0110 }
0111 
0112 #endif /* _ASM_POWERPC_PGTABLE_BE_TYPES_H */