forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/gpu/drm/vc4/vc4_bo.c
....@@ -1,9 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright © 2015 Broadcom
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License version 2 as
6
- * published by the Free Software Foundation.
74 */
85
96 /**
....@@ -40,7 +37,7 @@
4037 return label >= VC4_BO_TYPE_COUNT;
4138 }
4239
43
-static void vc4_bo_stats_dump(struct vc4_dev *vc4)
40
+static void vc4_bo_stats_print(struct drm_printer *p, struct vc4_dev *vc4)
4441 {
4542 int i;
4643
....@@ -48,58 +45,35 @@
4845 if (!vc4->bo_labels[i].num_allocated)
4946 continue;
5047
51
- DRM_INFO("%30s: %6dkb BOs (%d)\n",
52
- vc4->bo_labels[i].name,
53
- vc4->bo_labels[i].size_allocated / 1024,
54
- vc4->bo_labels[i].num_allocated);
55
- }
56
-
57
- mutex_lock(&vc4->purgeable.lock);
58
- if (vc4->purgeable.num)
59
- DRM_INFO("%30s: %6zdkb BOs (%d)\n", "userspace BO cache",
60
- vc4->purgeable.size / 1024, vc4->purgeable.num);
61
-
62
- if (vc4->purgeable.purged_num)
63
- DRM_INFO("%30s: %6zdkb BOs (%d)\n", "total purged BO",
64
- vc4->purgeable.purged_size / 1024,
65
- vc4->purgeable.purged_num);
66
- mutex_unlock(&vc4->purgeable.lock);
67
-}
68
-
69
-#ifdef CONFIG_DEBUG_FS
70
-int vc4_bo_stats_debugfs(struct seq_file *m, void *unused)
71
-{
72
- struct drm_info_node *node = (struct drm_info_node *)m->private;
73
- struct drm_device *dev = node->minor->dev;
74
- struct vc4_dev *vc4 = to_vc4_dev(dev);
75
- int i;
76
-
77
- mutex_lock(&vc4->bo_lock);
78
- for (i = 0; i < vc4->num_labels; i++) {
79
- if (!vc4->bo_labels[i].num_allocated)
80
- continue;
81
-
82
- seq_printf(m, "%30s: %6dkb BOs (%d)\n",
48
+ drm_printf(p, "%30s: %6dkb BOs (%d)\n",
8349 vc4->bo_labels[i].name,
8450 vc4->bo_labels[i].size_allocated / 1024,
8551 vc4->bo_labels[i].num_allocated);
8652 }
87
- mutex_unlock(&vc4->bo_lock);
8853
8954 mutex_lock(&vc4->purgeable.lock);
9055 if (vc4->purgeable.num)
91
- seq_printf(m, "%30s: %6zdkb BOs (%d)\n", "userspace BO cache",
56
+ drm_printf(p, "%30s: %6zdkb BOs (%d)\n", "userspace BO cache",
9257 vc4->purgeable.size / 1024, vc4->purgeable.num);
9358
9459 if (vc4->purgeable.purged_num)
95
- seq_printf(m, "%30s: %6zdkb BOs (%d)\n", "total purged BO",
60
+ drm_printf(p, "%30s: %6zdkb BOs (%d)\n", "total purged BO",
9661 vc4->purgeable.purged_size / 1024,
9762 vc4->purgeable.purged_num);
9863 mutex_unlock(&vc4->purgeable.lock);
64
+}
65
+
66
+static int vc4_bo_stats_debugfs(struct seq_file *m, void *unused)
67
+{
68
+ struct drm_info_node *node = (struct drm_info_node *)m->private;
69
+ struct drm_device *dev = node->minor->dev;
70
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
71
+ struct drm_printer p = drm_seq_file_printer(m);
72
+
73
+ vc4_bo_stats_print(&p, vc4);
9974
10075 return 0;
10176 }
102
-#endif
10377
10478 /* Takes ownership of *name and returns the appropriate slot for it in
10579 * the bo_labels[] array, extending it as necessary.
....@@ -200,8 +174,6 @@
200174 kfree(bo->validated_shader);
201175 bo->validated_shader = NULL;
202176 }
203
-
204
- reservation_object_fini(&bo->_resv);
205177
206178 drm_gem_cma_free_object(obj);
207179 }
....@@ -427,8 +399,6 @@
427399 vc4->bo_labels[VC4_BO_TYPE_KERNEL].num_allocated++;
428400 vc4->bo_labels[VC4_BO_TYPE_KERNEL].size_allocated += size;
429401 mutex_unlock(&vc4->bo_lock);
430
- bo->resv = &bo->_resv;
431
- reservation_object_init(bo->resv);
432402
433403 return &bo->base.base;
434404 }
....@@ -479,8 +449,9 @@
479449 }
480450
481451 if (IS_ERR(cma_obj)) {
452
+ struct drm_printer p = drm_info_printer(vc4->base.dev);
482453 DRM_ERROR("Failed to allocate from CMA:\n");
483
- vc4_bo_stats_dump(vc4);
454
+ vc4_bo_stats_print(&p, vc4);
484455 return ERR_PTR(-ENOMEM);
485456 }
486457 bo = to_vc4_bo(&cma_obj->base);
....@@ -519,7 +490,7 @@
519490 bo->madv = VC4_MADV_WILLNEED;
520491
521492 ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
522
- drm_gem_object_put_unlocked(&bo->base.base);
493
+ drm_gem_object_put(&bo->base.base);
523494
524495 return ret;
525496 }
....@@ -619,7 +590,7 @@
619590 {
620591 struct vc4_dev *vc4 =
621592 container_of(work, struct vc4_dev, bo_cache.time_work);
622
- struct drm_device *dev = vc4->dev;
593
+ struct drm_device *dev = &vc4->base;
623594
624595 mutex_lock(&vc4->bo_lock);
625596 vc4_bo_cache_free_old(dev);
....@@ -684,15 +655,7 @@
684655 schedule_work(&vc4->bo_cache.time_work);
685656 }
686657
687
-struct reservation_object *vc4_prime_res_obj(struct drm_gem_object *obj)
688
-{
689
- struct vc4_bo *bo = to_vc4_bo(obj);
690
-
691
- return bo->resv;
692
-}
693
-
694
-struct dma_buf *
695
-vc4_prime_export(struct drm_device *dev, struct drm_gem_object *obj, int flags)
658
+struct dma_buf * vc4_prime_export(struct drm_gem_object *obj, int flags)
696659 {
697660 struct vc4_bo *bo = to_vc4_bo(obj);
698661 struct dma_buf *dmabuf;
....@@ -714,7 +677,7 @@
714677 return ERR_PTR(ret);
715678 }
716679
717
- dmabuf = drm_gem_prime_export(dev, obj, flags);
680
+ dmabuf = drm_gem_prime_export(obj, flags);
718681 if (IS_ERR(dmabuf))
719682 vc4_bo_dec_usecnt(bo);
720683
....@@ -822,24 +785,43 @@
822785 struct sg_table *sgt)
823786 {
824787 struct drm_gem_object *obj;
825
- struct vc4_bo *bo;
826788
827789 obj = drm_gem_cma_prime_import_sg_table(dev, attach, sgt);
828790 if (IS_ERR(obj))
829791 return obj;
830792
831
- bo = to_vc4_bo(obj);
832
- bo->resv = attach->dmabuf->resv;
833
-
834793 return obj;
794
+}
795
+
796
+static int vc4_grab_bin_bo(struct vc4_dev *vc4, struct vc4_file *vc4file)
797
+{
798
+ int ret;
799
+
800
+ if (!vc4->v3d)
801
+ return -ENODEV;
802
+
803
+ if (vc4file->bin_bo_used)
804
+ return 0;
805
+
806
+ ret = vc4_v3d_bin_bo_get(vc4, &vc4file->bin_bo_used);
807
+ if (ret)
808
+ return ret;
809
+
810
+ return 0;
835811 }
836812
837813 int vc4_create_bo_ioctl(struct drm_device *dev, void *data,
838814 struct drm_file *file_priv)
839815 {
840816 struct drm_vc4_create_bo *args = data;
817
+ struct vc4_file *vc4file = file_priv->driver_priv;
818
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
841819 struct vc4_bo *bo = NULL;
842820 int ret;
821
+
822
+ ret = vc4_grab_bin_bo(vc4, vc4file);
823
+ if (ret)
824
+ return ret;
843825
844826 /*
845827 * We can't allocate from the BO cache, because the BOs don't
....@@ -852,7 +834,7 @@
852834 bo->madv = VC4_MADV_WILLNEED;
853835
854836 ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
855
- drm_gem_object_put_unlocked(&bo->base.base);
837
+ drm_gem_object_put(&bo->base.base);
856838
857839 return ret;
858840 }
....@@ -872,7 +854,7 @@
872854 /* The mmap offset was set up at BO allocation time. */
873855 args->offset = drm_vma_node_offset_addr(&gem_obj->vma_node);
874856
875
- drm_gem_object_put_unlocked(gem_obj);
857
+ drm_gem_object_put(gem_obj);
876858 return 0;
877859 }
878860
....@@ -881,6 +863,8 @@
881863 struct drm_file *file_priv)
882864 {
883865 struct drm_vc4_create_shader_bo *args = data;
866
+ struct vc4_file *vc4file = file_priv->driver_priv;
867
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
884868 struct vc4_bo *bo = NULL;
885869 int ret;
886870
....@@ -899,6 +883,10 @@
899883 DRM_INFO("Pad set: 0x%08x\n", args->pad);
900884 return -EINVAL;
901885 }
886
+
887
+ ret = vc4_grab_bin_bo(vc4, vc4file);
888
+ if (ret)
889
+ return ret;
902890
903891 bo = vc4_bo_create(dev, args->size, true, VC4_BO_TYPE_V3D_SHADER);
904892 if (IS_ERR(bo))
....@@ -929,8 +917,8 @@
929917 */
930918 ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
931919
932
- fail:
933
- drm_gem_object_put_unlocked(&bo->base.base);
920
+fail:
921
+ drm_gem_object_put(&bo->base.base);
934922
935923 return ret;
936924 }
....@@ -977,7 +965,7 @@
977965 bo = to_vc4_bo(gem_obj);
978966 bo->t_format = t_format;
979967
980
- drm_gem_object_put_unlocked(gem_obj);
968
+ drm_gem_object_put(gem_obj);
981969
982970 return 0;
983971 }
....@@ -1012,11 +1000,12 @@
10121000 else
10131001 args->modifier = DRM_FORMAT_MOD_NONE;
10141002
1015
- drm_gem_object_put_unlocked(gem_obj);
1003
+ drm_gem_object_put(gem_obj);
10161004
10171005 return 0;
10181006 }
10191007
1008
+static void vc4_bo_cache_destroy(struct drm_device *dev, void *unused);
10201009 int vc4_bo_cache_init(struct drm_device *dev)
10211010 {
10221011 struct vc4_dev *vc4 = to_vc4_dev(dev);
....@@ -1038,15 +1027,17 @@
10381027
10391028 mutex_init(&vc4->bo_lock);
10401029
1030
+ vc4_debugfs_add_file(dev, "bo_stats", vc4_bo_stats_debugfs, NULL);
1031
+
10411032 INIT_LIST_HEAD(&vc4->bo_cache.time_list);
10421033
10431034 INIT_WORK(&vc4->bo_cache.time_work, vc4_bo_cache_time_work);
10441035 timer_setup(&vc4->bo_cache.time_timer, vc4_bo_cache_time_timer, 0);
10451036
1046
- return 0;
1037
+ return drmm_add_action_or_reset(dev, vc4_bo_cache_destroy, NULL);
10471038 }
10481039
1049
-void vc4_bo_cache_destroy(struct drm_device *dev)
1040
+static void vc4_bo_cache_destroy(struct drm_device *dev, void *unused)
10501041 {
10511042 struct vc4_dev *vc4 = to_vc4_dev(dev);
10521043 int i;
....@@ -1101,7 +1092,7 @@
11011092 ret = -ENOMEM;
11021093 mutex_unlock(&vc4->bo_lock);
11031094
1104
- drm_gem_object_put_unlocked(gem_obj);
1095
+ drm_gem_object_put(gem_obj);
11051096
11061097 return ret;
11071098 }