xref: /linux-6.15/include/drm/drm_suballoc.h (revision 6a91585e)
1849ee8a2SMaarten Lankhorst /* SPDX-License-Identifier: GPL-2.0 OR MIT */
2849ee8a2SMaarten Lankhorst /*
3849ee8a2SMaarten Lankhorst  * Copyright 2011 Red Hat Inc.
4849ee8a2SMaarten Lankhorst  * Copyright © 2022 Intel Corporation
5849ee8a2SMaarten Lankhorst  */
6849ee8a2SMaarten Lankhorst #ifndef _DRM_SUBALLOC_H_
7849ee8a2SMaarten Lankhorst #define _DRM_SUBALLOC_H_
8849ee8a2SMaarten Lankhorst 
9849ee8a2SMaarten Lankhorst #include <drm/drm_mm.h>
10849ee8a2SMaarten Lankhorst 
11849ee8a2SMaarten Lankhorst #include <linux/dma-fence.h>
12849ee8a2SMaarten Lankhorst #include <linux/types.h>
13849ee8a2SMaarten Lankhorst 
14849ee8a2SMaarten Lankhorst #define DRM_SUBALLOC_MAX_QUEUES 32
15849ee8a2SMaarten Lankhorst /**
16849ee8a2SMaarten Lankhorst  * struct drm_suballoc_manager - fenced range allocations
17849ee8a2SMaarten Lankhorst  * @wq: Wait queue for sleeping allocations on contention.
18849ee8a2SMaarten Lankhorst  * @hole: Pointer to first hole node.
19849ee8a2SMaarten Lankhorst  * @olist: List of allocated ranges.
20849ee8a2SMaarten Lankhorst  * @flist: Array[fence context hash] of queues of fenced allocated ranges.
21849ee8a2SMaarten Lankhorst  * @size: Size of the managed range.
22849ee8a2SMaarten Lankhorst  * @align: Default alignment for the managed range.
23849ee8a2SMaarten Lankhorst  */
24849ee8a2SMaarten Lankhorst struct drm_suballoc_manager {
25849ee8a2SMaarten Lankhorst 	wait_queue_head_t wq;
26849ee8a2SMaarten Lankhorst 	struct list_head *hole;
27849ee8a2SMaarten Lankhorst 	struct list_head olist;
28849ee8a2SMaarten Lankhorst 	struct list_head flist[DRM_SUBALLOC_MAX_QUEUES];
29849ee8a2SMaarten Lankhorst 	size_t size;
30849ee8a2SMaarten Lankhorst 	size_t align;
31849ee8a2SMaarten Lankhorst };
32849ee8a2SMaarten Lankhorst 
33849ee8a2SMaarten Lankhorst /**
34849ee8a2SMaarten Lankhorst  * struct drm_suballoc - Sub-allocated range
35849ee8a2SMaarten Lankhorst  * @olist: List link for list of allocated ranges.
36849ee8a2SMaarten Lankhorst  * @flist: List linkk for the manager fenced allocated ranges queues.
37849ee8a2SMaarten Lankhorst  * @manager: The drm_suballoc_manager.
38849ee8a2SMaarten Lankhorst  * @soffset: Start offset.
39849ee8a2SMaarten Lankhorst  * @eoffset: End offset + 1 so that @eoffset - @soffset = size.
40*6a91585eSJani Nikula  * @fence: The fence protecting the allocation.
41849ee8a2SMaarten Lankhorst  */
42849ee8a2SMaarten Lankhorst struct drm_suballoc {
43849ee8a2SMaarten Lankhorst 	struct list_head olist;
44849ee8a2SMaarten Lankhorst 	struct list_head flist;
45849ee8a2SMaarten Lankhorst 	struct drm_suballoc_manager *manager;
46849ee8a2SMaarten Lankhorst 	size_t soffset;
47849ee8a2SMaarten Lankhorst 	size_t eoffset;
48849ee8a2SMaarten Lankhorst 	struct dma_fence *fence;
49849ee8a2SMaarten Lankhorst };
50849ee8a2SMaarten Lankhorst 
51849ee8a2SMaarten Lankhorst void drm_suballoc_manager_init(struct drm_suballoc_manager *sa_manager,
52849ee8a2SMaarten Lankhorst 			       size_t size, size_t align);
53849ee8a2SMaarten Lankhorst 
54849ee8a2SMaarten Lankhorst void drm_suballoc_manager_fini(struct drm_suballoc_manager *sa_manager);
55849ee8a2SMaarten Lankhorst 
56849ee8a2SMaarten Lankhorst struct drm_suballoc *
57849ee8a2SMaarten Lankhorst drm_suballoc_new(struct drm_suballoc_manager *sa_manager, size_t size,
58849ee8a2SMaarten Lankhorst 		 gfp_t gfp, bool intr, size_t align);
59849ee8a2SMaarten Lankhorst 
60849ee8a2SMaarten Lankhorst void drm_suballoc_free(struct drm_suballoc *sa, struct dma_fence *fence);
61849ee8a2SMaarten Lankhorst 
62849ee8a2SMaarten Lankhorst /**
63849ee8a2SMaarten Lankhorst  * drm_suballoc_soffset - Range start.
64849ee8a2SMaarten Lankhorst  * @sa: The struct drm_suballoc.
65849ee8a2SMaarten Lankhorst  *
66849ee8a2SMaarten Lankhorst  * Return: The start of the allocated range.
67849ee8a2SMaarten Lankhorst  */
drm_suballoc_soffset(struct drm_suballoc * sa)68849ee8a2SMaarten Lankhorst static inline size_t drm_suballoc_soffset(struct drm_suballoc *sa)
69849ee8a2SMaarten Lankhorst {
70849ee8a2SMaarten Lankhorst 	return sa->soffset;
71849ee8a2SMaarten Lankhorst }
72849ee8a2SMaarten Lankhorst 
73849ee8a2SMaarten Lankhorst /**
74849ee8a2SMaarten Lankhorst  * drm_suballoc_eoffset - Range end.
75849ee8a2SMaarten Lankhorst  * @sa: The struct drm_suballoc.
76849ee8a2SMaarten Lankhorst  *
77849ee8a2SMaarten Lankhorst  * Return: The end of the allocated range + 1.
78849ee8a2SMaarten Lankhorst  */
drm_suballoc_eoffset(struct drm_suballoc * sa)79849ee8a2SMaarten Lankhorst static inline size_t drm_suballoc_eoffset(struct drm_suballoc *sa)
80849ee8a2SMaarten Lankhorst {
81849ee8a2SMaarten Lankhorst 	return sa->eoffset;
82849ee8a2SMaarten Lankhorst }
83849ee8a2SMaarten Lankhorst 
84849ee8a2SMaarten Lankhorst /**
85849ee8a2SMaarten Lankhorst  * drm_suballoc_size - Range size.
86849ee8a2SMaarten Lankhorst  * @sa: The struct drm_suballoc.
87849ee8a2SMaarten Lankhorst  *
88849ee8a2SMaarten Lankhorst  * Return: The size of the allocated range.
89849ee8a2SMaarten Lankhorst  */
drm_suballoc_size(struct drm_suballoc * sa)90849ee8a2SMaarten Lankhorst static inline size_t drm_suballoc_size(struct drm_suballoc *sa)
91849ee8a2SMaarten Lankhorst {
92849ee8a2SMaarten Lankhorst 	return sa->eoffset - sa->soffset;
93849ee8a2SMaarten Lankhorst }
94849ee8a2SMaarten Lankhorst 
95849ee8a2SMaarten Lankhorst #ifdef CONFIG_DEBUG_FS
96849ee8a2SMaarten Lankhorst void drm_suballoc_dump_debug_info(struct drm_suballoc_manager *sa_manager,
97849ee8a2SMaarten Lankhorst 				  struct drm_printer *p,
98849ee8a2SMaarten Lankhorst 				  unsigned long long suballoc_base);
99849ee8a2SMaarten Lankhorst #else
100849ee8a2SMaarten Lankhorst static inline void
drm_suballoc_dump_debug_info(struct drm_suballoc_manager * sa_manager,struct drm_printer * p,unsigned long long suballoc_base)101849ee8a2SMaarten Lankhorst drm_suballoc_dump_debug_info(struct drm_suballoc_manager *sa_manager,
102849ee8a2SMaarten Lankhorst 			     struct drm_printer *p,
103849ee8a2SMaarten Lankhorst 			     unsigned long long suballoc_base)
104849ee8a2SMaarten Lankhorst { }
105849ee8a2SMaarten Lankhorst 
106849ee8a2SMaarten Lankhorst #endif
107849ee8a2SMaarten Lankhorst 
108849ee8a2SMaarten Lankhorst #endif /* _DRM_SUBALLOC_H_ */
109