diff options
author | Monk Liu <Monk.Liu@amd.com> | 2018-01-26 03:57:25 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-02-28 14:18:07 -0500 |
commit | bffe07b8b97d7faaf3d291129aafef2ee8a80e90 (patch) | |
tree | c1fc52dbe840a7018a308bb21c29fb9aed4b777e /drivers/gpu/drm/amd/amdgpu/amdgpu_sa.c | |
parent | 6f31fe6ec6ee77a82dafc4f72efba6272f279b9f (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.c | 62 |
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 | ||
76 | void amdgpu_sa_bo_manager_fini(struct amdgpu_device *adev, | 77 | void 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 | |||
95 | int 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 | |||
123 | int 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 | ||
142 | static void amdgpu_sa_bo_remove_locked(struct amdgpu_sa_bo *sa_bo) | 102 | static void amdgpu_sa_bo_remove_locked(struct amdgpu_sa_bo *sa_bo) |