1 | /* SPDX-License-Identifier: GPL-2.0 OR MIT */ |
2 | /* |
3 | * Copyright 2011 Red Hat Inc. |
4 | * Copyright © 2022 Intel Corporation |
5 | */ |
6 | #ifndef _DRM_SUBALLOC_H_ |
7 | #define _DRM_SUBALLOC_H_ |
8 | |
9 | #include <drm/drm_mm.h> |
10 | |
11 | #include <linux/dma-fence.h> |
12 | #include <linux/types.h> |
13 | |
14 | #define DRM_SUBALLOC_MAX_QUEUES 32 |
15 | /** |
16 | * struct drm_suballoc_manager - fenced range allocations |
17 | * @wq: Wait queue for sleeping allocations on contention. |
18 | * @hole: Pointer to first hole node. |
19 | * @olist: List of allocated ranges. |
20 | * @flist: Array[fence context hash] of queues of fenced allocated ranges. |
21 | * @size: Size of the managed range. |
22 | * @align: Default alignment for the managed range. |
23 | */ |
24 | struct drm_suballoc_manager { |
25 | wait_queue_head_t wq; |
26 | struct list_head *hole; |
27 | struct list_head olist; |
28 | struct list_head flist[DRM_SUBALLOC_MAX_QUEUES]; |
29 | size_t size; |
30 | size_t align; |
31 | }; |
32 | |
33 | /** |
34 | * struct drm_suballoc - Sub-allocated range |
35 | * @olist: List link for list of allocated ranges. |
36 | * @flist: List linkk for the manager fenced allocated ranges queues. |
37 | * @manager: The drm_suballoc_manager. |
38 | * @soffset: Start offset. |
39 | * @eoffset: End offset + 1 so that @eoffset - @soffset = size. |
40 | * @dma_fence: The fence protecting the allocation. |
41 | */ |
42 | struct drm_suballoc { |
43 | struct list_head olist; |
44 | struct list_head flist; |
45 | struct drm_suballoc_manager *manager; |
46 | size_t soffset; |
47 | size_t eoffset; |
48 | struct dma_fence *fence; |
49 | }; |
50 | |
51 | void drm_suballoc_manager_init(struct drm_suballoc_manager *sa_manager, |
52 | size_t size, size_t align); |
53 | |
54 | void drm_suballoc_manager_fini(struct drm_suballoc_manager *sa_manager); |
55 | |
56 | struct drm_suballoc * |
57 | drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size, |
58 | gfp_t gfp, bool intr, size_t align); |
59 | |
60 | void drm_suballoc_free(struct drm_suballoc *sa, struct dma_fence *fence); |
61 | |
62 | /** |
63 | * drm_suballoc_soffset - Range start. |
64 | * @sa: The struct drm_suballoc. |
65 | * |
66 | * Return: The start of the allocated range. |
67 | */ |
68 | static inline size_t drm_suballoc_soffset(struct drm_suballoc *sa) |
69 | { |
70 | return sa->soffset; |
71 | } |
72 | |
73 | /** |
74 | * drm_suballoc_eoffset - Range end. |
75 | * @sa: The struct drm_suballoc. |
76 | * |
77 | * Return: The end of the allocated range + 1. |
78 | */ |
79 | static inline size_t drm_suballoc_eoffset(struct drm_suballoc *sa) |
80 | { |
81 | return sa->eoffset; |
82 | } |
83 | |
84 | /** |
85 | * drm_suballoc_size - Range size. |
86 | * @sa: The struct drm_suballoc. |
87 | * |
88 | * Return: The size of the allocated range. |
89 | */ |
90 | static inline size_t drm_suballoc_size(struct drm_suballoc *sa) |
91 | { |
92 | return sa->eoffset - sa->soffset; |
93 | } |
94 | |
95 | #ifdef CONFIG_DEBUG_FS |
96 | void drm_suballoc_dump_debug_info(struct drm_suballoc_manager *sa_manager, |
97 | struct drm_printer *p, |
98 | unsigned long long suballoc_base); |
99 | #else |
100 | static inline void |
101 | drm_suballoc_dump_debug_info(struct drm_suballoc_manager *sa_manager, |
102 | struct drm_printer *p, |
103 | unsigned long long suballoc_base) |
104 | { } |
105 | |
106 | #endif |
107 | |
108 | #endif /* _DRM_SUBALLOC_H_ */ |
109 | |