1// SPDX-License-Identifier: MIT
2/* Copyright © 2025 Intel Corporation */
3
4#include "gem/i915_gem_stolen.h"
5#include "xe_res_cursor.h"
6#include "xe_ttm_stolen_mgr.h"
7#include "xe_validation.h"
8
9struct intel_stolen_node {
10 struct xe_device *xe;
11 struct xe_bo *bo;
12};
13
14int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size,
15 unsigned int align, u64 start, u64 end)
16{
17 struct xe_device *xe = node->xe;
18
19 struct xe_bo *bo;
20 int err = 0;
21 u32 flags = XE_BO_FLAG_PINNED | XE_BO_FLAG_STOLEN;
22
23 if (start < SZ_4K)
24 start = SZ_4K;
25
26 if (align) {
27 size = ALIGN(size, align);
28 start = ALIGN(start, align);
29 }
30
31 bo = xe_bo_create_pin_range_novm(xe, tile: xe_device_get_root_tile(xe),
32 size, start, end, type: ttm_bo_type_kernel, flags);
33 if (IS_ERR(ptr: bo)) {
34 err = PTR_ERR(ptr: bo);
35 bo = NULL;
36 return err;
37 }
38
39 node->bo = bo;
40
41 return err;
42}
43
44int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, unsigned int align)
45{
46 /* Not used on xe */
47 WARN_ON(1);
48
49 return -ENODEV;
50}
51
52void i915_gem_stolen_remove_node(struct intel_stolen_node *node)
53{
54 xe_bo_unpin_map_no_vm(bo: node->bo);
55 node->bo = NULL;
56}
57
58bool i915_gem_stolen_initialized(struct drm_device *drm)
59{
60 struct xe_device *xe = to_xe_device(dev: drm);
61
62 return ttm_manager_type(bdev: &xe->ttm, XE_PL_STOLEN);
63}
64
65bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node)
66{
67 return node->bo;
68}
69
70u32 i915_gem_stolen_node_offset(struct intel_stolen_node *node)
71{
72 struct xe_res_cursor res;
73
74 xe_res_first(res: node->bo->ttm.resource, start: 0, size: 4096, cur: &res);
75 return res.start;
76}
77
78/* Used for < gen4. These are not supported by Xe */
79u64 i915_gem_stolen_area_address(struct drm_device *drm)
80{
81 WARN_ON(1);
82
83 return 0;
84}
85
86/* Used for gen9 specific WA. Gen9 is not supported by Xe */
87u64 i915_gem_stolen_area_size(struct drm_device *drm)
88{
89 WARN_ON(1);
90
91 return 0;
92}
93
94u64 i915_gem_stolen_node_address(struct intel_stolen_node *node)
95{
96 struct xe_device *xe = node->xe;
97
98 return xe_ttm_stolen_gpu_offset(xe) + i915_gem_stolen_node_offset(node);
99}
100
101u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node)
102{
103 return node->bo->ttm.base.size;
104}
105
106struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm)
107{
108 struct xe_device *xe = to_xe_device(dev: drm);
109 struct intel_stolen_node *node;
110
111 node = kzalloc(sizeof(*node), GFP_KERNEL);
112 if (!node)
113 return NULL;
114
115 node->xe = xe;
116
117 return node;
118}
119
120void i915_gem_stolen_node_free(const struct intel_stolen_node *node)
121{
122 kfree(objp: node);
123}
124

source code of linux/drivers/gpu/drm/xe/display/xe_stolen.c