aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2017-10-19 20:47:19 -0400
committerDave Airlie <airlied@redhat.com>2017-10-19 20:47:19 -0400
commit6585d4274b0baf1d09318539c4a726a96b51af34 (patch)
tree179aacc9409db45966595893ae4842104b314442 /drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
parent40d86701a625eed9e644281b9af228d6a52d8ed9 (diff)
parent96687ec0bb478088cb6941a7dca3bb6808a19313 (diff)
Merge branch 'drm-next-4.15' of git://people.freedesktop.org/~agd5f/linux into drm-next
Last set of features for 4.15. Highlights: - Add a bo flag to allow buffers to opt out of implicit sync - Add ctx priority setting interface - Lots more powerplay cleanups - Start to plumb through vram lost infrastructure for gpu reset - ttm support for huge pages - misc cleanups and bug fixes * 'drm-next-4.15' of git://people.freedesktop.org/~agd5f/linux: (73 commits) drm/amd/powerplay: Place the constant on the right side of the test drm/amd/powerplay: Remove useless variable drm/amd/powerplay: Don't cast kzalloc() return value drm/amdgpu: allow GTT overcommit during bind drm/amdgpu: linear validate first then bind to GART drm/amd/pp: Fix overflow when setup decf/pix/disp dpm table. drm/amd/pp: thermal control not enabled on vega10. drm/amdgpu: busywait KIQ register accessing (v4) drm/amdgpu: report more amdgpu_fence_info drm/amdgpu:don't check soft_reset for sriov drm/amdgpu:fix duplicated setting job's vram_lost drm/amdgpu:reduce wb to 512 slot drm/amdgpu: fix regresstion on SR-IOV gpu reset failed drm/amd/powerplay: Tidy up cz_dpm_powerup_vce() drm/amd/powerplay: Tidy up cz_dpm_powerdown_vce() drm/amd/powerplay: Tidy up cz_dpm_update_vce_dpm() drm/amd/powerplay: Tidy up cz_dpm_update_uvd_dpm() drm/amd/powerplay: Tidy up cz_dpm_powerup_uvd() drm/amd/powerplay: Tidy up cz_dpm_powerdown_uvd() drm/amd/powerplay: Tidy up cz_start_dpm() ...
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c76
1 files changed, 75 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index 019932a7ea3a..e5ece1fae149 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -155,6 +155,75 @@ void amdgpu_ring_undo(struct amdgpu_ring *ring)
155} 155}
156 156
157/** 157/**
158 * amdgpu_ring_priority_put - restore a ring's priority
159 *
160 * @ring: amdgpu_ring structure holding the information
161 * @priority: target priority
162 *
163 * Release a request for executing at @priority
164 */
165void amdgpu_ring_priority_put(struct amdgpu_ring *ring,
166 enum amd_sched_priority priority)
167{
168 int i;
169
170 if (!ring->funcs->set_priority)
171 return;
172
173 if (atomic_dec_return(&ring->num_jobs[priority]) > 0)
174 return;
175
176 /* no need to restore if the job is already at the lowest priority */
177 if (priority == AMD_SCHED_PRIORITY_NORMAL)
178 return;
179
180 mutex_lock(&ring->priority_mutex);
181 /* something higher prio is executing, no need to decay */
182 if (ring->priority > priority)
183 goto out_unlock;
184
185 /* decay priority to the next level with a job available */
186 for (i = priority; i >= AMD_SCHED_PRIORITY_MIN; i--) {
187 if (i == AMD_SCHED_PRIORITY_NORMAL
188 || atomic_read(&ring->num_jobs[i])) {
189 ring->priority = i;
190 ring->funcs->set_priority(ring, i);
191 break;
192 }
193 }
194
195out_unlock:
196 mutex_unlock(&ring->priority_mutex);
197}
198
199/**
200 * amdgpu_ring_priority_get - change the ring's priority
201 *
202 * @ring: amdgpu_ring structure holding the information
203 * @priority: target priority
204 *
205 * Request a ring's priority to be raised to @priority (refcounted).
206 */
207void amdgpu_ring_priority_get(struct amdgpu_ring *ring,
208 enum amd_sched_priority priority)
209{
210 if (!ring->funcs->set_priority)
211 return;
212
213 atomic_inc(&ring->num_jobs[priority]);
214
215 mutex_lock(&ring->priority_mutex);
216 if (priority <= ring->priority)
217 goto out_unlock;
218
219 ring->priority = priority;
220 ring->funcs->set_priority(ring, priority);
221
222out_unlock:
223 mutex_unlock(&ring->priority_mutex);
224}
225
226/**
158 * amdgpu_ring_init - init driver ring struct. 227 * amdgpu_ring_init - init driver ring struct.
159 * 228 *
160 * @adev: amdgpu_device pointer 229 * @adev: amdgpu_device pointer
@@ -169,7 +238,7 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
169 unsigned max_dw, struct amdgpu_irq_src *irq_src, 238 unsigned max_dw, struct amdgpu_irq_src *irq_src,
170 unsigned irq_type) 239 unsigned irq_type)
171{ 240{
172 int r; 241 int r, i;
173 int sched_hw_submission = amdgpu_sched_hw_submission; 242 int sched_hw_submission = amdgpu_sched_hw_submission;
174 243
175 /* Set the hw submission limit higher for KIQ because 244 /* Set the hw submission limit higher for KIQ because
@@ -247,9 +316,14 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
247 } 316 }
248 317
249 ring->max_dw = max_dw; 318 ring->max_dw = max_dw;
319 ring->priority = AMD_SCHED_PRIORITY_NORMAL;
320 mutex_init(&ring->priority_mutex);
250 INIT_LIST_HEAD(&ring->lru_list); 321 INIT_LIST_HEAD(&ring->lru_list);
251 amdgpu_ring_lru_touch(adev, ring); 322 amdgpu_ring_lru_touch(adev, ring);
252 323
324 for (i = 0; i < AMD_SCHED_PRIORITY_MAX; ++i)
325 atomic_set(&ring->num_jobs[i], 0);
326
253 if (amdgpu_debugfs_ring_init(adev, ring)) { 327 if (amdgpu_debugfs_ring_init(adev, ring)) {
254 DRM_ERROR("Failed to register debugfs file for rings !\n"); 328 DRM_ERROR("Failed to register debugfs file for rings !\n");
255 } 329 }