1 | /* SPDX-License-Identifier: MIT */ |
2 | /* |
3 | * Copyright © 2019 Intel Corporation |
4 | */ |
5 | |
6 | #ifndef __I915_GEM_REGION_H__ |
7 | #define __I915_GEM_REGION_H__ |
8 | |
9 | #include <linux/types.h> |
10 | |
11 | struct intel_memory_region; |
12 | struct drm_i915_gem_object; |
13 | struct sg_table; |
14 | |
15 | struct i915_gem_apply_to_region; |
16 | |
17 | #define I915_BO_INVALID_OFFSET ((resource_size_t)-1) |
18 | |
19 | /** |
20 | * struct i915_gem_apply_to_region_ops - ops to use when iterating over all |
21 | * region objects. |
22 | */ |
23 | struct i915_gem_apply_to_region_ops { |
24 | /** |
25 | * @process_obj: Process the current object |
26 | * |
27 | * Note that if this function is part of a ww transaction, and |
28 | * if returns -EDEADLK for one of the objects, it may be |
29 | * rerun for that same object in the same pass. |
30 | */ |
31 | int (*process_obj)(struct i915_gem_apply_to_region *apply, |
32 | struct drm_i915_gem_object *obj); |
33 | }; |
34 | |
35 | /** |
36 | * struct i915_gem_apply_to_region - Argument to the struct |
37 | * i915_gem_apply_to_region_ops functions. |
38 | * @ops: The ops for the operation. |
39 | * @ww: Locking context used for the transaction. |
40 | * @interruptible: Whether to perform object locking interruptible. |
41 | * |
42 | * This structure is intended to be embedded in a private struct if needed |
43 | */ |
44 | struct i915_gem_apply_to_region { |
45 | const struct i915_gem_apply_to_region_ops *ops; |
46 | struct i915_gem_ww_ctx *ww; |
47 | u32 interruptible:1; |
48 | }; |
49 | |
50 | void i915_gem_object_init_memory_region(struct drm_i915_gem_object *obj, |
51 | struct intel_memory_region *mem); |
52 | void i915_gem_object_release_memory_region(struct drm_i915_gem_object *obj); |
53 | |
54 | struct drm_i915_gem_object * |
55 | i915_gem_object_create_region(struct intel_memory_region *mem, |
56 | resource_size_t size, |
57 | resource_size_t page_size, |
58 | unsigned int flags); |
59 | struct drm_i915_gem_object * |
60 | i915_gem_object_create_region_at(struct intel_memory_region *mem, |
61 | resource_size_t offset, |
62 | resource_size_t size, |
63 | unsigned int flags); |
64 | |
65 | int i915_gem_process_region(struct intel_memory_region *mr, |
66 | struct i915_gem_apply_to_region *apply); |
67 | #endif |
68 | |