linux/include/linux/pfn_t.h
<<
>>
Prefs
   1#ifndef _LINUX_PFN_T_H_
   2#define _LINUX_PFN_T_H_
   3#include <linux/mm.h>
   4
   5/*
   6 * PFN_FLAGS_MASK - mask of all the possible valid pfn_t flags
   7 * PFN_SG_CHAIN - pfn is a pointer to the next scatterlist entry
   8 * PFN_SG_LAST - pfn references a page and is the last scatterlist entry
   9 * PFN_DEV - pfn is not covered by system memmap by default
  10 * PFN_MAP - pfn has a dynamic page mapping established by a device driver
  11 */
  12#define PFN_FLAGS_MASK (((u64) ~PAGE_MASK) << (BITS_PER_LONG_LONG - PAGE_SHIFT))
  13#define PFN_SG_CHAIN (1ULL << (BITS_PER_LONG_LONG - 1))
  14#define PFN_SG_LAST (1ULL << (BITS_PER_LONG_LONG - 2))
  15#define PFN_DEV (1ULL << (BITS_PER_LONG_LONG - 3))
  16#define PFN_MAP (1ULL << (BITS_PER_LONG_LONG - 4))
  17
  18static inline pfn_t __pfn_to_pfn_t(unsigned long pfn, u64 flags)
  19{
  20        pfn_t pfn_t = { .val = pfn | (flags & PFN_FLAGS_MASK), };
  21
  22        return pfn_t;
  23}
  24
  25/* a default pfn to pfn_t conversion assumes that @pfn is pfn_valid() */
  26static inline pfn_t pfn_to_pfn_t(unsigned long pfn)
  27{
  28        return __pfn_to_pfn_t(pfn, 0);
  29}
  30
  31extern pfn_t phys_to_pfn_t(phys_addr_t addr, u64 flags);
  32
  33static inline bool pfn_t_has_page(pfn_t pfn)
  34{
  35        return (pfn.val & PFN_MAP) == PFN_MAP || (pfn.val & PFN_DEV) == 0;
  36}
  37
  38static inline unsigned long pfn_t_to_pfn(pfn_t pfn)
  39{
  40        return pfn.val & ~PFN_FLAGS_MASK;
  41}
  42
  43static inline struct page *pfn_t_to_page(pfn_t pfn)
  44{
  45        if (pfn_t_has_page(pfn))
  46                return pfn_to_page(pfn_t_to_pfn(pfn));
  47        return NULL;
  48}
  49
  50static inline phys_addr_t pfn_t_to_phys(pfn_t pfn)
  51{
  52        return PFN_PHYS(pfn_t_to_pfn(pfn));
  53}
  54
  55static inline void *pfn_t_to_virt(pfn_t pfn)
  56{
  57        if (pfn_t_has_page(pfn))
  58                return __va(pfn_t_to_phys(pfn));
  59        return NULL;
  60}
  61
  62static inline pfn_t page_to_pfn_t(struct page *page)
  63{
  64        return pfn_to_pfn_t(page_to_pfn(page));
  65}
  66
  67static inline int pfn_t_valid(pfn_t pfn)
  68{
  69        return pfn_valid(pfn_t_to_pfn(pfn));
  70}
  71
  72#ifdef CONFIG_MMU
  73static inline pte_t pfn_t_pte(pfn_t pfn, pgprot_t pgprot)
  74{
  75        return pfn_pte(pfn_t_to_pfn(pfn), pgprot);
  76}
  77#endif
  78
  79#ifdef CONFIG_TRANSPARENT_HUGEPAGE
  80static inline pmd_t pfn_t_pmd(pfn_t pfn, pgprot_t pgprot)
  81{
  82        return pfn_pmd(pfn_t_to_pfn(pfn), pgprot);
  83}
  84#endif
  85
  86#ifdef __HAVE_ARCH_PTE_DEVMAP
  87static inline bool pfn_t_devmap(pfn_t pfn)
  88{
  89        const u64 flags = PFN_DEV|PFN_MAP;
  90
  91        return (pfn.val & flags) == flags;
  92}
  93#else
  94static inline bool pfn_t_devmap(pfn_t pfn)
  95{
  96        return false;
  97}
  98pte_t pte_mkdevmap(pte_t pte);
  99pmd_t pmd_mkdevmap(pmd_t pmd);
 100#endif
 101#endif /* _LINUX_PFN_T_H_ */
 102