forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
....@@ -25,6 +25,8 @@
2525 *
2626 **************************************************************************/
2727
28
+#include <linux/highmem.h>
29
+
2830 #include "vmwgfx_drv.h"
2931
3032 /*
....@@ -146,9 +148,8 @@
146148 mob->pt_level += VMW_MOBFMT_PTDEPTH_1 - SVGA3D_MOBFMT_PTDEPTH_1;
147149 }
148150
149
- cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd));
151
+ cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd));
150152 if (unlikely(cmd == NULL)) {
151
- DRM_ERROR("Failed reserving FIFO space for OTable setup.\n");
152153 ret = -ENOMEM;
153154 goto out_no_fifo;
154155 }
....@@ -202,12 +203,9 @@
202203 return;
203204
204205 bo = otable->page_table->pt_bo;
205
- cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd));
206
- if (unlikely(cmd == NULL)) {
207
- DRM_ERROR("Failed reserving FIFO space for OTable "
208
- "takedown.\n");
206
+ cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd));
207
+ if (unlikely(cmd == NULL))
209208 return;
210
- }
211209
212210 memset(cmd, 0, sizeof(*cmd));
213211 cmd->header.id = SVGA_3D_CMD_SET_OTABLE_BASE;
....@@ -240,10 +238,6 @@
240238 unsigned long offset;
241239 unsigned long bo_size;
242240 struct vmw_otable *otables = batch->otables;
243
- struct ttm_operation_ctx ctx = {
244
- .interruptible = false,
245
- .no_wait_gpu = false
246
- };
247241 SVGAOTableType i;
248242 int ret;
249243
....@@ -257,24 +251,9 @@
257251 bo_size += otables[i].size;
258252 }
259253
260
- ret = ttm_bo_create(&dev_priv->bdev, bo_size,
261
- ttm_bo_type_device,
262
- &vmw_sys_ne_placement,
263
- 0, false, &batch->otable_bo);
264
-
254
+ ret = vmw_bo_create_and_populate(dev_priv, bo_size, &batch->otable_bo);
265255 if (unlikely(ret != 0))
266
- goto out_no_bo;
267
-
268
- ret = ttm_bo_reserve(batch->otable_bo, false, true, NULL);
269
- BUG_ON(ret != 0);
270
- ret = vmw_bo_driver.ttm_tt_populate(batch->otable_bo->ttm, &ctx);
271
- if (unlikely(ret != 0))
272
- goto out_unreserve;
273
- ret = vmw_bo_map_dma(batch->otable_bo);
274
- if (unlikely(ret != 0))
275
- goto out_unreserve;
276
-
277
- ttm_bo_unreserve(batch->otable_bo);
256
+ return ret;
278257
279258 offset = 0;
280259 for (i = 0; i < batch->num_otables; ++i) {
....@@ -291,8 +270,6 @@
291270
292271 return 0;
293272
294
-out_unreserve:
295
- ttm_bo_unreserve(batch->otable_bo);
296273 out_no_setup:
297274 for (i = 0; i < batch->num_otables; ++i) {
298275 if (batch->otables[i].enabled)
....@@ -300,8 +277,8 @@
300277 &batch->otables[i]);
301278 }
302279
303
- ttm_bo_unref(&batch->otable_bo);
304
-out_no_bo:
280
+ ttm_bo_put(batch->otable_bo);
281
+ batch->otable_bo = NULL;
305282 return ret;
306283 }
307284
....@@ -321,7 +298,7 @@
321298 struct vmw_otable **otables = &dev_priv->otable_batch.otables;
322299 int ret;
323300
324
- if (dev_priv->has_dx) {
301
+ if (has_sm4_context(dev_priv)) {
325302 *otables = kmemdup(dx_tables, sizeof(dx_tables), GFP_KERNEL);
326303 if (!(*otables))
327304 return -ENOMEM;
....@@ -365,7 +342,8 @@
365342 vmw_bo_fence_single(bo, NULL);
366343 ttm_bo_unreserve(bo);
367344
368
- ttm_bo_unref(&batch->otable_bo);
345
+ ttm_bo_put(batch->otable_bo);
346
+ batch->otable_bo = NULL;
369347 }
370348
371349 /*
....@@ -432,40 +410,9 @@
432410 static int vmw_mob_pt_populate(struct vmw_private *dev_priv,
433411 struct vmw_mob *mob)
434412 {
435
- int ret;
436
- struct ttm_operation_ctx ctx = {
437
- .interruptible = false,
438
- .no_wait_gpu = false
439
- };
440
-
441413 BUG_ON(mob->pt_bo != NULL);
442414
443
- ret = ttm_bo_create(&dev_priv->bdev, mob->num_pages * PAGE_SIZE,
444
- ttm_bo_type_device,
445
- &vmw_sys_ne_placement,
446
- 0, false, &mob->pt_bo);
447
- if (unlikely(ret != 0))
448
- return ret;
449
-
450
- ret = ttm_bo_reserve(mob->pt_bo, false, true, NULL);
451
-
452
- BUG_ON(ret != 0);
453
- ret = vmw_bo_driver.ttm_tt_populate(mob->pt_bo->ttm, &ctx);
454
- if (unlikely(ret != 0))
455
- goto out_unreserve;
456
- ret = vmw_bo_map_dma(mob->pt_bo);
457
- if (unlikely(ret != 0))
458
- goto out_unreserve;
459
-
460
- ttm_bo_unreserve(mob->pt_bo);
461
-
462
- return 0;
463
-
464
-out_unreserve:
465
- ttm_bo_unreserve(mob->pt_bo);
466
- ttm_bo_unref(&mob->pt_bo);
467
-
468
- return ret;
415
+ return vmw_bo_create_and_populate(dev_priv, mob->num_pages * PAGE_SIZE, &mob->pt_bo);
469416 }
470417
471418 /**
....@@ -580,8 +527,10 @@
580527 */
581528 void vmw_mob_destroy(struct vmw_mob *mob)
582529 {
583
- if (mob->pt_bo)
584
- ttm_bo_unref(&mob->pt_bo);
530
+ if (mob->pt_bo) {
531
+ ttm_bo_put(mob->pt_bo);
532
+ mob->pt_bo = NULL;
533
+ }
585534 kfree(mob);
586535 }
587536
....@@ -609,16 +558,14 @@
609558 BUG_ON(ret != 0);
610559 }
611560
612
- cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd));
613
- if (unlikely(cmd == NULL)) {
614
- DRM_ERROR("Failed reserving FIFO space for Memory "
615
- "Object unbinding.\n");
616
- } else {
561
+ cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd));
562
+ if (cmd) {
617563 cmd->header.id = SVGA_3D_CMD_DESTROY_GB_MOB;
618564 cmd->header.size = sizeof(cmd->body);
619565 cmd->body.mobid = mob->id;
620566 vmw_fifo_commit(dev_priv, sizeof(*cmd));
621567 }
568
+
622569 if (bo) {
623570 vmw_bo_fence_single(bo, NULL);
624571 ttm_bo_unreserve(bo);
....@@ -678,12 +625,9 @@
678625
679626 vmw_fifo_resource_inc(dev_priv);
680627
681
- cmd = vmw_fifo_reserve(dev_priv, sizeof(*cmd));
682
- if (unlikely(cmd == NULL)) {
683
- DRM_ERROR("Failed reserving FIFO space for Memory "
684
- "Object binding.\n");
628
+ cmd = VMW_FIFO_RESERVE(dev_priv, sizeof(*cmd));
629
+ if (unlikely(cmd == NULL))
685630 goto out_no_cmd_space;
686
- }
687631
688632 cmd->header.id = SVGA_3D_CMD_DEFINE_GB_MOB64;
689633 cmd->header.size = sizeof(cmd->body);
....@@ -698,8 +642,10 @@
698642
699643 out_no_cmd_space:
700644 vmw_fifo_resource_dec(dev_priv);
701
- if (pt_set_up)
702
- ttm_bo_unref(&mob->pt_bo);
645
+ if (pt_set_up) {
646
+ ttm_bo_put(mob->pt_bo);
647
+ mob->pt_bo = NULL;
648
+ }
703649
704650 return -ENOMEM;
705651 }