Linux 6.10-rc4
[sfrench/cifs-2.6.git] / include / drm / ttm / ttm_range_manager.h
1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
2
3 #ifndef _TTM_RANGE_MANAGER_H_
4 #define _TTM_RANGE_MANAGER_H_
5
6 #include <drm/ttm/ttm_resource.h>
7 #include <drm/ttm/ttm_device.h>
8 #include <drm/drm_mm.h>
9
10 /**
11  * struct ttm_range_mgr_node
12  *
13  * @base: base clase we extend
14  * @mm_nodes: MM nodes, usually 1
15  *
16  * Extending the ttm_resource object to manage an address space allocation with
17  * one or more drm_mm_nodes.
18  */
19 struct ttm_range_mgr_node {
20         struct ttm_resource base;
21         struct drm_mm_node mm_nodes[];
22 };
23
24 /**
25  * to_ttm_range_mgr_node
26  *
27  * @res: the resource to upcast
28  *
29  * Upcast the ttm_resource object into a ttm_range_mgr_node object.
30  */
31 static inline struct ttm_range_mgr_node *
32 to_ttm_range_mgr_node(struct ttm_resource *res)
33 {
34         return container_of(res, struct ttm_range_mgr_node, base);
35 }
36
37 int ttm_range_man_init_nocheck(struct ttm_device *bdev,
38                        unsigned type, bool use_tt,
39                        unsigned long p_size);
40 int ttm_range_man_fini_nocheck(struct ttm_device *bdev,
41                        unsigned type);
42 static __always_inline int ttm_range_man_init(struct ttm_device *bdev,
43                        unsigned int type, bool use_tt,
44                        unsigned long p_size)
45 {
46         BUILD_BUG_ON(__builtin_constant_p(type) && type >= TTM_NUM_MEM_TYPES);
47         return ttm_range_man_init_nocheck(bdev, type, use_tt, p_size);
48 }
49
50 static __always_inline int ttm_range_man_fini(struct ttm_device *bdev,
51                        unsigned int type)
52 {
53         BUILD_BUG_ON(__builtin_constant_p(type) && type >= TTM_NUM_MEM_TYPES);
54         return ttm_range_man_fini_nocheck(bdev, type);
55 }
56 #endif