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