aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMonk Liu <Monk.Liu@amd.com>2018-01-26 03:57:25 -0500
committerAlex Deucher <alexander.deucher@amd.com>2018-02-28 14:18:07 -0500
commitbffe07b8b97d7faaf3d291129aafef2ee8a80e90 (patch)
treec1fc52dbe840a7018a308bb21c29fb9aed4b777e
parent6f31fe6ec6ee77a82dafc4f72efba6272f279b9f (diff)
drm/amdgpu: cleanup SA inti and fini(v2)
should use bo_create_kernel instead of split to two function that create and pin the SA bo issue: before this patch, there are DMAR read error in host side when running SRIOV test, the DMAR address dropped in the range of SA bo. fix: after this cleanups of SA init and fini, above DMAR eror gone. v2: keep sa_bo's fini instead of suspend, to keep reporting error Signed-off-by: Monk Liu <Monk.Liu@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_object.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c62
3 files changed, 11 insertions, 59 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
index d7e39827f22a..311589e02d17 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
@@ -279,11 +279,6 @@ int amdgpu_ib_pool_init(struct amdgpu_device *adev)
279 return r; 279 return r;
280 } 280 }
281 281
282 r = amdgpu_sa_bo_manager_start(adev, &adev->ring_tmp_bo);
283 if (r) {
284 return r;
285 }
286
287 adev->ib_pool_ready = true; 282 adev->ib_pool_ready = true;
288 if (amdgpu_debugfs_sa_init(adev)) { 283 if (amdgpu_debugfs_sa_init(adev)) {
289 dev_err(adev->dev, "failed to register debugfs file for SA\n"); 284 dev_err(adev->dev, "failed to register debugfs file for SA\n");
@@ -302,7 +297,6 @@ int amdgpu_ib_pool_init(struct amdgpu_device *adev)
302void amdgpu_ib_pool_fini(struct amdgpu_device *adev) 297void amdgpu_ib_pool_fini(struct amdgpu_device *adev)
303{ 298{
304 if (adev->ib_pool_ready) { 299 if (adev->ib_pool_ready) {
305 amdgpu_sa_bo_manager_suspend(adev, &adev->ring_tmp_bo);
306 amdgpu_sa_bo_manager_fini(adev, &adev->ring_tmp_bo); 300 amdgpu_sa_bo_manager_fini(adev, &adev->ring_tmp_bo);
307 adev->ib_pool_ready = false; 301 adev->ib_pool_ready = false;
308 } 302 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index c2b02f5c88d2..1cef944ef98d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -281,8 +281,6 @@ void amdgpu_sa_bo_manager_fini(struct amdgpu_device *adev,
281 struct amdgpu_sa_manager *sa_manager); 281 struct amdgpu_sa_manager *sa_manager);
282int amdgpu_sa_bo_manager_start(struct amdgpu_device *adev, 282int amdgpu_sa_bo_manager_start(struct amdgpu_device *adev,
283 struct amdgpu_sa_manager *sa_manager); 283 struct amdgpu_sa_manager *sa_manager);
284int amdgpu_sa_bo_manager_suspend(struct amdgpu_device *adev,
285 struct amdgpu_sa_manager *sa_manager);
286int amdgpu_sa_bo_new(struct amdgpu_sa_manager *sa_manager, 284int amdgpu_sa_bo_new(struct amdgpu_sa_manager *sa_manager,
287 struct amdgpu_sa_bo **sa_bo, 285 struct amdgpu_sa_bo **sa_bo,
288 unsigned size, unsigned align); 286 unsigned size, unsigned align);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
index 5ca75a456ad2..fb1667b35daa 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
@@ -63,21 +63,27 @@ int amdgpu_sa_bo_manager_init(struct amdgpu_device *adev,
63 for (i = 0; i < AMDGPU_SA_NUM_FENCE_LISTS; ++i) 63 for (i = 0; i < AMDGPU_SA_NUM_FENCE_LISTS; ++i)
64 INIT_LIST_HEAD(&sa_manager->flist[i]); 64 INIT_LIST_HEAD(&sa_manager->flist[i]);
65 65
66 r = amdgpu_bo_create(adev, size, align, true, domain, 66 r = amdgpu_bo_create_kernel(adev, size, align, domain, &sa_manager->bo,
67 0, NULL, NULL, &sa_manager->bo); 67 &sa_manager->gpu_addr, &sa_manager->cpu_ptr);
68 if (r) { 68 if (r) {
69 dev_err(adev->dev, "(%d) failed to allocate bo for manager\n", r); 69 dev_err(adev->dev, "(%d) failed to allocate bo for manager\n", r);
70 return r; 70 return r;
71 } 71 }
72 72
73 memset(sa_manager->cpu_ptr, 0, sa_manager->size);
73 return r; 74 return r;
74} 75}
75 76
76void amdgpu_sa_bo_manager_fini(struct amdgpu_device *adev, 77void amdgpu_sa_bo_manager_fini(struct amdgpu_device *adev,
77 struct amdgpu_sa_manager *sa_manager) 78 struct amdgpu_sa_manager *sa_manager)
78{ 79{
79 struct amdgpu_sa_bo *sa_bo, *tmp; 80 struct amdgpu_sa_bo *sa_bo, *tmp;
80 81
82 if (sa_manager->bo == NULL) {
83 dev_err(adev->dev, "no bo for sa manager\n");
84 return;
85 }
86
81 if (!list_empty(&sa_manager->olist)) { 87 if (!list_empty(&sa_manager->olist)) {
82 sa_manager->hole = &sa_manager->olist, 88 sa_manager->hole = &sa_manager->olist,
83 amdgpu_sa_bo_try_free(sa_manager); 89 amdgpu_sa_bo_try_free(sa_manager);
@@ -88,55 +94,9 @@ void amdgpu_sa_bo_manager_fini(struct amdgpu_device *adev,
88 list_for_each_entry_safe(sa_bo, tmp, &sa_manager->olist, olist) { 94 list_for_each_entry_safe(sa_bo, tmp, &sa_manager->olist, olist) {
89 amdgpu_sa_bo_remove_locked(sa_bo); 95 amdgpu_sa_bo_remove_locked(sa_bo);
90 } 96 }
91 amdgpu_bo_unref(&sa_manager->bo);
92 sa_manager->size = 0;
93}
94
95int amdgpu_sa_bo_manager_start(struct amdgpu_device *adev,
96 struct amdgpu_sa_manager *sa_manager)
97{
98 int r;
99
100 if (sa_manager->bo == NULL) {
101 dev_err(adev->dev, "no bo for sa manager\n");
102 return -EINVAL;
103 }
104 97
105 /* map the buffer */ 98 amdgpu_bo_free_kernel(&sa_manager->bo, &sa_manager->gpu_addr, &sa_manager->cpu_ptr);
106 r = amdgpu_bo_reserve(sa_manager->bo, false); 99 sa_manager->size = 0;
107 if (r) {
108 dev_err(adev->dev, "(%d) failed to reserve manager bo\n", r);
109 return r;
110 }
111 r = amdgpu_bo_pin(sa_manager->bo, sa_manager->domain, &sa_manager->gpu_addr);
112 if (r) {
113 amdgpu_bo_unreserve(sa_manager->bo);
114 dev_err(adev->dev, "(%d) failed to pin manager bo\n", r);
115 return r;
116 }
117 r = amdgpu_bo_kmap(sa_manager->bo, &sa_manager->cpu_ptr);
118 memset(sa_manager->cpu_ptr, 0, sa_manager->size);
119 amdgpu_bo_unreserve(sa_manager->bo);
120 return r;
121}
122
123int amdgpu_sa_bo_manager_suspend(struct amdgpu_device *adev,
124 struct amdgpu_sa_manager *sa_manager)
125{
126 int r;
127
128 if (sa_manager->bo == NULL) {
129 dev_err(adev->dev, "no bo for sa manager\n");
130 return -EINVAL;
131 }
132
133 r = amdgpu_bo_reserve(sa_manager->bo, true);
134 if (!r) {
135 amdgpu_bo_kunmap(sa_manager->bo);
136 amdgpu_bo_unpin(sa_manager->bo);
137 amdgpu_bo_unreserve(sa_manager->bo);
138 }
139 return r;
140} 100}
141 101
142static void amdgpu_sa_bo_remove_locked(struct amdgpu_sa_bo *sa_bo) 102static void amdgpu_sa_bo_remove_locked(struct amdgpu_sa_bo *sa_bo)