]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - queue-5.10/drm-vmwgfx-switch-over-to-the-new-pin-interface-v2.patch
5.10-stable patches
[thirdparty/kernel/stable-queue.git] / queue-5.10 / drm-vmwgfx-switch-over-to-the-new-pin-interface-v2.patch
CommitLineData
b7ca0ba0
SL
1From d43c32e37b480556e350deb013e56160ca2f41c1 Mon Sep 17 00:00:00 2001
2From: Sasha Levin <sashal@kernel.org>
3Date: Mon, 21 Sep 2020 14:37:25 +0200
4Subject: drm/vmwgfx: switch over to the new pin interface v2
5MIME-Version: 1.0
6Content-Type: text/plain; charset=UTF-8
7Content-Transfer-Encoding: 8bit
8
9From: Christian König <christian.koenig@amd.com>
10
11[ Upstream commit fbe86ca567919b22bbba1220ce55020b1868879f ]
12
13Stop using TTM_PL_FLAG_NO_EVICT.
14
15v2: fix unconditional pinning
16
17Signed-off-by: Christian König <christian.koenig@amd.com>
18Reviewed-by: Dave Airlie <airlied@redhat.com>
19Reviewed-by: Huang Rui <ray.huang@amd.com>
20Link: https://patchwork.freedesktop.org/patch/391601/?series=81973&rev=1
21Stable-dep-of: 517621b70600 ("drm/vmwgfx: Fix possible null pointer derefence with invalid contexts")
22Signed-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
37diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c b/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c
38index 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)) {
53diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
54index 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;
181diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
182index 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;
196diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
197index 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;
209diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
210index 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 *
255diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
256index 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 */
268diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
269index 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,
290diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
291index 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 */
305diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c b/drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
306index 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
320diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
321index 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,
408diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_validation.c b/drivers/gpu/drm/vmwgfx/vmwgfx_validation.c
409index 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--
4222.43.0
423