XenevaOS
Loading...
Searching...
No Matches
drm_pagemap.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: MIT */
2#ifndef _DRM_PAGEMAP_H_
3#define _DRM_PAGEMAP_H_
4
6#include <linux/hmm.h>
7#include <linux/memremap.h>
8#include <linux/types.h>
9
10#define NR_PAGES(order) (1U << (order))
11
12struct dma_fence;
13struct drm_pagemap;
14struct drm_pagemap_cache;
15struct drm_pagemap_dev_hold;
16struct drm_pagemap_zdd;
17struct device;
18
28 /* A driver can add private values beyond DRM_INTERCONNECT_DRIVER */
29};
30
47
57static inline struct drm_pagemap_addr
58drm_pagemap_addr_encode(dma_addr_t addr,
60 unsigned int order,
62{
63 return (struct drm_pagemap_addr) {
64 .addr = addr,
65 .proto = proto,
66 .order = order,
67 .dir = dir,
68 };
69}
70
84 struct drm_pagemap_addr (*device_map)(struct drm_pagemap *dpagemap,
85 struct device *dev,
86 struct page *page,
87 unsigned int order,
88 enum dma_data_direction dir);
89
97 void (*device_unmap)(struct drm_pagemap *dpagemap,
98 struct device *dev,
99 const struct drm_pagemap_addr *addr);
100
126 int (*populate_mm)(struct drm_pagemap *dpagemap,
127 unsigned long start, unsigned long end,
128 struct mm_struct *mm,
129 unsigned long timeslice_ms);
147 void (*destroy)(struct drm_pagemap *dpagemap,
148 bool is_atomic_or_reclaim);
149};
150
166 const struct drm_pagemap_ops *ops;
167 struct kref ref;
169 struct dev_pagemap *pagemap;
170 struct drm_pagemap_dev_hold *dev_hold;
171 struct drm_pagemap_cache *cache;
173};
174
175struct drm_pagemap_devmem;
176
193 void (*devmem_release)(struct drm_pagemap_devmem *devmem_allocation);
194
205 int (*populate_devmem_pfn)(struct drm_pagemap_devmem *devmem_allocation,
206 unsigned long npages, unsigned long *pfn);
207
222 int (*copy_to_devmem)(struct page **pages,
223 struct drm_pagemap_addr *pagemap_addr,
224 unsigned long npages,
225 struct dma_fence *pre_migrate_fence);
226
241 int (*copy_to_ram)(struct page **pages,
242 struct drm_pagemap_addr *pagemap_addr,
243 unsigned long npages,
244 struct dma_fence *pre_migrate_fence);
245};
246
247#if IS_ENABLED(CONFIG_ZONE_DEVICE)
248
249int drm_pagemap_init(struct drm_pagemap *dpagemap,
250 struct dev_pagemap *pagemap,
251 struct drm_device *drm,
252 const struct drm_pagemap_ops *ops);
253
254struct drm_pagemap *drm_pagemap_create(struct drm_device *drm,
255 struct dev_pagemap *pagemap,
256 const struct drm_pagemap_ops *ops);
257
258struct drm_pagemap *drm_pagemap_page_to_dpagemap(struct page *page);
259
260void drm_pagemap_put(struct drm_pagemap *dpagemap);
261
262#else
263
264static inline struct drm_pagemap *drm_pagemap_page_to_dpagemap(struct page *page)
265{
266 return NULL;
267}
268
269static inline void drm_pagemap_put(struct drm_pagemap *dpagemap)
270{
271}
272
273#endif /* IS_ENABLED(CONFIG_ZONE_DEVICE) */
274
281static inline struct drm_pagemap *
282drm_pagemap_get(struct drm_pagemap *dpagemap)
283{
284 if (likely(dpagemap))
285 kref_get(&dpagemap->ref);
286
287 return dpagemap;
288}
289
298static inline struct drm_pagemap * __must_check
299drm_pagemap_get_unless_zero(struct drm_pagemap *dpagemap)
300{
301 return (dpagemap && kref_get_unless_zero(&dpagemap->ref)) ? dpagemap : NULL;
302}
303
327
339
340#if IS_ENABLED(CONFIG_ZONE_DEVICE)
341
342int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem *devmem_allocation,
343 struct mm_struct *mm,
344 unsigned long start, unsigned long end,
345 const struct drm_pagemap_migrate_details *mdetails);
346
347int drm_pagemap_evict_to_ram(struct drm_pagemap_devmem *devmem_allocation);
348
349const struct dev_pagemap_ops *drm_pagemap_pagemap_ops_get(void);
350
351void drm_pagemap_devmem_init(struct drm_pagemap_devmem *devmem_allocation,
352 struct device *dev, struct mm_struct *mm,
353 const struct drm_pagemap_devmem_ops *ops,
354 struct drm_pagemap *dpagemap, size_t size,
355 struct dma_fence *pre_migrate_fence);
356
357int drm_pagemap_populate_mm(struct drm_pagemap *dpagemap,
358 unsigned long start, unsigned long end,
359 struct mm_struct *mm,
360 unsigned long timeslice_ms);
361
362void drm_pagemap_destroy(struct drm_pagemap *dpagemap, bool is_atomic_or_reclaim);
363
364int drm_pagemap_reinit(struct drm_pagemap *dpagemap);
365
372static inline struct drm_pagemap_zdd *drm_pagemap_page_zone_device_data(struct page *page)
373{
374 struct folio *folio = page_folio(page);
375
376 return folio_zone_device_data(folio);
377}
378
379#else
380
381static inline struct drm_pagemap_zdd *drm_pagemap_page_zone_device_data(struct page *page)
382{
383 return NULL;
384}
385
386#endif /* IS_ENABLED(CONFIG_ZONE_DEVICE) */
387
388#endif
#define NULL
Definition actypes.h:561
size_t pages
Definition audrv.c:83
#define likely(x)
Definition compiler.h:29
#define __must_check
Definition compiler.h:114
dma_data_direction
Definition dma-direction.h:21
size_t size
Definition drm_bridge.h:1299
drm_interconnect_protocol
Definition drm_pagemap.h:25
@ DRM_INTERCONNECT_SYSTEM
Definition drm_pagemap.h:26
@ DRM_INTERCONNECT_DRIVER
Definition drm_pagemap.h:27
const struct device * dev
Definition drm_print.h:519
uint64_t u64
Definition kernel.h:17
uintptr_t dma_addr_t
Definition kernel.h:42
uint32_t u32
Definition kernel.h:16
char end[]
Definition completion.h:55
Definition fs.h:255
Definition dma-fence.h:70
const struct dma_fence_ops __rcu * ops
Definition dma-fence.h:75
Definition drm_device.h:75
Definition drm_pagemap.h:41
u64 order
Definition drm_pagemap.h:44
u64 dir
Definition drm_pagemap.h:45
u64 proto
Definition drm_pagemap.h:43
dma_addr_t addr
Definition drm_pagemap.h:42
Definition drm_pagemap.h:185
int(* copy_to_ram)(struct page **pages, struct drm_pagemap_addr *pagemap_addr, unsigned long npages, struct dma_fence *pre_migrate_fence)
Definition drm_pagemap.h:241
int(* copy_to_devmem)(struct page **pages, struct drm_pagemap_addr *pagemap_addr, unsigned long npages, struct dma_fence *pre_migrate_fence)
Definition drm_pagemap.h:222
int(* populate_devmem_pfn)(struct drm_pagemap_devmem *devmem_allocation, unsigned long npages, unsigned long *pfn)
Definition drm_pagemap.h:205
void(* devmem_release)(struct drm_pagemap_devmem *devmem_allocation)
Definition drm_pagemap.h:193
Definition drm_pagemap.h:317
struct dma_fence * pre_migrate_fence
Definition drm_pagemap.h:325
struct drm_pagemap * dpagemap
Definition drm_pagemap.h:322
struct device * dev
Definition drm_pagemap.h:318
struct mm_struct * mm
Definition drm_pagemap.h:319
const struct drm_pagemap_devmem_ops * ops
Definition drm_pagemap.h:321
struct completion detached
Definition drm_pagemap.h:320
size_t size
Definition drm_pagemap.h:323
u64 timeslice_expiration
Definition drm_pagemap.h:324
Definition drm_pagemap.h:335
unsigned long timeslice_ms
Definition drm_pagemap.h:336
u32 can_migrate_same_pagemap
Definition drm_pagemap.h:337
Definition drm_pagemap.h:74
void(* device_unmap)(struct drm_pagemap *dpagemap, struct device *dev, const struct drm_pagemap_addr *addr)
Definition drm_pagemap.h:97
void(* destroy)(struct drm_pagemap *dpagemap, bool is_atomic_or_reclaim)
Definition drm_pagemap.h:147
int(* populate_mm)(struct drm_pagemap *dpagemap, unsigned long start, unsigned long end, struct mm_struct *mm, unsigned long timeslice_ms)
Definition drm_pagemap.h:126
struct drm_pagemap_addr(* device_map)(struct drm_pagemap *dpagemap, struct device *dev, struct page *page, unsigned int order, enum dma_data_direction dir)
Definition drm_pagemap.h:84
Definition drm_pagemap.h:165
struct kref ref
Definition drm_pagemap.h:167
struct dev_pagemap * pagemap
Definition drm_pagemap.h:169
struct drm_pagemap_cache * cache
Definition drm_pagemap.h:171
const struct drm_pagemap_ops * ops
Definition drm_pagemap.h:166
struct drm_device * drm
Definition drm_pagemap.h:168
struct drm_pagemap_dev_hold * dev_hold
Definition drm_pagemap.h:170
struct list_head shrink_link
Definition drm_pagemap.h:172
Definition mm_types.h:16
Definition kref.h:44
Definition list.h:11
Definition pagemap.h:38