summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/xe/display/xe_stolen.c
blob: 9f04ba36e930b2d36b4809e443540bee7fe84af2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// SPDX-License-Identifier: MIT
/* Copyright © 2025 Intel Corporation */

#include "gem/i915_gem_stolen.h"
#include "xe_res_cursor.h"
#include "xe_ttm_stolen_mgr.h"
#include "xe_validation.h"

struct intel_stolen_node {
	struct xe_device *xe;
	struct xe_bo *bo;
};

int i915_gem_stolen_insert_node_in_range(struct intel_stolen_node *node, u64 size,
					 unsigned int align, u64 start, u64 end)
{
	struct xe_device *xe = node->xe;

	struct xe_bo *bo;
	int err = 0;
	u32 flags = XE_BO_FLAG_PINNED | XE_BO_FLAG_STOLEN;

	if (start < SZ_4K)
		start = SZ_4K;

	if (align) {
		size = ALIGN(size, align);
		start = ALIGN(start, align);
	}

	bo = xe_bo_create_pin_range_novm(xe, xe_device_get_root_tile(xe),
					 size, start, end, ttm_bo_type_kernel, flags);
	if (IS_ERR(bo)) {
		err = PTR_ERR(bo);
		bo = NULL;
		return err;
	}

	node->bo = bo;

	return err;
}

int i915_gem_stolen_insert_node(struct intel_stolen_node *node, u64 size, unsigned int align)
{
	/* Not used on xe */
	WARN_ON(1);

	return -ENODEV;
}

void i915_gem_stolen_remove_node(struct intel_stolen_node *node)
{
	xe_bo_unpin_map_no_vm(node->bo);
	node->bo = NULL;
}

bool i915_gem_stolen_initialized(struct drm_device *drm)
{
	struct xe_device *xe = to_xe_device(drm);

	return ttm_manager_type(&xe->ttm, XE_PL_STOLEN);
}

bool i915_gem_stolen_node_allocated(const struct intel_stolen_node *node)
{
	return node->bo;
}

u32 i915_gem_stolen_node_offset(struct intel_stolen_node *node)
{
	struct xe_res_cursor res;

	xe_res_first(node->bo->ttm.resource, 0, 4096, &res);
	return res.start;
}

/* Used for < gen4. These are not supported by Xe */
u64 i915_gem_stolen_area_address(struct drm_device *drm)
{
	WARN_ON(1);

	return 0;
}

/* Used for gen9 specific WA. Gen9 is not supported by Xe */
u64 i915_gem_stolen_area_size(struct drm_device *drm)
{
	WARN_ON(1);

	return 0;
}

u64 i915_gem_stolen_node_address(struct intel_stolen_node *node)
{
	struct xe_device *xe = node->xe;

	return xe_ttm_stolen_gpu_offset(xe) + i915_gem_stolen_node_offset(node);
}

u64 i915_gem_stolen_node_size(const struct intel_stolen_node *node)
{
	return node->bo->ttm.base.size;
}

struct intel_stolen_node *i915_gem_stolen_node_alloc(struct drm_device *drm)
{
	struct xe_device *xe = to_xe_device(drm);
	struct intel_stolen_node *node;

	node = kzalloc(sizeof(*node), GFP_KERNEL);
	if (!node)
		return NULL;

	node->xe = xe;

	return node;
}

void i915_gem_stolen_node_free(const struct intel_stolen_node *node)
{
	kfree(node);
}