1 /*
2 * Copyright 2014 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 *
24 */
25
26 #include <linux/firmware.h>
27 #include <linux/pm_runtime.h>
28
29 #include "amdgpu.h"
30 #include "amdgpu_gfx.h"
31 #include "amdgpu_rlc.h"
32 #include "amdgpu_ras.h"
33 #include "amdgpu_reset.h"
34 #include "amdgpu_xcp.h"
35 #include "amdgpu_xgmi.h"
36 #include "amdgpu_mes.h"
37 #include "amdgpu_userq.h"
38 #include "mes_userqueue.h"
39 #include "nvd.h"
40
41 /* delay 0.1 second to enable gfx off feature */
42 #define GFX_OFF_DELAY_ENABLE msecs_to_jiffies(100)
43
44 #define GFX_OFF_NO_DELAY 0
45
46 /*
47 * GPU GFX IP block helpers function.
48 */
49
amdgpu_gfx_mec_queue_to_bit(struct amdgpu_device * adev,int mec,int pipe,int queue)50 int amdgpu_gfx_mec_queue_to_bit(struct amdgpu_device *adev, int mec,
51 int pipe, int queue)
52 {
53 int bit = 0;
54
55 bit += mec * adev->gfx.mec.num_pipe_per_mec
56 * adev->gfx.mec.num_queue_per_pipe;
57 bit += pipe * adev->gfx.mec.num_queue_per_pipe;
58 bit += queue;
59
60 return bit;
61 }
62
amdgpu_queue_mask_bit_to_mec_queue(struct amdgpu_device * adev,int bit,int * mec,int * pipe,int * queue)63 void amdgpu_queue_mask_bit_to_mec_queue(struct amdgpu_device *adev, int bit,
64 int *mec, int *pipe, int *queue)
65 {
66 *queue = bit % adev->gfx.mec.num_queue_per_pipe;
67 *pipe = (bit / adev->gfx.mec.num_queue_per_pipe)
68 % adev->gfx.mec.num_pipe_per_mec;
69 *mec = (bit / adev->gfx.mec.num_queue_per_pipe)
70 / adev->gfx.mec.num_pipe_per_mec;
71
72 }
73
amdgpu_gfx_is_mec_queue_enabled(struct amdgpu_device * adev,int xcc_id,int mec,int pipe,int queue)74 bool amdgpu_gfx_is_mec_queue_enabled(struct amdgpu_device *adev,
75 int xcc_id, int mec, int pipe, int queue)
76 {
77 return test_bit(amdgpu_gfx_mec_queue_to_bit(adev, mec, pipe, queue),
78 adev->gfx.mec_bitmap[xcc_id].queue_bitmap);
79 }
80
amdgpu_gfx_me_queue_to_bit(struct amdgpu_device * adev,int me,int pipe,int queue)81 static int amdgpu_gfx_me_queue_to_bit(struct amdgpu_device *adev,
82 int me, int pipe, int queue)
83 {
84 int num_queue_per_pipe = 1; /* we only enable 1 KGQ per pipe */
85 int bit = 0;
86
87 bit += me * adev->gfx.me.num_pipe_per_me
88 * num_queue_per_pipe;
89 bit += pipe * num_queue_per_pipe;
90 bit += queue;
91
92 return bit;
93 }
94
amdgpu_gfx_is_me_queue_enabled(struct amdgpu_device * adev,int me,int pipe,int queue)95 bool amdgpu_gfx_is_me_queue_enabled(struct amdgpu_device *adev,
96 int me, int pipe, int queue)
97 {
98 return test_bit(amdgpu_gfx_me_queue_to_bit(adev, me, pipe, queue),
99 adev->gfx.me.queue_bitmap);
100 }
101
102 /**
103 * amdgpu_gfx_parse_disable_cu - Parse the disable_cu module parameter
104 *
105 * @adev: amdgpu device pointer
106 * @mask: array in which the per-shader array disable masks will be stored
107 * @max_se: number of SEs
108 * @max_sh: number of SHs
109 *
110 * The bitmask of CUs to be disabled in the shader array determined by se and
111 * sh is stored in mask[se * max_sh + sh].
112 */
amdgpu_gfx_parse_disable_cu(struct amdgpu_device * adev,unsigned int * mask,unsigned int max_se,unsigned int max_sh)113 void amdgpu_gfx_parse_disable_cu(struct amdgpu_device *adev, unsigned int *mask,
114 unsigned int max_se, unsigned int max_sh)
115 {
116 unsigned int se, sh, cu;
117 const char *p;
118
119 memset(mask, 0, sizeof(*mask) * max_se * max_sh);
120
121 if (!amdgpu_disable_cu || !*amdgpu_disable_cu)
122 return;
123
124 p = amdgpu_disable_cu;
125 for (;;) {
126 char *next;
127 int ret = sscanf(p, "%u.%u.%u", &se, &sh, &cu);
128
129 if (ret < 3) {
130 drm_err(adev_to_drm(adev), "could not parse disable_cu\n");
131 return;
132 }
133
134 if (se < max_se && sh < max_sh && cu < 16) {
135 drm_info(adev_to_drm(adev), "Disabling CU %u.%u.%u\n", se, sh, cu);
136 mask[se * max_sh + sh] |= 1u << cu;
137 } else {
138 drm_err(adev_to_drm(adev), "disable_cu %u.%u.%u is out of range\n",
139 se, sh, cu);
140 }
141
142 next = strchr(p, ',');
143 if (!next)
144 break;
145 p = next + 1;
146 }
147 }
148
amdgpu_gfx_is_graphics_multipipe_capable(struct amdgpu_device * adev)149 static bool amdgpu_gfx_is_graphics_multipipe_capable(struct amdgpu_device *adev)
150 {
151 return amdgpu_async_gfx_ring && adev->gfx.me.num_pipe_per_me > 1;
152 }
153
amdgpu_gfx_is_compute_multipipe_capable(struct amdgpu_device * adev)154 static bool amdgpu_gfx_is_compute_multipipe_capable(struct amdgpu_device *adev)
155 {
156 if (amdgpu_compute_multipipe != -1) {
157 dev_info(adev->dev, " forcing compute pipe policy %d\n",
158 amdgpu_compute_multipipe);
159 return amdgpu_compute_multipipe == 1;
160 }
161
162 if (amdgpu_ip_version(adev, GC_HWIP, 0) > IP_VERSION(9, 0, 0))
163 return true;
164
165 /* FIXME: spreading the queues across pipes causes perf regressions
166 * on POLARIS11 compute workloads */
167 if (adev->asic_type == CHIP_POLARIS11)
168 return false;
169
170 return adev->gfx.mec.num_mec > 1;
171 }
172
amdgpu_gfx_is_high_priority_graphics_queue(struct amdgpu_device * adev,struct amdgpu_ring * ring)173 bool amdgpu_gfx_is_high_priority_graphics_queue(struct amdgpu_device *adev,
174 struct amdgpu_ring *ring)
175 {
176 int queue = ring->queue;
177 int pipe = ring->pipe;
178
179 /* Policy: use pipe1 queue0 as high priority graphics queue if we
180 * have more than one gfx pipe.
181 */
182 if (amdgpu_gfx_is_graphics_multipipe_capable(adev) &&
183 adev->gfx.num_gfx_rings > 1 && pipe == 1 && queue == 0) {
184 int me = ring->me;
185 int bit;
186
187 bit = amdgpu_gfx_me_queue_to_bit(adev, me, pipe, queue);
188 if (ring == &adev->gfx.gfx_ring[bit])
189 return true;
190 }
191
192 return false;
193 }
194
amdgpu_gfx_is_high_priority_compute_queue(struct amdgpu_device * adev,struct amdgpu_ring * ring)195 bool amdgpu_gfx_is_high_priority_compute_queue(struct amdgpu_device *adev,
196 struct amdgpu_ring *ring)
197 {
198 /* Policy: use 1st queue as high priority compute queue if we
199 * have more than one compute queue.
200 */
201 if (adev->gfx.num_compute_rings > 1 &&
202 ring == &adev->gfx.compute_ring[0])
203 return true;
204
205 return false;
206 }
207
amdgpu_gfx_compute_queue_acquire(struct amdgpu_device * adev)208 void amdgpu_gfx_compute_queue_acquire(struct amdgpu_device *adev)
209 {
210 int i, j, queue, pipe;
211 bool multipipe_policy = amdgpu_gfx_is_compute_multipipe_capable(adev);
212 int max_queues_per_mec = min(adev->gfx.mec.num_pipe_per_mec *
213 adev->gfx.mec.num_queue_per_pipe,
214 adev->gfx.num_compute_rings);
215 int num_xcc = adev->gfx.xcc_mask ? NUM_XCC(adev->gfx.xcc_mask) : 1;
216
217 if (multipipe_policy) {
218 /* policy: make queues evenly cross all pipes on MEC1 only
219 * for multiple xcc, just use the original policy for simplicity */
220 for (j = 0; j < num_xcc; j++) {
221 for (i = 0; i < max_queues_per_mec; i++) {
222 pipe = i % adev->gfx.mec.num_pipe_per_mec;
223 queue = (i / adev->gfx.mec.num_pipe_per_mec) %
224 adev->gfx.mec.num_queue_per_pipe;
225
226 set_bit(pipe * adev->gfx.mec.num_queue_per_pipe + queue,
227 adev->gfx.mec_bitmap[j].queue_bitmap);
228 }
229 }
230 } else {
231 /* policy: amdgpu owns all queues in the given pipe */
232 for (j = 0; j < num_xcc; j++) {
233 for (i = 0; i < max_queues_per_mec; ++i)
234 set_bit(i, adev->gfx.mec_bitmap[j].queue_bitmap);
235 }
236 }
237
238 for (j = 0; j < num_xcc; j++) {
239 dev_dbg(adev->dev, "mec queue bitmap weight=%d\n",
240 bitmap_weight(adev->gfx.mec_bitmap[j].queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES));
241 }
242 }
243
amdgpu_gfx_graphics_queue_acquire(struct amdgpu_device * adev)244 void amdgpu_gfx_graphics_queue_acquire(struct amdgpu_device *adev)
245 {
246 int i, queue, pipe;
247 bool multipipe_policy = amdgpu_gfx_is_graphics_multipipe_capable(adev);
248 int num_queue_per_pipe = 1; /* we only enable 1 KGQ per pipe */
249 int max_queues_per_me = adev->gfx.me.num_pipe_per_me * num_queue_per_pipe;
250
251 if (multipipe_policy) {
252 /* policy: amdgpu owns the first queue per pipe at this stage
253 * will extend to mulitple queues per pipe later */
254 for (i = 0; i < max_queues_per_me; i++) {
255 pipe = i % adev->gfx.me.num_pipe_per_me;
256 queue = (i / adev->gfx.me.num_pipe_per_me) %
257 num_queue_per_pipe;
258
259 set_bit(pipe * num_queue_per_pipe + queue,
260 adev->gfx.me.queue_bitmap);
261 }
262 } else {
263 for (i = 0; i < max_queues_per_me; ++i)
264 set_bit(i, adev->gfx.me.queue_bitmap);
265 }
266
267 /* update the number of active graphics rings */
268 if (adev->gfx.num_gfx_rings)
269 adev->gfx.num_gfx_rings =
270 bitmap_weight(adev->gfx.me.queue_bitmap, AMDGPU_MAX_GFX_QUEUES);
271 }
272
amdgpu_gfx_kiq_acquire(struct amdgpu_device * adev,struct amdgpu_ring * ring,int xcc_id)273 static int amdgpu_gfx_kiq_acquire(struct amdgpu_device *adev,
274 struct amdgpu_ring *ring, int xcc_id)
275 {
276 int queue_bit;
277 int mec, pipe, queue;
278
279 queue_bit = adev->gfx.mec.num_mec
280 * adev->gfx.mec.num_pipe_per_mec
281 * adev->gfx.mec.num_queue_per_pipe;
282
283 while (--queue_bit >= 0) {
284 if (test_bit(queue_bit, adev->gfx.mec_bitmap[xcc_id].queue_bitmap))
285 continue;
286
287 amdgpu_queue_mask_bit_to_mec_queue(adev, queue_bit, &mec, &pipe, &queue);
288
289 /*
290 * 1. Using pipes 2/3 from MEC 2 seems cause problems.
291 * 2. It must use queue id 0, because CGPG_IDLE/SAVE/LOAD/RUN
292 * only can be issued on queue 0.
293 */
294 if ((mec == 1 && pipe > 1) || queue != 0)
295 continue;
296
297 ring->me = mec + 1;
298 ring->pipe = pipe;
299 ring->queue = queue;
300
301 return 0;
302 }
303
304 dev_err(adev->dev, "Failed to find a queue for KIQ\n");
305 return -EINVAL;
306 }
307
amdgpu_gfx_kiq_init_ring(struct amdgpu_device * adev,int xcc_id)308 int amdgpu_gfx_kiq_init_ring(struct amdgpu_device *adev, int xcc_id)
309 {
310 struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
311 struct amdgpu_irq_src *irq = &kiq->irq;
312 struct amdgpu_ring *ring = &kiq->ring;
313 int r = 0;
314
315 spin_lock_init(&kiq->ring_lock);
316
317 ring->adev = NULL;
318 ring->ring_obj = NULL;
319 ring->use_doorbell = true;
320 ring->xcc_id = xcc_id;
321 ring->vm_hub = AMDGPU_GFXHUB(xcc_id);
322 ring->doorbell_index =
323 (adev->doorbell_index.kiq +
324 xcc_id * adev->doorbell_index.xcc_doorbell_range)
325 << 1;
326
327 r = amdgpu_gfx_kiq_acquire(adev, ring, xcc_id);
328 if (r)
329 return r;
330
331 ring->eop_gpu_addr = kiq->eop_gpu_addr;
332 ring->no_scheduler = true;
333 snprintf(ring->name, sizeof(ring->name), "kiq_%hhu.%hhu.%hhu.%hhu",
334 (unsigned char)xcc_id, (unsigned char)ring->me,
335 (unsigned char)ring->pipe, (unsigned char)ring->queue);
336 r = amdgpu_ring_init(adev, ring, 1024, irq, AMDGPU_CP_KIQ_IRQ_DRIVER0,
337 AMDGPU_RING_PRIO_DEFAULT, NULL);
338 if (r)
339 dev_warn(adev->dev, "(%d) failed to init kiq ring\n", r);
340
341 return r;
342 }
343
amdgpu_gfx_kiq_free_ring(struct amdgpu_ring * ring)344 void amdgpu_gfx_kiq_free_ring(struct amdgpu_ring *ring)
345 {
346 amdgpu_ring_fini(ring);
347 }
348
amdgpu_gfx_kiq_fini(struct amdgpu_device * adev,int xcc_id)349 void amdgpu_gfx_kiq_fini(struct amdgpu_device *adev, int xcc_id)
350 {
351 struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
352
353 amdgpu_bo_free_kernel(&kiq->eop_obj, &kiq->eop_gpu_addr, NULL);
354 }
355
amdgpu_gfx_kiq_init(struct amdgpu_device * adev,unsigned int hpd_size,int xcc_id)356 int amdgpu_gfx_kiq_init(struct amdgpu_device *adev,
357 unsigned int hpd_size, int xcc_id)
358 {
359 int r;
360 u32 *hpd;
361 struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
362
363 r = amdgpu_bo_create_kernel(adev, hpd_size, PAGE_SIZE,
364 AMDGPU_GEM_DOMAIN_GTT, &kiq->eop_obj,
365 &kiq->eop_gpu_addr, (void **)&hpd);
366 if (r) {
367 dev_warn(adev->dev, "failed to create KIQ bo (%d).\n", r);
368 return r;
369 }
370
371 memset(hpd, 0, hpd_size);
372
373 r = amdgpu_bo_reserve(kiq->eop_obj, true);
374 if (unlikely(r != 0))
375 dev_warn(adev->dev, "(%d) reserve kiq eop bo failed\n", r);
376 amdgpu_bo_kunmap(kiq->eop_obj);
377 amdgpu_bo_unreserve(kiq->eop_obj);
378
379 return 0;
380 }
381
amdgpu_gfx_mqd_reset_restore(struct amdgpu_ring * ring)382 static void amdgpu_gfx_mqd_reset_restore(struct amdgpu_ring *ring)
383 {
384 struct amdgpu_device *adev = ring->adev;
385 int mqd_idx, mqd_size;
386
387 /* restore mqd with the backup copy */
388 if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) {
389 mqd_idx = ring - &adev->gfx.compute_ring[0];
390 mqd_size = adev->mqds[AMDGPU_HW_IP_COMPUTE].mqd_size;
391 if (adev->gfx.mec.mqd_backup[mqd_idx])
392 memcpy_toio(ring->mqd_ptr, adev->gfx.mec.mqd_backup[mqd_idx], mqd_size);
393 } else if (ring->funcs->type == AMDGPU_RING_TYPE_GFX) {
394 mqd_size = adev->mqds[AMDGPU_HW_IP_GFX].mqd_size;
395 mqd_idx = ring - &adev->gfx.gfx_ring[0];
396
397 if (adev->gfx.me.mqd_backup[mqd_idx])
398 memcpy_toio(ring->mqd_ptr, adev->gfx.me.mqd_backup[mqd_idx], mqd_size);
399 }
400 /* reset the ring */
401 ring->wptr = 0;
402 atomic64_set((atomic64_t *)ring->wptr_cpu_addr, 0);
403 amdgpu_ring_clear_ring(ring);
404 }
405
406 /* create MQD for each compute/gfx queue */
amdgpu_gfx_mqd_sw_init(struct amdgpu_device * adev,unsigned int mqd_size,int xcc_id)407 int amdgpu_gfx_mqd_sw_init(struct amdgpu_device *adev,
408 unsigned int mqd_size, int xcc_id)
409 {
410 int r, i, j;
411 struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
412 struct amdgpu_ring *ring = &kiq->ring;
413 u32 domain = AMDGPU_GEM_DOMAIN_GTT;
414 u32 gfx_mqd_size = max(adev->mqds[AMDGPU_HW_IP_GFX].mqd_size, mqd_size);
415 u32 compute_mqd_size = max(adev->mqds[AMDGPU_HW_IP_COMPUTE].mqd_size, mqd_size);
416
417 #if !defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
418 /* Only enable on gfx10 and 11 for now to avoid changing behavior on older chips */
419 if (amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(10, 0, 0))
420 domain |= AMDGPU_GEM_DOMAIN_VRAM;
421 #endif
422
423 /* create MQD for KIQ (on GFX8+ where we use KIQ) */
424 if (adev->asic_type >= CHIP_TOPAZ && !adev->enable_mes_kiq && !ring->mqd_obj) {
425 /* originaly the KIQ MQD is put in GTT domain, but for SRIOV VRAM domain is a must
426 * otherwise hypervisor trigger SAVE_VF fail after driver unloaded which mean MQD
427 * deallocated and gart_unbind, to strict diverage we decide to use VRAM domain for
428 * KIQ MQD no matter SRIOV or Bare-metal
429 */
430 r = amdgpu_bo_create_kernel(adev, mqd_size, PAGE_SIZE,
431 AMDGPU_GEM_DOMAIN_VRAM |
432 AMDGPU_GEM_DOMAIN_GTT,
433 &ring->mqd_obj,
434 &ring->mqd_gpu_addr,
435 &ring->mqd_ptr);
436 if (r) {
437 dev_warn(adev->dev, "failed to create ring mqd ob (%d)", r);
438 return r;
439 }
440
441 /* prepare MQD backup */
442 kiq->mqd_backup = kzalloc(mqd_size, GFP_KERNEL);
443 if (!kiq->mqd_backup) {
444 dev_warn(adev->dev,
445 "no memory to create MQD backup for ring %s\n", ring->name);
446 return -ENOMEM;
447 }
448 }
449
450 if (adev->asic_type >= CHIP_NAVI10 && amdgpu_async_gfx_ring) {
451 /* create MQD for each KGQ */
452 for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
453 ring = &adev->gfx.gfx_ring[i];
454 if (!ring->mqd_obj) {
455 r = amdgpu_bo_create_kernel(adev, AMDGPU_MQD_SIZE_ALIGN(gfx_mqd_size),
456 PAGE_SIZE, domain, &ring->mqd_obj,
457 &ring->mqd_gpu_addr, &ring->mqd_ptr);
458 if (r) {
459 dev_warn(adev->dev, "failed to create ring mqd bo (%d)", r);
460 return r;
461 }
462
463 ring->mqd_size = gfx_mqd_size;
464 /* prepare MQD backup */
465 adev->gfx.me.mqd_backup[i] = kzalloc(gfx_mqd_size, GFP_KERNEL);
466 if (!adev->gfx.me.mqd_backup[i]) {
467 dev_warn(adev->dev, "no memory to create MQD backup for ring %s\n", ring->name);
468 return -ENOMEM;
469 }
470 }
471 }
472 }
473
474 /* create MQD for each KCQ */
475 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
476 j = i + xcc_id * adev->gfx.num_compute_rings;
477 ring = &adev->gfx.compute_ring[j];
478 if (!ring->mqd_obj) {
479 r = amdgpu_bo_create_kernel(adev, AMDGPU_MQD_SIZE_ALIGN(compute_mqd_size),
480 PAGE_SIZE, domain, &ring->mqd_obj,
481 &ring->mqd_gpu_addr, &ring->mqd_ptr);
482 if (r) {
483 dev_warn(adev->dev, "failed to create ring mqd bo (%d)", r);
484 return r;
485 }
486
487 ring->mqd_size = compute_mqd_size;
488 /* prepare MQD backup */
489 adev->gfx.mec.mqd_backup[j] = kzalloc(compute_mqd_size, GFP_KERNEL);
490 if (!adev->gfx.mec.mqd_backup[j]) {
491 dev_warn(adev->dev, "no memory to create MQD backup for ring %s\n", ring->name);
492 return -ENOMEM;
493 }
494 }
495 }
496
497 return 0;
498 }
499
amdgpu_gfx_mqd_sw_fini(struct amdgpu_device * adev,int xcc_id)500 void amdgpu_gfx_mqd_sw_fini(struct amdgpu_device *adev, int xcc_id)
501 {
502 struct amdgpu_ring *ring = NULL;
503 int i, j;
504 struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
505
506 if (adev->asic_type >= CHIP_NAVI10 && amdgpu_async_gfx_ring) {
507 for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
508 ring = &adev->gfx.gfx_ring[i];
509 kfree(adev->gfx.me.mqd_backup[i]);
510 amdgpu_bo_free_kernel(&ring->mqd_obj,
511 &ring->mqd_gpu_addr,
512 &ring->mqd_ptr);
513 }
514 }
515
516 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
517 j = i + xcc_id * adev->gfx.num_compute_rings;
518 ring = &adev->gfx.compute_ring[j];
519 kfree(adev->gfx.mec.mqd_backup[j]);
520 amdgpu_bo_free_kernel(&ring->mqd_obj,
521 &ring->mqd_gpu_addr,
522 &ring->mqd_ptr);
523 }
524
525 ring = &kiq->ring;
526 kfree(kiq->mqd_backup);
527 amdgpu_bo_free_kernel(&ring->mqd_obj,
528 &ring->mqd_gpu_addr,
529 &ring->mqd_ptr);
530 }
531
amdgpu_gfx_mqd_symmetrically_map_cu_mask(struct amdgpu_device * adev,const uint32_t * cu_mask,uint32_t cu_mask_count,uint32_t * se_mask)532 void amdgpu_gfx_mqd_symmetrically_map_cu_mask(struct amdgpu_device *adev, const uint32_t *cu_mask,
533 uint32_t cu_mask_count, uint32_t *se_mask)
534 {
535 struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
536 struct amdgpu_gfx_config *gfx_info = &adev->gfx.config;
537 uint32_t cu_per_sh[8][4] = {0};
538 int i, se, sh, cu, cu_bitmap_sh_mul;
539 int xcc_inst = ffs(adev->gfx.xcc_mask) - 1;
540 bool wgp_mode_req = amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(10, 0, 0);
541 int cu_inc = wgp_mode_req ? 2 : 1;
542 uint32_t en_mask = wgp_mode_req ? 0x3 : 0x1;
543 int num_xcc, inc, inst = 0;
544
545 if (xcc_inst < 0)
546 xcc_inst = 0;
547
548 num_xcc = hweight16(adev->gfx.xcc_mask);
549 if (!num_xcc)
550 num_xcc = 1;
551
552 inc = cu_inc * num_xcc;
553
554 cu_bitmap_sh_mul = 2;
555
556 for (se = 0; se < gfx_info->max_shader_engines; se++)
557 for (sh = 0; sh < gfx_info->max_sh_per_se; sh++)
558 cu_per_sh[se][sh] = hweight32(
559 cu_info->bitmap[xcc_inst][se % 4][sh + (se / 4) *
560 cu_bitmap_sh_mul]);
561
562 for (i = 0; i < gfx_info->max_shader_engines; i++)
563 se_mask[i] = 0;
564
565 i = inst;
566 for (cu = 0; cu < 16; cu += cu_inc) {
567 for (sh = 0; sh < gfx_info->max_sh_per_se; sh++) {
568 for (se = 0; se < gfx_info->max_shader_engines; se++) {
569 if (cu_per_sh[se][sh] > cu) {
570 if ((i / 32) < cu_mask_count && (cu_mask[i / 32] & (1 << (i % 32))))
571 se_mask[se] |= en_mask << (cu + sh * 16);
572 i += inc;
573 if (i >= cu_mask_count * 32)
574 return;
575 }
576 }
577 }
578 }
579 }
580
amdgpu_gfx_disable_kcq(struct amdgpu_device * adev,int xcc_id)581 int amdgpu_gfx_disable_kcq(struct amdgpu_device *adev, int xcc_id)
582 {
583 struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
584 struct amdgpu_ring *kiq_ring = &kiq->ring;
585 int i, r = 0;
586 int j;
587
588 if (adev->enable_mes) {
589 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
590 j = i + xcc_id * adev->gfx.num_compute_rings;
591 amdgpu_mes_unmap_legacy_queue(adev,
592 &adev->gfx.compute_ring[j],
593 RESET_QUEUES, 0, 0, xcc_id);
594 }
595 return 0;
596 }
597
598 if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
599 return -EINVAL;
600
601 if (!kiq_ring->sched.ready || amdgpu_in_reset(adev))
602 return 0;
603
604 spin_lock(&kiq->ring_lock);
605 if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size *
606 adev->gfx.num_compute_rings)) {
607 spin_unlock(&kiq->ring_lock);
608 return -ENOMEM;
609 }
610
611 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
612 j = i + xcc_id * adev->gfx.num_compute_rings;
613 kiq->pmf->kiq_unmap_queues(kiq_ring,
614 &adev->gfx.compute_ring[j],
615 RESET_QUEUES, 0, 0);
616 }
617 /* Submit unmap queue packet */
618 amdgpu_ring_commit(kiq_ring);
619 /*
620 * Ring test will do a basic scratch register change check. Just run
621 * this to ensure that unmap queues that is submitted before got
622 * processed successfully before returning.
623 */
624 r = amdgpu_ring_test_helper(kiq_ring);
625
626 spin_unlock(&kiq->ring_lock);
627
628 return r;
629 }
630
amdgpu_gfx_disable_kgq(struct amdgpu_device * adev,int xcc_id)631 int amdgpu_gfx_disable_kgq(struct amdgpu_device *adev, int xcc_id)
632 {
633 struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
634 struct amdgpu_ring *kiq_ring = &kiq->ring;
635 int i, r = 0;
636 int j;
637
638 if (adev->enable_mes) {
639 if (amdgpu_gfx_is_master_xcc(adev, xcc_id)) {
640 for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
641 j = i + xcc_id * adev->gfx.num_gfx_rings;
642 amdgpu_mes_unmap_legacy_queue(adev,
643 &adev->gfx.gfx_ring[j],
644 PREEMPT_QUEUES, 0, 0, xcc_id);
645 }
646 }
647 return 0;
648 }
649
650 if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
651 return -EINVAL;
652
653 if (!adev->gfx.kiq[0].ring.sched.ready || amdgpu_in_reset(adev))
654 return 0;
655
656 if (amdgpu_gfx_is_master_xcc(adev, xcc_id)) {
657 spin_lock(&kiq->ring_lock);
658 if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size *
659 adev->gfx.num_gfx_rings)) {
660 spin_unlock(&kiq->ring_lock);
661 return -ENOMEM;
662 }
663
664 for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
665 j = i + xcc_id * adev->gfx.num_gfx_rings;
666 kiq->pmf->kiq_unmap_queues(kiq_ring,
667 &adev->gfx.gfx_ring[j],
668 PREEMPT_QUEUES, 0, 0);
669 }
670 /* Submit unmap queue packet */
671 amdgpu_ring_commit(kiq_ring);
672
673 /*
674 * Ring test will do a basic scratch register change check.
675 * Just run this to ensure that unmap queues that is submitted
676 * before got processed successfully before returning.
677 */
678 r = amdgpu_ring_test_helper(kiq_ring);
679 spin_unlock(&kiq->ring_lock);
680 }
681
682 return r;
683 }
684
amdgpu_queue_mask_bit_to_set_resource_bit(struct amdgpu_device * adev,int queue_bit)685 int amdgpu_queue_mask_bit_to_set_resource_bit(struct amdgpu_device *adev,
686 int queue_bit)
687 {
688 int mec, pipe, queue;
689 int set_resource_bit = 0;
690
691 amdgpu_queue_mask_bit_to_mec_queue(adev, queue_bit, &mec, &pipe, &queue);
692
693 set_resource_bit = mec * 4 * 8 + pipe * 8 + queue;
694
695 return set_resource_bit;
696 }
697
amdgpu_gfx_mes_enable_kcq(struct amdgpu_device * adev,int xcc_id)698 static int amdgpu_gfx_mes_enable_kcq(struct amdgpu_device *adev, int xcc_id)
699 {
700 struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
701 struct amdgpu_ring *kiq_ring = &kiq->ring;
702 uint64_t queue_mask = ~0ULL;
703 int r, i, j;
704
705 amdgpu_device_flush_hdp(adev, NULL);
706
707 if (!adev->enable_uni_mes) {
708 spin_lock(&kiq->ring_lock);
709 r = amdgpu_ring_alloc(kiq_ring, kiq->pmf->set_resources_size);
710 if (r) {
711 dev_err(adev->dev, "Failed to lock KIQ (%d).\n", r);
712 spin_unlock(&kiq->ring_lock);
713 return r;
714 }
715
716 kiq->pmf->kiq_set_resources(kiq_ring, queue_mask);
717 r = amdgpu_ring_test_helper(kiq_ring);
718 spin_unlock(&kiq->ring_lock);
719 if (r)
720 dev_err(adev->dev, "KIQ failed to set resources\n");
721 }
722
723 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
724 j = i + xcc_id * adev->gfx.num_compute_rings;
725 r = amdgpu_mes_map_legacy_queue(adev,
726 &adev->gfx.compute_ring[j],
727 xcc_id);
728 if (r) {
729 dev_err(adev->dev, "failed to map compute queue\n");
730 return r;
731 }
732 }
733
734 return 0;
735 }
736
amdgpu_gfx_enable_kcq(struct amdgpu_device * adev,int xcc_id)737 int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev, int xcc_id)
738 {
739 struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
740 struct amdgpu_ring *kiq_ring = &kiq->ring;
741 uint64_t queue_mask = 0;
742 int r, i, j;
743
744 if (adev->mes.enable_legacy_queue_map)
745 return amdgpu_gfx_mes_enable_kcq(adev, xcc_id);
746
747 if (!kiq->pmf || !kiq->pmf->kiq_map_queues || !kiq->pmf->kiq_set_resources)
748 return -EINVAL;
749
750 for (i = 0; i < AMDGPU_MAX_COMPUTE_QUEUES; ++i) {
751 if (!test_bit(i, adev->gfx.mec_bitmap[xcc_id].queue_bitmap))
752 continue;
753
754 /* This situation may be hit in the future if a new HW
755 * generation exposes more than 64 queues. If so, the
756 * definition of queue_mask needs updating */
757 if (WARN_ON(i > (sizeof(queue_mask)*8))) {
758 dev_err(adev->dev, "Invalid KCQ enabled: %d\n", i);
759 break;
760 }
761
762 queue_mask |= (1ull << amdgpu_queue_mask_bit_to_set_resource_bit(adev, i));
763 }
764
765 amdgpu_device_flush_hdp(adev, NULL);
766
767 dev_info(adev->dev, "kiq ring mec %d pipe %d q %d\n", kiq_ring->me,
768 kiq_ring->pipe, kiq_ring->queue);
769
770 spin_lock(&kiq->ring_lock);
771 r = amdgpu_ring_alloc(kiq_ring, kiq->pmf->map_queues_size *
772 adev->gfx.num_compute_rings +
773 kiq->pmf->set_resources_size);
774 if (r) {
775 dev_err(adev->dev, "Failed to lock KIQ (%d).\n", r);
776 spin_unlock(&kiq->ring_lock);
777 return r;
778 }
779
780 kiq->pmf->kiq_set_resources(kiq_ring, queue_mask);
781 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
782 j = i + xcc_id * adev->gfx.num_compute_rings;
783 kiq->pmf->kiq_map_queues(kiq_ring,
784 &adev->gfx.compute_ring[j]);
785 }
786 /* Submit map queue packet */
787 amdgpu_ring_commit(kiq_ring);
788 /*
789 * Ring test will do a basic scratch register change check. Just run
790 * this to ensure that map queues that is submitted before got
791 * processed successfully before returning.
792 */
793 r = amdgpu_ring_test_helper(kiq_ring);
794 spin_unlock(&kiq->ring_lock);
795 if (r)
796 dev_err(adev->dev, "KCQ enable failed\n");
797
798 return r;
799 }
800
amdgpu_gfx_enable_kgq(struct amdgpu_device * adev,int xcc_id)801 int amdgpu_gfx_enable_kgq(struct amdgpu_device *adev, int xcc_id)
802 {
803 struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
804 struct amdgpu_ring *kiq_ring = &kiq->ring;
805 int r, i, j;
806
807 if (!kiq->pmf || !kiq->pmf->kiq_map_queues)
808 return -EINVAL;
809
810 amdgpu_device_flush_hdp(adev, NULL);
811
812 if (adev->mes.enable_legacy_queue_map) {
813 for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
814 j = i + xcc_id * adev->gfx.num_gfx_rings;
815 r = amdgpu_mes_map_legacy_queue(adev,
816 &adev->gfx.gfx_ring[j],
817 xcc_id);
818 if (r) {
819 dev_err(adev->dev, "failed to map gfx queue\n");
820 return r;
821 }
822 }
823
824 return 0;
825 }
826
827 spin_lock(&kiq->ring_lock);
828 /* No need to map kcq on the slave */
829 if (amdgpu_gfx_is_master_xcc(adev, xcc_id)) {
830 r = amdgpu_ring_alloc(kiq_ring, kiq->pmf->map_queues_size *
831 adev->gfx.num_gfx_rings);
832 if (r) {
833 dev_err(adev->dev, "Failed to lock KIQ (%d).\n", r);
834 spin_unlock(&kiq->ring_lock);
835 return r;
836 }
837
838 for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
839 j = i + xcc_id * adev->gfx.num_gfx_rings;
840 kiq->pmf->kiq_map_queues(kiq_ring,
841 &adev->gfx.gfx_ring[j]);
842 }
843 }
844 /* Submit map queue packet */
845 amdgpu_ring_commit(kiq_ring);
846 /*
847 * Ring test will do a basic scratch register change check. Just run
848 * this to ensure that map queues that is submitted before got
849 * processed successfully before returning.
850 */
851 r = amdgpu_ring_test_helper(kiq_ring);
852 spin_unlock(&kiq->ring_lock);
853 if (r)
854 dev_err(adev->dev, "KGQ enable failed\n");
855
856 return r;
857 }
858
859 /**
860 * amdgpu_gfx_handle_priv_fault - Handle privileged instruction fault
861 *
862 * @adev: amdgpu_device pointer
863 * @entry: interrupt vector entry containing fault information
864 * @me_id: micro-engine ID of the faulty ring
865 * @pipe_id: pipe ID of the faulty ring
866 * @queue_id: queue ID of the faulty ring
867 *
868 * This function handles privileged instruction faults by identifying
869 * the faulty ring (gfx or compute) and triggering a scheduler fault, or by
870 * recovering the faulting user queue.
871 */
amdgpu_gfx_handle_priv_fault(struct amdgpu_device * adev,struct amdgpu_iv_entry * entry,u8 me_id,u8 pipe_id,u8 queue_id)872 void amdgpu_gfx_handle_priv_fault(struct amdgpu_device *adev,
873 struct amdgpu_iv_entry *entry,
874 u8 me_id, u8 pipe_id, u8 queue_id)
875 {
876 struct amdgpu_ring *ring;
877 u32 doorbell_offset;
878 int i;
879
880 /*
881 * Try KQ first by ring_id (HW slot is authoritative). The
882 * KMD compute_hqd_mask contract guarantees KCQ and user queues
883 * never share a HW slot.
884 */
885 if (!adev->gfx.disable_kq) {
886 for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
887 ring = &adev->gfx.gfx_ring[i];
888 if (ring->me == me_id && ring->pipe == pipe_id &&
889 ring->queue == queue_id) {
890 drm_sched_fault(&ring->sched);
891 return;
892 }
893 }
894
895 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
896 ring = &adev->gfx.compute_ring[i];
897 if (ring->me == me_id && ring->pipe == pipe_id &&
898 ring->queue == queue_id) {
899 drm_sched_fault(&ring->sched);
900 return;
901 }
902 }
903 }
904
905 /* No KQ matched: the faulting slot belongs to a user queue. */
906 if (adev->gfx.disable_uq)
907 return;
908
909 doorbell_offset = entry->src_data[0] & AMDGPU_CTXID0_DOORBELL_ID_MASK;
910
911 /*
912 * A compute user-queue fault IV carries the doorbell offset, so reset
913 * the queue directly from it. A gfx user-queue fault is raised by the
914 * ME and carries only the HW slot (no doorbell); record the slot and
915 * let the worker read the doorbell back from the HQD.
916 */
917 if (doorbell_offset) {
918 amdgpu_userq_process_reset_irq(adev, entry->pasid,
919 doorbell_offset);
920 } else {
921 set_bit(pipe_id | (queue_id << 2), &adev->gfx.userq_priv_fault_slots);
922 schedule_work(&adev->gfx.userq_priv_fault_work);
923 }
924 }
925
amdgpu_gfx_do_off_ctrl(struct amdgpu_device * adev,bool enable,bool no_delay)926 static void amdgpu_gfx_do_off_ctrl(struct amdgpu_device *adev, bool enable,
927 bool no_delay)
928 {
929 unsigned long delay = GFX_OFF_DELAY_ENABLE;
930
931 if (!(adev->pm.pp_feature & PP_GFXOFF_MASK))
932 return;
933
934 mutex_lock(&adev->gfx.gfx_off_mutex);
935
936 if (enable) {
937 /* If the count is already 0, it means there's an imbalance bug somewhere.
938 * Note that the bug may be in a different caller than the one which triggers the
939 * WARN_ON_ONCE.
940 */
941 if (WARN_ON_ONCE(adev->gfx.gfx_off_req_count == 0))
942 goto unlock;
943
944 adev->gfx.gfx_off_req_count--;
945
946 if (adev->gfx.gfx_off_req_count == 0 &&
947 !adev->gfx.gfx_off_state) {
948 /* If going to s2idle, no need to wait */
949 if (no_delay) {
950 if (!amdgpu_dpm_set_powergating_by_smu(adev,
951 AMD_IP_BLOCK_TYPE_GFX, true, 0))
952 adev->gfx.gfx_off_state = true;
953 } else {
954 schedule_delayed_work(&adev->gfx.gfx_off_delay_work,
955 delay);
956 }
957 }
958 } else {
959 if (adev->gfx.gfx_off_req_count == 0) {
960 cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work);
961
962 if (adev->gfx.gfx_off_state &&
963 !amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_GFX, false, 0)) {
964 adev->gfx.gfx_off_state = false;
965
966 if (adev->gfx.funcs->init_spm_golden) {
967 dev_dbg(adev->dev,
968 "GFXOFF is disabled, re-init SPM golden settings\n");
969 amdgpu_gfx_init_spm_golden(adev);
970 }
971 }
972 }
973
974 adev->gfx.gfx_off_req_count++;
975 }
976
977 unlock:
978 mutex_unlock(&adev->gfx.gfx_off_mutex);
979 }
980
981 /* amdgpu_gfx_off_ctrl - Handle gfx off feature enable/disable
982 *
983 * @adev: amdgpu_device pointer
984 * @bool enable true: enable gfx off feature, false: disable gfx off feature
985 *
986 * 1. gfx off feature will be enabled by gfx ip after gfx cg pg enabled.
987 * 2. other client can send request to disable gfx off feature, the request should be honored.
988 * 3. other client can cancel their request of disable gfx off feature
989 * 4. other client should not send request to enable gfx off feature before disable gfx off feature.
990 *
991 * gfx off allow will be delayed by GFX_OFF_DELAY_ENABLE ms.
992 */
amdgpu_gfx_off_ctrl(struct amdgpu_device * adev,bool enable)993 void amdgpu_gfx_off_ctrl(struct amdgpu_device *adev, bool enable)
994 {
995 /* If going to s2idle, no need to wait */
996 bool no_delay = adev->in_s0ix ? true : false;
997
998 amdgpu_gfx_do_off_ctrl(adev, enable, no_delay);
999 }
1000
1001 /* amdgpu_gfx_off_ctrl_immediate - Handle gfx off feature enable/disable
1002 *
1003 * @adev: amdgpu_device pointer
1004 * @bool enable true: enable gfx off feature, false: disable gfx off feature
1005 *
1006 * 1. gfx off feature will be enabled by gfx ip after gfx cg pg enabled.
1007 * 2. other client can send request to disable gfx off feature, the request should be honored.
1008 * 3. other client can cancel their request of disable gfx off feature
1009 * 4. other client should not send request to enable gfx off feature before disable gfx off feature.
1010 *
1011 * gfx off allow will be issued immediately.
1012 */
amdgpu_gfx_off_ctrl_immediate(struct amdgpu_device * adev,bool enable)1013 void amdgpu_gfx_off_ctrl_immediate(struct amdgpu_device *adev, bool enable)
1014 {
1015 amdgpu_gfx_do_off_ctrl(adev, enable, true);
1016 }
1017
amdgpu_set_gfx_off_residency(struct amdgpu_device * adev,bool value)1018 int amdgpu_set_gfx_off_residency(struct amdgpu_device *adev, bool value)
1019 {
1020 int r = 0;
1021
1022 mutex_lock(&adev->gfx.gfx_off_mutex);
1023
1024 r = amdgpu_dpm_set_residency_gfxoff(adev, value);
1025
1026 mutex_unlock(&adev->gfx.gfx_off_mutex);
1027
1028 return r;
1029 }
1030
amdgpu_get_gfx_off_residency(struct amdgpu_device * adev,u32 * value)1031 int amdgpu_get_gfx_off_residency(struct amdgpu_device *adev, u32 *value)
1032 {
1033 int r = 0;
1034
1035 mutex_lock(&adev->gfx.gfx_off_mutex);
1036
1037 r = amdgpu_dpm_get_residency_gfxoff(adev, value);
1038
1039 mutex_unlock(&adev->gfx.gfx_off_mutex);
1040
1041 return r;
1042 }
1043
amdgpu_get_gfx_off_entrycount(struct amdgpu_device * adev,u64 * value)1044 int amdgpu_get_gfx_off_entrycount(struct amdgpu_device *adev, u64 *value)
1045 {
1046 int r = 0;
1047
1048 mutex_lock(&adev->gfx.gfx_off_mutex);
1049
1050 r = amdgpu_dpm_get_entrycount_gfxoff(adev, value);
1051
1052 mutex_unlock(&adev->gfx.gfx_off_mutex);
1053
1054 return r;
1055 }
1056
amdgpu_get_gfx_off_status(struct amdgpu_device * adev,uint32_t * value)1057 int amdgpu_get_gfx_off_status(struct amdgpu_device *adev, uint32_t *value)
1058 {
1059
1060 int r = 0;
1061
1062 mutex_lock(&adev->gfx.gfx_off_mutex);
1063
1064 r = amdgpu_dpm_get_status_gfxoff(adev, value);
1065
1066 mutex_unlock(&adev->gfx.gfx_off_mutex);
1067
1068 return r;
1069 }
1070
amdgpu_gfx_ras_late_init(struct amdgpu_device * adev,struct ras_common_if * ras_block)1071 int amdgpu_gfx_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *ras_block)
1072 {
1073 int r;
1074
1075 if (amdgpu_ras_is_supported(adev, ras_block->block)) {
1076 if (!amdgpu_persistent_edc_harvesting_supported(adev)) {
1077 r = amdgpu_ras_reset_error_status(adev, AMDGPU_RAS_BLOCK__GFX);
1078 if (r)
1079 return r;
1080 }
1081
1082 r = amdgpu_ras_block_late_init(adev, ras_block);
1083 if (r)
1084 return r;
1085
1086 if (!amdgpu_sriov_vf(adev) && adev->gfx.cp_ecc_error_irq.funcs) {
1087 r = amdgpu_irq_get(adev, &adev->gfx.cp_ecc_error_irq, 0);
1088 if (r)
1089 goto late_fini;
1090 }
1091 } else {
1092 amdgpu_ras_feature_enable_on_boot(adev, ras_block, 0);
1093 }
1094
1095 return 0;
1096 late_fini:
1097 amdgpu_ras_block_late_fini(adev, ras_block);
1098 return r;
1099 }
1100
amdgpu_gfx_ras_suspend(struct amdgpu_device * adev,struct ras_common_if * ras_block)1101 void amdgpu_gfx_ras_suspend(struct amdgpu_device *adev,
1102 struct ras_common_if *ras_block)
1103 {
1104 if (!amdgpu_sriov_vf(adev) && adev->gfx.cp_ecc_error_irq.funcs)
1105 amdgpu_irq_put(adev, &adev->gfx.cp_ecc_error_irq, 0);
1106 }
1107
amdgpu_gfx_ras_fini(struct amdgpu_device * adev,struct ras_common_if * ras_block)1108 void amdgpu_gfx_ras_fini(struct amdgpu_device *adev,
1109 struct ras_common_if *ras_block)
1110 {
1111 if (!amdgpu_sriov_vf(adev) && adev->gfx.cp_ecc_error_irq.funcs)
1112 amdgpu_irq_put(adev, &adev->gfx.cp_ecc_error_irq, 0);
1113 amdgpu_ras_block_late_fini(adev, ras_block);
1114 }
1115
amdgpu_gfx_ras_sw_init(struct amdgpu_device * adev)1116 int amdgpu_gfx_ras_sw_init(struct amdgpu_device *adev)
1117 {
1118 int err = 0;
1119 struct amdgpu_gfx_ras *ras = NULL;
1120
1121 /* adev->gfx.ras is NULL, which means gfx does not
1122 * support ras function, then do nothing here.
1123 */
1124 if (!adev->gfx.ras)
1125 return 0;
1126
1127 ras = adev->gfx.ras;
1128
1129 err = amdgpu_ras_register_ras_block(adev, &ras->ras_block);
1130 if (err) {
1131 dev_err(adev->dev, "Failed to register gfx ras block!\n");
1132 return err;
1133 }
1134
1135 strcpy(ras->ras_block.ras_comm.name, "gfx");
1136 ras->ras_block.ras_comm.block = AMDGPU_RAS_BLOCK__GFX;
1137 ras->ras_block.ras_comm.type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
1138 adev->gfx.ras_if = &ras->ras_block.ras_comm;
1139
1140 /* If not define special ras_late_init function, use gfx default ras_late_init */
1141 if (!ras->ras_block.ras_late_init)
1142 ras->ras_block.ras_late_init = amdgpu_gfx_ras_late_init;
1143
1144 if (!ras->ras_block.ras_suspend)
1145 ras->ras_block.ras_suspend = amdgpu_gfx_ras_suspend;
1146
1147 if (!ras->ras_block.ras_fini)
1148 ras->ras_block.ras_fini = amdgpu_gfx_ras_fini;
1149
1150 /* If not defined special ras_cb function, use default ras_cb */
1151 if (!ras->ras_block.ras_cb)
1152 ras->ras_block.ras_cb = amdgpu_gfx_process_ras_data_cb;
1153
1154 return 0;
1155 }
1156
amdgpu_gfx_poison_consumption_handler(struct amdgpu_device * adev,struct amdgpu_iv_entry * entry)1157 int amdgpu_gfx_poison_consumption_handler(struct amdgpu_device *adev,
1158 struct amdgpu_iv_entry *entry)
1159 {
1160 if (adev->gfx.ras && adev->gfx.ras->poison_consumption_handler)
1161 return adev->gfx.ras->poison_consumption_handler(adev, entry);
1162
1163 return 0;
1164 }
1165
amdgpu_gfx_process_ras_data_cb(struct amdgpu_device * adev,void * err_data,struct amdgpu_iv_entry * entry)1166 int amdgpu_gfx_process_ras_data_cb(struct amdgpu_device *adev,
1167 void *err_data,
1168 struct amdgpu_iv_entry *entry)
1169 {
1170 /* TODO ue will trigger an interrupt.
1171 *
1172 * When “Full RAS” is enabled, the per-IP interrupt sources should
1173 * be disabled and the driver should only look for the aggregated
1174 * interrupt via sync flood
1175 */
1176 if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX)) {
1177 kgd2kfd_set_sram_ecc_flag(adev->kfd.dev);
1178 if (adev->gfx.ras && adev->gfx.ras->ras_block.hw_ops &&
1179 adev->gfx.ras->ras_block.hw_ops->query_ras_error_count)
1180 adev->gfx.ras->ras_block.hw_ops->query_ras_error_count(adev, err_data);
1181 amdgpu_ras_reset_gpu(adev);
1182 }
1183 return AMDGPU_RAS_SUCCESS;
1184 }
1185
amdgpu_gfx_cp_ecc_error_irq(struct amdgpu_device * adev,struct amdgpu_irq_src * source,struct amdgpu_iv_entry * entry)1186 int amdgpu_gfx_cp_ecc_error_irq(struct amdgpu_device *adev,
1187 struct amdgpu_irq_src *source,
1188 struct amdgpu_iv_entry *entry)
1189 {
1190 struct ras_common_if *ras_if = adev->gfx.ras_if;
1191 struct ras_dispatch_if ih_data = {
1192 .entry = entry,
1193 };
1194
1195 if (!ras_if)
1196 return 0;
1197
1198 ih_data.head = *ras_if;
1199
1200 dev_err(adev->dev, "CP ECC ERROR IRQ\n");
1201 amdgpu_ras_interrupt_dispatch(adev, &ih_data);
1202 return 0;
1203 }
1204
amdgpu_gfx_ras_error_func(struct amdgpu_device * adev,void * ras_error_status,void (* func)(struct amdgpu_device * adev,void * ras_error_status,int xcc_id))1205 void amdgpu_gfx_ras_error_func(struct amdgpu_device *adev,
1206 void *ras_error_status,
1207 void (*func)(struct amdgpu_device *adev, void *ras_error_status,
1208 int xcc_id))
1209 {
1210 int i;
1211 int num_xcc = adev->gfx.xcc_mask ? NUM_XCC(adev->gfx.xcc_mask) : 1;
1212 uint32_t xcc_mask = GENMASK(num_xcc - 1, 0);
1213 struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status;
1214
1215 if (err_data) {
1216 err_data->ue_count = 0;
1217 err_data->ce_count = 0;
1218 }
1219
1220 for_each_inst(i, xcc_mask)
1221 func(adev, ras_error_status, i);
1222 }
1223
amdgpu_kiq_rreg(struct amdgpu_device * adev,uint32_t reg,uint32_t xcc_id)1224 uint32_t amdgpu_kiq_rreg(struct amdgpu_device *adev, uint32_t reg, uint32_t xcc_id)
1225 {
1226 signed long r, cnt = 0;
1227 unsigned long flags;
1228 uint32_t seq, reg_val_offs = 0, value = 0;
1229 struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
1230 struct amdgpu_ring *ring = &kiq->ring;
1231
1232 if (amdgpu_device_skip_hw_access(adev))
1233 return 0;
1234
1235 if (adev->mes.ring[0].sched.ready)
1236 return amdgpu_mes_rreg(adev, reg, xcc_id);
1237
1238 BUG_ON(!ring->funcs->emit_rreg);
1239
1240 spin_lock_irqsave(&kiq->ring_lock, flags);
1241 if (amdgpu_wb_get(adev, ®_val_offs)) {
1242 pr_err("critical bug! too many kiq readers\n");
1243 goto failed_unlock;
1244 }
1245 r = amdgpu_ring_alloc(ring, 32);
1246 if (r)
1247 goto failed_unlock;
1248
1249 amdgpu_ring_emit_rreg(ring, reg, reg_val_offs);
1250 r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT);
1251 if (r)
1252 goto failed_undo;
1253
1254 amdgpu_ring_commit(ring);
1255 spin_unlock_irqrestore(&kiq->ring_lock, flags);
1256
1257 r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
1258
1259 /* don't wait anymore for gpu reset case because this way may
1260 * block gpu_recover() routine forever, e.g. this virt_kiq_rreg
1261 * is triggered in TTM and ttm_bo_lock_delayed_workqueue() will
1262 * never return if we keep waiting in virt_kiq_rreg, which cause
1263 * gpu_recover() hang there.
1264 *
1265 * also don't wait anymore for IRQ context
1266 * */
1267 if (r < 1 && (amdgpu_in_reset(adev) || in_interrupt()))
1268 goto failed_kiq_read;
1269
1270 might_sleep();
1271 while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) {
1272 if (amdgpu_in_reset(adev))
1273 goto failed_kiq_read;
1274
1275 msleep(MAX_KIQ_REG_BAILOUT_INTERVAL);
1276 r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
1277 }
1278
1279 if (cnt > MAX_KIQ_REG_TRY)
1280 goto failed_kiq_read;
1281
1282 mb();
1283 value = adev->wb.wb[reg_val_offs];
1284 amdgpu_wb_free(adev, reg_val_offs);
1285 return value;
1286
1287 failed_undo:
1288 amdgpu_ring_undo(ring);
1289 failed_unlock:
1290 spin_unlock_irqrestore(&kiq->ring_lock, flags);
1291 failed_kiq_read:
1292 if (reg_val_offs)
1293 amdgpu_wb_free(adev, reg_val_offs);
1294 dev_err(adev->dev, "failed to read reg:%x\n", reg);
1295 return ~0;
1296 }
1297
amdgpu_kiq_wreg(struct amdgpu_device * adev,uint32_t reg,uint32_t v,uint32_t xcc_id)1298 void amdgpu_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v, uint32_t xcc_id)
1299 {
1300 signed long r, cnt = 0;
1301 unsigned long flags;
1302 uint32_t seq;
1303 struct amdgpu_kiq *kiq = &adev->gfx.kiq[xcc_id];
1304 struct amdgpu_ring *ring = &kiq->ring;
1305
1306 BUG_ON(!ring->funcs->emit_wreg);
1307
1308 if (amdgpu_device_skip_hw_access(adev))
1309 return;
1310
1311 if (adev->mes.ring[0].sched.ready) {
1312 amdgpu_mes_wreg(adev, reg, v, xcc_id);
1313 return;
1314 }
1315
1316 spin_lock_irqsave(&kiq->ring_lock, flags);
1317 r = amdgpu_ring_alloc(ring, 32);
1318 if (r)
1319 goto failed_unlock;
1320
1321 amdgpu_ring_emit_wreg(ring, reg, v);
1322 r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT);
1323 if (r)
1324 goto failed_undo;
1325
1326 amdgpu_ring_commit(ring);
1327 spin_unlock_irqrestore(&kiq->ring_lock, flags);
1328
1329 r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
1330
1331 /* don't wait anymore for gpu reset case because this way may
1332 * block gpu_recover() routine forever, e.g. this virt_kiq_rreg
1333 * is triggered in TTM and ttm_bo_lock_delayed_workqueue() will
1334 * never return if we keep waiting in virt_kiq_rreg, which cause
1335 * gpu_recover() hang there.
1336 *
1337 * also don't wait anymore for IRQ context
1338 * */
1339 if (r < 1 && (amdgpu_in_reset(adev) || in_interrupt()))
1340 goto failed_kiq_write;
1341
1342 might_sleep();
1343 while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) {
1344 if (amdgpu_in_reset(adev))
1345 goto failed_kiq_write;
1346
1347 msleep(MAX_KIQ_REG_BAILOUT_INTERVAL);
1348 r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
1349 }
1350
1351 if (cnt > MAX_KIQ_REG_TRY)
1352 goto failed_kiq_write;
1353
1354 return;
1355
1356 failed_undo:
1357 amdgpu_ring_undo(ring);
1358 failed_unlock:
1359 spin_unlock_irqrestore(&kiq->ring_lock, flags);
1360 failed_kiq_write:
1361 dev_err(adev->dev, "failed to write reg:%x\n", reg);
1362 }
1363
amdgpu_gfx_get_hdp_flush_mask(struct amdgpu_ring * ring,uint32_t * hdp_flush_mask,uint32_t * reg_mem_engine)1364 void amdgpu_gfx_get_hdp_flush_mask(struct amdgpu_ring *ring,
1365 uint32_t *hdp_flush_mask, uint32_t *reg_mem_engine)
1366 {
1367
1368 if (!ring || !hdp_flush_mask || !reg_mem_engine) {
1369 DRM_INFO("%s:invalid params\n", __func__);
1370 return;
1371 }
1372
1373 const struct nbio_hdp_flush_reg *nbio_hf_reg = ring->adev->nbio.hdp_flush_reg;
1374
1375 switch (ring->funcs->type) {
1376 case AMDGPU_RING_TYPE_GFX:
1377 *hdp_flush_mask = nbio_hf_reg->ref_and_mask_cp0 << ring->pipe;
1378 *reg_mem_engine = 1; /* pfp */
1379 break;
1380 case AMDGPU_RING_TYPE_COMPUTE:
1381 *hdp_flush_mask = nbio_hf_reg->ref_and_mask_cp2 << ring->pipe;
1382 *reg_mem_engine = 0;
1383 break;
1384 case AMDGPU_RING_TYPE_MES:
1385 *hdp_flush_mask = nbio_hf_reg->ref_and_mask_cp8;
1386 *reg_mem_engine = 0;
1387 break;
1388 case AMDGPU_RING_TYPE_KIQ:
1389 *hdp_flush_mask = nbio_hf_reg->ref_and_mask_cp9;
1390 *reg_mem_engine = 0;
1391 break;
1392 default:
1393 DRM_ERROR("%s:unsupported ring type %d\n", __func__, ring->funcs->type);
1394 return;
1395 }
1396 }
1397
amdgpu_kiq_hdp_flush(struct amdgpu_device * adev)1398 int amdgpu_kiq_hdp_flush(struct amdgpu_device *adev)
1399 {
1400 signed long r, cnt = 0;
1401 unsigned long flags;
1402 uint32_t seq;
1403 struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];
1404 struct amdgpu_ring *ring = &kiq->ring;
1405
1406 if (amdgpu_device_skip_hw_access(adev))
1407 return 0;
1408
1409 if (adev->enable_mes_kiq && adev->mes.ring[0].sched.ready)
1410 return amdgpu_mes_hdp_flush(adev);
1411
1412 if (!ring->funcs->emit_hdp_flush) {
1413 return -EOPNOTSUPP;
1414 }
1415
1416 spin_lock_irqsave(&kiq->ring_lock, flags);
1417 r = amdgpu_ring_alloc(ring, 32);
1418 if (r)
1419 goto failed_unlock;
1420
1421 amdgpu_ring_emit_hdp_flush(ring);
1422 r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT);
1423 if (r)
1424 goto failed_undo;
1425
1426 amdgpu_ring_commit(ring);
1427 spin_unlock_irqrestore(&kiq->ring_lock, flags);
1428
1429 r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
1430
1431 /* don't wait anymore for gpu reset case because this way may
1432 * block gpu_recover() routine forever, e.g. this virt_kiq_rreg
1433 * is triggered in TTM and ttm_bo_lock_delayed_workqueue() will
1434 * never return if we keep waiting in virt_kiq_rreg, which cause
1435 * gpu_recover() hang there.
1436 *
1437 * also don't wait anymore for IRQ context
1438 * */
1439 if (r < 1 && (amdgpu_in_reset(adev) || in_interrupt()))
1440 goto failed_kiq_hdp_flush;
1441
1442 might_sleep();
1443 while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) {
1444 if (amdgpu_in_reset(adev))
1445 goto failed_kiq_hdp_flush;
1446
1447 msleep(MAX_KIQ_REG_BAILOUT_INTERVAL);
1448 r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
1449 }
1450
1451 if (cnt > MAX_KIQ_REG_TRY) {
1452 dev_err(adev->dev, "failed to flush HDP via KIQ timeout\n");
1453 return -ETIMEDOUT;
1454 }
1455
1456 return 0;
1457
1458 failed_undo:
1459 amdgpu_ring_undo(ring);
1460 failed_unlock:
1461 spin_unlock_irqrestore(&kiq->ring_lock, flags);
1462 failed_kiq_hdp_flush:
1463 if (!amdgpu_in_reset(adev))
1464 dev_err(adev->dev, "failed to flush HDP via KIQ\n");
1465 return r < 0 ? r : -EIO;
1466 }
1467
amdgpu_gfx_get_num_kcq(struct amdgpu_device * adev)1468 int amdgpu_gfx_get_num_kcq(struct amdgpu_device *adev)
1469 {
1470 if (amdgpu_num_kcq == -1) {
1471 return 8;
1472 } else if (amdgpu_num_kcq > 8 || amdgpu_num_kcq < 0) {
1473 dev_warn(adev->dev, "set kernel compute queue number to 8 due to invalid parameter provided by user\n");
1474 return 8;
1475 }
1476 return amdgpu_num_kcq;
1477 }
1478
amdgpu_gfx_cp_init_microcode(struct amdgpu_device * adev,uint32_t ucode_id)1479 void amdgpu_gfx_cp_init_microcode(struct amdgpu_device *adev,
1480 uint32_t ucode_id)
1481 {
1482 const struct gfx_firmware_header_v1_0 *cp_hdr;
1483 const struct gfx_firmware_header_v2_0 *cp_hdr_v2_0;
1484 struct amdgpu_firmware_info *info = NULL;
1485 const struct firmware *ucode_fw;
1486 unsigned int fw_size;
1487
1488 switch (ucode_id) {
1489 case AMDGPU_UCODE_ID_CP_PFP:
1490 cp_hdr = (const struct gfx_firmware_header_v1_0 *)
1491 adev->gfx.pfp_fw->data;
1492 adev->gfx.pfp_fw_version =
1493 le32_to_cpu(cp_hdr->header.ucode_version);
1494 adev->gfx.pfp_feature_version =
1495 le32_to_cpu(cp_hdr->ucode_feature_version);
1496 ucode_fw = adev->gfx.pfp_fw;
1497 fw_size = le32_to_cpu(cp_hdr->header.ucode_size_bytes);
1498 break;
1499 case AMDGPU_UCODE_ID_CP_RS64_PFP:
1500 cp_hdr_v2_0 = (const struct gfx_firmware_header_v2_0 *)
1501 adev->gfx.pfp_fw->data;
1502 adev->gfx.pfp_fw_version =
1503 le32_to_cpu(cp_hdr_v2_0->header.ucode_version);
1504 adev->gfx.pfp_feature_version =
1505 le32_to_cpu(cp_hdr_v2_0->ucode_feature_version);
1506 ucode_fw = adev->gfx.pfp_fw;
1507 fw_size = le32_to_cpu(cp_hdr_v2_0->ucode_size_bytes);
1508 break;
1509 case AMDGPU_UCODE_ID_CP_RS64_PFP_P0_STACK:
1510 case AMDGPU_UCODE_ID_CP_RS64_PFP_P1_STACK:
1511 cp_hdr_v2_0 = (const struct gfx_firmware_header_v2_0 *)
1512 adev->gfx.pfp_fw->data;
1513 ucode_fw = adev->gfx.pfp_fw;
1514 fw_size = le32_to_cpu(cp_hdr_v2_0->data_size_bytes);
1515 break;
1516 case AMDGPU_UCODE_ID_CP_ME:
1517 cp_hdr = (const struct gfx_firmware_header_v1_0 *)
1518 adev->gfx.me_fw->data;
1519 adev->gfx.me_fw_version =
1520 le32_to_cpu(cp_hdr->header.ucode_version);
1521 adev->gfx.me_feature_version =
1522 le32_to_cpu(cp_hdr->ucode_feature_version);
1523 ucode_fw = adev->gfx.me_fw;
1524 fw_size = le32_to_cpu(cp_hdr->header.ucode_size_bytes);
1525 break;
1526 case AMDGPU_UCODE_ID_CP_RS64_ME:
1527 cp_hdr_v2_0 = (const struct gfx_firmware_header_v2_0 *)
1528 adev->gfx.me_fw->data;
1529 adev->gfx.me_fw_version =
1530 le32_to_cpu(cp_hdr_v2_0->header.ucode_version);
1531 adev->gfx.me_feature_version =
1532 le32_to_cpu(cp_hdr_v2_0->ucode_feature_version);
1533 ucode_fw = adev->gfx.me_fw;
1534 fw_size = le32_to_cpu(cp_hdr_v2_0->ucode_size_bytes);
1535 break;
1536 case AMDGPU_UCODE_ID_CP_RS64_ME_P0_STACK:
1537 case AMDGPU_UCODE_ID_CP_RS64_ME_P1_STACK:
1538 cp_hdr_v2_0 = (const struct gfx_firmware_header_v2_0 *)
1539 adev->gfx.me_fw->data;
1540 ucode_fw = adev->gfx.me_fw;
1541 fw_size = le32_to_cpu(cp_hdr_v2_0->data_size_bytes);
1542 break;
1543 case AMDGPU_UCODE_ID_CP_CE:
1544 cp_hdr = (const struct gfx_firmware_header_v1_0 *)
1545 adev->gfx.ce_fw->data;
1546 adev->gfx.ce_fw_version =
1547 le32_to_cpu(cp_hdr->header.ucode_version);
1548 adev->gfx.ce_feature_version =
1549 le32_to_cpu(cp_hdr->ucode_feature_version);
1550 ucode_fw = adev->gfx.ce_fw;
1551 fw_size = le32_to_cpu(cp_hdr->header.ucode_size_bytes);
1552 break;
1553 case AMDGPU_UCODE_ID_CP_MEC1:
1554 cp_hdr = (const struct gfx_firmware_header_v1_0 *)
1555 adev->gfx.mec_fw->data;
1556 adev->gfx.mec_fw_version =
1557 le32_to_cpu(cp_hdr->header.ucode_version);
1558 adev->gfx.mec_feature_version =
1559 le32_to_cpu(cp_hdr->ucode_feature_version);
1560 ucode_fw = adev->gfx.mec_fw;
1561 fw_size = le32_to_cpu(cp_hdr->header.ucode_size_bytes) -
1562 le32_to_cpu(cp_hdr->jt_size) * 4;
1563 break;
1564 case AMDGPU_UCODE_ID_CP_MEC1_JT:
1565 cp_hdr = (const struct gfx_firmware_header_v1_0 *)
1566 adev->gfx.mec_fw->data;
1567 ucode_fw = adev->gfx.mec_fw;
1568 fw_size = le32_to_cpu(cp_hdr->jt_size) * 4;
1569 break;
1570 case AMDGPU_UCODE_ID_CP_MEC2:
1571 cp_hdr = (const struct gfx_firmware_header_v1_0 *)
1572 adev->gfx.mec2_fw->data;
1573 adev->gfx.mec2_fw_version =
1574 le32_to_cpu(cp_hdr->header.ucode_version);
1575 adev->gfx.mec2_feature_version =
1576 le32_to_cpu(cp_hdr->ucode_feature_version);
1577 ucode_fw = adev->gfx.mec2_fw;
1578 fw_size = le32_to_cpu(cp_hdr->header.ucode_size_bytes) -
1579 le32_to_cpu(cp_hdr->jt_size) * 4;
1580 break;
1581 case AMDGPU_UCODE_ID_CP_MEC2_JT:
1582 cp_hdr = (const struct gfx_firmware_header_v1_0 *)
1583 adev->gfx.mec2_fw->data;
1584 ucode_fw = adev->gfx.mec2_fw;
1585 fw_size = le32_to_cpu(cp_hdr->jt_size) * 4;
1586 break;
1587 case AMDGPU_UCODE_ID_CP_RS64_MEC:
1588 cp_hdr_v2_0 = (const struct gfx_firmware_header_v2_0 *)
1589 adev->gfx.mec_fw->data;
1590 adev->gfx.mec_fw_version =
1591 le32_to_cpu(cp_hdr_v2_0->header.ucode_version);
1592 adev->gfx.mec_feature_version =
1593 le32_to_cpu(cp_hdr_v2_0->ucode_feature_version);
1594 ucode_fw = adev->gfx.mec_fw;
1595 fw_size = le32_to_cpu(cp_hdr_v2_0->ucode_size_bytes);
1596 break;
1597 case AMDGPU_UCODE_ID_CP_RS64_MEC_P0_STACK:
1598 case AMDGPU_UCODE_ID_CP_RS64_MEC_P1_STACK:
1599 case AMDGPU_UCODE_ID_CP_RS64_MEC_P2_STACK:
1600 case AMDGPU_UCODE_ID_CP_RS64_MEC_P3_STACK:
1601 cp_hdr_v2_0 = (const struct gfx_firmware_header_v2_0 *)
1602 adev->gfx.mec_fw->data;
1603 ucode_fw = adev->gfx.mec_fw;
1604 fw_size = le32_to_cpu(cp_hdr_v2_0->data_size_bytes);
1605 break;
1606 default:
1607 dev_err(adev->dev, "Invalid ucode id %u\n", ucode_id);
1608 return;
1609 }
1610
1611 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
1612 info = &adev->firmware.ucode[ucode_id];
1613 info->ucode_id = ucode_id;
1614 info->fw = ucode_fw;
1615 adev->firmware.fw_size += ALIGN(fw_size, PAGE_SIZE);
1616 }
1617 }
1618
amdgpu_gfx_is_master_xcc(struct amdgpu_device * adev,int xcc_id)1619 bool amdgpu_gfx_is_master_xcc(struct amdgpu_device *adev, int xcc_id)
1620 {
1621 return !(xcc_id % (adev->gfx.num_xcc_per_xcp ?
1622 adev->gfx.num_xcc_per_xcp : 1));
1623 }
1624
amdgpu_gfx_get_current_compute_partition(struct device * dev,struct device_attribute * addr,char * buf)1625 static ssize_t amdgpu_gfx_get_current_compute_partition(struct device *dev,
1626 struct device_attribute *addr,
1627 char *buf)
1628 {
1629 struct drm_device *ddev = dev_get_drvdata(dev);
1630 struct amdgpu_device *adev = drm_to_adev(ddev);
1631 int mode;
1632
1633 /* Only minimal precaution taken to reject requests while in reset.*/
1634 if (amdgpu_in_reset(adev))
1635 return -EPERM;
1636
1637 mode = amdgpu_xcp_query_partition_mode(adev->xcp_mgr,
1638 AMDGPU_XCP_FL_NONE);
1639
1640 return sysfs_emit(buf, "%s\n", amdgpu_gfx_compute_mode_desc(mode));
1641 }
1642
amdgpu_gfx_set_compute_partition(struct device * dev,struct device_attribute * addr,const char * buf,size_t count)1643 static ssize_t amdgpu_gfx_set_compute_partition(struct device *dev,
1644 struct device_attribute *addr,
1645 const char *buf, size_t count)
1646 {
1647 struct drm_device *ddev = dev_get_drvdata(dev);
1648 struct amdgpu_device *adev = drm_to_adev(ddev);
1649 enum amdgpu_gfx_partition mode;
1650 int ret = 0, num_xcc;
1651
1652 num_xcc = NUM_XCC(adev->gfx.xcc_mask);
1653 if (num_xcc % 2 != 0)
1654 return -EINVAL;
1655
1656 if (!strncasecmp("SPX", buf, strlen("SPX"))) {
1657 mode = AMDGPU_SPX_PARTITION_MODE;
1658 } else if (!strncasecmp("DPX", buf, strlen("DPX"))) {
1659 /*
1660 * DPX mode needs AIDs to be in multiple of 2.
1661 * Each AID connects 2 XCCs.
1662 */
1663 if (num_xcc%4)
1664 return -EINVAL;
1665 mode = AMDGPU_DPX_PARTITION_MODE;
1666 } else if (!strncasecmp("TPX", buf, strlen("TPX"))) {
1667 if (num_xcc != 6)
1668 return -EINVAL;
1669 mode = AMDGPU_TPX_PARTITION_MODE;
1670 } else if (!strncasecmp("QPX", buf, strlen("QPX"))) {
1671 if (num_xcc != 8)
1672 return -EINVAL;
1673 mode = AMDGPU_QPX_PARTITION_MODE;
1674 } else if (!strncasecmp("CPX", buf, strlen("CPX"))) {
1675 mode = AMDGPU_CPX_PARTITION_MODE;
1676 } else {
1677 return -EINVAL;
1678 }
1679
1680 /* Don't allow a switch while under reset */
1681 if (!down_read_trylock(&adev->reset_domain->sem))
1682 return -EPERM;
1683
1684 ret = amdgpu_xcp_switch_partition_mode(adev->xcp_mgr, mode);
1685
1686 up_read(&adev->reset_domain->sem);
1687
1688 if (ret)
1689 return ret;
1690
1691 return count;
1692 }
1693
compute_partition_mem_alloc_mode_show(struct device * dev,struct device_attribute * addr,char * buf)1694 static ssize_t compute_partition_mem_alloc_mode_show(struct device *dev,
1695 struct device_attribute *addr,
1696 char *buf)
1697 {
1698 struct drm_device *ddev = dev_get_drvdata(dev);
1699 struct amdgpu_device *adev = drm_to_adev(ddev);
1700 int mode = adev->xcp_mgr->mem_alloc_mode;
1701
1702 return sysfs_emit(buf, "%s\n",
1703 amdgpu_gfx_compute_mem_alloc_mode_desc(mode));
1704 }
1705
1706
compute_partition_mem_alloc_mode_store(struct device * dev,struct device_attribute * addr,const char * buf,size_t count)1707 static ssize_t compute_partition_mem_alloc_mode_store(struct device *dev,
1708 struct device_attribute *addr,
1709 const char *buf, size_t count)
1710 {
1711 struct drm_device *ddev = dev_get_drvdata(dev);
1712 struct amdgpu_device *adev = drm_to_adev(ddev);
1713
1714 if (!strncasecmp("CAPPING", buf, strlen("CAPPING")))
1715 adev->xcp_mgr->mem_alloc_mode = AMDGPU_PARTITION_MEM_CAPPING_EVEN;
1716 else if (!strncasecmp("ALL", buf, strlen("ALL")))
1717 adev->xcp_mgr->mem_alloc_mode = AMDGPU_PARTITION_MEM_ALLOC_ALL;
1718 else
1719 return -EINVAL;
1720
1721 return count;
1722 }
1723
1724 static const char *xcp_desc[] = {
1725 [AMDGPU_SPX_PARTITION_MODE] = "SPX",
1726 [AMDGPU_DPX_PARTITION_MODE] = "DPX",
1727 [AMDGPU_TPX_PARTITION_MODE] = "TPX",
1728 [AMDGPU_QPX_PARTITION_MODE] = "QPX",
1729 [AMDGPU_CPX_PARTITION_MODE] = "CPX",
1730 };
1731
amdgpu_gfx_get_available_compute_partition(struct device * dev,struct device_attribute * addr,char * buf)1732 static ssize_t amdgpu_gfx_get_available_compute_partition(struct device *dev,
1733 struct device_attribute *addr,
1734 char *buf)
1735 {
1736 struct drm_device *ddev = dev_get_drvdata(dev);
1737 struct amdgpu_device *adev = drm_to_adev(ddev);
1738 struct amdgpu_xcp_mgr *xcp_mgr = adev->xcp_mgr;
1739 int size = 0, mode;
1740 char *sep = "";
1741
1742 if (!xcp_mgr || !xcp_mgr->avail_xcp_modes)
1743 return sysfs_emit(buf, "Not supported\n");
1744
1745 for_each_inst(mode, xcp_mgr->avail_xcp_modes) {
1746 size += sysfs_emit_at(buf, size, "%s%s", sep, xcp_desc[mode]);
1747 sep = ", ";
1748 }
1749
1750 size += sysfs_emit_at(buf, size, "\n");
1751
1752 return size;
1753 }
1754
amdgpu_gfx_run_cleaner_shader_job(struct amdgpu_ring * ring)1755 static int amdgpu_gfx_run_cleaner_shader_job(struct amdgpu_ring *ring)
1756 {
1757 struct amdgpu_device *adev = ring->adev;
1758 struct drm_gpu_scheduler *sched = &ring->sched;
1759 struct drm_sched_entity entity;
1760 unsigned int ib_size_dw = 16;
1761 static atomic_t counter;
1762 struct dma_fence *f;
1763 struct amdgpu_job *job;
1764 struct amdgpu_ib *ib;
1765 void *owner;
1766 int r;
1767
1768 /* Initialize the scheduler entity */
1769 r = drm_sched_entity_init(&entity, DRM_SCHED_PRIORITY_NORMAL,
1770 &sched, 1, NULL);
1771 if (r) {
1772 dev_err(adev->dev, "Failed setting up GFX kernel entity.\n");
1773 goto err;
1774 }
1775
1776 /*
1777 * Use some unique dummy value as the owner to make sure we execute
1778 * the cleaner shader on each submission. The value just need to change
1779 * for each submission and is otherwise meaningless.
1780 */
1781 owner = (void *)(unsigned long)atomic_inc_return(&counter);
1782
1783 r = amdgpu_job_alloc_with_ib(ring->adev, &entity, owner,
1784 ib_size_dw * sizeof(uint32_t), 0,
1785 AMDGPU_KERNEL_JOB_ID_CLEANER_SHADER,
1786 &job);
1787 if (r)
1788 goto err;
1789
1790 job->enforce_isolation = true;
1791 /* always run the cleaner shader */
1792 job->run_cleaner_shader = true;
1793
1794 ib = &job->ibs[0];
1795 memset32(ib->ptr, ring->funcs->nop, ib_size_dw);
1796 ib->length_dw = ib_size_dw;
1797
1798 f = amdgpu_job_submit(job);
1799
1800 r = dma_fence_wait(f, false);
1801 if (r)
1802 goto err;
1803
1804 dma_fence_put(f);
1805
1806 /* Clean up the scheduler entity */
1807 drm_sched_entity_destroy(&entity);
1808 return 0;
1809
1810 err:
1811 return r;
1812 }
1813
amdgpu_gfx_run_cleaner_shader(struct amdgpu_device * adev,int xcp_id)1814 static int amdgpu_gfx_run_cleaner_shader(struct amdgpu_device *adev, int xcp_id)
1815 {
1816 int num_xcc = NUM_XCC(adev->gfx.xcc_mask);
1817 struct amdgpu_ring *ring;
1818 int num_xcc_to_clear;
1819 int i, r, xcc_id;
1820
1821 if (adev->gfx.num_xcc_per_xcp)
1822 num_xcc_to_clear = adev->gfx.num_xcc_per_xcp;
1823 else
1824 num_xcc_to_clear = 1;
1825
1826 for (xcc_id = 0; xcc_id < num_xcc; xcc_id++) {
1827 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
1828 ring = &adev->gfx.compute_ring[i + xcc_id * adev->gfx.num_compute_rings];
1829 if ((ring->xcp_id == xcp_id) && ring->sched.ready) {
1830 r = amdgpu_gfx_run_cleaner_shader_job(ring);
1831 if (r)
1832 return r;
1833 num_xcc_to_clear--;
1834 break;
1835 }
1836 }
1837 }
1838
1839 if (num_xcc_to_clear)
1840 return -ENOENT;
1841
1842 return 0;
1843 }
1844
1845 /**
1846 * amdgpu_gfx_set_run_cleaner_shader - Execute the AMDGPU GFX Cleaner Shader
1847 * @dev: The device structure
1848 * @attr: The device attribute structure
1849 * @buf: The buffer containing the input data
1850 * @count: The size of the input data
1851 *
1852 * Provides the sysfs interface to manually run a cleaner shader, which is
1853 * used to clear the GPU state between different tasks. Writing a value to the
1854 * 'run_cleaner_shader' sysfs file triggers the cleaner shader execution.
1855 * The value written corresponds to the partition index on multi-partition
1856 * devices. On single-partition devices, the value should be '0'.
1857 *
1858 * The cleaner shader clears the Local Data Store (LDS) and General Purpose
1859 * Registers (GPRs) to ensure data isolation between GPU workloads.
1860 *
1861 * Return: The number of bytes written to the sysfs file.
1862 */
amdgpu_gfx_set_run_cleaner_shader(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1863 static ssize_t amdgpu_gfx_set_run_cleaner_shader(struct device *dev,
1864 struct device_attribute *attr,
1865 const char *buf,
1866 size_t count)
1867 {
1868 struct drm_device *ddev = dev_get_drvdata(dev);
1869 struct amdgpu_device *adev = drm_to_adev(ddev);
1870 int ret;
1871 long value;
1872
1873 if (amdgpu_in_reset(adev))
1874 return -EPERM;
1875 if (adev->in_suspend && !adev->in_runpm)
1876 return -EPERM;
1877
1878 if (adev->gfx.disable_kq)
1879 return -EPERM;
1880
1881 ret = kstrtol(buf, 0, &value);
1882
1883 if (ret)
1884 return -EINVAL;
1885
1886 if (value < 0)
1887 return -EINVAL;
1888
1889 if (adev->xcp_mgr) {
1890 if (value >= adev->xcp_mgr->num_xcps)
1891 return -EINVAL;
1892 } else {
1893 if (value > 1)
1894 return -EINVAL;
1895 }
1896
1897 ret = pm_runtime_get_sync(ddev->dev);
1898 if (ret < 0) {
1899 pm_runtime_put_autosuspend(ddev->dev);
1900 return ret;
1901 }
1902
1903 ret = amdgpu_gfx_run_cleaner_shader(adev, value);
1904
1905 pm_runtime_put_autosuspend(ddev->dev);
1906
1907 if (ret)
1908 return ret;
1909
1910 return count;
1911 }
1912
1913 /**
1914 * amdgpu_gfx_get_enforce_isolation - Query AMDGPU GFX Enforce Isolation Settings
1915 * @dev: The device structure
1916 * @attr: The device attribute structure
1917 * @buf: The buffer to store the output data
1918 *
1919 * Provides the sysfs read interface to get the current settings of the 'enforce_isolation'
1920 * feature for each GPU partition. Reading from the 'enforce_isolation'
1921 * sysfs file returns the isolation settings for all partitions, where '0'
1922 * indicates disabled, '1' indicates enabled, and '2' indicates enabled in legacy mode,
1923 * and '3' indicates enabled without cleaner shader.
1924 *
1925 * Return: The number of bytes read from the sysfs file.
1926 */
amdgpu_gfx_get_enforce_isolation(struct device * dev,struct device_attribute * attr,char * buf)1927 static ssize_t amdgpu_gfx_get_enforce_isolation(struct device *dev,
1928 struct device_attribute *attr,
1929 char *buf)
1930 {
1931 struct drm_device *ddev = dev_get_drvdata(dev);
1932 struct amdgpu_device *adev = drm_to_adev(ddev);
1933 int i;
1934 ssize_t size = 0;
1935
1936 if (adev->xcp_mgr) {
1937 for (i = 0; i < adev->xcp_mgr->num_xcps; i++) {
1938 size += sysfs_emit_at(buf, size, "%u", adev->enforce_isolation[i]);
1939 if (i < (adev->xcp_mgr->num_xcps - 1))
1940 size += sysfs_emit_at(buf, size, " ");
1941 }
1942 buf[size++] = '\n';
1943 } else {
1944 size = sysfs_emit_at(buf, 0, "%u\n", adev->enforce_isolation[0]);
1945 }
1946
1947 return size;
1948 }
1949
1950 /**
1951 * amdgpu_gfx_set_enforce_isolation - Control AMDGPU GFX Enforce Isolation
1952 * @dev: The device structure
1953 * @attr: The device attribute structure
1954 * @buf: The buffer containing the input data
1955 * @count: The size of the input data
1956 *
1957 * This function allows control over the 'enforce_isolation' feature, which
1958 * serializes access to the graphics engine. Writing '0' to disable, '1' to
1959 * enable isolation with cleaner shader, '2' to enable legacy isolation without
1960 * cleaner shader, or '3' to enable process isolation without submitting the
1961 * cleaner shader to the 'enforce_isolation' sysfs file sets the isolation mode
1962 * for each partition. The input should specify the setting for all
1963 * partitions.
1964 *
1965 * Return: The number of bytes written to the sysfs file.
1966 */
amdgpu_gfx_set_enforce_isolation(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)1967 static ssize_t amdgpu_gfx_set_enforce_isolation(struct device *dev,
1968 struct device_attribute *attr,
1969 const char *buf, size_t count)
1970 {
1971 struct drm_device *ddev = dev_get_drvdata(dev);
1972 struct amdgpu_device *adev = drm_to_adev(ddev);
1973 long partition_values[MAX_XCP] = {0};
1974 int ret, i, num_partitions;
1975 const char *input_buf = buf;
1976
1977 for (i = 0; i < (adev->xcp_mgr ? adev->xcp_mgr->num_xcps : 1); i++) {
1978 ret = sscanf(input_buf, "%ld", &partition_values[i]);
1979 if (ret <= 0)
1980 break;
1981
1982 /* Move the pointer to the next value in the string */
1983 input_buf = strchr(input_buf, ' ');
1984 if (input_buf) {
1985 input_buf++;
1986 } else {
1987 i++;
1988 break;
1989 }
1990 }
1991 num_partitions = i;
1992
1993 if (adev->xcp_mgr && num_partitions != adev->xcp_mgr->num_xcps)
1994 return -EINVAL;
1995
1996 if (!adev->xcp_mgr && num_partitions != 1)
1997 return -EINVAL;
1998
1999 for (i = 0; i < num_partitions; i++) {
2000 if (partition_values[i] != 0 &&
2001 partition_values[i] != 1 &&
2002 partition_values[i] != 2 &&
2003 partition_values[i] != 3)
2004 return -EINVAL;
2005 }
2006
2007 mutex_lock(&adev->enforce_isolation_mutex);
2008 for (i = 0; i < num_partitions; i++) {
2009 switch (partition_values[i]) {
2010 case 0:
2011 default:
2012 adev->enforce_isolation[i] = AMDGPU_ENFORCE_ISOLATION_DISABLE;
2013 break;
2014 case 1:
2015 adev->enforce_isolation[i] =
2016 AMDGPU_ENFORCE_ISOLATION_ENABLE;
2017 break;
2018 case 2:
2019 adev->enforce_isolation[i] =
2020 AMDGPU_ENFORCE_ISOLATION_ENABLE_LEGACY;
2021 break;
2022 case 3:
2023 adev->enforce_isolation[i] =
2024 AMDGPU_ENFORCE_ISOLATION_NO_CLEANER_SHADER;
2025 break;
2026 }
2027 }
2028 mutex_unlock(&adev->enforce_isolation_mutex);
2029
2030 amdgpu_mes_update_enforce_isolation(adev);
2031
2032 return count;
2033 }
2034
amdgpu_gfx_get_gfx_reset_mask(struct device * dev,struct device_attribute * attr,char * buf)2035 static ssize_t amdgpu_gfx_get_gfx_reset_mask(struct device *dev,
2036 struct device_attribute *attr,
2037 char *buf)
2038 {
2039 struct drm_device *ddev = dev_get_drvdata(dev);
2040 struct amdgpu_device *adev = drm_to_adev(ddev);
2041
2042 if (!adev)
2043 return -ENODEV;
2044
2045 return amdgpu_show_reset_mask(buf, adev->gfx.gfx_supported_reset);
2046 }
2047
amdgpu_gfx_get_compute_reset_mask(struct device * dev,struct device_attribute * attr,char * buf)2048 static ssize_t amdgpu_gfx_get_compute_reset_mask(struct device *dev,
2049 struct device_attribute *attr,
2050 char *buf)
2051 {
2052 struct drm_device *ddev = dev_get_drvdata(dev);
2053 struct amdgpu_device *adev = drm_to_adev(ddev);
2054
2055 if (!adev)
2056 return -ENODEV;
2057
2058 return amdgpu_show_reset_mask(buf, adev->gfx.compute_supported_reset);
2059 }
2060
amdgpu_gfx_mes_reset_queue_start(struct amdgpu_ring * ring,unsigned int vmid,struct amdgpu_fence * timedout_fence,bool use_mmio)2061 static int amdgpu_gfx_mes_reset_queue_start(struct amdgpu_ring *ring,
2062 unsigned int vmid,
2063 struct amdgpu_fence *timedout_fence,
2064 bool use_mmio)
2065 {
2066 struct amdgpu_device *adev = ring->adev;
2067 bool reinit_queue;
2068 int r;
2069
2070 if ((ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) &&
2071 adev->mes.compute_pipe_reset_enabled)
2072 reinit_queue = true;
2073 else if ((ring->funcs->type == AMDGPU_RING_TYPE_GFX) &&
2074 adev->mes.gfx_pipe_reset_enabled)
2075 reinit_queue = true;
2076 else
2077 reinit_queue = use_mmio;
2078
2079 amdgpu_ring_reset_helper_begin(ring, timedout_fence);
2080
2081 r = amdgpu_mes_reset_legacy_queue(ring->adev, ring, vmid, use_mmio, 0);
2082 if (r)
2083 return r;
2084
2085 if (reinit_queue) {
2086 r = amdgpu_mes_unmap_legacy_queue(adev, ring,
2087 RESET_QUEUES, 0, 0, 0);
2088 if (r)
2089 return r;
2090 amdgpu_gfx_mqd_reset_restore(ring);
2091
2092 r = amdgpu_mes_map_legacy_queue(adev, ring, 0);
2093 if (r) {
2094 dev_err(adev->dev, "failed to remap kgq\n");
2095 return r;
2096 }
2097 }
2098 return 0;
2099 }
2100
amdgpu_gfx_mes_reset_queue(struct amdgpu_ring * ring,unsigned int vmid,struct amdgpu_fence * timedout_fence,bool use_mmio)2101 int amdgpu_gfx_mes_reset_queue(struct amdgpu_ring *ring,
2102 unsigned int vmid,
2103 struct amdgpu_fence *timedout_fence,
2104 bool use_mmio)
2105 {
2106 int r;
2107
2108 r = amdgpu_gfx_mes_reset_queue_start(ring, vmid, timedout_fence,
2109 use_mmio);
2110 if (r)
2111 return r;
2112 return amdgpu_ring_reset_helper_end(ring, timedout_fence);
2113 }
2114
2115 static DEVICE_ATTR(run_cleaner_shader, 0200,
2116 NULL, amdgpu_gfx_set_run_cleaner_shader);
2117
2118 static DEVICE_ATTR(enforce_isolation, 0644,
2119 amdgpu_gfx_get_enforce_isolation,
2120 amdgpu_gfx_set_enforce_isolation);
2121
2122 static DEVICE_ATTR(current_compute_partition, 0644,
2123 amdgpu_gfx_get_current_compute_partition,
2124 amdgpu_gfx_set_compute_partition);
2125
2126 static DEVICE_ATTR(available_compute_partition, 0444,
2127 amdgpu_gfx_get_available_compute_partition, NULL);
2128 static DEVICE_ATTR(gfx_reset_mask, 0444,
2129 amdgpu_gfx_get_gfx_reset_mask, NULL);
2130
2131 static DEVICE_ATTR(compute_reset_mask, 0444,
2132 amdgpu_gfx_get_compute_reset_mask, NULL);
2133
2134 static DEVICE_ATTR(compute_partition_mem_alloc_mode, 0644,
2135 compute_partition_mem_alloc_mode_show,
2136 compute_partition_mem_alloc_mode_store);
2137
amdgpu_gfx_sysfs_xcp_init(struct amdgpu_device * adev)2138 static int amdgpu_gfx_sysfs_xcp_init(struct amdgpu_device *adev)
2139 {
2140 struct amdgpu_xcp_mgr *xcp_mgr = adev->xcp_mgr;
2141 bool xcp_switch_supported;
2142 int r;
2143
2144 if (!xcp_mgr)
2145 return 0;
2146
2147 xcp_switch_supported =
2148 (xcp_mgr->funcs && xcp_mgr->funcs->switch_partition_mode);
2149
2150 if (!xcp_switch_supported)
2151 dev_attr_current_compute_partition.attr.mode &=
2152 ~(S_IWUSR | S_IWGRP | S_IWOTH);
2153
2154 r = device_create_file(adev->dev, &dev_attr_current_compute_partition);
2155 if (r)
2156 return r;
2157
2158 r = device_create_file(adev->dev,
2159 &dev_attr_compute_partition_mem_alloc_mode);
2160 if (r)
2161 return r;
2162
2163 if (xcp_switch_supported)
2164 r = device_create_file(adev->dev,
2165 &dev_attr_available_compute_partition);
2166
2167 return r;
2168 }
2169
amdgpu_gfx_sysfs_xcp_fini(struct amdgpu_device * adev)2170 static void amdgpu_gfx_sysfs_xcp_fini(struct amdgpu_device *adev)
2171 {
2172 struct amdgpu_xcp_mgr *xcp_mgr = adev->xcp_mgr;
2173 bool xcp_switch_supported;
2174
2175 if (!xcp_mgr)
2176 return;
2177
2178 xcp_switch_supported =
2179 (xcp_mgr->funcs && xcp_mgr->funcs->switch_partition_mode);
2180 device_remove_file(adev->dev, &dev_attr_current_compute_partition);
2181
2182 device_remove_file(adev->dev, &dev_attr_compute_partition_mem_alloc_mode);
2183
2184 if (xcp_switch_supported)
2185 device_remove_file(adev->dev,
2186 &dev_attr_available_compute_partition);
2187 }
2188
amdgpu_gfx_sysfs_isolation_shader_init(struct amdgpu_device * adev)2189 static int amdgpu_gfx_sysfs_isolation_shader_init(struct amdgpu_device *adev)
2190 {
2191 int r;
2192
2193 r = device_create_file(adev->dev, &dev_attr_enforce_isolation);
2194 if (r)
2195 return r;
2196 if (adev->gfx.enable_cleaner_shader)
2197 r = device_create_file(adev->dev, &dev_attr_run_cleaner_shader);
2198
2199 return r;
2200 }
2201
amdgpu_gfx_sysfs_isolation_shader_fini(struct amdgpu_device * adev)2202 static void amdgpu_gfx_sysfs_isolation_shader_fini(struct amdgpu_device *adev)
2203 {
2204 device_remove_file(adev->dev, &dev_attr_enforce_isolation);
2205 if (adev->gfx.enable_cleaner_shader)
2206 device_remove_file(adev->dev, &dev_attr_run_cleaner_shader);
2207 }
2208
amdgpu_gfx_sysfs_reset_mask_init(struct amdgpu_device * adev)2209 static int amdgpu_gfx_sysfs_reset_mask_init(struct amdgpu_device *adev)
2210 {
2211 int r = 0;
2212
2213 if (!amdgpu_gpu_recovery)
2214 return r;
2215
2216 if (adev->gfx.num_gfx_rings) {
2217 r = device_create_file(adev->dev, &dev_attr_gfx_reset_mask);
2218 if (r)
2219 return r;
2220 }
2221
2222 if (adev->gfx.num_compute_rings) {
2223 r = device_create_file(adev->dev, &dev_attr_compute_reset_mask);
2224 if (r)
2225 return r;
2226 }
2227
2228 return r;
2229 }
2230
amdgpu_gfx_sysfs_reset_mask_fini(struct amdgpu_device * adev)2231 static void amdgpu_gfx_sysfs_reset_mask_fini(struct amdgpu_device *adev)
2232 {
2233 if (!amdgpu_gpu_recovery)
2234 return;
2235
2236 if (adev->gfx.num_gfx_rings)
2237 device_remove_file(adev->dev, &dev_attr_gfx_reset_mask);
2238
2239 if (adev->gfx.num_compute_rings)
2240 device_remove_file(adev->dev, &dev_attr_compute_reset_mask);
2241 }
2242
amdgpu_gfx_sysfs_init(struct amdgpu_device * adev)2243 int amdgpu_gfx_sysfs_init(struct amdgpu_device *adev)
2244 {
2245 int r;
2246
2247 r = amdgpu_gfx_sysfs_xcp_init(adev);
2248 if (r) {
2249 dev_err(adev->dev, "failed to create xcp sysfs files");
2250 return r;
2251 }
2252
2253 r = amdgpu_gfx_sysfs_isolation_shader_init(adev);
2254 if (r)
2255 dev_err(adev->dev, "failed to create isolation sysfs files");
2256
2257 r = amdgpu_gfx_sysfs_reset_mask_init(adev);
2258 if (r)
2259 dev_err(adev->dev, "failed to create reset mask sysfs files");
2260
2261 return r;
2262 }
2263
amdgpu_gfx_sysfs_fini(struct amdgpu_device * adev)2264 void amdgpu_gfx_sysfs_fini(struct amdgpu_device *adev)
2265 {
2266 if (adev->dev->kobj.sd) {
2267 amdgpu_gfx_sysfs_xcp_fini(adev);
2268 amdgpu_gfx_sysfs_isolation_shader_fini(adev);
2269 amdgpu_gfx_sysfs_reset_mask_fini(adev);
2270 }
2271 }
2272
amdgpu_gfx_reset_start_compute_scheds(struct amdgpu_device * adev,struct amdgpu_ring * guilty_ring)2273 static void amdgpu_gfx_reset_start_compute_scheds(struct amdgpu_device *adev,
2274 struct amdgpu_ring *guilty_ring)
2275 {
2276 struct amdgpu_ring *ring;
2277 int i;
2278
2279 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
2280 ring = &adev->gfx.compute_ring[i];
2281 if (ring == guilty_ring)
2282 continue;
2283 drm_sched_wqueue_start(&ring->sched);
2284 }
2285 }
2286
amdgpu_gfx_reset_stop_compute_scheds(struct amdgpu_device * adev,struct amdgpu_ring * guilty_ring)2287 static void amdgpu_gfx_reset_stop_compute_scheds(struct amdgpu_device *adev,
2288 struct amdgpu_ring *guilty_ring)
2289 {
2290 struct amdgpu_ring *ring;
2291 int i;
2292
2293 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
2294 ring = &adev->gfx.compute_ring[i];
2295 if (ring == guilty_ring)
2296 continue;
2297 drm_sched_wqueue_stop(&ring->sched);
2298 }
2299 }
2300
2301 /*
2302 * Match the MES-reported hung doorbell against a compute ring and run
2303 * the reset. On hit, the matched ring and its guilty fence are returned
2304 * via *out_ring / *out_fence so the caller can defer reset end until
2305 * after MES has resumed all gangs.
2306 */
amdgpu_gfx_reset_mes_kcq(struct amdgpu_device * adev,struct amdgpu_ring * guilty_ring,unsigned int db,struct amdgpu_ring ** out_ring,struct amdgpu_fence ** out_fence)2307 static int amdgpu_gfx_reset_mes_kcq(struct amdgpu_device *adev,
2308 struct amdgpu_ring *guilty_ring,
2309 unsigned int db,
2310 struct amdgpu_ring **out_ring,
2311 struct amdgpu_fence **out_fence)
2312 {
2313 bool use_mmio = adev->gfx.mec.use_mmio_for_reset;
2314 struct amdgpu_fence *fence;
2315 struct amdgpu_ring *ring;
2316 int i, r;
2317
2318 *out_ring = NULL;
2319 *out_fence = NULL;
2320 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
2321 ring = &adev->gfx.compute_ring[i];
2322 if (ring == guilty_ring)
2323 continue;
2324 if (ring->doorbell_index == db) {
2325 fence = amdgpu_ring_find_guilty_fence(ring);
2326 r = amdgpu_gfx_mes_reset_queue_start(ring, 0, fence,
2327 use_mmio);
2328 if (r)
2329 return r;
2330 *out_ring = ring;
2331 *out_fence = fence;
2332 break;
2333 }
2334 }
2335 return 0;
2336 }
2337
amdgpu_gfx_reset_mes_compute(struct amdgpu_device * adev,struct amdgpu_ring * ring,struct amdgpu_fence * guilty_fence,struct amdgpu_usermode_queue * uq,unsigned int * hung_queue_count,void * faulty_queue_input)2338 int amdgpu_gfx_reset_mes_compute(struct amdgpu_device *adev,
2339 struct amdgpu_ring *ring,
2340 struct amdgpu_fence *guilty_fence,
2341 struct amdgpu_usermode_queue *uq,
2342 unsigned int *hung_queue_count,
2343 void *faulty_queue_input)
2344 {
2345 struct amdgpu_mes_hung_queue_hqd_info *hqd_info =
2346 (struct amdgpu_mes_hung_queue_hqd_info *)
2347 &adev->gfx.mec.mes_hung_db_array[adev->mes.hung_queue_hqd_info_offset];
2348 int i, r, pipe, queue, queue_type;
2349 unsigned int num_hung = 0;
2350 bool use_mmio = adev->gfx.mec.use_mmio_for_reset;
2351 struct mes_remove_queue_input *queue_input = (struct mes_remove_queue_input *)faulty_queue_input;
2352 struct amdgpu_gfx_deferred_entry deferred_end[AMDGPU_MAX_COMPUTE_RINGS + 1];
2353 int n_deferred = 0;
2354 int ring_err;
2355
2356 guard(mutex)(&adev->gfx.mec.reset_mutex);
2357 /* stop the drm schedulers for all compute queues */
2358 amdgpu_gfx_reset_stop_compute_scheds(adev, ring);
2359 /* suspend all will determine which queues are hung.
2360 * reset detect will return the array of bad queue doorbells
2361 */
2362 r = amdgpu_mes_suspend(adev, 0);
2363 /* if suspend all success, it should no hang queue */
2364 if (!r)
2365 /* always reset the KCQ/userq since we need to signal the fence
2366 * and we could be stuck in a loop which is preemptable.
2367 */
2368 goto fence_reset;
2369 r = amdgpu_mes_detect_and_reset_hung_queues(adev, AMDGPU_RING_TYPE_COMPUTE,
2370 true, &num_hung, adev->gfx.mec.mes_hung_db_array, 0);
2371 if (r)
2372 goto out;
2373 if (hung_queue_count)
2374 *hung_queue_count = num_hung;
2375
2376 fence_reset:
2377 /* reset the queue this came from if specified */
2378 if (ring) {
2379 r = amdgpu_gfx_mes_reset_queue_start(ring, 0, guilty_fence,
2380 use_mmio);
2381 if (r)
2382 goto out;
2383 deferred_end[n_deferred].ring = ring;
2384 deferred_end[n_deferred].fence = guilty_fence;
2385 n_deferred++;
2386 }
2387 if (uq) {
2388 r = mes_userq_reset(uq);
2389 if (r)
2390 goto out;
2391 }
2392 for (i = 0; i < num_hung; i++) {
2393 struct amdgpu_ring *hr = NULL;
2394 struct amdgpu_fence *hf = NULL;
2395
2396 pipe = hqd_info[i].pipe_index;
2397 queue = hqd_info[i].queue_index;
2398 queue_type = hqd_info[i].queue_type;
2399
2400 /* reset any KCQs */
2401 r = amdgpu_gfx_reset_mes_kcq(adev, ring,
2402 adev->gfx.mec.mes_hung_db_array[i],
2403 &hr, &hf);
2404 if (r)
2405 goto out;
2406 if (hr) {
2407 deferred_end[n_deferred].ring = hr;
2408 deferred_end[n_deferred].fence = hf;
2409 n_deferred++;
2410 }
2411 /* reset any KFD queues */
2412 r = amdgpu_amdkfd_reset_mes_queue(adev, 0, queue_type, pipe, queue,
2413 adev->gfx.mec.mes_hung_db_array[i]);
2414 if (r)
2415 goto out;
2416 /* reset KGD user queues */
2417 r = mes_userq_reset_queue(adev, uq, queue_type, pipe, queue,
2418 adev->gfx.mec.mes_hung_db_array[i]);
2419 if (r)
2420 goto out;
2421 }
2422
2423 /* MES doesn't detect any hung queue but we have a known bad queue
2424 * and it is not KCQ
2425 */
2426 if (!num_hung && queue_input && !ring) {
2427 /* MES suspend_all is successful means this bad queue is
2428 * preempted successfuly. Remove it before resume all so it
2429 * doesn't get mapped back
2430 */
2431 if (!down_read_trylock(&adev->reset_domain->sem)) {
2432 r = -EIO;
2433 goto out;
2434 }
2435 amdgpu_mes_lock(&adev->mes);
2436 r = adev->mes.funcs->remove_hw_queue(&adev->mes, queue_input);
2437 amdgpu_mes_unlock(&adev->mes);
2438 up_read(&adev->reset_domain->sem);
2439 }
2440
2441 out:
2442 /* resume all will enable the non-hung queues */
2443 amdgpu_mes_resume(adev, 0);
2444
2445 /* Now CP is running again — replay backed-up commands and ring
2446 * doorbells on each reset queue.
2447 */
2448 ring_err = r;
2449 for (i = 0; i < n_deferred; i++) {
2450 int er = amdgpu_ring_reset_helper_end(deferred_end[i].ring,
2451 deferred_end[i].fence);
2452
2453 if (er && !ring_err)
2454 ring_err = er;
2455 }
2456
2457 if (!ring_err)
2458 amdgpu_gfx_reset_start_compute_scheds(adev, ring);
2459
2460 /* If this reset is triggered by non-KCQ, the KCQ result after resume must
2461 * not override the reset result; otherwise a false reset failure is returned
2462 * to the non-KCQ caller
2463 */
2464 return ring ? ring_err : r;
2465 }
2466
amdgpu_gfx_cleaner_shader_sw_init(struct amdgpu_device * adev,unsigned int cleaner_shader_size)2467 int amdgpu_gfx_cleaner_shader_sw_init(struct amdgpu_device *adev,
2468 unsigned int cleaner_shader_size)
2469 {
2470 if (!adev->gfx.enable_cleaner_shader)
2471 return -EOPNOTSUPP;
2472
2473 return amdgpu_bo_create_kernel(adev, cleaner_shader_size, PAGE_SIZE,
2474 AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT,
2475 &adev->gfx.cleaner_shader_obj,
2476 &adev->gfx.cleaner_shader_gpu_addr,
2477 (void **)&adev->gfx.cleaner_shader_cpu_ptr);
2478 }
2479
amdgpu_gfx_cleaner_shader_sw_fini(struct amdgpu_device * adev)2480 void amdgpu_gfx_cleaner_shader_sw_fini(struct amdgpu_device *adev)
2481 {
2482 if (!adev->gfx.enable_cleaner_shader)
2483 return;
2484
2485 amdgpu_bo_free_kernel(&adev->gfx.cleaner_shader_obj,
2486 &adev->gfx.cleaner_shader_gpu_addr,
2487 (void **)&adev->gfx.cleaner_shader_cpu_ptr);
2488 }
2489
amdgpu_gfx_cleaner_shader_init(struct amdgpu_device * adev,unsigned int cleaner_shader_size,const void * cleaner_shader_ptr)2490 void amdgpu_gfx_cleaner_shader_init(struct amdgpu_device *adev,
2491 unsigned int cleaner_shader_size,
2492 const void *cleaner_shader_ptr)
2493 {
2494 if (!adev->gfx.enable_cleaner_shader)
2495 return;
2496
2497 if (adev->gfx.cleaner_shader_cpu_ptr && cleaner_shader_ptr)
2498 memcpy_toio(adev->gfx.cleaner_shader_cpu_ptr, cleaner_shader_ptr,
2499 cleaner_shader_size);
2500 }
2501
2502 /**
2503 * amdgpu_gfx_kfd_sch_ctrl - Control the KFD scheduler from the KGD (Graphics Driver)
2504 * @adev: amdgpu_device pointer
2505 * @idx: Index of the scheduler to control
2506 * @enable: Whether to enable or disable the KFD scheduler
2507 *
2508 * This function is used to control the KFD (Kernel Fusion Driver) scheduler
2509 * from the KGD. It is part of the cleaner shader feature. This function plays
2510 * a key role in enforcing process isolation on the GPU.
2511 *
2512 * The function uses a reference count mechanism (kfd_sch_req_count) to keep
2513 * track of the number of requests to enable the KFD scheduler. When a request
2514 * to enable the KFD scheduler is made, the reference count is decremented.
2515 * When the reference count reaches zero, a delayed work is scheduled to
2516 * enforce isolation after a delay of GFX_SLICE_PERIOD.
2517 *
2518 * When a request to disable the KFD scheduler is made, the function first
2519 * checks if the reference count is zero. If it is, it cancels the delayed work
2520 * for enforcing isolation and checks if the KFD scheduler is active. If the
2521 * KFD scheduler is active, it sends a request to stop the KFD scheduler and
2522 * sets the KFD scheduler state to inactive. Then, it increments the reference
2523 * count.
2524 *
2525 * The function is synchronized using the kfd_sch_mutex to ensure that the KFD
2526 * scheduler state and reference count are updated atomically.
2527 *
2528 * Note: If the reference count is already zero when a request to enable the
2529 * KFD scheduler is made, it means there's an imbalance bug somewhere. The
2530 * function triggers a warning in this case.
2531 */
amdgpu_gfx_kfd_sch_ctrl(struct amdgpu_device * adev,u32 idx,bool enable)2532 static void amdgpu_gfx_kfd_sch_ctrl(struct amdgpu_device *adev, u32 idx,
2533 bool enable)
2534 {
2535 mutex_lock(&adev->gfx.userq_sch_mutex);
2536
2537 if (enable) {
2538 /* If the count is already 0, it means there's an imbalance bug somewhere.
2539 * Note that the bug may be in a different caller than the one which triggers the
2540 * WARN_ON_ONCE.
2541 */
2542 if (WARN_ON_ONCE(adev->gfx.userq_sch_req_count[idx] == 0)) {
2543 dev_err(adev->dev, "Attempted to enable KFD scheduler when reference count is already zero\n");
2544 goto unlock;
2545 }
2546
2547 adev->gfx.userq_sch_req_count[idx]--;
2548
2549 if (adev->gfx.userq_sch_req_count[idx] == 0 &&
2550 adev->gfx.userq_sch_inactive[idx]) {
2551 schedule_delayed_work(&adev->gfx.enforce_isolation[idx].work,
2552 msecs_to_jiffies(adev->gfx.enforce_isolation_time[idx]));
2553 }
2554 } else {
2555 if (adev->gfx.userq_sch_req_count[idx] == 0) {
2556 cancel_delayed_work_sync(&adev->gfx.enforce_isolation[idx].work);
2557 if (!adev->gfx.userq_sch_inactive[idx]) {
2558 amdgpu_userq_stop_sched_for_enforce_isolation(adev, idx);
2559 if (adev->kfd.init_complete)
2560 amdgpu_amdkfd_stop_sched(adev, idx);
2561 adev->gfx.userq_sch_inactive[idx] = true;
2562 }
2563 }
2564
2565 adev->gfx.userq_sch_req_count[idx]++;
2566 }
2567
2568 unlock:
2569 mutex_unlock(&adev->gfx.userq_sch_mutex);
2570 }
2571
2572 /**
2573 * amdgpu_gfx_enforce_isolation_handler - work handler for enforcing shader isolation
2574 *
2575 * @work: work_struct.
2576 *
2577 * This function is the work handler for enforcing shader isolation on AMD GPUs.
2578 * It counts the number of emitted fences for each GFX and compute ring. If there
2579 * are any fences, it schedules the `enforce_isolation_work` to be run after a
2580 * delay of `GFX_SLICE_PERIOD`. If there are no fences, it signals the Kernel Fusion
2581 * Driver (KFD) to resume the runqueue. The function is synchronized using the
2582 * `enforce_isolation_mutex`.
2583 */
amdgpu_gfx_enforce_isolation_handler(struct work_struct * work)2584 void amdgpu_gfx_enforce_isolation_handler(struct work_struct *work)
2585 {
2586 struct amdgpu_isolation_work *isolation_work =
2587 container_of(work, struct amdgpu_isolation_work, work.work);
2588 struct amdgpu_device *adev = isolation_work->adev;
2589 u32 i, idx, fences = 0;
2590
2591 if (isolation_work->xcp_id == AMDGPU_XCP_NO_PARTITION)
2592 idx = 0;
2593 else
2594 idx = isolation_work->xcp_id;
2595
2596 if (idx >= MAX_XCP)
2597 return;
2598
2599 mutex_lock(&adev->enforce_isolation_mutex);
2600 for (i = 0; i < AMDGPU_MAX_GFX_RINGS; ++i) {
2601 if (isolation_work->xcp_id == adev->gfx.gfx_ring[i].xcp_id)
2602 fences += amdgpu_fence_count_emitted(&adev->gfx.gfx_ring[i]);
2603 }
2604 for (i = 0; i < (AMDGPU_MAX_COMPUTE_RINGS * AMDGPU_MAX_GC_INSTANCES); ++i) {
2605 if (isolation_work->xcp_id == adev->gfx.compute_ring[i].xcp_id)
2606 fences += amdgpu_fence_count_emitted(&adev->gfx.compute_ring[i]);
2607 }
2608 if (fences) {
2609 /* we've already had our timeslice, so let's wrap this up */
2610 schedule_delayed_work(&adev->gfx.enforce_isolation[idx].work,
2611 msecs_to_jiffies(1));
2612 } else {
2613 /* Tell KFD to resume the runqueue */
2614 WARN_ON_ONCE(!adev->gfx.userq_sch_inactive[idx]);
2615 WARN_ON_ONCE(adev->gfx.userq_sch_req_count[idx]);
2616
2617 amdgpu_userq_start_sched_for_enforce_isolation(adev, idx);
2618 if (adev->kfd.init_complete)
2619 amdgpu_amdkfd_start_sched(adev, idx);
2620 adev->gfx.userq_sch_inactive[idx] = false;
2621 }
2622 mutex_unlock(&adev->enforce_isolation_mutex);
2623 }
2624
2625 /**
2626 * amdgpu_gfx_enforce_isolation_wait_for_kfd - Manage KFD wait period for process isolation
2627 * @adev: amdgpu_device pointer
2628 * @idx: Index of the GPU partition
2629 *
2630 * When kernel submissions come in, the jobs are given a time slice and once
2631 * that time slice is up, if there are KFD user queues active, kernel
2632 * submissions are blocked until KFD has had its time slice. Once the KFD time
2633 * slice is up, KFD user queues are preempted and kernel submissions are
2634 * unblocked and allowed to run again.
2635 */
2636 static void
amdgpu_gfx_enforce_isolation_wait_for_kfd(struct amdgpu_device * adev,u32 idx)2637 amdgpu_gfx_enforce_isolation_wait_for_kfd(struct amdgpu_device *adev,
2638 u32 idx)
2639 {
2640 unsigned long cjiffies;
2641 bool wait = false;
2642
2643 mutex_lock(&adev->enforce_isolation_mutex);
2644 if (adev->enforce_isolation[idx] == AMDGPU_ENFORCE_ISOLATION_ENABLE) {
2645 /* set the initial values if nothing is set */
2646 if (!adev->gfx.enforce_isolation_jiffies[idx]) {
2647 adev->gfx.enforce_isolation_jiffies[idx] = jiffies;
2648 adev->gfx.enforce_isolation_time[idx] = GFX_SLICE_PERIOD_MS;
2649 }
2650 /* Make sure KFD gets a chance to run */
2651 if (amdgpu_amdkfd_compute_active(adev, idx)) {
2652 cjiffies = jiffies;
2653 if (time_after(cjiffies, adev->gfx.enforce_isolation_jiffies[idx])) {
2654 cjiffies -= adev->gfx.enforce_isolation_jiffies[idx];
2655 if ((jiffies_to_msecs(cjiffies) >= GFX_SLICE_PERIOD_MS)) {
2656 /* if our time is up, let KGD work drain before scheduling more */
2657 wait = true;
2658 /* reset the timer period */
2659 adev->gfx.enforce_isolation_time[idx] = GFX_SLICE_PERIOD_MS;
2660 } else {
2661 /* set the timer period to what's left in our time slice */
2662 adev->gfx.enforce_isolation_time[idx] =
2663 GFX_SLICE_PERIOD_MS - jiffies_to_msecs(cjiffies);
2664 }
2665 } else {
2666 /* if jiffies wrap around we will just wait a little longer */
2667 adev->gfx.enforce_isolation_jiffies[idx] = jiffies;
2668 }
2669 } else {
2670 /* if there is no KFD work, then set the full slice period */
2671 adev->gfx.enforce_isolation_jiffies[idx] = jiffies;
2672 adev->gfx.enforce_isolation_time[idx] = GFX_SLICE_PERIOD_MS;
2673 }
2674 }
2675 mutex_unlock(&adev->enforce_isolation_mutex);
2676
2677 if (wait)
2678 msleep(GFX_SLICE_PERIOD_MS);
2679 }
2680
2681 /**
2682 * amdgpu_gfx_enforce_isolation_ring_begin_use - Begin use of a ring with enforced isolation
2683 * @ring: Pointer to the amdgpu_ring structure
2684 *
2685 * Ring begin_use helper implementation for gfx which serializes access to the
2686 * gfx IP between kernel submission IOCTLs and KFD user queues when isolation
2687 * enforcement is enabled. The kernel submission IOCTLs and KFD user queues
2688 * each get a time slice when both are active.
2689 */
amdgpu_gfx_enforce_isolation_ring_begin_use(struct amdgpu_ring * ring)2690 void amdgpu_gfx_enforce_isolation_ring_begin_use(struct amdgpu_ring *ring)
2691 {
2692 struct amdgpu_device *adev = ring->adev;
2693 u32 idx;
2694 bool sched_work = false;
2695
2696 if (!adev->gfx.enable_cleaner_shader)
2697 return;
2698
2699 if (ring->xcp_id == AMDGPU_XCP_NO_PARTITION)
2700 idx = 0;
2701 else
2702 idx = ring->xcp_id;
2703
2704 if (idx >= MAX_XCP)
2705 return;
2706
2707 /* Don't submit more work until KFD has had some time */
2708 amdgpu_gfx_enforce_isolation_wait_for_kfd(adev, idx);
2709
2710 mutex_lock(&adev->enforce_isolation_mutex);
2711 if (adev->enforce_isolation[idx] == AMDGPU_ENFORCE_ISOLATION_ENABLE) {
2712 if (adev->kfd.init_complete)
2713 sched_work = true;
2714 }
2715 mutex_unlock(&adev->enforce_isolation_mutex);
2716
2717 if (sched_work)
2718 amdgpu_gfx_kfd_sch_ctrl(adev, idx, false);
2719 }
2720
2721 /**
2722 * amdgpu_gfx_enforce_isolation_ring_end_use - End use of a ring with enforced isolation
2723 * @ring: Pointer to the amdgpu_ring structure
2724 *
2725 * Ring end_use helper implementation for gfx which serializes access to the
2726 * gfx IP between kernel submission IOCTLs and KFD user queues when isolation
2727 * enforcement is enabled. The kernel submission IOCTLs and KFD user queues
2728 * each get a time slice when both are active.
2729 */
amdgpu_gfx_enforce_isolation_ring_end_use(struct amdgpu_ring * ring)2730 void amdgpu_gfx_enforce_isolation_ring_end_use(struct amdgpu_ring *ring)
2731 {
2732 struct amdgpu_device *adev = ring->adev;
2733 u32 idx;
2734 bool sched_work = false;
2735
2736 if (!adev->gfx.enable_cleaner_shader)
2737 return;
2738
2739 if (ring->xcp_id == AMDGPU_XCP_NO_PARTITION)
2740 idx = 0;
2741 else
2742 idx = ring->xcp_id;
2743
2744 if (idx >= MAX_XCP)
2745 return;
2746
2747 mutex_lock(&adev->enforce_isolation_mutex);
2748 if (adev->enforce_isolation[idx] == AMDGPU_ENFORCE_ISOLATION_ENABLE) {
2749 if (adev->kfd.init_complete)
2750 sched_work = true;
2751 }
2752 mutex_unlock(&adev->enforce_isolation_mutex);
2753
2754 if (sched_work)
2755 amdgpu_gfx_kfd_sch_ctrl(adev, idx, true);
2756 }
2757
amdgpu_gfx_profile_idle_work_handler(struct work_struct * work)2758 void amdgpu_gfx_profile_idle_work_handler(struct work_struct *work)
2759 {
2760 struct amdgpu_device *adev =
2761 container_of(work, struct amdgpu_device, gfx.idle_work.work);
2762 enum PP_SMC_POWER_PROFILE profile;
2763 u32 i, fences = 0;
2764 int r;
2765
2766 if (adev->gfx.num_gfx_rings)
2767 profile = PP_SMC_POWER_PROFILE_FULLSCREEN3D;
2768 else
2769 profile = PP_SMC_POWER_PROFILE_COMPUTE;
2770
2771 for (i = 0; i < AMDGPU_MAX_GFX_RINGS; ++i)
2772 fences += amdgpu_fence_count_emitted(&adev->gfx.gfx_ring[i]);
2773 for (i = 0; i < (AMDGPU_MAX_COMPUTE_RINGS * AMDGPU_MAX_GC_INSTANCES); ++i)
2774 fences += amdgpu_fence_count_emitted(&adev->gfx.compute_ring[i]);
2775 if (!fences && !atomic_read(&adev->gfx.total_submission_cnt)) {
2776 mutex_lock(&adev->gfx.workload_profile_mutex);
2777 if (adev->gfx.workload_profile_active) {
2778 r = amdgpu_dpm_switch_power_profile(adev, profile, false);
2779 if (r)
2780 dev_warn(adev->dev, "(%d) failed to disable %s power profile mode\n", r,
2781 profile == PP_SMC_POWER_PROFILE_FULLSCREEN3D ?
2782 "fullscreen 3D" : "compute");
2783 adev->gfx.workload_profile_active = false;
2784 }
2785 mutex_unlock(&adev->gfx.workload_profile_mutex);
2786 } else {
2787 schedule_delayed_work(&adev->gfx.idle_work, GFX_PROFILE_IDLE_TIMEOUT);
2788 }
2789 }
2790
amdgpu_gfx_profile_ring_begin_use(struct amdgpu_ring * ring)2791 void amdgpu_gfx_profile_ring_begin_use(struct amdgpu_ring *ring)
2792 {
2793 struct amdgpu_device *adev = ring->adev;
2794 enum PP_SMC_POWER_PROFILE profile;
2795 int r;
2796
2797 if (amdgpu_dpm_is_overdrive_enabled(adev))
2798 return;
2799
2800 if (adev->gfx.num_gfx_rings)
2801 profile = PP_SMC_POWER_PROFILE_FULLSCREEN3D;
2802 else
2803 profile = PP_SMC_POWER_PROFILE_COMPUTE;
2804
2805 if (!atomic_fetch_inc(&adev->gfx.total_submission_cnt))
2806 cancel_delayed_work_sync(&adev->gfx.idle_work);
2807
2808 /* We can safely return early here because we've cancelled the
2809 * the delayed work so there is no one else to set it to false
2810 * and we don't care if someone else sets it to true.
2811 */
2812 if (adev->gfx.workload_profile_active)
2813 return;
2814
2815 mutex_lock(&adev->gfx.workload_profile_mutex);
2816 if (!adev->gfx.workload_profile_active) {
2817 r = amdgpu_dpm_switch_power_profile(adev, profile, true);
2818 if (r)
2819 dev_warn(adev->dev, "(%d) failed to disable %s power profile mode\n", r,
2820 profile == PP_SMC_POWER_PROFILE_FULLSCREEN3D ?
2821 "fullscreen 3D" : "compute");
2822 adev->gfx.workload_profile_active = true;
2823 }
2824 mutex_unlock(&adev->gfx.workload_profile_mutex);
2825 }
2826
amdgpu_gfx_profile_ring_end_use(struct amdgpu_ring * ring)2827 void amdgpu_gfx_profile_ring_end_use(struct amdgpu_ring *ring)
2828 {
2829 struct amdgpu_device *adev = ring->adev;
2830
2831 if (amdgpu_dpm_is_overdrive_enabled(adev))
2832 return;
2833
2834 if (atomic_dec_and_test(&ring->adev->gfx.total_submission_cnt))
2835 schedule_delayed_work(&ring->adev->gfx.idle_work,
2836 GFX_PROFILE_IDLE_TIMEOUT);
2837 }
2838
2839 /**
2840 * amdgpu_gfx_csb_preamble_start - Set CSB preamble start
2841 *
2842 * @buffer: This is an output variable that gets the PACKET3 preamble setup.
2843 *
2844 * Return:
2845 * return the latest index.
2846 */
amdgpu_gfx_csb_preamble_start(u32 * buffer)2847 u32 amdgpu_gfx_csb_preamble_start(u32 *buffer)
2848 {
2849 u32 count = 0;
2850
2851 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
2852 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
2853
2854 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1));
2855 buffer[count++] = cpu_to_le32(0x80000000);
2856 buffer[count++] = cpu_to_le32(0x80000000);
2857
2858 return count;
2859 }
2860
2861 /**
2862 * amdgpu_gfx_csb_data_parser - Parser CS data
2863 *
2864 * @adev: amdgpu_device pointer used to get the CS data and other gfx info.
2865 * @buffer: This is an output variable that gets the PACKET3 preamble end.
2866 * @count: Index to start set the preemble end.
2867 *
2868 * Return:
2869 * return the latest index.
2870 */
amdgpu_gfx_csb_data_parser(struct amdgpu_device * adev,u32 * buffer,u32 count)2871 u32 amdgpu_gfx_csb_data_parser(struct amdgpu_device *adev, u32 *buffer, u32 count)
2872 {
2873 const struct cs_section_def *sect = NULL;
2874 const struct cs_extent_def *ext = NULL;
2875 u32 i;
2876
2877 for (sect = adev->gfx.rlc.cs_data; sect->section != NULL; ++sect) {
2878 for (ext = sect->section; ext->extent != NULL; ++ext) {
2879 if (sect->id == SECT_CONTEXT) {
2880 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
2881 buffer[count++] = cpu_to_le32(ext->reg_index - PACKET3_SET_CONTEXT_REG_START);
2882
2883 for (i = 0; i < ext->reg_count; i++)
2884 buffer[count++] = cpu_to_le32(ext->extent[i]);
2885 }
2886 }
2887 }
2888
2889 return count;
2890 }
2891
2892 /**
2893 * amdgpu_gfx_csb_preamble_end - Set CSB preamble end
2894 *
2895 * @buffer: This is an output variable that gets the PACKET3 preamble end.
2896 * @count: Index to start set the preemble end.
2897 */
amdgpu_gfx_csb_preamble_end(u32 * buffer,u32 count)2898 void amdgpu_gfx_csb_preamble_end(u32 *buffer, u32 count)
2899 {
2900 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
2901 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE);
2902
2903 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0));
2904 buffer[count++] = cpu_to_le32(0);
2905 }
2906
2907 /*
2908 * debugfs for to enable/disable gfx job submission to specific core.
2909 */
2910 #if defined(CONFIG_DEBUG_FS)
amdgpu_debugfs_gfx_sched_mask_set(void * data,u64 val)2911 static int amdgpu_debugfs_gfx_sched_mask_set(void *data, u64 val)
2912 {
2913 struct amdgpu_device *adev = (struct amdgpu_device *)data;
2914 u32 i;
2915 u64 mask = 0;
2916 struct amdgpu_ring *ring;
2917
2918 if (!adev)
2919 return -ENODEV;
2920
2921 mask = (1ULL << adev->gfx.num_gfx_rings) - 1;
2922 if ((val & mask) == 0)
2923 return -EINVAL;
2924
2925 for (i = 0; i < adev->gfx.num_gfx_rings; ++i) {
2926 ring = &adev->gfx.gfx_ring[i];
2927 if (val & (1 << i))
2928 ring->sched.ready = true;
2929 else
2930 ring->sched.ready = false;
2931 }
2932 /* publish sched.ready flag update effective immediately across smp */
2933 smp_rmb();
2934 return 0;
2935 }
2936
amdgpu_debugfs_gfx_sched_mask_get(void * data,u64 * val)2937 static int amdgpu_debugfs_gfx_sched_mask_get(void *data, u64 *val)
2938 {
2939 struct amdgpu_device *adev = (struct amdgpu_device *)data;
2940 u32 i;
2941 u64 mask = 0;
2942 struct amdgpu_ring *ring;
2943
2944 if (!adev)
2945 return -ENODEV;
2946 for (i = 0; i < adev->gfx.num_gfx_rings; ++i) {
2947 ring = &adev->gfx.gfx_ring[i];
2948 if (ring->sched.ready)
2949 mask |= 1ULL << i;
2950 }
2951
2952 *val = mask;
2953 return 0;
2954 }
2955
2956 DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_debugfs_gfx_sched_mask_fops,
2957 amdgpu_debugfs_gfx_sched_mask_get,
2958 amdgpu_debugfs_gfx_sched_mask_set, "%llx\n");
2959
2960 #endif
2961
amdgpu_debugfs_gfx_sched_mask_init(struct amdgpu_device * adev)2962 void amdgpu_debugfs_gfx_sched_mask_init(struct amdgpu_device *adev)
2963 {
2964 #if defined(CONFIG_DEBUG_FS)
2965 struct drm_minor *minor = adev_to_drm(adev)->primary;
2966 struct dentry *root = minor->debugfs_root;
2967 char name[32];
2968
2969 if (!(adev->gfx.num_gfx_rings > 1))
2970 return;
2971 sprintf(name, "amdgpu_gfx_sched_mask");
2972 debugfs_create_file(name, 0600, root, adev,
2973 &amdgpu_debugfs_gfx_sched_mask_fops);
2974 #endif
2975 }
2976
2977 /*
2978 * debugfs for to enable/disable compute job submission to specific core.
2979 */
2980 #if defined(CONFIG_DEBUG_FS)
amdgpu_debugfs_compute_sched_mask_set(void * data,u64 val)2981 static int amdgpu_debugfs_compute_sched_mask_set(void *data, u64 val)
2982 {
2983 struct amdgpu_device *adev = (struct amdgpu_device *)data;
2984 u32 i;
2985 u64 mask = 0;
2986 struct amdgpu_ring *ring;
2987
2988 if (!adev)
2989 return -ENODEV;
2990
2991 mask = (1ULL << adev->gfx.num_compute_rings) - 1;
2992 if ((val & mask) == 0)
2993 return -EINVAL;
2994
2995 for (i = 0; i < adev->gfx.num_compute_rings; ++i) {
2996 ring = &adev->gfx.compute_ring[i];
2997 if (val & (1 << i))
2998 ring->sched.ready = true;
2999 else
3000 ring->sched.ready = false;
3001 }
3002
3003 /* publish sched.ready flag update effective immediately across smp */
3004 smp_rmb();
3005 return 0;
3006 }
3007
amdgpu_debugfs_compute_sched_mask_get(void * data,u64 * val)3008 static int amdgpu_debugfs_compute_sched_mask_get(void *data, u64 *val)
3009 {
3010 struct amdgpu_device *adev = (struct amdgpu_device *)data;
3011 u32 i;
3012 u64 mask = 0;
3013 struct amdgpu_ring *ring;
3014
3015 if (!adev)
3016 return -ENODEV;
3017 for (i = 0; i < adev->gfx.num_compute_rings; ++i) {
3018 ring = &adev->gfx.compute_ring[i];
3019 if (ring->sched.ready)
3020 mask |= 1ULL << i;
3021 }
3022
3023 *val = mask;
3024 return 0;
3025 }
3026
3027 DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_debugfs_compute_sched_mask_fops,
3028 amdgpu_debugfs_compute_sched_mask_get,
3029 amdgpu_debugfs_compute_sched_mask_set, "%llx\n");
3030
3031 #endif
3032
amdgpu_debugfs_compute_sched_mask_init(struct amdgpu_device * adev)3033 void amdgpu_debugfs_compute_sched_mask_init(struct amdgpu_device *adev)
3034 {
3035 #if defined(CONFIG_DEBUG_FS)
3036 struct drm_minor *minor = adev_to_drm(adev)->primary;
3037 struct dentry *root = minor->debugfs_root;
3038 char name[32];
3039
3040 if (!(adev->gfx.num_compute_rings > 1))
3041 return;
3042 sprintf(name, "amdgpu_compute_sched_mask");
3043 debugfs_create_file(name, 0600, root, adev,
3044 &amdgpu_debugfs_compute_sched_mask_fops);
3045 #endif
3046 }
3047
amdgpu_gfx_ring_preempt_ib(struct amdgpu_ring * ring)3048 int amdgpu_gfx_ring_preempt_ib(struct amdgpu_ring *ring)
3049 {
3050 struct amdgpu_device *adev = ring->adev;
3051 struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];
3052 struct amdgpu_ring *kiq_ring = &kiq->ring;
3053 unsigned long flags;
3054 int i;
3055
3056 if (adev->enable_mes)
3057 return -EINVAL;
3058
3059 if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
3060 return -EINVAL;
3061
3062 spin_lock_irqsave(&kiq->ring_lock, flags);
3063
3064 if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) {
3065 spin_unlock_irqrestore(&kiq->ring_lock, flags);
3066 return -ENOMEM;
3067 }
3068
3069 /* assert preemption condition */
3070 amdgpu_ring_set_preempt_cond_exec(ring, false);
3071
3072 /* assert IB preemption, emit the trailing fence */
3073 kiq->pmf->kiq_unmap_queues(kiq_ring, ring, PREEMPT_QUEUES_NO_UNMAP,
3074 ring->trail_fence_gpu_addr,
3075 ++ring->trail_seq);
3076 amdgpu_ring_commit(kiq_ring);
3077
3078 spin_unlock_irqrestore(&kiq->ring_lock, flags);
3079
3080 /* poll the trailing fence */
3081 for (i = 0; i < adev->usec_timeout; i++) {
3082 if (ring->trail_seq ==
3083 le32_to_cpu(*(ring->trail_fence_cpu_addr)))
3084 break;
3085 udelay(1);
3086 }
3087
3088 /* deassert preemption condition */
3089 amdgpu_ring_set_preempt_cond_exec(ring, true);
3090
3091 if (i >= adev->usec_timeout) {
3092 DRM_ERROR("ring %d failed to preempt ib\n", ring->idx);
3093 return -EINVAL;
3094 }
3095
3096 return 0;
3097 }
3098
3099