aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
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 /drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c
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>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c62
1 files changed, 11 insertions, 51 deletions
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)