1 /*
2 * Copyright 2008 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/kthread.h>
27 #include <linux/pci.h>
28 #include <linux/uaccess.h>
29 #include <linux/pm_runtime.h>
30
31 #include "amdgpu.h"
32 #include "amdgpu_pm.h"
33 #include "amdgpu_dm_debugfs.h"
34 #include "amdgpu_ras.h"
35 #include "amdgpu_rap.h"
36 #include "amdgpu_securedisplay.h"
37 #include "amdgpu_fw_attestation.h"
38
39 #if defined(CONFIG_DEBUG_FS)
40
41 /**
42 * amdgpu_debugfs_process_reg_op - Handle MMIO register reads/writes
43 *
44 * @read: True if reading
45 * @f: open file handle
46 * @buf: User buffer to write/read to
47 * @size: Number of bytes to write/read
48 * @pos: Offset to seek to
49 *
50 * This debugfs entry has special meaning on the offset being sought.
51 * Various bits have different meanings:
52 *
53 * Bit 62: Indicates a GRBM bank switch is needed
54 * Bit 61: Indicates a SRBM bank switch is needed (implies bit 62 is
55 * zero)
56 * Bits 24..33: The SE or ME selector if needed
57 * Bits 34..43: The SH (or SA) or PIPE selector if needed
58 * Bits 44..53: The INSTANCE (or CU/WGP) or QUEUE selector if needed
59 *
60 * Bit 23: Indicates that the PM power gating lock should be held
61 * This is necessary to read registers that might be
62 * unreliable during a power gating transistion.
63 *
64 * The lower bits are the BYTE offset of the register to read. This
65 * allows reading multiple registers in a single call and having
66 * the returned size reflect that.
67 */
amdgpu_debugfs_process_reg_op(bool read,struct file * f,char __user * buf,size_t size,loff_t * pos)68 static int amdgpu_debugfs_process_reg_op(bool read, struct file *f,
69 char __user *buf, size_t size, loff_t *pos)
70 {
71 struct amdgpu_device *adev = file_inode(f)->i_private;
72 ssize_t result = 0;
73 int r;
74 bool pm_pg_lock, use_bank, use_ring;
75 unsigned instance_bank, sh_bank, se_bank, me, pipe, queue, vmid;
76
77 pm_pg_lock = use_bank = use_ring = false;
78 instance_bank = sh_bank = se_bank = me = pipe = queue = vmid = 0;
79
80 if (size & 0x3 || *pos & 0x3 ||
81 ((*pos & (1ULL << 62)) && (*pos & (1ULL << 61))))
82 return -EINVAL;
83
84 /* are we reading registers for which a PG lock is necessary? */
85 pm_pg_lock = (*pos >> 23) & 1;
86
87 if (*pos & (1ULL << 62)) {
88 se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24;
89 sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34;
90 instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44;
91
92 if (se_bank == 0x3FF)
93 se_bank = 0xFFFFFFFF;
94 if (sh_bank == 0x3FF)
95 sh_bank = 0xFFFFFFFF;
96 if (instance_bank == 0x3FF)
97 instance_bank = 0xFFFFFFFF;
98 use_bank = true;
99 } else if (*pos & (1ULL << 61)) {
100
101 me = (*pos & GENMASK_ULL(33, 24)) >> 24;
102 pipe = (*pos & GENMASK_ULL(43, 34)) >> 34;
103 queue = (*pos & GENMASK_ULL(53, 44)) >> 44;
104 vmid = (*pos & GENMASK_ULL(58, 54)) >> 54;
105
106 use_ring = true;
107 } else {
108 use_bank = use_ring = false;
109 }
110
111 *pos &= (1UL << 22) - 1;
112
113 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
114 if (r < 0) {
115 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
116 return r;
117 }
118
119 r = amdgpu_virt_enable_access_debugfs(adev);
120 if (r < 0) {
121 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
122 return r;
123 }
124
125 if (use_bank) {
126 if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
127 (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines)) {
128 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
129 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
130 amdgpu_virt_disable_access_debugfs(adev);
131 return -EINVAL;
132 }
133 mutex_lock(&adev->grbm_idx_mutex);
134 amdgpu_gfx_select_se_sh(adev, se_bank,
135 sh_bank, instance_bank);
136 } else if (use_ring) {
137 mutex_lock(&adev->srbm_mutex);
138 amdgpu_gfx_select_me_pipe_q(adev, me, pipe, queue, vmid);
139 }
140
141 if (pm_pg_lock)
142 mutex_lock(&adev->pm.mutex);
143
144 while (size) {
145 uint32_t value;
146
147 if (read) {
148 value = RREG32(*pos >> 2);
149 r = put_user(value, (uint32_t *)buf);
150 } else {
151 r = get_user(value, (uint32_t *)buf);
152 if (!r)
153 amdgpu_mm_wreg_mmio_rlc(adev, *pos >> 2, value);
154 }
155 if (r) {
156 result = r;
157 goto end;
158 }
159
160 result += 4;
161 buf += 4;
162 *pos += 4;
163 size -= 4;
164 }
165
166 end:
167 if (use_bank) {
168 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);
169 mutex_unlock(&adev->grbm_idx_mutex);
170 } else if (use_ring) {
171 amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, 0);
172 mutex_unlock(&adev->srbm_mutex);
173 }
174
175 if (pm_pg_lock)
176 mutex_unlock(&adev->pm.mutex);
177
178 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
179 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
180
181 amdgpu_virt_disable_access_debugfs(adev);
182 return result;
183 }
184
185 /*
186 * amdgpu_debugfs_regs_read - Callback for reading MMIO registers
187 */
amdgpu_debugfs_regs_read(struct file * f,char __user * buf,size_t size,loff_t * pos)188 static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
189 size_t size, loff_t *pos)
190 {
191 return amdgpu_debugfs_process_reg_op(true, f, buf, size, pos);
192 }
193
194 /*
195 * amdgpu_debugfs_regs_write - Callback for writing MMIO registers
196 */
amdgpu_debugfs_regs_write(struct file * f,const char __user * buf,size_t size,loff_t * pos)197 static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
198 size_t size, loff_t *pos)
199 {
200 return amdgpu_debugfs_process_reg_op(false, f, (char __user *)buf, size, pos);
201 }
202
203
204 /**
205 * amdgpu_debugfs_regs_pcie_read - Read from a PCIE register
206 *
207 * @f: open file handle
208 * @buf: User buffer to store read data in
209 * @size: Number of bytes to read
210 * @pos: Offset to seek to
211 *
212 * The lower bits are the BYTE offset of the register to read. This
213 * allows reading multiple registers in a single call and having
214 * the returned size reflect that.
215 */
amdgpu_debugfs_regs_pcie_read(struct file * f,char __user * buf,size_t size,loff_t * pos)216 static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
217 size_t size, loff_t *pos)
218 {
219 struct amdgpu_device *adev = file_inode(f)->i_private;
220 ssize_t result = 0;
221 int r;
222
223 if (size & 0x3 || *pos & 0x3)
224 return -EINVAL;
225
226 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
227 if (r < 0) {
228 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
229 return r;
230 }
231
232 r = amdgpu_virt_enable_access_debugfs(adev);
233 if (r < 0) {
234 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
235 return r;
236 }
237
238 while (size) {
239 uint32_t value;
240
241 value = RREG32_PCIE(*pos);
242 r = put_user(value, (uint32_t *)buf);
243 if (r) {
244 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
245 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
246 amdgpu_virt_disable_access_debugfs(adev);
247 return r;
248 }
249
250 result += 4;
251 buf += 4;
252 *pos += 4;
253 size -= 4;
254 }
255
256 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
257 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
258
259 amdgpu_virt_disable_access_debugfs(adev);
260 return result;
261 }
262
263 /**
264 * amdgpu_debugfs_regs_pcie_write - Write to a PCIE register
265 *
266 * @f: open file handle
267 * @buf: User buffer to write data from
268 * @size: Number of bytes to write
269 * @pos: Offset to seek to
270 *
271 * The lower bits are the BYTE offset of the register to write. This
272 * allows writing multiple registers in a single call and having
273 * the returned size reflect that.
274 */
amdgpu_debugfs_regs_pcie_write(struct file * f,const char __user * buf,size_t size,loff_t * pos)275 static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf,
276 size_t size, loff_t *pos)
277 {
278 struct amdgpu_device *adev = file_inode(f)->i_private;
279 ssize_t result = 0;
280 int r;
281
282 if (size & 0x3 || *pos & 0x3)
283 return -EINVAL;
284
285 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
286 if (r < 0) {
287 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
288 return r;
289 }
290
291 r = amdgpu_virt_enable_access_debugfs(adev);
292 if (r < 0) {
293 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
294 return r;
295 }
296
297 while (size) {
298 uint32_t value;
299
300 r = get_user(value, (uint32_t *)buf);
301 if (r) {
302 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
303 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
304 amdgpu_virt_disable_access_debugfs(adev);
305 return r;
306 }
307
308 WREG32_PCIE(*pos, value);
309
310 result += 4;
311 buf += 4;
312 *pos += 4;
313 size -= 4;
314 }
315
316 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
317 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
318
319 amdgpu_virt_disable_access_debugfs(adev);
320 return result;
321 }
322
323 /**
324 * amdgpu_debugfs_regs_didt_read - Read from a DIDT register
325 *
326 * @f: open file handle
327 * @buf: User buffer to store read data in
328 * @size: Number of bytes to read
329 * @pos: Offset to seek to
330 *
331 * The lower bits are the BYTE offset of the register to read. This
332 * allows reading multiple registers in a single call and having
333 * the returned size reflect that.
334 */
amdgpu_debugfs_regs_didt_read(struct file * f,char __user * buf,size_t size,loff_t * pos)335 static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
336 size_t size, loff_t *pos)
337 {
338 struct amdgpu_device *adev = file_inode(f)->i_private;
339 ssize_t result = 0;
340 int r;
341
342 if (size & 0x3 || *pos & 0x3)
343 return -EINVAL;
344
345 if (!adev->didt_rreg)
346 return -EOPNOTSUPP;
347
348 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
349 if (r < 0) {
350 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
351 return r;
352 }
353
354 r = amdgpu_virt_enable_access_debugfs(adev);
355 if (r < 0) {
356 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
357 return r;
358 }
359
360 while (size) {
361 uint32_t value;
362
363 value = RREG32_DIDT(*pos >> 2);
364 r = put_user(value, (uint32_t *)buf);
365 if (r) {
366 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
367 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
368 amdgpu_virt_disable_access_debugfs(adev);
369 return r;
370 }
371
372 result += 4;
373 buf += 4;
374 *pos += 4;
375 size -= 4;
376 }
377
378 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
379 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
380
381 amdgpu_virt_disable_access_debugfs(adev);
382 return result;
383 }
384
385 /**
386 * amdgpu_debugfs_regs_didt_write - Write to a DIDT register
387 *
388 * @f: open file handle
389 * @buf: User buffer to write data from
390 * @size: Number of bytes to write
391 * @pos: Offset to seek to
392 *
393 * The lower bits are the BYTE offset of the register to write. This
394 * allows writing multiple registers in a single call and having
395 * the returned size reflect that.
396 */
amdgpu_debugfs_regs_didt_write(struct file * f,const char __user * buf,size_t size,loff_t * pos)397 static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf,
398 size_t size, loff_t *pos)
399 {
400 struct amdgpu_device *adev = file_inode(f)->i_private;
401 ssize_t result = 0;
402 int r;
403
404 if (size & 0x3 || *pos & 0x3)
405 return -EINVAL;
406
407 if (!adev->didt_wreg)
408 return -EOPNOTSUPP;
409
410 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
411 if (r < 0) {
412 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
413 return r;
414 }
415
416 r = amdgpu_virt_enable_access_debugfs(adev);
417 if (r < 0) {
418 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
419 return r;
420 }
421
422 while (size) {
423 uint32_t value;
424
425 r = get_user(value, (uint32_t *)buf);
426 if (r) {
427 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
428 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
429 amdgpu_virt_disable_access_debugfs(adev);
430 return r;
431 }
432
433 WREG32_DIDT(*pos >> 2, value);
434
435 result += 4;
436 buf += 4;
437 *pos += 4;
438 size -= 4;
439 }
440
441 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
442 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
443
444 amdgpu_virt_disable_access_debugfs(adev);
445 return result;
446 }
447
448 /**
449 * amdgpu_debugfs_regs_smc_read - Read from a SMC register
450 *
451 * @f: open file handle
452 * @buf: User buffer to store read data in
453 * @size: Number of bytes to read
454 * @pos: Offset to seek to
455 *
456 * The lower bits are the BYTE offset of the register to read. This
457 * allows reading multiple registers in a single call and having
458 * the returned size reflect that.
459 */
amdgpu_debugfs_regs_smc_read(struct file * f,char __user * buf,size_t size,loff_t * pos)460 static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
461 size_t size, loff_t *pos)
462 {
463 struct amdgpu_device *adev = file_inode(f)->i_private;
464 ssize_t result = 0;
465 int r;
466
467 if (!adev->smc_rreg)
468 return -EOPNOTSUPP;
469
470 if (size & 0x3 || *pos & 0x3)
471 return -EINVAL;
472
473 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
474 if (r < 0) {
475 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
476 return r;
477 }
478
479 r = amdgpu_virt_enable_access_debugfs(adev);
480 if (r < 0) {
481 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
482 return r;
483 }
484
485 while (size) {
486 uint32_t value;
487
488 value = RREG32_SMC(*pos);
489 r = put_user(value, (uint32_t *)buf);
490 if (r) {
491 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
492 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
493 amdgpu_virt_disable_access_debugfs(adev);
494 return r;
495 }
496
497 result += 4;
498 buf += 4;
499 *pos += 4;
500 size -= 4;
501 }
502
503 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
504 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
505
506 amdgpu_virt_disable_access_debugfs(adev);
507 return result;
508 }
509
510 /**
511 * amdgpu_debugfs_regs_smc_write - Write to a SMC register
512 *
513 * @f: open file handle
514 * @buf: User buffer to write data from
515 * @size: Number of bytes to write
516 * @pos: Offset to seek to
517 *
518 * The lower bits are the BYTE offset of the register to write. This
519 * allows writing multiple registers in a single call and having
520 * the returned size reflect that.
521 */
amdgpu_debugfs_regs_smc_write(struct file * f,const char __user * buf,size_t size,loff_t * pos)522 static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf,
523 size_t size, loff_t *pos)
524 {
525 struct amdgpu_device *adev = file_inode(f)->i_private;
526 ssize_t result = 0;
527 int r;
528
529 if (!adev->smc_wreg)
530 return -EOPNOTSUPP;
531
532 if (size & 0x3 || *pos & 0x3)
533 return -EINVAL;
534
535 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
536 if (r < 0) {
537 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
538 return r;
539 }
540
541 r = amdgpu_virt_enable_access_debugfs(adev);
542 if (r < 0) {
543 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
544 return r;
545 }
546
547 while (size) {
548 uint32_t value;
549
550 r = get_user(value, (uint32_t *)buf);
551 if (r) {
552 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
553 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
554 amdgpu_virt_disable_access_debugfs(adev);
555 return r;
556 }
557
558 WREG32_SMC(*pos, value);
559
560 result += 4;
561 buf += 4;
562 *pos += 4;
563 size -= 4;
564 }
565
566 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
567 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
568
569 amdgpu_virt_disable_access_debugfs(adev);
570 return result;
571 }
572
573 /**
574 * amdgpu_debugfs_gca_config_read - Read from gfx config data
575 *
576 * @f: open file handle
577 * @buf: User buffer to store read data in
578 * @size: Number of bytes to read
579 * @pos: Offset to seek to
580 *
581 * This file is used to access configuration data in a somewhat
582 * stable fashion. The format is a series of DWORDs with the first
583 * indicating which revision it is. New content is appended to the
584 * end so that older software can still read the data.
585 */
586
amdgpu_debugfs_gca_config_read(struct file * f,char __user * buf,size_t size,loff_t * pos)587 static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf,
588 size_t size, loff_t *pos)
589 {
590 struct amdgpu_device *adev = file_inode(f)->i_private;
591 ssize_t result = 0;
592 int r;
593 uint32_t *config, no_regs = 0;
594
595 if (size & 0x3 || *pos & 0x3)
596 return -EINVAL;
597
598 config = kmalloc_array(256, sizeof(*config), GFP_KERNEL);
599 if (!config)
600 return -ENOMEM;
601
602 /* version, increment each time something is added */
603 config[no_regs++] = 3;
604 config[no_regs++] = adev->gfx.config.max_shader_engines;
605 config[no_regs++] = adev->gfx.config.max_tile_pipes;
606 config[no_regs++] = adev->gfx.config.max_cu_per_sh;
607 config[no_regs++] = adev->gfx.config.max_sh_per_se;
608 config[no_regs++] = adev->gfx.config.max_backends_per_se;
609 config[no_regs++] = adev->gfx.config.max_texture_channel_caches;
610 config[no_regs++] = adev->gfx.config.max_gprs;
611 config[no_regs++] = adev->gfx.config.max_gs_threads;
612 config[no_regs++] = adev->gfx.config.max_hw_contexts;
613 config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_frontend;
614 config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_backend;
615 config[no_regs++] = adev->gfx.config.sc_hiz_tile_fifo_size;
616 config[no_regs++] = adev->gfx.config.sc_earlyz_tile_fifo_size;
617 config[no_regs++] = adev->gfx.config.num_tile_pipes;
618 config[no_regs++] = adev->gfx.config.backend_enable_mask;
619 config[no_regs++] = adev->gfx.config.mem_max_burst_length_bytes;
620 config[no_regs++] = adev->gfx.config.mem_row_size_in_kb;
621 config[no_regs++] = adev->gfx.config.shader_engine_tile_size;
622 config[no_regs++] = adev->gfx.config.num_gpus;
623 config[no_regs++] = adev->gfx.config.multi_gpu_tile_size;
624 config[no_regs++] = adev->gfx.config.mc_arb_ramcfg;
625 config[no_regs++] = adev->gfx.config.gb_addr_config;
626 config[no_regs++] = adev->gfx.config.num_rbs;
627
628 /* rev==1 */
629 config[no_regs++] = adev->rev_id;
630 config[no_regs++] = adev->pg_flags;
631 config[no_regs++] = adev->cg_flags;
632
633 /* rev==2 */
634 config[no_regs++] = adev->family;
635 config[no_regs++] = adev->external_rev_id;
636
637 /* rev==3 */
638 config[no_regs++] = adev->pdev->device;
639 config[no_regs++] = adev->pdev->revision;
640 config[no_regs++] = adev->pdev->subsystem_device;
641 config[no_regs++] = adev->pdev->subsystem_vendor;
642
643 while (size && (*pos < no_regs * 4)) {
644 uint32_t value;
645
646 value = config[*pos >> 2];
647 r = put_user(value, (uint32_t *)buf);
648 if (r) {
649 kfree(config);
650 return r;
651 }
652
653 result += 4;
654 buf += 4;
655 *pos += 4;
656 size -= 4;
657 }
658
659 kfree(config);
660 return result;
661 }
662
663 /**
664 * amdgpu_debugfs_sensor_read - Read from the powerplay sensors
665 *
666 * @f: open file handle
667 * @buf: User buffer to store read data in
668 * @size: Number of bytes to read
669 * @pos: Offset to seek to
670 *
671 * The offset is treated as the BYTE address of one of the sensors
672 * enumerated in amd/include/kgd_pp_interface.h under the
673 * 'amd_pp_sensors' enumeration. For instance to read the UVD VCLK
674 * you would use the offset 3 * 4 = 12.
675 */
amdgpu_debugfs_sensor_read(struct file * f,char __user * buf,size_t size,loff_t * pos)676 static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,
677 size_t size, loff_t *pos)
678 {
679 struct amdgpu_device *adev = file_inode(f)->i_private;
680 int idx, x, outsize, r, valuesize;
681 uint32_t values[16];
682
683 if (size & 3 || *pos & 0x3)
684 return -EINVAL;
685
686 if (!adev->pm.dpm_enabled)
687 return -EINVAL;
688
689 /* convert offset to sensor number */
690 idx = *pos >> 2;
691
692 valuesize = sizeof(values);
693
694 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
695 if (r < 0) {
696 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
697 return r;
698 }
699
700 r = amdgpu_virt_enable_access_debugfs(adev);
701 if (r < 0) {
702 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
703 return r;
704 }
705
706 r = amdgpu_dpm_read_sensor(adev, idx, &values[0], &valuesize);
707
708 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
709 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
710
711 if (r) {
712 amdgpu_virt_disable_access_debugfs(adev);
713 return r;
714 }
715
716 if (size > valuesize) {
717 amdgpu_virt_disable_access_debugfs(adev);
718 return -EINVAL;
719 }
720
721 outsize = 0;
722 x = 0;
723 if (!r) {
724 while (size) {
725 r = put_user(values[x++], (int32_t *)buf);
726 buf += 4;
727 size -= 4;
728 outsize += 4;
729 }
730 }
731
732 amdgpu_virt_disable_access_debugfs(adev);
733 return !r ? outsize : r;
734 }
735
736 /** amdgpu_debugfs_wave_read - Read WAVE STATUS data
737 *
738 * @f: open file handle
739 * @buf: User buffer to store read data in
740 * @size: Number of bytes to read
741 * @pos: Offset to seek to
742 *
743 * The offset being sought changes which wave that the status data
744 * will be returned for. The bits are used as follows:
745 *
746 * Bits 0..6: Byte offset into data
747 * Bits 7..14: SE selector
748 * Bits 15..22: SH/SA selector
749 * Bits 23..30: CU/{WGP+SIMD} selector
750 * Bits 31..36: WAVE ID selector
751 * Bits 37..44: SIMD ID selector
752 *
753 * The returned data begins with one DWORD of version information
754 * Followed by WAVE STATUS registers relevant to the GFX IP version
755 * being used. See gfx_v8_0_read_wave_data() for an example output.
756 */
amdgpu_debugfs_wave_read(struct file * f,char __user * buf,size_t size,loff_t * pos)757 static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,
758 size_t size, loff_t *pos)
759 {
760 struct amdgpu_device *adev = f->f_inode->i_private;
761 int r, x;
762 ssize_t result = 0;
763 uint32_t offset, se, sh, cu, wave, simd, data[32];
764
765 if (size & 3 || *pos & 3)
766 return -EINVAL;
767
768 /* decode offset */
769 offset = (*pos & GENMASK_ULL(6, 0));
770 se = (*pos & GENMASK_ULL(14, 7)) >> 7;
771 sh = (*pos & GENMASK_ULL(22, 15)) >> 15;
772 cu = (*pos & GENMASK_ULL(30, 23)) >> 23;
773 wave = (*pos & GENMASK_ULL(36, 31)) >> 31;
774 simd = (*pos & GENMASK_ULL(44, 37)) >> 37;
775
776 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
777 if (r < 0) {
778 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
779 return r;
780 }
781
782 r = amdgpu_virt_enable_access_debugfs(adev);
783 if (r < 0) {
784 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
785 return r;
786 }
787
788 /* switch to the specific se/sh/cu */
789 mutex_lock(&adev->grbm_idx_mutex);
790 amdgpu_gfx_select_se_sh(adev, se, sh, cu);
791
792 x = 0;
793 if (adev->gfx.funcs->read_wave_data)
794 adev->gfx.funcs->read_wave_data(adev, simd, wave, data, &x);
795
796 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
797 mutex_unlock(&adev->grbm_idx_mutex);
798
799 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
800 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
801
802 if (!x) {
803 amdgpu_virt_disable_access_debugfs(adev);
804 return -EINVAL;
805 }
806
807 while (size && (offset < x * 4)) {
808 uint32_t value;
809
810 value = data[offset >> 2];
811 r = put_user(value, (uint32_t *)buf);
812 if (r) {
813 amdgpu_virt_disable_access_debugfs(adev);
814 return r;
815 }
816
817 result += 4;
818 buf += 4;
819 offset += 4;
820 size -= 4;
821 }
822
823 amdgpu_virt_disable_access_debugfs(adev);
824 return result;
825 }
826
827 /** amdgpu_debugfs_gpr_read - Read wave gprs
828 *
829 * @f: open file handle
830 * @buf: User buffer to store read data in
831 * @size: Number of bytes to read
832 * @pos: Offset to seek to
833 *
834 * The offset being sought changes which wave that the status data
835 * will be returned for. The bits are used as follows:
836 *
837 * Bits 0..11: Byte offset into data
838 * Bits 12..19: SE selector
839 * Bits 20..27: SH/SA selector
840 * Bits 28..35: CU/{WGP+SIMD} selector
841 * Bits 36..43: WAVE ID selector
842 * Bits 37..44: SIMD ID selector
843 * Bits 52..59: Thread selector
844 * Bits 60..61: Bank selector (VGPR=0,SGPR=1)
845 *
846 * The return data comes from the SGPR or VGPR register bank for
847 * the selected operational unit.
848 */
amdgpu_debugfs_gpr_read(struct file * f,char __user * buf,size_t size,loff_t * pos)849 static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
850 size_t size, loff_t *pos)
851 {
852 struct amdgpu_device *adev = f->f_inode->i_private;
853 int r;
854 ssize_t result = 0;
855 uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data;
856
857 if (size > 4096 || size & 3 || *pos & 3)
858 return -EINVAL;
859
860 /* decode offset */
861 offset = (*pos & GENMASK_ULL(11, 0)) >> 2;
862 se = (*pos & GENMASK_ULL(19, 12)) >> 12;
863 sh = (*pos & GENMASK_ULL(27, 20)) >> 20;
864 cu = (*pos & GENMASK_ULL(35, 28)) >> 28;
865 wave = (*pos & GENMASK_ULL(43, 36)) >> 36;
866 simd = (*pos & GENMASK_ULL(51, 44)) >> 44;
867 thread = (*pos & GENMASK_ULL(59, 52)) >> 52;
868 bank = (*pos & GENMASK_ULL(61, 60)) >> 60;
869
870 data = kcalloc(1024, sizeof(*data), GFP_KERNEL);
871 if (!data)
872 return -ENOMEM;
873
874 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
875 if (r < 0)
876 goto err;
877
878 r = amdgpu_virt_enable_access_debugfs(adev);
879 if (r < 0)
880 goto err;
881
882 /* switch to the specific se/sh/cu */
883 mutex_lock(&adev->grbm_idx_mutex);
884 amdgpu_gfx_select_se_sh(adev, se, sh, cu);
885
886 if (bank == 0) {
887 if (adev->gfx.funcs->read_wave_vgprs)
888 adev->gfx.funcs->read_wave_vgprs(adev, simd, wave, thread, offset, size>>2, data);
889 } else {
890 if (adev->gfx.funcs->read_wave_sgprs)
891 adev->gfx.funcs->read_wave_sgprs(adev, simd, wave, offset, size>>2, data);
892 }
893
894 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
895 mutex_unlock(&adev->grbm_idx_mutex);
896
897 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
898 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
899
900 while (size) {
901 uint32_t value;
902
903 value = data[result >> 2];
904 r = put_user(value, (uint32_t *)buf);
905 if (r) {
906 amdgpu_virt_disable_access_debugfs(adev);
907 goto err;
908 }
909
910 result += 4;
911 buf += 4;
912 size -= 4;
913 }
914
915 kfree(data);
916 amdgpu_virt_disable_access_debugfs(adev);
917 return result;
918
919 err:
920 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
921 kfree(data);
922 return r;
923 }
924
925 /**
926 * amdgpu_debugfs_gfxoff_write - Enable/disable GFXOFF
927 *
928 * @f: open file handle
929 * @buf: User buffer to write data from
930 * @size: Number of bytes to write
931 * @pos: Offset to seek to
932 *
933 * Write a 32-bit zero to disable or a 32-bit non-zero to enable
934 */
amdgpu_debugfs_gfxoff_write(struct file * f,const char __user * buf,size_t size,loff_t * pos)935 static ssize_t amdgpu_debugfs_gfxoff_write(struct file *f, const char __user *buf,
936 size_t size, loff_t *pos)
937 {
938 struct amdgpu_device *adev = file_inode(f)->i_private;
939 ssize_t result = 0;
940 int r;
941
942 if (size & 0x3 || *pos & 0x3)
943 return -EINVAL;
944
945 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
946 if (r < 0) {
947 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
948 return r;
949 }
950
951 while (size) {
952 uint32_t value;
953
954 r = get_user(value, (uint32_t *)buf);
955 if (r) {
956 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
957 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
958 return r;
959 }
960
961 amdgpu_gfx_off_ctrl(adev, value ? true : false);
962
963 result += 4;
964 buf += 4;
965 *pos += 4;
966 size -= 4;
967 }
968
969 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
970 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
971
972 return result;
973 }
974
975
976 /**
977 * amdgpu_debugfs_gfxoff_read - read gfxoff status
978 *
979 * @f: open file handle
980 * @buf: User buffer to store read data in
981 * @size: Number of bytes to read
982 * @pos: Offset to seek to
983 */
amdgpu_debugfs_gfxoff_read(struct file * f,char __user * buf,size_t size,loff_t * pos)984 static ssize_t amdgpu_debugfs_gfxoff_read(struct file *f, char __user *buf,
985 size_t size, loff_t *pos)
986 {
987 struct amdgpu_device *adev = file_inode(f)->i_private;
988 ssize_t result = 0;
989 int r;
990
991 if (size & 0x3 || *pos & 0x3)
992 return -EINVAL;
993
994 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
995 if (r < 0)
996 return r;
997
998 while (size) {
999 uint32_t value;
1000
1001 r = amdgpu_get_gfx_off_status(adev, &value);
1002 if (r) {
1003 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
1004 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1005 return r;
1006 }
1007
1008 r = put_user(value, (uint32_t *)buf);
1009 if (r) {
1010 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
1011 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1012 return r;
1013 }
1014
1015 result += 4;
1016 buf += 4;
1017 *pos += 4;
1018 size -= 4;
1019 }
1020
1021 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
1022 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1023
1024 return result;
1025 }
1026
1027 static const struct file_operations amdgpu_debugfs_regs_fops = {
1028 .owner = THIS_MODULE,
1029 .read = amdgpu_debugfs_regs_read,
1030 .write = amdgpu_debugfs_regs_write,
1031 .llseek = default_llseek
1032 };
1033 static const struct file_operations amdgpu_debugfs_regs_didt_fops = {
1034 .owner = THIS_MODULE,
1035 .read = amdgpu_debugfs_regs_didt_read,
1036 .write = amdgpu_debugfs_regs_didt_write,
1037 .llseek = default_llseek
1038 };
1039 static const struct file_operations amdgpu_debugfs_regs_pcie_fops = {
1040 .owner = THIS_MODULE,
1041 .read = amdgpu_debugfs_regs_pcie_read,
1042 .write = amdgpu_debugfs_regs_pcie_write,
1043 .llseek = default_llseek
1044 };
1045 static const struct file_operations amdgpu_debugfs_regs_smc_fops = {
1046 .owner = THIS_MODULE,
1047 .read = amdgpu_debugfs_regs_smc_read,
1048 .write = amdgpu_debugfs_regs_smc_write,
1049 .llseek = default_llseek
1050 };
1051
1052 static const struct file_operations amdgpu_debugfs_gca_config_fops = {
1053 .owner = THIS_MODULE,
1054 .read = amdgpu_debugfs_gca_config_read,
1055 .llseek = default_llseek
1056 };
1057
1058 static const struct file_operations amdgpu_debugfs_sensors_fops = {
1059 .owner = THIS_MODULE,
1060 .read = amdgpu_debugfs_sensor_read,
1061 .llseek = default_llseek
1062 };
1063
1064 static const struct file_operations amdgpu_debugfs_wave_fops = {
1065 .owner = THIS_MODULE,
1066 .read = amdgpu_debugfs_wave_read,
1067 .llseek = default_llseek
1068 };
1069 static const struct file_operations amdgpu_debugfs_gpr_fops = {
1070 .owner = THIS_MODULE,
1071 .read = amdgpu_debugfs_gpr_read,
1072 .llseek = default_llseek
1073 };
1074
1075 static const struct file_operations amdgpu_debugfs_gfxoff_fops = {
1076 .owner = THIS_MODULE,
1077 .read = amdgpu_debugfs_gfxoff_read,
1078 .write = amdgpu_debugfs_gfxoff_write,
1079 .llseek = default_llseek
1080 };
1081
1082 static const struct file_operations *debugfs_regs[] = {
1083 &amdgpu_debugfs_regs_fops,
1084 &amdgpu_debugfs_regs_didt_fops,
1085 &amdgpu_debugfs_regs_pcie_fops,
1086 &amdgpu_debugfs_regs_smc_fops,
1087 &amdgpu_debugfs_gca_config_fops,
1088 &amdgpu_debugfs_sensors_fops,
1089 &amdgpu_debugfs_wave_fops,
1090 &amdgpu_debugfs_gpr_fops,
1091 &amdgpu_debugfs_gfxoff_fops,
1092 };
1093
1094 static const char *debugfs_regs_names[] = {
1095 "amdgpu_regs",
1096 "amdgpu_regs_didt",
1097 "amdgpu_regs_pcie",
1098 "amdgpu_regs_smc",
1099 "amdgpu_gca_config",
1100 "amdgpu_sensors",
1101 "amdgpu_wave",
1102 "amdgpu_gpr",
1103 "amdgpu_gfxoff",
1104 };
1105
1106 /**
1107 * amdgpu_debugfs_regs_init - Initialize debugfs entries that provide
1108 * register access.
1109 *
1110 * @adev: The device to attach the debugfs entries to
1111 */
amdgpu_debugfs_regs_init(struct amdgpu_device * adev)1112 int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
1113 {
1114 struct drm_minor *minor = adev_to_drm(adev)->primary;
1115 struct dentry *ent, *root = minor->debugfs_root;
1116 unsigned int i;
1117
1118 for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
1119 ent = debugfs_create_file(debugfs_regs_names[i],
1120 S_IFREG | S_IRUGO, root,
1121 adev, debugfs_regs[i]);
1122 if (!i && !IS_ERR_OR_NULL(ent))
1123 i_size_write(ent->d_inode, adev->rmmio_size);
1124 }
1125
1126 return 0;
1127 }
1128
amdgpu_debugfs_test_ib_show(struct seq_file * m,void * unused)1129 static int amdgpu_debugfs_test_ib_show(struct seq_file *m, void *unused)
1130 {
1131 struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
1132 struct drm_device *dev = adev_to_drm(adev);
1133 int r = 0, i;
1134
1135 r = pm_runtime_get_sync(dev->dev);
1136 if (r < 0) {
1137 pm_runtime_put_autosuspend(dev->dev);
1138 return r;
1139 }
1140
1141 /* Avoid accidently unparking the sched thread during GPU reset */
1142 r = down_read_killable(&adev->reset_sem);
1143 if (r)
1144 return r;
1145
1146 /* hold on the scheduler */
1147 for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
1148 struct amdgpu_ring *ring = adev->rings[i];
1149
1150 if (!ring || !ring->sched.thread)
1151 continue;
1152 kthread_park(ring->sched.thread);
1153 }
1154
1155 seq_printf(m, "run ib test:\n");
1156 r = amdgpu_ib_ring_tests(adev);
1157 if (r)
1158 seq_printf(m, "ib ring tests failed (%d).\n", r);
1159 else
1160 seq_printf(m, "ib ring tests passed.\n");
1161
1162 /* go on the scheduler */
1163 for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
1164 struct amdgpu_ring *ring = adev->rings[i];
1165
1166 if (!ring || !ring->sched.thread)
1167 continue;
1168 kthread_unpark(ring->sched.thread);
1169 }
1170
1171 up_read(&adev->reset_sem);
1172
1173 pm_runtime_mark_last_busy(dev->dev);
1174 pm_runtime_put_autosuspend(dev->dev);
1175
1176 return 0;
1177 }
1178
amdgpu_debugfs_evict_vram(void * data,u64 * val)1179 static int amdgpu_debugfs_evict_vram(void *data, u64 *val)
1180 {
1181 struct amdgpu_device *adev = (struct amdgpu_device *)data;
1182 struct drm_device *dev = adev_to_drm(adev);
1183 int r;
1184
1185 r = pm_runtime_get_sync(dev->dev);
1186 if (r < 0) {
1187 pm_runtime_put_autosuspend(dev->dev);
1188 return r;
1189 }
1190
1191 *val = amdgpu_ttm_evict_resources(adev, TTM_PL_VRAM);
1192
1193 pm_runtime_mark_last_busy(dev->dev);
1194 pm_runtime_put_autosuspend(dev->dev);
1195
1196 return 0;
1197 }
1198
1199
amdgpu_debugfs_evict_gtt(void * data,u64 * val)1200 static int amdgpu_debugfs_evict_gtt(void *data, u64 *val)
1201 {
1202 struct amdgpu_device *adev = (struct amdgpu_device *)data;
1203 struct drm_device *dev = adev_to_drm(adev);
1204 int r;
1205
1206 r = pm_runtime_get_sync(dev->dev);
1207 if (r < 0) {
1208 pm_runtime_put_autosuspend(dev->dev);
1209 return r;
1210 }
1211
1212 *val = amdgpu_ttm_evict_resources(adev, TTM_PL_TT);
1213
1214 pm_runtime_mark_last_busy(dev->dev);
1215 pm_runtime_put_autosuspend(dev->dev);
1216
1217 return 0;
1218 }
1219
1220
amdgpu_debugfs_vm_info_show(struct seq_file * m,void * unused)1221 static int amdgpu_debugfs_vm_info_show(struct seq_file *m, void *unused)
1222 {
1223 struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
1224 struct drm_device *dev = adev_to_drm(adev);
1225 struct drm_file *file;
1226 int r;
1227
1228 r = mutex_lock_interruptible(&dev->filelist_mutex);
1229 if (r)
1230 return r;
1231
1232 list_for_each_entry(file, &dev->filelist, lhead) {
1233 struct amdgpu_fpriv *fpriv = file->driver_priv;
1234 struct amdgpu_vm *vm = &fpriv->vm;
1235
1236 seq_printf(m, "pid:%d\tProcess:%s ----------\n",
1237 vm->task_info.pid, vm->task_info.process_name);
1238 r = amdgpu_bo_reserve(vm->root.bo, true);
1239 if (r)
1240 break;
1241 amdgpu_debugfs_vm_bo_info(vm, m);
1242 amdgpu_bo_unreserve(vm->root.bo);
1243 }
1244
1245 mutex_unlock(&dev->filelist_mutex);
1246
1247 return r;
1248 }
1249
1250 DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_test_ib);
1251 DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_vm_info);
1252 DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_evict_vram_fops, amdgpu_debugfs_evict_vram,
1253 NULL, "%lld\n");
1254 DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_evict_gtt_fops, amdgpu_debugfs_evict_gtt,
1255 NULL, "%lld\n");
1256
amdgpu_ib_preempt_fences_swap(struct amdgpu_ring * ring,struct dma_fence ** fences)1257 static void amdgpu_ib_preempt_fences_swap(struct amdgpu_ring *ring,
1258 struct dma_fence **fences)
1259 {
1260 struct amdgpu_fence_driver *drv = &ring->fence_drv;
1261 uint32_t sync_seq, last_seq;
1262
1263 last_seq = atomic_read(&ring->fence_drv.last_seq);
1264 sync_seq = ring->fence_drv.sync_seq;
1265
1266 last_seq &= drv->num_fences_mask;
1267 sync_seq &= drv->num_fences_mask;
1268
1269 do {
1270 struct dma_fence *fence, **ptr;
1271
1272 ++last_seq;
1273 last_seq &= drv->num_fences_mask;
1274 ptr = &drv->fences[last_seq];
1275
1276 fence = rcu_dereference_protected(*ptr, 1);
1277 RCU_INIT_POINTER(*ptr, NULL);
1278
1279 if (!fence)
1280 continue;
1281
1282 fences[last_seq] = fence;
1283
1284 } while (last_seq != sync_seq);
1285 }
1286
amdgpu_ib_preempt_signal_fences(struct dma_fence ** fences,int length)1287 static void amdgpu_ib_preempt_signal_fences(struct dma_fence **fences,
1288 int length)
1289 {
1290 int i;
1291 struct dma_fence *fence;
1292
1293 for (i = 0; i < length; i++) {
1294 fence = fences[i];
1295 if (!fence)
1296 continue;
1297 dma_fence_signal(fence);
1298 dma_fence_put(fence);
1299 }
1300 }
1301
amdgpu_ib_preempt_job_recovery(struct drm_gpu_scheduler * sched)1302 static void amdgpu_ib_preempt_job_recovery(struct drm_gpu_scheduler *sched)
1303 {
1304 struct drm_sched_job *s_job;
1305 struct dma_fence *fence;
1306
1307 spin_lock(&sched->job_list_lock);
1308 list_for_each_entry(s_job, &sched->pending_list, list) {
1309 fence = sched->ops->run_job(s_job);
1310 dma_fence_put(fence);
1311 }
1312 spin_unlock(&sched->job_list_lock);
1313 }
1314
amdgpu_ib_preempt_mark_partial_job(struct amdgpu_ring * ring)1315 static void amdgpu_ib_preempt_mark_partial_job(struct amdgpu_ring *ring)
1316 {
1317 struct amdgpu_job *job;
1318 struct drm_sched_job *s_job, *tmp;
1319 uint32_t preempt_seq;
1320 struct dma_fence *fence, **ptr;
1321 struct amdgpu_fence_driver *drv = &ring->fence_drv;
1322 struct drm_gpu_scheduler *sched = &ring->sched;
1323 bool preempted = true;
1324
1325 if (ring->funcs->type != AMDGPU_RING_TYPE_GFX)
1326 return;
1327
1328 preempt_seq = le32_to_cpu(*(drv->cpu_addr + 2));
1329 if (preempt_seq <= atomic_read(&drv->last_seq)) {
1330 preempted = false;
1331 goto no_preempt;
1332 }
1333
1334 preempt_seq &= drv->num_fences_mask;
1335 ptr = &drv->fences[preempt_seq];
1336 fence = rcu_dereference_protected(*ptr, 1);
1337
1338 no_preempt:
1339 spin_lock(&sched->job_list_lock);
1340 list_for_each_entry_safe(s_job, tmp, &sched->pending_list, list) {
1341 if (dma_fence_is_signaled(&s_job->s_fence->finished)) {
1342 /* remove job from ring_mirror_list */
1343 list_del_init(&s_job->list);
1344 sched->ops->free_job(s_job);
1345 continue;
1346 }
1347 job = to_amdgpu_job(s_job);
1348 if (preempted && (&job->hw_fence) == fence)
1349 /* mark the job as preempted */
1350 job->preemption_status |= AMDGPU_IB_PREEMPTED;
1351 }
1352 spin_unlock(&sched->job_list_lock);
1353 }
1354
amdgpu_debugfs_ib_preempt(void * data,u64 val)1355 static int amdgpu_debugfs_ib_preempt(void *data, u64 val)
1356 {
1357 int r, resched, length;
1358 struct amdgpu_ring *ring;
1359 struct dma_fence **fences = NULL;
1360 struct amdgpu_device *adev = (struct amdgpu_device *)data;
1361
1362 if (val >= AMDGPU_MAX_RINGS)
1363 return -EINVAL;
1364
1365 ring = adev->rings[val];
1366
1367 if (!ring || !ring->funcs->preempt_ib || !ring->sched.thread)
1368 return -EINVAL;
1369
1370 /* the last preemption failed */
1371 if (ring->trail_seq != le32_to_cpu(*ring->trail_fence_cpu_addr))
1372 return -EBUSY;
1373
1374 length = ring->fence_drv.num_fences_mask + 1;
1375 fences = kcalloc(length, sizeof(void *), GFP_KERNEL);
1376 if (!fences)
1377 return -ENOMEM;
1378
1379 /* Avoid accidently unparking the sched thread during GPU reset */
1380 r = down_read_killable(&adev->reset_sem);
1381 if (r)
1382 goto pro_end;
1383
1384 /* stop the scheduler */
1385 kthread_park(ring->sched.thread);
1386
1387 resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
1388
1389 /* preempt the IB */
1390 r = amdgpu_ring_preempt_ib(ring);
1391 if (r) {
1392 DRM_WARN("failed to preempt ring %d\n", ring->idx);
1393 goto failure;
1394 }
1395
1396 amdgpu_fence_process(ring);
1397
1398 if (atomic_read(&ring->fence_drv.last_seq) !=
1399 ring->fence_drv.sync_seq) {
1400 DRM_INFO("ring %d was preempted\n", ring->idx);
1401
1402 amdgpu_ib_preempt_mark_partial_job(ring);
1403
1404 /* swap out the old fences */
1405 amdgpu_ib_preempt_fences_swap(ring, fences);
1406
1407 amdgpu_fence_driver_force_completion(ring);
1408
1409 /* resubmit unfinished jobs */
1410 amdgpu_ib_preempt_job_recovery(&ring->sched);
1411
1412 /* wait for jobs finished */
1413 amdgpu_fence_wait_empty(ring);
1414
1415 /* signal the old fences */
1416 amdgpu_ib_preempt_signal_fences(fences, length);
1417 }
1418
1419 failure:
1420 /* restart the scheduler */
1421 kthread_unpark(ring->sched.thread);
1422
1423 up_read(&adev->reset_sem);
1424
1425 ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched);
1426
1427 pro_end:
1428 kfree(fences);
1429
1430 return r;
1431 }
1432
amdgpu_debugfs_sclk_set(void * data,u64 val)1433 static int amdgpu_debugfs_sclk_set(void *data, u64 val)
1434 {
1435 int ret = 0;
1436 uint32_t max_freq, min_freq;
1437 struct amdgpu_device *adev = (struct amdgpu_device *)data;
1438
1439 if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev))
1440 return -EINVAL;
1441
1442 ret = pm_runtime_get_sync(adev_to_drm(adev)->dev);
1443 if (ret < 0) {
1444 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1445 return ret;
1446 }
1447
1448 if (is_support_sw_smu(adev)) {
1449 ret = smu_get_dpm_freq_range(&adev->smu, SMU_SCLK, &min_freq, &max_freq);
1450 if (ret || val > max_freq || val < min_freq)
1451 return -EINVAL;
1452 ret = smu_set_soft_freq_range(&adev->smu, SMU_SCLK, (uint32_t)val, (uint32_t)val);
1453 } else {
1454 return 0;
1455 }
1456
1457 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
1458 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1459
1460 if (ret)
1461 return -EINVAL;
1462
1463 return 0;
1464 }
1465
1466 DEFINE_DEBUGFS_ATTRIBUTE(fops_ib_preempt, NULL,
1467 amdgpu_debugfs_ib_preempt, "%llu\n");
1468
1469 DEFINE_DEBUGFS_ATTRIBUTE(fops_sclk_set, NULL,
1470 amdgpu_debugfs_sclk_set, "%llu\n");
1471
amdgpu_debugfs_init(struct amdgpu_device * adev)1472 int amdgpu_debugfs_init(struct amdgpu_device *adev)
1473 {
1474 struct dentry *root = adev_to_drm(adev)->primary->debugfs_root;
1475 struct dentry *ent;
1476 int r, i;
1477
1478 ent = debugfs_create_file("amdgpu_preempt_ib", 0600, root, adev,
1479 &fops_ib_preempt);
1480 if (IS_ERR(ent)) {
1481 DRM_ERROR("unable to create amdgpu_preempt_ib debugsfs file\n");
1482 return PTR_ERR(ent);
1483 }
1484
1485 ent = debugfs_create_file("amdgpu_force_sclk", 0200, root, adev,
1486 &fops_sclk_set);
1487 if (IS_ERR(ent)) {
1488 DRM_ERROR("unable to create amdgpu_set_sclk debugsfs file\n");
1489 return PTR_ERR(ent);
1490 }
1491
1492 /* Register debugfs entries for amdgpu_ttm */
1493 amdgpu_ttm_debugfs_init(adev);
1494 amdgpu_debugfs_pm_init(adev);
1495 amdgpu_debugfs_sa_init(adev);
1496 amdgpu_debugfs_fence_init(adev);
1497 amdgpu_debugfs_gem_init(adev);
1498
1499 r = amdgpu_debugfs_regs_init(adev);
1500 if (r)
1501 DRM_ERROR("registering register debugfs failed (%d).\n", r);
1502
1503 amdgpu_debugfs_firmware_init(adev);
1504
1505 #if defined(CONFIG_DRM_AMD_DC)
1506 if (amdgpu_device_has_dc_support(adev))
1507 dtn_debugfs_init(adev);
1508 #endif
1509
1510 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
1511 struct amdgpu_ring *ring = adev->rings[i];
1512
1513 if (!ring)
1514 continue;
1515
1516 if (amdgpu_debugfs_ring_init(adev, ring)) {
1517 DRM_ERROR("Failed to register debugfs file for rings !\n");
1518 }
1519 }
1520
1521 amdgpu_ras_debugfs_create_all(adev);
1522 amdgpu_rap_debugfs_init(adev);
1523 amdgpu_securedisplay_debugfs_init(adev);
1524 amdgpu_fw_attestation_debugfs_init(adev);
1525
1526 debugfs_create_file("amdgpu_evict_vram", 0444, root, adev,
1527 &amdgpu_evict_vram_fops);
1528 debugfs_create_file("amdgpu_evict_gtt", 0444, root, adev,
1529 &amdgpu_evict_gtt_fops);
1530 debugfs_create_file("amdgpu_test_ib", 0444, root, adev,
1531 &amdgpu_debugfs_test_ib_fops);
1532 debugfs_create_file("amdgpu_vm_info", 0444, root, adev,
1533 &amdgpu_debugfs_vm_info_fops);
1534
1535 adev->debugfs_vbios_blob.data = adev->bios;
1536 adev->debugfs_vbios_blob.size = adev->bios_size;
1537 debugfs_create_blob("amdgpu_vbios", 0444, root,
1538 &adev->debugfs_vbios_blob);
1539
1540 return 0;
1541 }
1542
1543 #else
amdgpu_debugfs_init(struct amdgpu_device * adev)1544 int amdgpu_debugfs_init(struct amdgpu_device *adev)
1545 {
1546 return 0;
1547 }
amdgpu_debugfs_regs_init(struct amdgpu_device * adev)1548 int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
1549 {
1550 return 0;
1551 }
1552 #endif
1553