]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-5.10/drm-vmwgfx-switch-over-to-the-new-pin-interface-v2.patch
Fixes for 5.10
[thirdparty/kernel/stable-queue.git] / queue-5.10 / drm-vmwgfx-switch-over-to-the-new-pin-interface-v2.patch
1 From d43c32e37b480556e350deb013e56160ca2f41c1 Mon Sep 17 00:00:00 2001
2 From: Sasha Levin <sashal@kernel.org>
3 Date: Mon, 21 Sep 2020 14:37:25 +0200
4 Subject: drm/vmwgfx: switch over to the new pin interface v2
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8
9 From: Christian König <christian.koenig@amd.com>
10
11 [ Upstream commit fbe86ca567919b22bbba1220ce55020b1868879f ]
12
13 Stop using TTM_PL_FLAG_NO_EVICT.
14
15 v2: fix unconditional pinning
16
17 Signed-off-by: Christian König <christian.koenig@amd.com>
18 Reviewed-by: Dave Airlie <airlied@redhat.com>
19 Reviewed-by: Huang Rui <ray.huang@amd.com>
20 Link: https://patchwork.freedesktop.org/patch/391601/?series=81973&rev=1
21 Stable-dep-of: 517621b70600 ("drm/vmwgfx: Fix possible null pointer derefence with invalid contexts")
22 Signed-off-by: Sasha Levin <sashal@kernel.org>
23 ---
24 drivers/gpu/drm/vmwgfx/vmwgfx_blit.c | 4 +-
25 drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 49 +++++++++++-----------
26 drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c | 4 +-
27 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 2 +-
28 drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 7 +---
29 drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 2 +-
30 drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 4 +-
31 drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | 4 +-
32 drivers/gpu/drm/vmwgfx/vmwgfx_shader.c | 4 +-
33 drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c | 42 -------------------
34 drivers/gpu/drm/vmwgfx/vmwgfx_validation.c | 2 +-
35 11 files changed, 39 insertions(+), 85 deletions(-)
36
37 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c b/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c
38 index e8d66182cd7b5..ea2f2f937eb30 100644
39 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c
40 +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c
41 @@ -459,9 +459,9 @@ int vmw_bo_cpu_blit(struct ttm_buffer_object *dst,
42 int ret = 0;
43
44 /* Buffer objects need to be either pinned or reserved: */
45 - if (!(dst->mem.placement & TTM_PL_FLAG_NO_EVICT))
46 + if (!(dst->pin_count))
47 dma_resv_assert_held(dst->base.resv);
48 - if (!(src->mem.placement & TTM_PL_FLAG_NO_EVICT))
49 + if (!(src->pin_count))
50 dma_resv_assert_held(src->base.resv);
51
52 if (!ttm_tt_is_populated(dst->ttm)) {
53 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
54 index c8ca09f0e6274..9a66ba2543263 100644
55 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
56 +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
57 @@ -106,7 +106,7 @@ int vmw_bo_pin_in_placement(struct vmw_private *dev_priv,
58 if (unlikely(ret != 0))
59 goto err;
60
61 - if (buf->pin_count > 0)
62 + if (buf->base.pin_count > 0)
63 ret = ttm_bo_mem_compat(placement, &bo->mem,
64 &new_flags) == true ? 0 : -EINVAL;
65 else
66 @@ -155,7 +155,7 @@ int vmw_bo_pin_in_vram_or_gmr(struct vmw_private *dev_priv,
67 if (unlikely(ret != 0))
68 goto err;
69
70 - if (buf->pin_count > 0) {
71 + if (buf->base.pin_count > 0) {
72 ret = ttm_bo_mem_compat(&vmw_vram_gmr_placement, &bo->mem,
73 &new_flags) == true ? 0 : -EINVAL;
74 goto out_unreserve;
75 @@ -246,12 +246,12 @@ int vmw_bo_pin_in_start_of_vram(struct vmw_private *dev_priv,
76 if (bo->mem.mem_type == TTM_PL_VRAM &&
77 bo->mem.start < bo->num_pages &&
78 bo->mem.start > 0 &&
79 - buf->pin_count == 0) {
80 + buf->base.pin_count == 0) {
81 ctx.interruptible = false;
82 (void) ttm_bo_validate(bo, &vmw_sys_placement, &ctx);
83 }
84
85 - if (buf->pin_count > 0)
86 + if (buf->base.pin_count > 0)
87 ret = ttm_bo_mem_compat(&placement, &bo->mem,
88 &new_flags) == true ? 0 : -EINVAL;
89 else
90 @@ -343,23 +343,13 @@ void vmw_bo_pin_reserved(struct vmw_buffer_object *vbo, bool pin)
91
92 dma_resv_assert_held(bo->base.resv);
93
94 - if (pin) {
95 - if (vbo->pin_count++ > 0)
96 - return;
97 - } else {
98 - WARN_ON(vbo->pin_count <= 0);
99 - if (--vbo->pin_count > 0)
100 - return;
101 - }
102 + if (pin == !!bo->pin_count)
103 + return;
104
105 pl.fpfn = 0;
106 pl.lpfn = 0;
107 pl.mem_type = bo->mem.mem_type;
108 pl.flags = bo->mem.placement;
109 - if (pin)
110 - pl.flags |= TTM_PL_FLAG_NO_EVICT;
111 - else
112 - pl.flags &= ~TTM_PL_FLAG_NO_EVICT;
113
114 memset(&placement, 0, sizeof(placement));
115 placement.num_placement = 1;
116 @@ -368,8 +358,12 @@ void vmw_bo_pin_reserved(struct vmw_buffer_object *vbo, bool pin)
117 ret = ttm_bo_validate(bo, &placement, &ctx);
118
119 BUG_ON(ret != 0 || bo->mem.mem_type != old_mem_type);
120 -}
121
122 + if (pin)
123 + ttm_bo_pin(bo);
124 + else
125 + ttm_bo_unpin(bo);
126 +}
127
128 /**
129 * vmw_bo_map_and_cache - Map a buffer object and cache the map
130 @@ -539,6 +533,7 @@ int vmw_bo_create_kernel(struct vmw_private *dev_priv, unsigned long size,
131 * @size: Buffer object size in bytes.
132 * @placement: Initial placement.
133 * @interruptible: Whether waits should be performed interruptible.
134 + * @pin: If the BO should be created pinned at a fixed location.
135 * @bo_free: The buffer object destructor.
136 * Returns: Zero on success, negative error code on error.
137 *
138 @@ -547,9 +542,10 @@ int vmw_bo_create_kernel(struct vmw_private *dev_priv, unsigned long size,
139 int vmw_bo_init(struct vmw_private *dev_priv,
140 struct vmw_buffer_object *vmw_bo,
141 size_t size, struct ttm_placement *placement,
142 - bool interruptible,
143 + bool interruptible, bool pin,
144 void (*bo_free)(struct ttm_buffer_object *bo))
145 {
146 + struct ttm_operation_ctx ctx = { interruptible, false };
147 struct ttm_bo_device *bdev = &dev_priv->bdev;
148 size_t acc_size;
149 int ret;
150 @@ -563,11 +559,16 @@ int vmw_bo_init(struct vmw_private *dev_priv,
151 vmw_bo->base.priority = 3;
152 vmw_bo->res_tree = RB_ROOT;
153
154 - ret = ttm_bo_init(bdev, &vmw_bo->base, size,
155 - ttm_bo_type_device, placement,
156 - 0, interruptible, acc_size,
157 - NULL, NULL, bo_free);
158 - return ret;
159 + ret = ttm_bo_init_reserved(bdev, &vmw_bo->base, size,
160 + ttm_bo_type_device, placement,
161 + 0, &ctx, acc_size, NULL, NULL, bo_free);
162 + if (unlikely(ret))
163 + return ret;
164 +
165 + if (pin)
166 + ttm_bo_pin(&vmw_bo->base);
167 + ttm_bo_unreserve(&vmw_bo->base);
168 + return 0;
169 }
170
171
172 @@ -656,7 +657,7 @@ int vmw_user_bo_alloc(struct vmw_private *dev_priv,
173 ret = vmw_bo_init(dev_priv, &user_bo->vbo, size,
174 (dev_priv->has_mob) ?
175 &vmw_sys_placement :
176 - &vmw_vram_sys_placement, true,
177 + &vmw_vram_sys_placement, true, false,
178 &vmw_user_bo_destroy);
179 if (unlikely(ret != 0))
180 return ret;
181 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
182 index 65e8e7a977246..984d8884357d9 100644
183 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
184 +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
185 @@ -410,8 +410,8 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size)
186 if (!buf)
187 return -ENOMEM;
188
189 - ret = vmw_bo_init(dev_priv, buf, new_size, &vmw_mob_ne_placement,
190 - true, vmw_bo_bo_free);
191 + ret = vmw_bo_init(dev_priv, buf, new_size, &vmw_mob_placement,
192 + true, true, vmw_bo_bo_free);
193 if (ret) {
194 DRM_ERROR("Failed initializing new cotable MOB.\n");
195 return ret;
196 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
197 index 31e3e5c9f3622..bdb7a5e965601 100644
198 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
199 +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
200 @@ -372,7 +372,7 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)
201 return -ENOMEM;
202
203 ret = vmw_bo_init(dev_priv, vbo, PAGE_SIZE,
204 - &vmw_sys_ne_placement, false,
205 + &vmw_sys_placement, false, true,
206 &vmw_bo_bo_free);
207 if (unlikely(ret != 0))
208 return ret;
209 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
210 index e6af950c40370..fa285c20d6dac 100644
211 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
212 +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
213 @@ -99,7 +99,6 @@ struct vmw_fpriv {
214 * struct vmw_buffer_object - TTM buffer object with vmwgfx additions
215 * @base: The TTM buffer object
216 * @res_tree: RB tree of resources using this buffer object as a backing MOB
217 - * @pin_count: pin depth
218 * @cpu_writers: Number of synccpu write grabs. Protected by reservation when
219 * increased. May be decreased without reservation.
220 * @dx_query_ctx: DX context if this buffer object is used as a DX query MOB
221 @@ -110,7 +109,6 @@ struct vmw_fpriv {
222 struct vmw_buffer_object {
223 struct ttm_buffer_object base;
224 struct rb_root res_tree;
225 - s32 pin_count;
226 atomic_t cpu_writers;
227 /* Not ref-counted. Protected by binding_mutex */
228 struct vmw_resource *dx_query_ctx;
229 @@ -852,7 +850,7 @@ extern int vmw_bo_create_kernel(struct vmw_private *dev_priv,
230 extern int vmw_bo_init(struct vmw_private *dev_priv,
231 struct vmw_buffer_object *vmw_bo,
232 size_t size, struct ttm_placement *placement,
233 - bool interruptible,
234 + bool interruptible, bool pin,
235 void (*bo_free)(struct ttm_buffer_object *bo));
236 extern int vmw_user_bo_verify_access(struct ttm_buffer_object *bo,
237 struct ttm_object_file *tfile);
238 @@ -1009,16 +1007,13 @@ extern void vmw_validation_mem_init_ttm(struct vmw_private *dev_priv,
239
240 extern const size_t vmw_tt_size;
241 extern struct ttm_placement vmw_vram_placement;
242 -extern struct ttm_placement vmw_vram_ne_placement;
243 extern struct ttm_placement vmw_vram_sys_placement;
244 extern struct ttm_placement vmw_vram_gmr_placement;
245 extern struct ttm_placement vmw_vram_gmr_ne_placement;
246 extern struct ttm_placement vmw_sys_placement;
247 -extern struct ttm_placement vmw_sys_ne_placement;
248 extern struct ttm_placement vmw_evictable_placement;
249 extern struct ttm_placement vmw_srf_placement;
250 extern struct ttm_placement vmw_mob_placement;
251 -extern struct ttm_placement vmw_mob_ne_placement;
252 extern struct ttm_placement vmw_nonfixed_placement;
253 extern struct ttm_bo_driver vmw_bo_driver;
254 extern const struct vmw_sg_table *
255 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
256 index 97d9d2557447b..3923acc3ab1e5 100644
257 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
258 +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
259 @@ -406,7 +406,7 @@ static int vmw_fb_create_bo(struct vmw_private *vmw_priv,
260
261 ret = vmw_bo_init(vmw_priv, vmw_bo, size,
262 &vmw_sys_placement,
263 - false,
264 + false, false,
265 &vmw_bo_bo_free);
266 if (unlikely(ret != 0))
267 goto err_unlock; /* init frees the buffer on failure */
268 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
269 index c0f156078ddae..5e922d9d5f2cc 100644
270 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
271 +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
272 @@ -370,7 +370,7 @@ static int vmw_resource_buf_alloc(struct vmw_resource *res,
273
274 ret = vmw_bo_init(res->dev_priv, backup, res->backup_size,
275 res->func->backup_placement,
276 - interruptible,
277 + interruptible, false,
278 &vmw_bo_bo_free);
279 if (unlikely(ret != 0))
280 goto out_no_bo;
281 @@ -1002,7 +1002,7 @@ int vmw_resource_pin(struct vmw_resource *res, bool interruptible)
282 vbo = res->backup;
283
284 ttm_bo_reserve(&vbo->base, interruptible, false, NULL);
285 - if (!vbo->pin_count) {
286 + if (!vbo->base.pin_count) {
287 ret = ttm_bo_validate
288 (&vbo->base,
289 res->func->backup_placement,
290 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
291 index 2b6590344468d..9c8109efefbd6 100644
292 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
293 +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
294 @@ -451,8 +451,8 @@ vmw_sou_primary_plane_prepare_fb(struct drm_plane *plane,
295 */
296 vmw_overlay_pause_all(dev_priv);
297 ret = vmw_bo_init(dev_priv, vps->bo, size,
298 - &vmw_vram_ne_placement,
299 - false, &vmw_bo_bo_free);
300 + &vmw_vram_placement,
301 + false, true, &vmw_bo_bo_free);
302 vmw_overlay_resume_all(dev_priv);
303 if (ret) {
304 vps->bo = NULL; /* vmw_bo_init frees on error */
305 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
306 index e139fdfd16356..f328aa5839a22 100644
307 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
308 +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
309 @@ -978,8 +978,8 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,
310 if (unlikely(!buf))
311 return -ENOMEM;
312
313 - ret = vmw_bo_init(dev_priv, buf, size, &vmw_sys_ne_placement,
314 - true, vmw_bo_bo_free);
315 + ret = vmw_bo_init(dev_priv, buf, size, &vmw_sys_placement,
316 + true, true, vmw_bo_bo_free);
317 if (unlikely(ret != 0))
318 goto out;
319
320 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
321 index 8abeef691ad29..89b3356ec27f0 100644
322 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
323 +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
324 @@ -37,13 +37,6 @@ static const struct ttm_place vram_placement_flags = {
325 .flags = TTM_PL_FLAG_CACHED
326 };
327
328 -static const struct ttm_place vram_ne_placement_flags = {
329 - .fpfn = 0,
330 - .lpfn = 0,
331 - .mem_type = TTM_PL_VRAM,
332 - .flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
333 -};
334 -
335 static const struct ttm_place sys_placement_flags = {
336 .fpfn = 0,
337 .lpfn = 0,
338 @@ -51,13 +44,6 @@ static const struct ttm_place sys_placement_flags = {
339 .flags = TTM_PL_FLAG_CACHED
340 };
341
342 -static const struct ttm_place sys_ne_placement_flags = {
343 - .fpfn = 0,
344 - .lpfn = 0,
345 - .mem_type = TTM_PL_SYSTEM,
346 - .flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
347 -};
348 -
349 static const struct ttm_place gmr_placement_flags = {
350 .fpfn = 0,
351 .lpfn = 0,
352 @@ -79,13 +65,6 @@ static const struct ttm_place mob_placement_flags = {
353 .flags = TTM_PL_FLAG_CACHED
354 };
355
356 -static const struct ttm_place mob_ne_placement_flags = {
357 - .fpfn = 0,
358 - .lpfn = 0,
359 - .mem_type = VMW_PL_MOB,
360 - .flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
361 -};
362 -
363 struct ttm_placement vmw_vram_placement = {
364 .num_placement = 1,
365 .placement = &vram_placement_flags,
366 @@ -158,13 +137,6 @@ struct ttm_placement vmw_vram_sys_placement = {
367 .busy_placement = &sys_placement_flags
368 };
369
370 -struct ttm_placement vmw_vram_ne_placement = {
371 - .num_placement = 1,
372 - .placement = &vram_ne_placement_flags,
373 - .num_busy_placement = 1,
374 - .busy_placement = &vram_ne_placement_flags
375 -};
376 -
377 struct ttm_placement vmw_sys_placement = {
378 .num_placement = 1,
379 .placement = &sys_placement_flags,
380 @@ -172,13 +144,6 @@ struct ttm_placement vmw_sys_placement = {
381 .busy_placement = &sys_placement_flags
382 };
383
384 -struct ttm_placement vmw_sys_ne_placement = {
385 - .num_placement = 1,
386 - .placement = &sys_ne_placement_flags,
387 - .num_busy_placement = 1,
388 - .busy_placement = &sys_ne_placement_flags
389 -};
390 -
391 static const struct ttm_place evictable_placement_flags[] = {
392 {
393 .fpfn = 0,
394 @@ -243,13 +208,6 @@ struct ttm_placement vmw_mob_placement = {
395 .busy_placement = &mob_placement_flags
396 };
397
398 -struct ttm_placement vmw_mob_ne_placement = {
399 - .num_placement = 1,
400 - .num_busy_placement = 1,
401 - .placement = &mob_ne_placement_flags,
402 - .busy_placement = &mob_ne_placement_flags
403 -};
404 -
405 struct ttm_placement vmw_nonfixed_placement = {
406 .num_placement = 3,
407 .placement = nonfixed_placement_flags,
408 diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_validation.c b/drivers/gpu/drm/vmwgfx/vmwgfx_validation.c
409 index e69bc373ae2e5..f2e2bf6d1421f 100644
410 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_validation.c
411 +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_validation.c
412 @@ -540,7 +540,7 @@ int vmw_validation_bo_validate_single(struct ttm_buffer_object *bo,
413 if (atomic_read(&vbo->cpu_writers))
414 return -EBUSY;
415
416 - if (vbo->pin_count > 0)
417 + if (vbo->base.pin_count > 0)
418 return 0;
419
420 if (validate_as_mob)
421 --
422 2.43.0
423