Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.5-rc1 102 lines 2.4 kB view raw
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 (((unsigned long) ~PAGE_MASK) \ 13 << (BITS_PER_LONG - PAGE_SHIFT)) 14#define PFN_SG_CHAIN (1UL << (BITS_PER_LONG - 1)) 15#define PFN_SG_LAST (1UL << (BITS_PER_LONG - 2)) 16#define PFN_DEV (1UL << (BITS_PER_LONG - 3)) 17#define PFN_MAP (1UL << (BITS_PER_LONG - 4)) 18 19static inline pfn_t __pfn_to_pfn_t(unsigned long pfn, unsigned long flags) 20{ 21 pfn_t pfn_t = { .val = pfn | (flags & PFN_FLAGS_MASK), }; 22 23 return pfn_t; 24} 25 26/* a default pfn to pfn_t conversion assumes that @pfn is pfn_valid() */ 27static inline pfn_t pfn_to_pfn_t(unsigned long pfn) 28{ 29 return __pfn_to_pfn_t(pfn, 0); 30} 31 32extern pfn_t phys_to_pfn_t(dma_addr_t addr, unsigned long flags); 33 34static inline bool pfn_t_has_page(pfn_t pfn) 35{ 36 return (pfn.val & PFN_MAP) == PFN_MAP || (pfn.val & PFN_DEV) == 0; 37} 38 39static inline unsigned long pfn_t_to_pfn(pfn_t pfn) 40{ 41 return pfn.val & ~PFN_FLAGS_MASK; 42} 43 44static inline struct page *pfn_t_to_page(pfn_t pfn) 45{ 46 if (pfn_t_has_page(pfn)) 47 return pfn_to_page(pfn_t_to_pfn(pfn)); 48 return NULL; 49} 50 51static inline dma_addr_t pfn_t_to_phys(pfn_t pfn) 52{ 53 return PFN_PHYS(pfn_t_to_pfn(pfn)); 54} 55 56static inline void *pfn_t_to_virt(pfn_t pfn) 57{ 58 if (pfn_t_has_page(pfn)) 59 return __va(pfn_t_to_phys(pfn)); 60 return NULL; 61} 62 63static inline pfn_t page_to_pfn_t(struct page *page) 64{ 65 return pfn_to_pfn_t(page_to_pfn(page)); 66} 67 68static inline int pfn_t_valid(pfn_t pfn) 69{ 70 return pfn_valid(pfn_t_to_pfn(pfn)); 71} 72 73#ifdef CONFIG_MMU 74static inline pte_t pfn_t_pte(pfn_t pfn, pgprot_t pgprot) 75{ 76 return pfn_pte(pfn_t_to_pfn(pfn), pgprot); 77} 78#endif 79 80#ifdef CONFIG_TRANSPARENT_HUGEPAGE 81static inline pmd_t pfn_t_pmd(pfn_t pfn, pgprot_t pgprot) 82{ 83 return pfn_pmd(pfn_t_to_pfn(pfn), pgprot); 84} 85#endif 86 87#ifdef __HAVE_ARCH_PTE_DEVMAP 88static inline bool pfn_t_devmap(pfn_t pfn) 89{ 90 const unsigned long flags = PFN_DEV|PFN_MAP; 91 92 return (pfn.val & flags) == flags; 93} 94#else 95static inline bool pfn_t_devmap(pfn_t pfn) 96{ 97 return false; 98} 99pte_t pte_mkdevmap(pte_t pte); 100pmd_t pmd_mkdevmap(pmd_t pmd); 101#endif 102#endif /* _LINUX_PFN_T_H_ */