aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_object.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.c112
1 files changed, 60 insertions, 52 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 9113fffbb8b9..04c376f27611 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -116,87 +116,95 @@ bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object *bo)
116 116
117static void amdgpu_ttm_placement_init(struct amdgpu_device *adev, 117static void amdgpu_ttm_placement_init(struct amdgpu_device *adev,
118 struct ttm_placement *placement, 118 struct ttm_placement *placement,
119 struct ttm_place *placements, 119 struct ttm_place *places,
120 u32 domain, u64 flags) 120 u32 domain, u64 flags)
121{ 121{
122 u32 c = 0, i; 122 u32 c = 0, i;
123 123
124 placement->placement = placements;
125 placement->busy_placement = placements;
126
127 if (domain & AMDGPU_GEM_DOMAIN_VRAM) { 124 if (domain & AMDGPU_GEM_DOMAIN_VRAM) {
125 unsigned visible_pfn = adev->mc.visible_vram_size >> PAGE_SHIFT;
126
128 if (flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS && 127 if (flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS &&
129 adev->mc.visible_vram_size < adev->mc.real_vram_size) { 128 adev->mc.visible_vram_size < adev->mc.real_vram_size) {
130 placements[c].fpfn = 129 places[c].fpfn = visible_pfn;
131 adev->mc.visible_vram_size >> PAGE_SHIFT; 130 if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
132 placements[c++].flags = TTM_PL_FLAG_WC | 131 places[c].lpfn = visible_pfn;
132 else
133 places[c].lpfn = 0;
134 places[c].flags = TTM_PL_FLAG_WC |
133 TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM | 135 TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM |
134 TTM_PL_FLAG_TOPDOWN; 136 TTM_PL_FLAG_TOPDOWN;
137 c++;
135 } 138 }
136 placements[c].fpfn = 0; 139
137 placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | 140 places[c].fpfn = 0;
141 places[c].lpfn = 0;
142 places[c].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
138 TTM_PL_FLAG_VRAM; 143 TTM_PL_FLAG_VRAM;
139 if (!(flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)) 144 if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)
140 placements[c - 1].flags |= TTM_PL_FLAG_TOPDOWN; 145 places[c].lpfn = visible_pfn;
146 else
147 places[c].flags |= TTM_PL_FLAG_TOPDOWN;
148 c++;
141 } 149 }
142 150
143 if (domain & AMDGPU_GEM_DOMAIN_GTT) { 151 if (domain & AMDGPU_GEM_DOMAIN_GTT) {
144 if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC) { 152 places[c].fpfn = 0;
145 placements[c].fpfn = 0; 153 places[c].lpfn = 0;
146 placements[c++].flags = TTM_PL_FLAG_WC | 154 places[c].flags = TTM_PL_FLAG_TT;
147 TTM_PL_FLAG_TT | TTM_PL_FLAG_UNCACHED; 155 if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
148 } else { 156 places[c].flags |= TTM_PL_FLAG_WC |
149 placements[c].fpfn = 0; 157 TTM_PL_FLAG_UNCACHED;
150 placements[c++].flags = TTM_PL_FLAG_CACHED | 158 else
151 TTM_PL_FLAG_TT; 159 places[c].flags |= TTM_PL_FLAG_CACHED;
152 } 160 c++;
153 } 161 }
154 162
155 if (domain & AMDGPU_GEM_DOMAIN_CPU) { 163 if (domain & AMDGPU_GEM_DOMAIN_CPU) {
156 if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC) { 164 places[c].fpfn = 0;
157 placements[c].fpfn = 0; 165 places[c].lpfn = 0;
158 placements[c++].flags = TTM_PL_FLAG_WC | 166 places[c].flags = TTM_PL_FLAG_SYSTEM;
159 TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_UNCACHED; 167 if (flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC)
160 } else { 168 places[c].flags |= TTM_PL_FLAG_WC |
161 placements[c].fpfn = 0; 169 TTM_PL_FLAG_UNCACHED;
162 placements[c++].flags = TTM_PL_FLAG_CACHED | 170 else
163 TTM_PL_FLAG_SYSTEM; 171 places[c].flags |= TTM_PL_FLAG_CACHED;
164 } 172 c++;
165 } 173 }
166 174
167 if (domain & AMDGPU_GEM_DOMAIN_GDS) { 175 if (domain & AMDGPU_GEM_DOMAIN_GDS) {
168 placements[c].fpfn = 0; 176 places[c].fpfn = 0;
169 placements[c++].flags = TTM_PL_FLAG_UNCACHED | 177 places[c].lpfn = 0;
170 AMDGPU_PL_FLAG_GDS; 178 places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_GDS;
179 c++;
171 } 180 }
181
172 if (domain & AMDGPU_GEM_DOMAIN_GWS) { 182 if (domain & AMDGPU_GEM_DOMAIN_GWS) {
173 placements[c].fpfn = 0; 183 places[c].fpfn = 0;
174 placements[c++].flags = TTM_PL_FLAG_UNCACHED | 184 places[c].lpfn = 0;
175 AMDGPU_PL_FLAG_GWS; 185 places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_GWS;
186 c++;
176 } 187 }
188
177 if (domain & AMDGPU_GEM_DOMAIN_OA) { 189 if (domain & AMDGPU_GEM_DOMAIN_OA) {
178 placements[c].fpfn = 0; 190 places[c].fpfn = 0;
179 placements[c++].flags = TTM_PL_FLAG_UNCACHED | 191 places[c].lpfn = 0;
180 AMDGPU_PL_FLAG_OA; 192 places[c].flags = TTM_PL_FLAG_UNCACHED | AMDGPU_PL_FLAG_OA;
193 c++;
181 } 194 }
182 195
183 if (!c) { 196 if (!c) {
184 placements[c].fpfn = 0; 197 places[c].fpfn = 0;
185 placements[c++].flags = TTM_PL_MASK_CACHING | 198 places[c].lpfn = 0;
186 TTM_PL_FLAG_SYSTEM; 199 places[c].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
200 c++;
187 } 201 }
202
188 placement->num_placement = c; 203 placement->num_placement = c;
189 placement->num_busy_placement = c; 204 placement->placement = places;
190 205
191 for (i = 0; i < c; i++) { 206 placement->num_busy_placement = c;
192 if ((flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) && 207 placement->busy_placement = places;
193 (placements[i].flags & TTM_PL_FLAG_VRAM) &&
194 !placements[i].fpfn)
195 placements[i].lpfn =
196 adev->mc.visible_vram_size >> PAGE_SHIFT;
197 else
198 placements[i].lpfn = 0;
199 }
200} 208}
201 209
202void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *rbo, u32 domain) 210void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *rbo, u32 domain)