0001
0002 #ifndef _LINUX_MEMREMAP_H_
0003 #define _LINUX_MEMREMAP_H_
0004
0005 #include <linux/mmzone.h>
0006 #include <linux/range.h>
0007 #include <linux/ioport.h>
0008 #include <linux/percpu-refcount.h>
0009
0010 struct resource;
0011 struct device;
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 struct vmem_altmap {
0022 unsigned long base_pfn;
0023 const unsigned long end_pfn;
0024 const unsigned long reserve;
0025 unsigned long free;
0026 unsigned long align;
0027 unsigned long alloc;
0028 };
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068 enum memory_type {
0069
0070 MEMORY_DEVICE_PRIVATE = 1,
0071 MEMORY_DEVICE_COHERENT,
0072 MEMORY_DEVICE_FS_DAX,
0073 MEMORY_DEVICE_GENERIC,
0074 MEMORY_DEVICE_PCI_P2PDMA,
0075 };
0076
0077 struct dev_pagemap_ops {
0078
0079
0080
0081
0082
0083 void (*page_free)(struct page *page);
0084
0085
0086
0087
0088
0089 vm_fault_t (*migrate_to_ram)(struct vm_fault *vmf);
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100 int (*memory_failure)(struct dev_pagemap *pgmap, unsigned long pfn,
0101 unsigned long nr_pages, int mf_flags);
0102 };
0103
0104 #define PGMAP_ALTMAP_VALID (1 << 0)
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126 struct dev_pagemap {
0127 struct vmem_altmap altmap;
0128 struct percpu_ref ref;
0129 struct completion done;
0130 enum memory_type type;
0131 unsigned int flags;
0132 unsigned long vmemmap_shift;
0133 const struct dev_pagemap_ops *ops;
0134 void *owner;
0135 int nr_range;
0136 union {
0137 struct range range;
0138 struct range ranges[0];
0139 };
0140 };
0141
0142 static inline bool pgmap_has_memory_failure(struct dev_pagemap *pgmap)
0143 {
0144 return pgmap->ops && pgmap->ops->memory_failure;
0145 }
0146
0147 static inline struct vmem_altmap *pgmap_altmap(struct dev_pagemap *pgmap)
0148 {
0149 if (pgmap->flags & PGMAP_ALTMAP_VALID)
0150 return &pgmap->altmap;
0151 return NULL;
0152 }
0153
0154 static inline unsigned long pgmap_vmemmap_nr(struct dev_pagemap *pgmap)
0155 {
0156 return 1 << pgmap->vmemmap_shift;
0157 }
0158
0159 static inline bool is_device_private_page(const struct page *page)
0160 {
0161 return IS_ENABLED(CONFIG_DEVICE_PRIVATE) &&
0162 is_zone_device_page(page) &&
0163 page->pgmap->type == MEMORY_DEVICE_PRIVATE;
0164 }
0165
0166 static inline bool folio_is_device_private(const struct folio *folio)
0167 {
0168 return is_device_private_page(&folio->page);
0169 }
0170
0171 static inline bool is_pci_p2pdma_page(const struct page *page)
0172 {
0173 return IS_ENABLED(CONFIG_PCI_P2PDMA) &&
0174 is_zone_device_page(page) &&
0175 page->pgmap->type == MEMORY_DEVICE_PCI_P2PDMA;
0176 }
0177
0178 static inline bool is_device_coherent_page(const struct page *page)
0179 {
0180 return is_zone_device_page(page) &&
0181 page->pgmap->type == MEMORY_DEVICE_COHERENT;
0182 }
0183
0184 static inline bool folio_is_device_coherent(const struct folio *folio)
0185 {
0186 return is_device_coherent_page(&folio->page);
0187 }
0188
0189 #ifdef CONFIG_ZONE_DEVICE
0190 void *memremap_pages(struct dev_pagemap *pgmap, int nid);
0191 void memunmap_pages(struct dev_pagemap *pgmap);
0192 void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap);
0193 void devm_memunmap_pages(struct device *dev, struct dev_pagemap *pgmap);
0194 struct dev_pagemap *get_dev_pagemap(unsigned long pfn,
0195 struct dev_pagemap *pgmap);
0196 bool pgmap_pfn_valid(struct dev_pagemap *pgmap, unsigned long pfn);
0197
0198 unsigned long vmem_altmap_offset(struct vmem_altmap *altmap);
0199 void vmem_altmap_free(struct vmem_altmap *altmap, unsigned long nr_pfns);
0200 unsigned long memremap_compat_align(void);
0201 #else
0202 static inline void *devm_memremap_pages(struct device *dev,
0203 struct dev_pagemap *pgmap)
0204 {
0205
0206
0207
0208
0209
0210 WARN_ON_ONCE(1);
0211 return ERR_PTR(-ENXIO);
0212 }
0213
0214 static inline void devm_memunmap_pages(struct device *dev,
0215 struct dev_pagemap *pgmap)
0216 {
0217 }
0218
0219 static inline struct dev_pagemap *get_dev_pagemap(unsigned long pfn,
0220 struct dev_pagemap *pgmap)
0221 {
0222 return NULL;
0223 }
0224
0225 static inline bool pgmap_pfn_valid(struct dev_pagemap *pgmap, unsigned long pfn)
0226 {
0227 return false;
0228 }
0229
0230 static inline unsigned long vmem_altmap_offset(struct vmem_altmap *altmap)
0231 {
0232 return 0;
0233 }
0234
0235 static inline void vmem_altmap_free(struct vmem_altmap *altmap,
0236 unsigned long nr_pfns)
0237 {
0238 }
0239
0240
0241 static inline unsigned long memremap_compat_align(void)
0242 {
0243 return PAGE_SIZE;
0244 }
0245 #endif
0246
0247 static inline void put_dev_pagemap(struct dev_pagemap *pgmap)
0248 {
0249 if (pgmap)
0250 percpu_ref_put(&pgmap->ref);
0251 }
0252
0253 #endif