1*474c4dd2SFrancois Dugast /* SPDX-License-Identifier: MIT */
2*474c4dd2SFrancois Dugast /*
3*474c4dd2SFrancois Dugast * Copyright © 2024 Intel Corporation
4*474c4dd2SFrancois Dugast */
5*474c4dd2SFrancois Dugast
6c5a2eaddSJouni Högander #ifndef _I915_GEM_STOLEN_H_
7c5a2eaddSJouni Högander #define _I915_GEM_STOLEN_H_
8c5a2eaddSJouni Högander
9c5a2eaddSJouni Högander #include "xe_ttm_stolen_mgr.h"
10c5a2eaddSJouni Högander #include "xe_res_cursor.h"
11c5a2eaddSJouni Högander
12c5a2eaddSJouni Högander struct xe_bo;
13c5a2eaddSJouni Högander
14c5a2eaddSJouni Högander struct i915_stolen_fb {
15c5a2eaddSJouni Högander struct xe_bo *bo;
16c5a2eaddSJouni Högander };
17c5a2eaddSJouni Högander
i915_gem_stolen_insert_node_in_range(struct xe_device * xe,struct i915_stolen_fb * fb,u32 size,u32 align,u32 start,u32 end)18c5a2eaddSJouni Högander static inline int i915_gem_stolen_insert_node_in_range(struct xe_device *xe,
19c5a2eaddSJouni Högander struct i915_stolen_fb *fb,
20c5a2eaddSJouni Högander u32 size, u32 align,
21c5a2eaddSJouni Högander u32 start, u32 end)
22c5a2eaddSJouni Högander {
23c5a2eaddSJouni Högander struct xe_bo *bo;
24c5a2eaddSJouni Högander int err;
2562742d12SLucas De Marchi u32 flags = XE_BO_FLAG_PINNED | XE_BO_FLAG_STOLEN;
26c5a2eaddSJouni Högander
2748b1f11cSMatthew Auld if (start < SZ_4K)
2848b1f11cSMatthew Auld start = SZ_4K;
2948b1f11cSMatthew Auld
3048b1f11cSMatthew Auld if (align) {
318ea8c918SVinod Govindapillai size = ALIGN(size, align);
3248b1f11cSMatthew Auld start = ALIGN(start, align);
3348b1f11cSMatthew Auld }
348ea8c918SVinod Govindapillai
35c5a2eaddSJouni Högander bo = xe_bo_create_locked_range(xe, xe_device_get_root_tile(xe),
36c5a2eaddSJouni Högander NULL, size, start, end,
373ad86ae1SJuha-Pekka Heikkila ttm_bo_type_kernel, flags, 0);
38c5a2eaddSJouni Högander if (IS_ERR(bo)) {
39c5a2eaddSJouni Högander err = PTR_ERR(bo);
40c5a2eaddSJouni Högander bo = NULL;
41c5a2eaddSJouni Högander return err;
42c5a2eaddSJouni Högander }
43c5a2eaddSJouni Högander err = xe_bo_pin(bo);
44c5a2eaddSJouni Högander xe_bo_unlock_vm_held(bo);
45c5a2eaddSJouni Högander
46c5a2eaddSJouni Högander if (err) {
47c5a2eaddSJouni Högander xe_bo_put(fb->bo);
48c5a2eaddSJouni Högander bo = NULL;
49c5a2eaddSJouni Högander }
50c5a2eaddSJouni Högander
51c5a2eaddSJouni Högander fb->bo = bo;
52c5a2eaddSJouni Högander
53c5a2eaddSJouni Högander return err;
54c5a2eaddSJouni Högander }
55c5a2eaddSJouni Högander
i915_gem_stolen_insert_node(struct xe_device * xe,struct i915_stolen_fb * fb,u32 size,u32 align)56c5a2eaddSJouni Högander static inline int i915_gem_stolen_insert_node(struct xe_device *xe,
57c5a2eaddSJouni Högander struct i915_stolen_fb *fb,
58c5a2eaddSJouni Högander u32 size, u32 align)
59c5a2eaddSJouni Högander {
60c5a2eaddSJouni Högander /* Not used on xe */
61c5a2eaddSJouni Högander BUG_ON(1);
62c5a2eaddSJouni Högander return -ENODEV;
63c5a2eaddSJouni Högander }
64c5a2eaddSJouni Högander
i915_gem_stolen_remove_node(struct xe_device * xe,struct i915_stolen_fb * fb)65c5a2eaddSJouni Högander static inline void i915_gem_stolen_remove_node(struct xe_device *xe,
66c5a2eaddSJouni Högander struct i915_stolen_fb *fb)
67c5a2eaddSJouni Högander {
68c5a2eaddSJouni Högander xe_bo_unpin_map_no_vm(fb->bo);
69c5a2eaddSJouni Högander fb->bo = NULL;
70c5a2eaddSJouni Högander }
71c5a2eaddSJouni Högander
72c5a2eaddSJouni Högander #define i915_gem_stolen_initialized(xe) (!!ttm_manager_type(&(xe)->ttm, XE_PL_STOLEN))
73c5a2eaddSJouni Högander #define i915_gem_stolen_node_allocated(fb) (!!((fb)->bo))
74c5a2eaddSJouni Högander
i915_gem_stolen_node_offset(struct i915_stolen_fb * fb)75c5a2eaddSJouni Högander static inline u32 i915_gem_stolen_node_offset(struct i915_stolen_fb *fb)
76c5a2eaddSJouni Högander {
77c5a2eaddSJouni Högander struct xe_res_cursor res;
78c5a2eaddSJouni Högander
79c5a2eaddSJouni Högander xe_res_first(fb->bo->ttm.resource, 0, 4096, &res);
80c5a2eaddSJouni Högander return res.start;
81c5a2eaddSJouni Högander }
82c5a2eaddSJouni Högander
83c5a2eaddSJouni Högander /* Used for < gen4. These are not supported by Xe */
84c5a2eaddSJouni Högander #define i915_gem_stolen_area_address(xe) (!WARN_ON(1))
85c5a2eaddSJouni Högander /* Used for gen9 specific WA. Gen9 is not supported by Xe */
86c5a2eaddSJouni Högander #define i915_gem_stolen_area_size(xe) (!WARN_ON(1))
87c5a2eaddSJouni Högander
88c5a2eaddSJouni Högander #define i915_gem_stolen_node_address(xe, fb) (xe_ttm_stolen_gpu_offset(xe) + \
89c5a2eaddSJouni Högander i915_gem_stolen_node_offset(fb))
90c5a2eaddSJouni Högander #define i915_gem_stolen_node_size(fb) ((u64)((fb)->bo->ttm.base.size))
91c5a2eaddSJouni Högander
92c5a2eaddSJouni Högander #endif
93