1 | /* SPDX-License-Identifier: MIT */ |
2 | /* |
3 | * Copyright © 2019 Intel Corporation |
4 | */ |
5 | |
6 | #ifndef __INTEL_MEMORY_REGION_H__ |
7 | #define __INTEL_MEMORY_REGION_H__ |
8 | |
9 | #include <linux/ioport.h> |
10 | #include <linux/mutex.h> |
11 | #include <linux/io-mapping.h> |
12 | #include <drm/drm_mm.h> |
13 | #include <uapi/drm/i915_drm.h> |
14 | |
15 | struct drm_i915_private; |
16 | struct drm_i915_gem_object; |
17 | struct drm_printer; |
18 | struct intel_memory_region; |
19 | struct sg_table; |
20 | struct ttm_resource; |
21 | |
22 | enum intel_memory_type { |
23 | INTEL_MEMORY_SYSTEM = I915_MEMORY_CLASS_SYSTEM, |
24 | INTEL_MEMORY_LOCAL = I915_MEMORY_CLASS_DEVICE, |
25 | INTEL_MEMORY_STOLEN_SYSTEM, |
26 | INTEL_MEMORY_STOLEN_LOCAL, |
27 | INTEL_MEMORY_MOCK, |
28 | }; |
29 | |
30 | enum intel_region_id { |
31 | INTEL_REGION_SMEM = 0, |
32 | INTEL_REGION_LMEM_0, |
33 | INTEL_REGION_LMEM_1, |
34 | INTEL_REGION_LMEM_2, |
35 | INTEL_REGION_LMEM_3, |
36 | INTEL_REGION_STOLEN_SMEM, |
37 | INTEL_REGION_STOLEN_LMEM, |
38 | INTEL_REGION_UNKNOWN, /* Should be last */ |
39 | }; |
40 | |
41 | #define REGION_SMEM BIT(INTEL_REGION_SMEM) |
42 | #define REGION_LMEM BIT(INTEL_REGION_LMEM_0) |
43 | #define REGION_STOLEN_SMEM BIT(INTEL_REGION_STOLEN_SMEM) |
44 | #define REGION_STOLEN_LMEM BIT(INTEL_REGION_STOLEN_LMEM) |
45 | |
46 | #define I915_ALLOC_CONTIGUOUS BIT(0) |
47 | |
48 | #define for_each_memory_region(mr, i915, id) \ |
49 | for (id = 0; id < ARRAY_SIZE((i915)->mm.regions); id++) \ |
50 | for_each_if((mr) = (i915)->mm.regions[id]) |
51 | |
52 | struct intel_memory_region_ops { |
53 | unsigned int flags; |
54 | |
55 | int (*init)(struct intel_memory_region *mem); |
56 | int (*release)(struct intel_memory_region *mem); |
57 | |
58 | int (*init_object)(struct intel_memory_region *mem, |
59 | struct drm_i915_gem_object *obj, |
60 | resource_size_t offset, |
61 | resource_size_t size, |
62 | resource_size_t page_size, |
63 | unsigned int flags); |
64 | }; |
65 | |
66 | struct intel_memory_region { |
67 | struct drm_i915_private *i915; |
68 | |
69 | const struct intel_memory_region_ops *ops; |
70 | |
71 | struct io_mapping iomap; |
72 | struct resource region; |
73 | |
74 | resource_size_t io_start; |
75 | resource_size_t io_size; |
76 | resource_size_t min_page_size; |
77 | resource_size_t total; |
78 | |
79 | u16 type; |
80 | u16 instance; |
81 | enum intel_region_id id; |
82 | char name[16]; |
83 | bool private; /* not for userspace */ |
84 | |
85 | struct { |
86 | struct mutex lock; /* Protects access to objects */ |
87 | struct list_head list; |
88 | } objects; |
89 | |
90 | bool is_range_manager; |
91 | |
92 | void *region_private; |
93 | }; |
94 | |
95 | struct intel_memory_region * |
96 | intel_memory_region_lookup(struct drm_i915_private *i915, |
97 | u16 class, u16 instance); |
98 | |
99 | struct intel_memory_region * |
100 | intel_memory_region_create(struct drm_i915_private *i915, |
101 | resource_size_t start, |
102 | resource_size_t size, |
103 | resource_size_t min_page_size, |
104 | resource_size_t io_start, |
105 | resource_size_t io_size, |
106 | u16 type, |
107 | u16 instance, |
108 | const struct intel_memory_region_ops *ops); |
109 | |
110 | void intel_memory_region_destroy(struct intel_memory_region *mem); |
111 | |
112 | int intel_memory_regions_hw_probe(struct drm_i915_private *i915); |
113 | void intel_memory_regions_driver_release(struct drm_i915_private *i915); |
114 | struct intel_memory_region * |
115 | intel_memory_region_by_type(struct drm_i915_private *i915, |
116 | enum intel_memory_type mem_type); |
117 | |
118 | __printf(2, 3) void |
119 | intel_memory_region_set_name(struct intel_memory_region *mem, |
120 | const char *fmt, ...); |
121 | |
122 | int intel_memory_region_reserve(struct intel_memory_region *mem, |
123 | resource_size_t offset, |
124 | resource_size_t size); |
125 | |
126 | void intel_memory_region_debug(struct intel_memory_region *mr, |
127 | struct drm_printer *printer); |
128 | |
129 | void intel_memory_region_avail(struct intel_memory_region *mr, |
130 | u64 *avail, u64 *visible_avail); |
131 | |
132 | struct intel_memory_region * |
133 | i915_gem_ttm_system_setup(struct drm_i915_private *i915, |
134 | u16 type, u16 instance); |
135 | struct intel_memory_region * |
136 | i915_gem_shmem_setup(struct drm_i915_private *i915, |
137 | u16 type, u16 instance); |
138 | |
139 | #endif |
140 | |