File Index
Files and directories
Sign in
FILE

xe_stolen.c

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/xe/display/xe_stolen.c C
  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, xe_device_get_root_tile(xe),
 32					 size, start, end, ttm_bo_type_kernel, flags);
 33	if (IS_ERR(bo)) {
 34		err = PTR_ERR(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(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(drm);
 61
 62	return ttm_manager_type(&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(node->bo->ttm.resource, 0, 4096, &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(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(node);
123}
~/ Read-only file preview.