linux/arch/powerpc/include/asm/pgtable-types.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _ASM_POWERPC_PGTABLE_TYPES_H
   3#define _ASM_POWERPC_PGTABLE_TYPES_H
   4
   5#if defined(__CHECKER__) || !defined(CONFIG_PPC32)
   6#define STRICT_MM_TYPECHECKS
   7#endif
   8
   9/* PTE level */
  10#if defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES)
  11typedef struct { pte_basic_t pte, pte1, pte2, pte3; } pte_t;
  12#elif defined(STRICT_MM_TYPECHECKS)
  13typedef struct { pte_basic_t pte; } pte_t;
  14#else
  15typedef pte_basic_t pte_t;
  16#endif
  17
  18#if defined(STRICT_MM_TYPECHECKS) || \
  19    (defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES))
  20#define __pte(x)        ((pte_t) { (x) })
  21static inline pte_basic_t pte_val(pte_t x)
  22{
  23        return x.pte;
  24}
  25#else
  26#define __pte(x)        ((pte_t)(x))
  27static inline pte_basic_t pte_val(pte_t x)
  28{
  29        return x;
  30}
  31#endif
  32
  33/* PMD level */
  34#ifdef CONFIG_PPC64
  35typedef struct { unsigned long pmd; } pmd_t;
  36#define __pmd(x)        ((pmd_t) { (x) })
  37static inline unsigned long pmd_val(pmd_t x)
  38{
  39        return x.pmd;
  40}
  41
  42/* 64 bit always use 4 level table. */
  43typedef struct { unsigned long pud; } pud_t;
  44#define __pud(x)        ((pud_t) { (x) })
  45static inline unsigned long pud_val(pud_t x)
  46{
  47        return x.pud;
  48}
  49#endif /* CONFIG_PPC64 */
  50
  51/* PGD level */
  52typedef struct { unsigned long pgd; } pgd_t;
  53#define __pgd(x)        ((pgd_t) { (x) })
  54static inline unsigned long pgd_val(pgd_t x)
  55{
  56        return x.pgd;
  57}
  58
  59/* Page protection bits */
  60typedef struct { unsigned long pgprot; } pgprot_t;
  61#define pgprot_val(x)   ((x).pgprot)
  62#define __pgprot(x)     ((pgprot_t) { (x) })
  63
  64/*
  65 * With hash config 64k pages additionally define a bigger "real PTE" type that
  66 * gathers the "second half" part of the PTE for pseudo 64k pages
  67 */
  68#ifdef CONFIG_PPC_64K_PAGES
  69typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
  70#else
  71typedef struct { pte_t pte; } real_pte_t;
  72#endif
  73
  74#ifdef CONFIG_PPC_BOOK3S_64
  75#include <asm/cmpxchg.h>
  76
  77static inline bool pte_xchg(pte_t *ptep, pte_t old, pte_t new)
  78{
  79        unsigned long *p = (unsigned long *)ptep;
  80
  81        /* See comment in switch_mm_irqs_off() */
  82        return pte_val(old) == __cmpxchg_u64(p, pte_val(old), pte_val(new));
  83}
  84#endif
  85
  86typedef struct { unsigned long pd; } hugepd_t;
  87#define __hugepd(x) ((hugepd_t) { (x) })
  88static inline unsigned long hpd_val(hugepd_t x)
  89{
  90        return x.pd;
  91}
  92
  93#endif /* _ASM_POWERPC_PGTABLE_TYPES_H */
  94