Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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#include "amdgpu_umr.h"
39
40#include "amdgpu_reset.h"
41#include "amdgpu_psp_ta.h"
42
43#if defined(CONFIG_DEBUG_FS)
44
45/**
46 * amdgpu_debugfs_process_reg_op - Handle MMIO register reads/writes
47 *
48 * @read: True if reading
49 * @f: open file handle
50 * @buf: User buffer to write/read to
51 * @size: Number of bytes to write/read
52 * @pos: Offset to seek to
53 *
54 * This debugfs entry has special meaning on the offset being sought.
55 * Various bits have different meanings:
56 *
57 * Bit 62: Indicates a GRBM bank switch is needed
58 * Bit 61: Indicates a SRBM bank switch is needed (implies bit 62 is
59 * zero)
60 * Bits 24..33: The SE or ME selector if needed
61 * Bits 34..43: The SH (or SA) or PIPE selector if needed
62 * Bits 44..53: The INSTANCE (or CU/WGP) or QUEUE selector if needed
63 *
64 * Bit 23: Indicates that the PM power gating lock should be held
65 * This is necessary to read registers that might be
66 * unreliable during a power gating transistion.
67 *
68 * The lower bits are the BYTE offset of the register to read. This
69 * allows reading multiple registers in a single call and having
70 * the returned size reflect that.
71 */
72static int amdgpu_debugfs_process_reg_op(bool read, struct file *f,
73 char __user *buf, size_t size, loff_t *pos)
74{
75 struct amdgpu_device *adev = file_inode(f)->i_private;
76 ssize_t result = 0;
77 int r;
78 bool pm_pg_lock, use_bank, use_ring;
79 unsigned int instance_bank, sh_bank, se_bank, me, pipe, queue, vmid;
80
81 pm_pg_lock = use_bank = use_ring = false;
82 instance_bank = sh_bank = se_bank = me = pipe = queue = vmid = 0;
83
84 if (size & 0x3 || *pos & 0x3 ||
85 ((*pos & (1ULL << 62)) && (*pos & (1ULL << 61))))
86 return -EINVAL;
87
88 /* are we reading registers for which a PG lock is necessary? */
89 pm_pg_lock = (*pos >> 23) & 1;
90
91 if (*pos & (1ULL << 62)) {
92 se_bank = (*pos & GENMASK_ULL(33, 24)) >> 24;
93 sh_bank = (*pos & GENMASK_ULL(43, 34)) >> 34;
94 instance_bank = (*pos & GENMASK_ULL(53, 44)) >> 44;
95
96 if (se_bank == 0x3FF)
97 se_bank = 0xFFFFFFFF;
98 if (sh_bank == 0x3FF)
99 sh_bank = 0xFFFFFFFF;
100 if (instance_bank == 0x3FF)
101 instance_bank = 0xFFFFFFFF;
102 use_bank = true;
103 } else if (*pos & (1ULL << 61)) {
104
105 me = (*pos & GENMASK_ULL(33, 24)) >> 24;
106 pipe = (*pos & GENMASK_ULL(43, 34)) >> 34;
107 queue = (*pos & GENMASK_ULL(53, 44)) >> 44;
108 vmid = (*pos & GENMASK_ULL(58, 54)) >> 54;
109
110 use_ring = true;
111 } else {
112 use_bank = use_ring = false;
113 }
114
115 *pos &= (1UL << 22) - 1;
116
117 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
118 if (r < 0) {
119 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
120 return r;
121 }
122
123 r = amdgpu_virt_enable_access_debugfs(adev);
124 if (r < 0) {
125 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
126 return r;
127 }
128
129 if (use_bank) {
130 if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||
131 (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines)) {
132 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
133 amdgpu_virt_disable_access_debugfs(adev);
134 return -EINVAL;
135 }
136 mutex_lock(&adev->grbm_idx_mutex);
137 amdgpu_gfx_select_se_sh(adev, se_bank,
138 sh_bank, instance_bank, 0);
139 } else if (use_ring) {
140 mutex_lock(&adev->srbm_mutex);
141 amdgpu_gfx_select_me_pipe_q(adev, me, pipe, queue, vmid, 0);
142 }
143
144 if (pm_pg_lock)
145 mutex_lock(&adev->pm.mutex);
146
147 while (size) {
148 uint32_t value;
149
150 if (read) {
151 value = RREG32(*pos >> 2);
152 r = put_user(value, (uint32_t *)buf);
153 } else {
154 r = get_user(value, (uint32_t *)buf);
155 if (!r)
156 amdgpu_mm_wreg_mmio_rlc(adev, *pos >> 2, value, 0);
157 }
158 if (r) {
159 result = r;
160 goto end;
161 }
162
163 result += 4;
164 buf += 4;
165 *pos += 4;
166 size -= 4;
167 }
168
169end:
170 if (use_bank) {
171 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);
172 mutex_unlock(&adev->grbm_idx_mutex);
173 } else if (use_ring) {
174 amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, 0, 0);
175 mutex_unlock(&adev->srbm_mutex);
176 }
177
178 if (pm_pg_lock)
179 mutex_unlock(&adev->pm.mutex);
180
181 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
182
183 amdgpu_virt_disable_access_debugfs(adev);
184 return result;
185}
186
187/*
188 * amdgpu_debugfs_regs_read - Callback for reading MMIO registers
189 */
190static ssize_t amdgpu_debugfs_regs_read(struct file *f, char __user *buf,
191 size_t size, loff_t *pos)
192{
193 return amdgpu_debugfs_process_reg_op(true, f, buf, size, pos);
194}
195
196/*
197 * amdgpu_debugfs_regs_write - Callback for writing MMIO registers
198 */
199static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
200 size_t size, loff_t *pos)
201{
202 return amdgpu_debugfs_process_reg_op(false, f, (char __user *)buf, size, pos);
203}
204
205static int amdgpu_debugfs_regs2_open(struct inode *inode, struct file *file)
206{
207 struct amdgpu_debugfs_regs2_data *rd;
208
209 rd = kzalloc(sizeof(*rd), GFP_KERNEL);
210 if (!rd)
211 return -ENOMEM;
212 rd->adev = file_inode(file)->i_private;
213 file->private_data = rd;
214 mutex_init(&rd->lock);
215
216 return 0;
217}
218
219static int amdgpu_debugfs_regs2_release(struct inode *inode, struct file *file)
220{
221 struct amdgpu_debugfs_regs2_data *rd = file->private_data;
222
223 mutex_destroy(&rd->lock);
224 kfree(file->private_data);
225 return 0;
226}
227
228static ssize_t amdgpu_debugfs_regs2_op(struct file *f, char __user *buf, u32 offset, size_t size, int write_en)
229{
230 struct amdgpu_debugfs_regs2_data *rd = f->private_data;
231 struct amdgpu_device *adev = rd->adev;
232 ssize_t result = 0;
233 int r;
234 uint32_t value;
235
236 if (size & 0x3 || offset & 0x3)
237 return -EINVAL;
238
239 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
240 if (r < 0) {
241 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
242 return r;
243 }
244
245 r = amdgpu_virt_enable_access_debugfs(adev);
246 if (r < 0) {
247 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
248 return r;
249 }
250
251 mutex_lock(&rd->lock);
252
253 if (rd->id.use_grbm) {
254 if ((rd->id.grbm.sh != 0xFFFFFFFF && rd->id.grbm.sh >= adev->gfx.config.max_sh_per_se) ||
255 (rd->id.grbm.se != 0xFFFFFFFF && rd->id.grbm.se >= adev->gfx.config.max_shader_engines)) {
256 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
257 amdgpu_virt_disable_access_debugfs(adev);
258 mutex_unlock(&rd->lock);
259 return -EINVAL;
260 }
261 mutex_lock(&adev->grbm_idx_mutex);
262 amdgpu_gfx_select_se_sh(adev, rd->id.grbm.se,
263 rd->id.grbm.sh,
264 rd->id.grbm.instance, rd->id.xcc_id);
265 }
266
267 if (rd->id.use_srbm) {
268 mutex_lock(&adev->srbm_mutex);
269 amdgpu_gfx_select_me_pipe_q(adev, rd->id.srbm.me, rd->id.srbm.pipe,
270 rd->id.srbm.queue, rd->id.srbm.vmid, rd->id.xcc_id);
271 }
272
273 if (rd->id.pg_lock)
274 mutex_lock(&adev->pm.mutex);
275
276 while (size) {
277 if (!write_en) {
278 value = RREG32(offset >> 2);
279 r = put_user(value, (uint32_t *)buf);
280 } else {
281 r = get_user(value, (uint32_t *)buf);
282 if (!r)
283 amdgpu_mm_wreg_mmio_rlc(adev, offset >> 2, value, rd->id.xcc_id);
284 }
285 if (r) {
286 result = r;
287 goto end;
288 }
289 offset += 4;
290 size -= 4;
291 result += 4;
292 buf += 4;
293 }
294end:
295 if (rd->id.use_grbm) {
296 amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, rd->id.xcc_id);
297 mutex_unlock(&adev->grbm_idx_mutex);
298 }
299
300 if (rd->id.use_srbm) {
301 amdgpu_gfx_select_me_pipe_q(adev, 0, 0, 0, 0, rd->id.xcc_id);
302 mutex_unlock(&adev->srbm_mutex);
303 }
304
305 if (rd->id.pg_lock)
306 mutex_unlock(&adev->pm.mutex);
307
308 mutex_unlock(&rd->lock);
309
310 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
311
312 amdgpu_virt_disable_access_debugfs(adev);
313 return result;
314}
315
316static long amdgpu_debugfs_regs2_ioctl(struct file *f, unsigned int cmd, unsigned long data)
317{
318 struct amdgpu_debugfs_regs2_data *rd = f->private_data;
319 struct amdgpu_debugfs_regs2_iocdata v1_data;
320 int r;
321
322 mutex_lock(&rd->lock);
323
324 switch (cmd) {
325 case AMDGPU_DEBUGFS_REGS2_IOC_SET_STATE_V2:
326 r = copy_from_user(&rd->id, (struct amdgpu_debugfs_regs2_iocdata_v2 *)data,
327 sizeof(rd->id));
328 if (r)
329 r = -EINVAL;
330 goto done;
331 case AMDGPU_DEBUGFS_REGS2_IOC_SET_STATE:
332 r = copy_from_user(&v1_data, (struct amdgpu_debugfs_regs2_iocdata *)data,
333 sizeof(v1_data));
334 if (r) {
335 r = -EINVAL;
336 goto done;
337 }
338 goto v1_copy;
339 default:
340 r = -EINVAL;
341 goto done;
342 }
343
344v1_copy:
345 rd->id.use_srbm = v1_data.use_srbm;
346 rd->id.use_grbm = v1_data.use_grbm;
347 rd->id.pg_lock = v1_data.pg_lock;
348 rd->id.grbm.se = v1_data.grbm.se;
349 rd->id.grbm.sh = v1_data.grbm.sh;
350 rd->id.grbm.instance = v1_data.grbm.instance;
351 rd->id.srbm.me = v1_data.srbm.me;
352 rd->id.srbm.pipe = v1_data.srbm.pipe;
353 rd->id.srbm.queue = v1_data.srbm.queue;
354 rd->id.xcc_id = 0;
355done:
356 mutex_unlock(&rd->lock);
357 return r;
358}
359
360static ssize_t amdgpu_debugfs_regs2_read(struct file *f, char __user *buf, size_t size, loff_t *pos)
361{
362 return amdgpu_debugfs_regs2_op(f, buf, *pos, size, 0);
363}
364
365static ssize_t amdgpu_debugfs_regs2_write(struct file *f, const char __user *buf, size_t size, loff_t *pos)
366{
367 return amdgpu_debugfs_regs2_op(f, (char __user *)buf, *pos, size, 1);
368}
369
370static int amdgpu_debugfs_gprwave_open(struct inode *inode, struct file *file)
371{
372 struct amdgpu_debugfs_gprwave_data *rd;
373
374 rd = kzalloc(sizeof(*rd), GFP_KERNEL);
375 if (!rd)
376 return -ENOMEM;
377 rd->adev = file_inode(file)->i_private;
378 file->private_data = rd;
379 mutex_init(&rd->lock);
380
381 return 0;
382}
383
384static int amdgpu_debugfs_gprwave_release(struct inode *inode, struct file *file)
385{
386 struct amdgpu_debugfs_gprwave_data *rd = file->private_data;
387
388 mutex_destroy(&rd->lock);
389 kfree(file->private_data);
390 return 0;
391}
392
393static ssize_t amdgpu_debugfs_gprwave_read(struct file *f, char __user *buf, size_t size, loff_t *pos)
394{
395 struct amdgpu_debugfs_gprwave_data *rd = f->private_data;
396 struct amdgpu_device *adev = rd->adev;
397 ssize_t result = 0;
398 int r;
399 uint32_t *data, x;
400
401 if (size > 4096 || size & 0x3 || *pos & 0x3)
402 return -EINVAL;
403
404 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
405 if (r < 0) {
406 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
407 return r;
408 }
409
410 r = amdgpu_virt_enable_access_debugfs(adev);
411 if (r < 0) {
412 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
413 return r;
414 }
415
416 data = kcalloc(1024, sizeof(*data), GFP_KERNEL);
417 if (!data) {
418 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
419 amdgpu_virt_disable_access_debugfs(adev);
420 return -ENOMEM;
421 }
422
423 /* switch to the specific se/sh/cu */
424 mutex_lock(&adev->grbm_idx_mutex);
425 amdgpu_gfx_select_se_sh(adev, rd->id.se, rd->id.sh, rd->id.cu, rd->id.xcc_id);
426
427 if (!rd->id.gpr_or_wave) {
428 x = 0;
429 if (adev->gfx.funcs->read_wave_data)
430 adev->gfx.funcs->read_wave_data(adev, rd->id.xcc_id, rd->id.simd, rd->id.wave, data, &x);
431 } else {
432 x = size >> 2;
433 if (rd->id.gpr.vpgr_or_sgpr) {
434 if (adev->gfx.funcs->read_wave_vgprs)
435 adev->gfx.funcs->read_wave_vgprs(adev, rd->id.xcc_id, rd->id.simd, rd->id.wave, rd->id.gpr.thread, *pos, size>>2, data);
436 } else {
437 if (adev->gfx.funcs->read_wave_sgprs)
438 adev->gfx.funcs->read_wave_sgprs(adev, rd->id.xcc_id, rd->id.simd, rd->id.wave, *pos, size>>2, data);
439 }
440 }
441
442 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, rd->id.xcc_id);
443 mutex_unlock(&adev->grbm_idx_mutex);
444
445 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
446
447 if (!x) {
448 result = -EINVAL;
449 goto done;
450 }
451
452 while (size && (*pos < x * 4)) {
453 uint32_t value;
454
455 value = data[*pos >> 2];
456 r = put_user(value, (uint32_t *)buf);
457 if (r) {
458 result = r;
459 goto done;
460 }
461
462 result += 4;
463 buf += 4;
464 *pos += 4;
465 size -= 4;
466 }
467
468done:
469 amdgpu_virt_disable_access_debugfs(adev);
470 kfree(data);
471 return result;
472}
473
474static long amdgpu_debugfs_gprwave_ioctl(struct file *f, unsigned int cmd, unsigned long data)
475{
476 struct amdgpu_debugfs_gprwave_data *rd = f->private_data;
477 int r = 0;
478
479 mutex_lock(&rd->lock);
480
481 switch (cmd) {
482 case AMDGPU_DEBUGFS_GPRWAVE_IOC_SET_STATE:
483 if (copy_from_user(&rd->id,
484 (struct amdgpu_debugfs_gprwave_iocdata *)data,
485 sizeof(rd->id)))
486 r = -EFAULT;
487 goto done;
488 default:
489 r = -EINVAL;
490 goto done;
491 }
492
493done:
494 mutex_unlock(&rd->lock);
495 return r;
496}
497
498
499
500
501/**
502 * amdgpu_debugfs_regs_pcie_read - Read from a PCIE register
503 *
504 * @f: open file handle
505 * @buf: User buffer to store read data in
506 * @size: Number of bytes to read
507 * @pos: Offset to seek to
508 *
509 * The lower bits are the BYTE offset of the register to read. This
510 * allows reading multiple registers in a single call and having
511 * the returned size reflect that.
512 */
513static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
514 size_t size, loff_t *pos)
515{
516 struct amdgpu_device *adev = file_inode(f)->i_private;
517 ssize_t result = 0;
518 int r;
519
520 if (size & 0x3 || *pos & 0x3)
521 return -EINVAL;
522
523 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
524 if (r < 0) {
525 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
526 return r;
527 }
528
529 r = amdgpu_virt_enable_access_debugfs(adev);
530 if (r < 0) {
531 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
532 return r;
533 }
534
535 while (size) {
536 uint32_t value;
537
538 if (upper_32_bits(*pos))
539 value = RREG32_PCIE_EXT(*pos);
540 else
541 value = RREG32_PCIE(*pos);
542
543 r = put_user(value, (uint32_t *)buf);
544 if (r)
545 goto out;
546
547 result += 4;
548 buf += 4;
549 *pos += 4;
550 size -= 4;
551 }
552
553 r = result;
554out:
555 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
556 amdgpu_virt_disable_access_debugfs(adev);
557 return r;
558}
559
560/**
561 * amdgpu_debugfs_regs_pcie_write - Write to a PCIE register
562 *
563 * @f: open file handle
564 * @buf: User buffer to write data from
565 * @size: Number of bytes to write
566 * @pos: Offset to seek to
567 *
568 * The lower bits are the BYTE offset of the register to write. This
569 * allows writing multiple registers in a single call and having
570 * the returned size reflect that.
571 */
572static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf,
573 size_t size, loff_t *pos)
574{
575 struct amdgpu_device *adev = file_inode(f)->i_private;
576 ssize_t result = 0;
577 int r;
578
579 if (size & 0x3 || *pos & 0x3)
580 return -EINVAL;
581
582 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
583 if (r < 0) {
584 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
585 return r;
586 }
587
588 r = amdgpu_virt_enable_access_debugfs(adev);
589 if (r < 0) {
590 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
591 return r;
592 }
593
594 while (size) {
595 uint32_t value;
596
597 r = get_user(value, (uint32_t *)buf);
598 if (r)
599 goto out;
600
601 if (upper_32_bits(*pos))
602 WREG32_PCIE_EXT(*pos, value);
603 else
604 WREG32_PCIE(*pos, value);
605
606 result += 4;
607 buf += 4;
608 *pos += 4;
609 size -= 4;
610 }
611
612 r = result;
613out:
614 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
615 amdgpu_virt_disable_access_debugfs(adev);
616 return r;
617}
618
619/**
620 * amdgpu_debugfs_regs_didt_read - Read from a DIDT register
621 *
622 * @f: open file handle
623 * @buf: User buffer to store read data in
624 * @size: Number of bytes to read
625 * @pos: Offset to seek to
626 *
627 * The lower bits are the BYTE offset of the register to read. This
628 * allows reading multiple registers in a single call and having
629 * the returned size reflect that.
630 */
631static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
632 size_t size, loff_t *pos)
633{
634 struct amdgpu_device *adev = file_inode(f)->i_private;
635 ssize_t result = 0;
636 int r;
637
638 if (size & 0x3 || *pos & 0x3)
639 return -EINVAL;
640
641 if (!adev->didt_rreg)
642 return -EOPNOTSUPP;
643
644 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
645 if (r < 0) {
646 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
647 return r;
648 }
649
650 r = amdgpu_virt_enable_access_debugfs(adev);
651 if (r < 0) {
652 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
653 return r;
654 }
655
656 while (size) {
657 uint32_t value;
658
659 value = RREG32_DIDT(*pos >> 2);
660 r = put_user(value, (uint32_t *)buf);
661 if (r)
662 goto out;
663
664 result += 4;
665 buf += 4;
666 *pos += 4;
667 size -= 4;
668 }
669
670 r = result;
671out:
672 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
673 amdgpu_virt_disable_access_debugfs(adev);
674 return r;
675}
676
677/**
678 * amdgpu_debugfs_regs_didt_write - Write to a DIDT register
679 *
680 * @f: open file handle
681 * @buf: User buffer to write data from
682 * @size: Number of bytes to write
683 * @pos: Offset to seek to
684 *
685 * The lower bits are the BYTE offset of the register to write. This
686 * allows writing multiple registers in a single call and having
687 * the returned size reflect that.
688 */
689static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf,
690 size_t size, loff_t *pos)
691{
692 struct amdgpu_device *adev = file_inode(f)->i_private;
693 ssize_t result = 0;
694 int r;
695
696 if (size & 0x3 || *pos & 0x3)
697 return -EINVAL;
698
699 if (!adev->didt_wreg)
700 return -EOPNOTSUPP;
701
702 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
703 if (r < 0) {
704 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
705 return r;
706 }
707
708 r = amdgpu_virt_enable_access_debugfs(adev);
709 if (r < 0) {
710 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
711 return r;
712 }
713
714 while (size) {
715 uint32_t value;
716
717 r = get_user(value, (uint32_t *)buf);
718 if (r)
719 goto out;
720
721 WREG32_DIDT(*pos >> 2, value);
722
723 result += 4;
724 buf += 4;
725 *pos += 4;
726 size -= 4;
727 }
728
729 r = result;
730out:
731 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
732 amdgpu_virt_disable_access_debugfs(adev);
733 return r;
734}
735
736/**
737 * amdgpu_debugfs_regs_smc_read - Read from a SMC register
738 *
739 * @f: open file handle
740 * @buf: User buffer to store read data in
741 * @size: Number of bytes to read
742 * @pos: Offset to seek to
743 *
744 * The lower bits are the BYTE offset of the register to read. This
745 * allows reading multiple registers in a single call and having
746 * the returned size reflect that.
747 */
748static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
749 size_t size, loff_t *pos)
750{
751 struct amdgpu_device *adev = file_inode(f)->i_private;
752 ssize_t result = 0;
753 int r;
754
755 if (!adev->smc_rreg)
756 return -EOPNOTSUPP;
757
758 if (size & 0x3 || *pos & 0x3)
759 return -EINVAL;
760
761 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
762 if (r < 0) {
763 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
764 return r;
765 }
766
767 r = amdgpu_virt_enable_access_debugfs(adev);
768 if (r < 0) {
769 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
770 return r;
771 }
772
773 while (size) {
774 uint32_t value;
775
776 value = RREG32_SMC(*pos);
777 r = put_user(value, (uint32_t *)buf);
778 if (r)
779 goto out;
780
781 result += 4;
782 buf += 4;
783 *pos += 4;
784 size -= 4;
785 }
786
787 r = result;
788out:
789 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
790 amdgpu_virt_disable_access_debugfs(adev);
791 return r;
792}
793
794/**
795 * amdgpu_debugfs_regs_smc_write - Write to a SMC register
796 *
797 * @f: open file handle
798 * @buf: User buffer to write data from
799 * @size: Number of bytes to write
800 * @pos: Offset to seek to
801 *
802 * The lower bits are the BYTE offset of the register to write. This
803 * allows writing multiple registers in a single call and having
804 * the returned size reflect that.
805 */
806static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf,
807 size_t size, loff_t *pos)
808{
809 struct amdgpu_device *adev = file_inode(f)->i_private;
810 ssize_t result = 0;
811 int r;
812
813 if (!adev->smc_wreg)
814 return -EOPNOTSUPP;
815
816 if (size & 0x3 || *pos & 0x3)
817 return -EINVAL;
818
819 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
820 if (r < 0) {
821 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
822 return r;
823 }
824
825 r = amdgpu_virt_enable_access_debugfs(adev);
826 if (r < 0) {
827 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
828 return r;
829 }
830
831 while (size) {
832 uint32_t value;
833
834 r = get_user(value, (uint32_t *)buf);
835 if (r)
836 goto out;
837
838 WREG32_SMC(*pos, value);
839
840 result += 4;
841 buf += 4;
842 *pos += 4;
843 size -= 4;
844 }
845
846 r = result;
847out:
848 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
849 amdgpu_virt_disable_access_debugfs(adev);
850 return r;
851}
852
853/**
854 * amdgpu_debugfs_gca_config_read - Read from gfx config data
855 *
856 * @f: open file handle
857 * @buf: User buffer to store read data in
858 * @size: Number of bytes to read
859 * @pos: Offset to seek to
860 *
861 * This file is used to access configuration data in a somewhat
862 * stable fashion. The format is a series of DWORDs with the first
863 * indicating which revision it is. New content is appended to the
864 * end so that older software can still read the data.
865 */
866
867static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf,
868 size_t size, loff_t *pos)
869{
870 struct amdgpu_device *adev = file_inode(f)->i_private;
871 ssize_t result = 0;
872 int r;
873 uint32_t *config, no_regs = 0;
874
875 if (size & 0x3 || *pos & 0x3)
876 return -EINVAL;
877
878 config = kmalloc_array(256, sizeof(*config), GFP_KERNEL);
879 if (!config)
880 return -ENOMEM;
881
882 /* version, increment each time something is added */
883 config[no_regs++] = 5;
884 config[no_regs++] = adev->gfx.config.max_shader_engines;
885 config[no_regs++] = adev->gfx.config.max_tile_pipes;
886 config[no_regs++] = adev->gfx.config.max_cu_per_sh;
887 config[no_regs++] = adev->gfx.config.max_sh_per_se;
888 config[no_regs++] = adev->gfx.config.max_backends_per_se;
889 config[no_regs++] = adev->gfx.config.max_texture_channel_caches;
890 config[no_regs++] = adev->gfx.config.max_gprs;
891 config[no_regs++] = adev->gfx.config.max_gs_threads;
892 config[no_regs++] = adev->gfx.config.max_hw_contexts;
893 config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_frontend;
894 config[no_regs++] = adev->gfx.config.sc_prim_fifo_size_backend;
895 config[no_regs++] = adev->gfx.config.sc_hiz_tile_fifo_size;
896 config[no_regs++] = adev->gfx.config.sc_earlyz_tile_fifo_size;
897 config[no_regs++] = adev->gfx.config.num_tile_pipes;
898 config[no_regs++] = adev->gfx.config.backend_enable_mask;
899 config[no_regs++] = adev->gfx.config.mem_max_burst_length_bytes;
900 config[no_regs++] = adev->gfx.config.mem_row_size_in_kb;
901 config[no_regs++] = adev->gfx.config.shader_engine_tile_size;
902 config[no_regs++] = adev->gfx.config.num_gpus;
903 config[no_regs++] = adev->gfx.config.multi_gpu_tile_size;
904 config[no_regs++] = adev->gfx.config.mc_arb_ramcfg;
905 config[no_regs++] = adev->gfx.config.gb_addr_config;
906 config[no_regs++] = adev->gfx.config.num_rbs;
907
908 /* rev==1 */
909 config[no_regs++] = adev->rev_id;
910 config[no_regs++] = adev->pg_flags;
911 config[no_regs++] = lower_32_bits(adev->cg_flags);
912
913 /* rev==2 */
914 config[no_regs++] = adev->family;
915 config[no_regs++] = adev->external_rev_id;
916
917 /* rev==3 */
918 config[no_regs++] = adev->pdev->device;
919 config[no_regs++] = adev->pdev->revision;
920 config[no_regs++] = adev->pdev->subsystem_device;
921 config[no_regs++] = adev->pdev->subsystem_vendor;
922
923 /* rev==4 APU flag */
924 config[no_regs++] = adev->flags & AMD_IS_APU ? 1 : 0;
925
926 /* rev==5 PG/CG flag upper 32bit */
927 config[no_regs++] = 0;
928 config[no_regs++] = upper_32_bits(adev->cg_flags);
929
930 while (size && (*pos < no_regs * 4)) {
931 uint32_t value;
932
933 value = config[*pos >> 2];
934 r = put_user(value, (uint32_t *)buf);
935 if (r) {
936 kfree(config);
937 return r;
938 }
939
940 result += 4;
941 buf += 4;
942 *pos += 4;
943 size -= 4;
944 }
945
946 kfree(config);
947 return result;
948}
949
950/**
951 * amdgpu_debugfs_sensor_read - Read from the powerplay sensors
952 *
953 * @f: open file handle
954 * @buf: User buffer to store read data in
955 * @size: Number of bytes to read
956 * @pos: Offset to seek to
957 *
958 * The offset is treated as the BYTE address of one of the sensors
959 * enumerated in amd/include/kgd_pp_interface.h under the
960 * 'amd_pp_sensors' enumeration. For instance to read the UVD VCLK
961 * you would use the offset 3 * 4 = 12.
962 */
963static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,
964 size_t size, loff_t *pos)
965{
966 struct amdgpu_device *adev = file_inode(f)->i_private;
967 int idx, x, outsize, r, valuesize;
968 uint32_t values[16];
969
970 if (size & 3 || *pos & 0x3)
971 return -EINVAL;
972
973 if (!adev->pm.dpm_enabled)
974 return -EINVAL;
975
976 /* convert offset to sensor number */
977 idx = *pos >> 2;
978
979 valuesize = sizeof(values);
980
981 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
982 if (r < 0) {
983 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
984 return r;
985 }
986
987 r = amdgpu_virt_enable_access_debugfs(adev);
988 if (r < 0) {
989 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
990 return r;
991 }
992
993 r = amdgpu_dpm_read_sensor(adev, idx, &values[0], &valuesize);
994
995 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
996
997 if (r) {
998 amdgpu_virt_disable_access_debugfs(adev);
999 return r;
1000 }
1001
1002 if (size > valuesize) {
1003 amdgpu_virt_disable_access_debugfs(adev);
1004 return -EINVAL;
1005 }
1006
1007 outsize = 0;
1008 x = 0;
1009 if (!r) {
1010 while (size) {
1011 r = put_user(values[x++], (int32_t *)buf);
1012 buf += 4;
1013 size -= 4;
1014 outsize += 4;
1015 }
1016 }
1017
1018 amdgpu_virt_disable_access_debugfs(adev);
1019 return !r ? outsize : r;
1020}
1021
1022/** amdgpu_debugfs_wave_read - Read WAVE STATUS data
1023 *
1024 * @f: open file handle
1025 * @buf: User buffer to store read data in
1026 * @size: Number of bytes to read
1027 * @pos: Offset to seek to
1028 *
1029 * The offset being sought changes which wave that the status data
1030 * will be returned for. The bits are used as follows:
1031 *
1032 * Bits 0..6: Byte offset into data
1033 * Bits 7..14: SE selector
1034 * Bits 15..22: SH/SA selector
1035 * Bits 23..30: CU/{WGP+SIMD} selector
1036 * Bits 31..36: WAVE ID selector
1037 * Bits 37..44: SIMD ID selector
1038 *
1039 * The returned data begins with one DWORD of version information
1040 * Followed by WAVE STATUS registers relevant to the GFX IP version
1041 * being used. See gfx_v8_0_read_wave_data() for an example output.
1042 */
1043static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,
1044 size_t size, loff_t *pos)
1045{
1046 struct amdgpu_device *adev = f->f_inode->i_private;
1047 int r, x;
1048 ssize_t result = 0;
1049 uint32_t offset, se, sh, cu, wave, simd, data[32];
1050
1051 if (size & 3 || *pos & 3)
1052 return -EINVAL;
1053
1054 /* decode offset */
1055 offset = (*pos & GENMASK_ULL(6, 0));
1056 se = (*pos & GENMASK_ULL(14, 7)) >> 7;
1057 sh = (*pos & GENMASK_ULL(22, 15)) >> 15;
1058 cu = (*pos & GENMASK_ULL(30, 23)) >> 23;
1059 wave = (*pos & GENMASK_ULL(36, 31)) >> 31;
1060 simd = (*pos & GENMASK_ULL(44, 37)) >> 37;
1061
1062 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
1063 if (r < 0) {
1064 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1065 return r;
1066 }
1067
1068 r = amdgpu_virt_enable_access_debugfs(adev);
1069 if (r < 0) {
1070 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1071 return r;
1072 }
1073
1074 /* switch to the specific se/sh/cu */
1075 mutex_lock(&adev->grbm_idx_mutex);
1076 amdgpu_gfx_select_se_sh(adev, se, sh, cu, 0);
1077
1078 x = 0;
1079 if (adev->gfx.funcs->read_wave_data)
1080 adev->gfx.funcs->read_wave_data(adev, 0, simd, wave, data, &x);
1081
1082 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0);
1083 mutex_unlock(&adev->grbm_idx_mutex);
1084
1085 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1086
1087 if (!x) {
1088 amdgpu_virt_disable_access_debugfs(adev);
1089 return -EINVAL;
1090 }
1091
1092 while (size && (offset < x * 4)) {
1093 uint32_t value;
1094
1095 value = data[offset >> 2];
1096 r = put_user(value, (uint32_t *)buf);
1097 if (r) {
1098 amdgpu_virt_disable_access_debugfs(adev);
1099 return r;
1100 }
1101
1102 result += 4;
1103 buf += 4;
1104 offset += 4;
1105 size -= 4;
1106 }
1107
1108 amdgpu_virt_disable_access_debugfs(adev);
1109 return result;
1110}
1111
1112/** amdgpu_debugfs_gpr_read - Read wave gprs
1113 *
1114 * @f: open file handle
1115 * @buf: User buffer to store read data in
1116 * @size: Number of bytes to read
1117 * @pos: Offset to seek to
1118 *
1119 * The offset being sought changes which wave that the status data
1120 * will be returned for. The bits are used as follows:
1121 *
1122 * Bits 0..11: Byte offset into data
1123 * Bits 12..19: SE selector
1124 * Bits 20..27: SH/SA selector
1125 * Bits 28..35: CU/{WGP+SIMD} selector
1126 * Bits 36..43: WAVE ID selector
1127 * Bits 37..44: SIMD ID selector
1128 * Bits 52..59: Thread selector
1129 * Bits 60..61: Bank selector (VGPR=0,SGPR=1)
1130 *
1131 * The return data comes from the SGPR or VGPR register bank for
1132 * the selected operational unit.
1133 */
1134static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,
1135 size_t size, loff_t *pos)
1136{
1137 struct amdgpu_device *adev = f->f_inode->i_private;
1138 int r;
1139 ssize_t result = 0;
1140 uint32_t offset, se, sh, cu, wave, simd, thread, bank, *data;
1141
1142 if (size > 4096 || size & 3 || *pos & 3)
1143 return -EINVAL;
1144
1145 /* decode offset */
1146 offset = (*pos & GENMASK_ULL(11, 0)) >> 2;
1147 se = (*pos & GENMASK_ULL(19, 12)) >> 12;
1148 sh = (*pos & GENMASK_ULL(27, 20)) >> 20;
1149 cu = (*pos & GENMASK_ULL(35, 28)) >> 28;
1150 wave = (*pos & GENMASK_ULL(43, 36)) >> 36;
1151 simd = (*pos & GENMASK_ULL(51, 44)) >> 44;
1152 thread = (*pos & GENMASK_ULL(59, 52)) >> 52;
1153 bank = (*pos & GENMASK_ULL(61, 60)) >> 60;
1154
1155 data = kcalloc(1024, sizeof(*data), GFP_KERNEL);
1156 if (!data)
1157 return -ENOMEM;
1158
1159 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
1160 if (r < 0)
1161 goto err;
1162
1163 r = amdgpu_virt_enable_access_debugfs(adev);
1164 if (r < 0)
1165 goto err;
1166
1167 /* switch to the specific se/sh/cu */
1168 mutex_lock(&adev->grbm_idx_mutex);
1169 amdgpu_gfx_select_se_sh(adev, se, sh, cu, 0);
1170
1171 if (bank == 0) {
1172 if (adev->gfx.funcs->read_wave_vgprs)
1173 adev->gfx.funcs->read_wave_vgprs(adev, 0, simd, wave, thread, offset, size>>2, data);
1174 } else {
1175 if (adev->gfx.funcs->read_wave_sgprs)
1176 adev->gfx.funcs->read_wave_sgprs(adev, 0, simd, wave, offset, size>>2, data);
1177 }
1178
1179 amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0);
1180 mutex_unlock(&adev->grbm_idx_mutex);
1181
1182 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1183
1184 while (size) {
1185 uint32_t value;
1186
1187 value = data[result >> 2];
1188 r = put_user(value, (uint32_t *)buf);
1189 if (r) {
1190 amdgpu_virt_disable_access_debugfs(adev);
1191 goto err;
1192 }
1193
1194 result += 4;
1195 buf += 4;
1196 size -= 4;
1197 }
1198
1199 kfree(data);
1200 amdgpu_virt_disable_access_debugfs(adev);
1201 return result;
1202
1203err:
1204 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1205 kfree(data);
1206 return r;
1207}
1208
1209/**
1210 * amdgpu_debugfs_gfxoff_residency_read - Read GFXOFF residency
1211 *
1212 * @f: open file handle
1213 * @buf: User buffer to store read data in
1214 * @size: Number of bytes to read
1215 * @pos: Offset to seek to
1216 *
1217 * Read the last residency value logged. It doesn't auto update, one needs to
1218 * stop logging before getting the current value.
1219 */
1220static ssize_t amdgpu_debugfs_gfxoff_residency_read(struct file *f, char __user *buf,
1221 size_t size, loff_t *pos)
1222{
1223 struct amdgpu_device *adev = file_inode(f)->i_private;
1224 ssize_t result = 0;
1225 int r;
1226
1227 if (size & 0x3 || *pos & 0x3)
1228 return -EINVAL;
1229
1230 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
1231 if (r < 0) {
1232 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1233 return r;
1234 }
1235
1236 while (size) {
1237 uint32_t value;
1238
1239 r = amdgpu_get_gfx_off_residency(adev, &value);
1240 if (r)
1241 goto out;
1242
1243 r = put_user(value, (uint32_t *)buf);
1244 if (r)
1245 goto out;
1246
1247 result += 4;
1248 buf += 4;
1249 *pos += 4;
1250 size -= 4;
1251 }
1252
1253 r = result;
1254out:
1255 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1256
1257 return r;
1258}
1259
1260/**
1261 * amdgpu_debugfs_gfxoff_residency_write - Log GFXOFF Residency
1262 *
1263 * @f: open file handle
1264 * @buf: User buffer to write data from
1265 * @size: Number of bytes to write
1266 * @pos: Offset to seek to
1267 *
1268 * Write a 32-bit non-zero to start logging; write a 32-bit zero to stop
1269 */
1270static ssize_t amdgpu_debugfs_gfxoff_residency_write(struct file *f, const char __user *buf,
1271 size_t size, loff_t *pos)
1272{
1273 struct amdgpu_device *adev = file_inode(f)->i_private;
1274 ssize_t result = 0;
1275 int r;
1276
1277 if (size & 0x3 || *pos & 0x3)
1278 return -EINVAL;
1279
1280 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
1281 if (r < 0) {
1282 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1283 return r;
1284 }
1285
1286 while (size) {
1287 u32 value;
1288
1289 r = get_user(value, (uint32_t *)buf);
1290 if (r)
1291 goto out;
1292
1293 amdgpu_set_gfx_off_residency(adev, value ? true : false);
1294
1295 result += 4;
1296 buf += 4;
1297 *pos += 4;
1298 size -= 4;
1299 }
1300
1301 r = result;
1302out:
1303 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1304
1305 return r;
1306}
1307
1308
1309/**
1310 * amdgpu_debugfs_gfxoff_count_read - Read GFXOFF entry count
1311 *
1312 * @f: open file handle
1313 * @buf: User buffer to store read data in
1314 * @size: Number of bytes to read
1315 * @pos: Offset to seek to
1316 */
1317static ssize_t amdgpu_debugfs_gfxoff_count_read(struct file *f, char __user *buf,
1318 size_t size, loff_t *pos)
1319{
1320 struct amdgpu_device *adev = file_inode(f)->i_private;
1321 ssize_t result = 0;
1322 int r;
1323
1324 if (size & 0x3 || *pos & 0x3)
1325 return -EINVAL;
1326
1327 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
1328 if (r < 0) {
1329 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1330 return r;
1331 }
1332
1333 while (size) {
1334 u64 value = 0;
1335
1336 r = amdgpu_get_gfx_off_entrycount(adev, &value);
1337 if (r)
1338 goto out;
1339
1340 r = put_user(value, (u64 *)buf);
1341 if (r)
1342 goto out;
1343
1344 result += 4;
1345 buf += 4;
1346 *pos += 4;
1347 size -= 4;
1348 }
1349
1350 r = result;
1351out:
1352 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1353
1354 return r;
1355}
1356
1357/**
1358 * amdgpu_debugfs_gfxoff_write - Enable/disable GFXOFF
1359 *
1360 * @f: open file handle
1361 * @buf: User buffer to write data from
1362 * @size: Number of bytes to write
1363 * @pos: Offset to seek to
1364 *
1365 * Write a 32-bit zero to disable or a 32-bit non-zero to enable
1366 */
1367static ssize_t amdgpu_debugfs_gfxoff_write(struct file *f, const char __user *buf,
1368 size_t size, loff_t *pos)
1369{
1370 struct amdgpu_device *adev = file_inode(f)->i_private;
1371 ssize_t result = 0;
1372 int r;
1373
1374 if (size & 0x3 || *pos & 0x3)
1375 return -EINVAL;
1376
1377 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
1378 if (r < 0) {
1379 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1380 return r;
1381 }
1382
1383 while (size) {
1384 uint32_t value;
1385
1386 r = get_user(value, (uint32_t *)buf);
1387 if (r)
1388 goto out;
1389
1390 amdgpu_gfx_off_ctrl(adev, value ? true : false);
1391
1392 result += 4;
1393 buf += 4;
1394 *pos += 4;
1395 size -= 4;
1396 }
1397
1398 r = result;
1399out:
1400 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1401
1402 return r;
1403}
1404
1405
1406/**
1407 * amdgpu_debugfs_gfxoff_read - read gfxoff status
1408 *
1409 * @f: open file handle
1410 * @buf: User buffer to store read data in
1411 * @size: Number of bytes to read
1412 * @pos: Offset to seek to
1413 */
1414static ssize_t amdgpu_debugfs_gfxoff_read(struct file *f, char __user *buf,
1415 size_t size, loff_t *pos)
1416{
1417 struct amdgpu_device *adev = file_inode(f)->i_private;
1418 ssize_t result = 0;
1419 int r;
1420
1421 if (size & 0x3 || *pos & 0x3)
1422 return -EINVAL;
1423
1424 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
1425 if (r < 0) {
1426 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1427 return r;
1428 }
1429
1430 while (size) {
1431 u32 value = adev->gfx.gfx_off_state;
1432
1433 r = put_user(value, (u32 *)buf);
1434 if (r)
1435 goto out;
1436
1437 result += 4;
1438 buf += 4;
1439 *pos += 4;
1440 size -= 4;
1441 }
1442
1443 r = result;
1444out:
1445 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1446
1447 return r;
1448}
1449
1450static ssize_t amdgpu_debugfs_gfxoff_status_read(struct file *f, char __user *buf,
1451 size_t size, loff_t *pos)
1452{
1453 struct amdgpu_device *adev = file_inode(f)->i_private;
1454 ssize_t result = 0;
1455 int r;
1456
1457 if (size & 0x3 || *pos & 0x3)
1458 return -EINVAL;
1459
1460 r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
1461 if (r < 0) {
1462 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1463 return r;
1464 }
1465
1466 while (size) {
1467 u32 value;
1468
1469 r = amdgpu_get_gfx_off_status(adev, &value);
1470 if (r)
1471 goto out;
1472
1473 r = put_user(value, (u32 *)buf);
1474 if (r)
1475 goto out;
1476
1477 result += 4;
1478 buf += 4;
1479 *pos += 4;
1480 size -= 4;
1481 }
1482
1483 r = result;
1484out:
1485 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1486
1487 return r;
1488}
1489
1490static const struct file_operations amdgpu_debugfs_regs2_fops = {
1491 .owner = THIS_MODULE,
1492 .unlocked_ioctl = amdgpu_debugfs_regs2_ioctl,
1493 .read = amdgpu_debugfs_regs2_read,
1494 .write = amdgpu_debugfs_regs2_write,
1495 .open = amdgpu_debugfs_regs2_open,
1496 .release = amdgpu_debugfs_regs2_release,
1497 .llseek = default_llseek
1498};
1499
1500static const struct file_operations amdgpu_debugfs_gprwave_fops = {
1501 .owner = THIS_MODULE,
1502 .unlocked_ioctl = amdgpu_debugfs_gprwave_ioctl,
1503 .read = amdgpu_debugfs_gprwave_read,
1504 .open = amdgpu_debugfs_gprwave_open,
1505 .release = amdgpu_debugfs_gprwave_release,
1506 .llseek = default_llseek
1507};
1508
1509static const struct file_operations amdgpu_debugfs_regs_fops = {
1510 .owner = THIS_MODULE,
1511 .read = amdgpu_debugfs_regs_read,
1512 .write = amdgpu_debugfs_regs_write,
1513 .llseek = default_llseek
1514};
1515static const struct file_operations amdgpu_debugfs_regs_didt_fops = {
1516 .owner = THIS_MODULE,
1517 .read = amdgpu_debugfs_regs_didt_read,
1518 .write = amdgpu_debugfs_regs_didt_write,
1519 .llseek = default_llseek
1520};
1521static const struct file_operations amdgpu_debugfs_regs_pcie_fops = {
1522 .owner = THIS_MODULE,
1523 .read = amdgpu_debugfs_regs_pcie_read,
1524 .write = amdgpu_debugfs_regs_pcie_write,
1525 .llseek = default_llseek
1526};
1527static const struct file_operations amdgpu_debugfs_regs_smc_fops = {
1528 .owner = THIS_MODULE,
1529 .read = amdgpu_debugfs_regs_smc_read,
1530 .write = amdgpu_debugfs_regs_smc_write,
1531 .llseek = default_llseek
1532};
1533
1534static const struct file_operations amdgpu_debugfs_gca_config_fops = {
1535 .owner = THIS_MODULE,
1536 .read = amdgpu_debugfs_gca_config_read,
1537 .llseek = default_llseek
1538};
1539
1540static const struct file_operations amdgpu_debugfs_sensors_fops = {
1541 .owner = THIS_MODULE,
1542 .read = amdgpu_debugfs_sensor_read,
1543 .llseek = default_llseek
1544};
1545
1546static const struct file_operations amdgpu_debugfs_wave_fops = {
1547 .owner = THIS_MODULE,
1548 .read = amdgpu_debugfs_wave_read,
1549 .llseek = default_llseek
1550};
1551static const struct file_operations amdgpu_debugfs_gpr_fops = {
1552 .owner = THIS_MODULE,
1553 .read = amdgpu_debugfs_gpr_read,
1554 .llseek = default_llseek
1555};
1556
1557static const struct file_operations amdgpu_debugfs_gfxoff_fops = {
1558 .owner = THIS_MODULE,
1559 .read = amdgpu_debugfs_gfxoff_read,
1560 .write = amdgpu_debugfs_gfxoff_write,
1561 .llseek = default_llseek
1562};
1563
1564static const struct file_operations amdgpu_debugfs_gfxoff_status_fops = {
1565 .owner = THIS_MODULE,
1566 .read = amdgpu_debugfs_gfxoff_status_read,
1567 .llseek = default_llseek
1568};
1569
1570static const struct file_operations amdgpu_debugfs_gfxoff_count_fops = {
1571 .owner = THIS_MODULE,
1572 .read = amdgpu_debugfs_gfxoff_count_read,
1573 .llseek = default_llseek
1574};
1575
1576static const struct file_operations amdgpu_debugfs_gfxoff_residency_fops = {
1577 .owner = THIS_MODULE,
1578 .read = amdgpu_debugfs_gfxoff_residency_read,
1579 .write = amdgpu_debugfs_gfxoff_residency_write,
1580 .llseek = default_llseek
1581};
1582
1583static const struct file_operations *debugfs_regs[] = {
1584 &amdgpu_debugfs_regs_fops,
1585 &amdgpu_debugfs_regs2_fops,
1586 &amdgpu_debugfs_gprwave_fops,
1587 &amdgpu_debugfs_regs_didt_fops,
1588 &amdgpu_debugfs_regs_pcie_fops,
1589 &amdgpu_debugfs_regs_smc_fops,
1590 &amdgpu_debugfs_gca_config_fops,
1591 &amdgpu_debugfs_sensors_fops,
1592 &amdgpu_debugfs_wave_fops,
1593 &amdgpu_debugfs_gpr_fops,
1594 &amdgpu_debugfs_gfxoff_fops,
1595 &amdgpu_debugfs_gfxoff_status_fops,
1596 &amdgpu_debugfs_gfxoff_count_fops,
1597 &amdgpu_debugfs_gfxoff_residency_fops,
1598};
1599
1600static const char * const debugfs_regs_names[] = {
1601 "amdgpu_regs",
1602 "amdgpu_regs2",
1603 "amdgpu_gprwave",
1604 "amdgpu_regs_didt",
1605 "amdgpu_regs_pcie",
1606 "amdgpu_regs_smc",
1607 "amdgpu_gca_config",
1608 "amdgpu_sensors",
1609 "amdgpu_wave",
1610 "amdgpu_gpr",
1611 "amdgpu_gfxoff",
1612 "amdgpu_gfxoff_status",
1613 "amdgpu_gfxoff_count",
1614 "amdgpu_gfxoff_residency",
1615};
1616
1617/**
1618 * amdgpu_debugfs_regs_init - Initialize debugfs entries that provide
1619 * register access.
1620 *
1621 * @adev: The device to attach the debugfs entries to
1622 */
1623int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
1624{
1625 struct drm_minor *minor = adev_to_drm(adev)->primary;
1626 struct dentry *ent, *root = minor->debugfs_root;
1627 unsigned int i;
1628
1629 for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
1630 ent = debugfs_create_file(debugfs_regs_names[i],
1631 S_IFREG | 0400, root,
1632 adev, debugfs_regs[i]);
1633 if (!i && !IS_ERR_OR_NULL(ent))
1634 i_size_write(ent->d_inode, adev->rmmio_size);
1635 }
1636
1637 return 0;
1638}
1639
1640static int amdgpu_debugfs_test_ib_show(struct seq_file *m, void *unused)
1641{
1642 struct amdgpu_device *adev = m->private;
1643 struct drm_device *dev = adev_to_drm(adev);
1644 int r = 0, i;
1645
1646 r = pm_runtime_get_sync(dev->dev);
1647 if (r < 0) {
1648 pm_runtime_put_autosuspend(dev->dev);
1649 return r;
1650 }
1651
1652 /* Avoid accidently unparking the sched thread during GPU reset */
1653 r = down_write_killable(&adev->reset_domain->sem);
1654 if (r)
1655 return r;
1656
1657 /* hold on the scheduler */
1658 for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
1659 struct amdgpu_ring *ring = adev->rings[i];
1660
1661 if (!amdgpu_ring_sched_ready(ring))
1662 continue;
1663 drm_sched_wqueue_stop(&ring->sched);
1664 }
1665
1666 seq_puts(m, "run ib test:\n");
1667 r = amdgpu_ib_ring_tests(adev);
1668 if (r)
1669 seq_printf(m, "ib ring tests failed (%d).\n", r);
1670 else
1671 seq_puts(m, "ib ring tests passed.\n");
1672
1673 /* go on the scheduler */
1674 for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
1675 struct amdgpu_ring *ring = adev->rings[i];
1676
1677 if (!amdgpu_ring_sched_ready(ring))
1678 continue;
1679 drm_sched_wqueue_start(&ring->sched);
1680 }
1681
1682 up_write(&adev->reset_domain->sem);
1683
1684 pm_runtime_put_autosuspend(dev->dev);
1685
1686 return 0;
1687}
1688
1689static int amdgpu_debugfs_evict_vram(void *data, u64 *val)
1690{
1691 struct amdgpu_device *adev = (struct amdgpu_device *)data;
1692 struct drm_device *dev = adev_to_drm(adev);
1693 int r;
1694
1695 r = pm_runtime_get_sync(dev->dev);
1696 if (r < 0) {
1697 pm_runtime_put_autosuspend(dev->dev);
1698 return r;
1699 }
1700
1701 *val = amdgpu_ttm_evict_resources(adev, TTM_PL_VRAM);
1702
1703 pm_runtime_put_autosuspend(dev->dev);
1704
1705 return 0;
1706}
1707
1708
1709static int amdgpu_debugfs_evict_gtt(void *data, u64 *val)
1710{
1711 struct amdgpu_device *adev = (struct amdgpu_device *)data;
1712 struct drm_device *dev = adev_to_drm(adev);
1713 int r;
1714
1715 r = pm_runtime_get_sync(dev->dev);
1716 if (r < 0) {
1717 pm_runtime_put_autosuspend(dev->dev);
1718 return r;
1719 }
1720
1721 *val = amdgpu_ttm_evict_resources(adev, TTM_PL_TT);
1722
1723 pm_runtime_put_autosuspend(dev->dev);
1724
1725 return 0;
1726}
1727
1728static int amdgpu_debugfs_benchmark(void *data, u64 val)
1729{
1730 struct amdgpu_device *adev = (struct amdgpu_device *)data;
1731 struct drm_device *dev = adev_to_drm(adev);
1732 int r;
1733
1734 r = pm_runtime_get_sync(dev->dev);
1735 if (r < 0) {
1736 pm_runtime_put_autosuspend(dev->dev);
1737 return r;
1738 }
1739
1740 r = amdgpu_benchmark(adev, val);
1741
1742 pm_runtime_put_autosuspend(dev->dev);
1743
1744 return r;
1745}
1746
1747static int amdgpu_debugfs_vm_info_show(struct seq_file *m, void *unused)
1748{
1749 struct amdgpu_device *adev = m->private;
1750 struct drm_device *dev = adev_to_drm(adev);
1751 struct drm_file *file;
1752 int r;
1753
1754 r = mutex_lock_interruptible(&dev->filelist_mutex);
1755 if (r)
1756 return r;
1757
1758 list_for_each_entry(file, &dev->filelist, lhead) {
1759 struct amdgpu_fpriv *fpriv = file->driver_priv;
1760 struct amdgpu_vm *vm = &fpriv->vm;
1761 struct amdgpu_task_info *ti;
1762
1763 ti = amdgpu_vm_get_task_info_vm(vm);
1764 if (ti) {
1765 seq_printf(m, "pid:%d\tProcess:%s ----------\n", ti->task.pid, ti->process_name);
1766 amdgpu_vm_put_task_info(ti);
1767 }
1768
1769 r = amdgpu_bo_reserve(vm->root.bo, true);
1770 if (r)
1771 break;
1772 amdgpu_debugfs_vm_bo_info(vm, m);
1773 amdgpu_bo_unreserve(vm->root.bo);
1774 }
1775
1776 mutex_unlock(&dev->filelist_mutex);
1777
1778 return r;
1779}
1780
1781DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_test_ib);
1782DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_vm_info);
1783DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_evict_vram_fops, amdgpu_debugfs_evict_vram,
1784 NULL, "%lld\n");
1785DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_evict_gtt_fops, amdgpu_debugfs_evict_gtt,
1786 NULL, "%lld\n");
1787DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_benchmark_fops, NULL, amdgpu_debugfs_benchmark,
1788 "%lld\n");
1789
1790static void amdgpu_ib_preempt_fences_swap(struct amdgpu_ring *ring,
1791 struct dma_fence **fences)
1792{
1793 struct amdgpu_fence_driver *drv = &ring->fence_drv;
1794 uint32_t sync_seq, last_seq;
1795
1796 last_seq = atomic_read(&ring->fence_drv.last_seq);
1797 sync_seq = ring->fence_drv.sync_seq;
1798
1799 last_seq &= drv->num_fences_mask;
1800 sync_seq &= drv->num_fences_mask;
1801
1802 do {
1803 struct dma_fence *fence, **ptr;
1804
1805 ++last_seq;
1806 last_seq &= drv->num_fences_mask;
1807 ptr = &drv->fences[last_seq];
1808
1809 fence = rcu_dereference_protected(*ptr, 1);
1810 RCU_INIT_POINTER(*ptr, NULL);
1811
1812 if (!fence)
1813 continue;
1814
1815 fences[last_seq] = fence;
1816
1817 } while (last_seq != sync_seq);
1818}
1819
1820static void amdgpu_ib_preempt_signal_fences(struct dma_fence **fences,
1821 int length)
1822{
1823 int i;
1824 struct dma_fence *fence;
1825
1826 for (i = 0; i < length; i++) {
1827 fence = fences[i];
1828 if (!fence)
1829 continue;
1830 dma_fence_signal(fence);
1831 dma_fence_put(fence);
1832 }
1833}
1834
1835static void amdgpu_ib_preempt_job_recovery(struct drm_gpu_scheduler *sched)
1836{
1837 struct drm_sched_job *s_job;
1838 struct dma_fence *fence;
1839
1840 spin_lock(&sched->job_list_lock);
1841 list_for_each_entry(s_job, &sched->pending_list, list) {
1842 fence = sched->ops->run_job(s_job);
1843 dma_fence_put(fence);
1844 }
1845 spin_unlock(&sched->job_list_lock);
1846}
1847
1848static void amdgpu_ib_preempt_mark_partial_job(struct amdgpu_ring *ring)
1849{
1850 struct amdgpu_job *job;
1851 struct drm_sched_job *s_job, *tmp;
1852 uint32_t preempt_seq;
1853 struct dma_fence *fence, **ptr;
1854 struct amdgpu_fence_driver *drv = &ring->fence_drv;
1855 struct drm_gpu_scheduler *sched = &ring->sched;
1856 bool preempted = true;
1857
1858 if (ring->funcs->type != AMDGPU_RING_TYPE_GFX)
1859 return;
1860
1861 preempt_seq = le32_to_cpu(*(drv->cpu_addr + 2));
1862 if (preempt_seq <= atomic_read(&drv->last_seq)) {
1863 preempted = false;
1864 goto no_preempt;
1865 }
1866
1867 preempt_seq &= drv->num_fences_mask;
1868 ptr = &drv->fences[preempt_seq];
1869 fence = rcu_dereference_protected(*ptr, 1);
1870
1871no_preempt:
1872 spin_lock(&sched->job_list_lock);
1873 list_for_each_entry_safe(s_job, tmp, &sched->pending_list, list) {
1874 if (dma_fence_is_signaled(&s_job->s_fence->finished)) {
1875 /* remove job from ring_mirror_list */
1876 list_del_init(&s_job->list);
1877 sched->ops->free_job(s_job);
1878 continue;
1879 }
1880 job = to_amdgpu_job(s_job);
1881 if (preempted && (&job->hw_fence->base) == fence)
1882 /* mark the job as preempted */
1883 job->preemption_status |= AMDGPU_IB_PREEMPTED;
1884 }
1885 spin_unlock(&sched->job_list_lock);
1886}
1887
1888static int amdgpu_debugfs_ib_preempt(void *data, u64 val)
1889{
1890 int r, length;
1891 struct amdgpu_ring *ring;
1892 struct dma_fence **fences = NULL;
1893 struct amdgpu_device *adev = (struct amdgpu_device *)data;
1894
1895 if (val >= AMDGPU_MAX_RINGS)
1896 return -EINVAL;
1897
1898 ring = adev->rings[val];
1899
1900 if (!amdgpu_ring_sched_ready(ring) ||
1901 !ring->funcs->preempt_ib)
1902 return -EINVAL;
1903
1904 /* the last preemption failed */
1905 if (ring->trail_seq != le32_to_cpu(*ring->trail_fence_cpu_addr))
1906 return -EBUSY;
1907
1908 length = ring->fence_drv.num_fences_mask + 1;
1909 fences = kcalloc(length, sizeof(void *), GFP_KERNEL);
1910 if (!fences)
1911 return -ENOMEM;
1912
1913 /* Avoid accidently unparking the sched thread during GPU reset */
1914 r = down_read_killable(&adev->reset_domain->sem);
1915 if (r)
1916 goto pro_end;
1917
1918 /* stop the scheduler */
1919 drm_sched_wqueue_stop(&ring->sched);
1920
1921 /* preempt the IB */
1922 r = amdgpu_ring_preempt_ib(ring);
1923 if (r) {
1924 DRM_WARN("failed to preempt ring %d\n", ring->idx);
1925 goto failure;
1926 }
1927
1928 amdgpu_fence_process(ring);
1929
1930 if (atomic_read(&ring->fence_drv.last_seq) !=
1931 ring->fence_drv.sync_seq) {
1932 DRM_INFO("ring %d was preempted\n", ring->idx);
1933
1934 amdgpu_ib_preempt_mark_partial_job(ring);
1935
1936 /* swap out the old fences */
1937 amdgpu_ib_preempt_fences_swap(ring, fences);
1938
1939 amdgpu_fence_driver_force_completion(ring);
1940
1941 /* resubmit unfinished jobs */
1942 amdgpu_ib_preempt_job_recovery(&ring->sched);
1943
1944 /* wait for jobs finished */
1945 amdgpu_fence_wait_empty(ring);
1946
1947 /* signal the old fences */
1948 amdgpu_ib_preempt_signal_fences(fences, length);
1949 }
1950
1951failure:
1952 /* restart the scheduler */
1953 drm_sched_wqueue_start(&ring->sched);
1954
1955 up_read(&adev->reset_domain->sem);
1956
1957pro_end:
1958 kfree(fences);
1959
1960 return r;
1961}
1962
1963static int amdgpu_debugfs_sclk_set(void *data, u64 val)
1964{
1965 int ret = 0;
1966 uint32_t max_freq, min_freq;
1967 struct amdgpu_device *adev = (struct amdgpu_device *)data;
1968
1969 if (amdgpu_sriov_multi_vf_mode(adev))
1970 return -EINVAL;
1971
1972 ret = pm_runtime_get_sync(adev_to_drm(adev)->dev);
1973 if (ret < 0) {
1974 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1975 return ret;
1976 }
1977
1978 ret = amdgpu_dpm_get_dpm_freq_range(adev, PP_SCLK, &min_freq, &max_freq);
1979 if (ret == -EOPNOTSUPP) {
1980 ret = 0;
1981 goto out;
1982 }
1983 if (ret || val > max_freq || val < min_freq) {
1984 ret = -EINVAL;
1985 goto out;
1986 }
1987
1988 ret = amdgpu_dpm_set_soft_freq_range(adev, PP_SCLK, (uint32_t)val, (uint32_t)val);
1989 if (ret)
1990 ret = -EINVAL;
1991
1992out:
1993 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
1994
1995 return ret;
1996}
1997
1998DEFINE_DEBUGFS_ATTRIBUTE(fops_ib_preempt, NULL,
1999 amdgpu_debugfs_ib_preempt, "%llu\n");
2000
2001DEFINE_DEBUGFS_ATTRIBUTE(fops_sclk_set, NULL,
2002 amdgpu_debugfs_sclk_set, "%llu\n");
2003
2004int amdgpu_debugfs_init(struct amdgpu_device *adev)
2005{
2006 struct dentry *root = adev_to_drm(adev)->primary->debugfs_root;
2007 struct dentry *ent;
2008 int r, i;
2009
2010 if (!debugfs_initialized())
2011 return 0;
2012
2013 debugfs_create_x32("amdgpu_smu_debug", 0600, root,
2014 &adev->pm.smu_debug_mask);
2015
2016 ent = debugfs_create_file("amdgpu_preempt_ib", 0600, root, adev,
2017 &fops_ib_preempt);
2018 if (IS_ERR(ent)) {
2019 DRM_ERROR("unable to create amdgpu_preempt_ib debugsfs file\n");
2020 return PTR_ERR(ent);
2021 }
2022
2023 ent = debugfs_create_file("amdgpu_force_sclk", 0200, root, adev,
2024 &fops_sclk_set);
2025 if (IS_ERR(ent)) {
2026 DRM_ERROR("unable to create amdgpu_set_sclk debugsfs file\n");
2027 return PTR_ERR(ent);
2028 }
2029
2030 /* Register debugfs entries for amdgpu_ttm */
2031 amdgpu_ttm_debugfs_init(adev);
2032 amdgpu_debugfs_pm_init(adev);
2033 amdgpu_debugfs_sa_init(adev);
2034 amdgpu_debugfs_fence_init(adev);
2035 amdgpu_debugfs_gem_init(adev);
2036
2037 r = amdgpu_debugfs_regs_init(adev);
2038 if (r)
2039 DRM_ERROR("registering register debugfs failed (%d).\n", r);
2040
2041 amdgpu_debugfs_firmware_init(adev);
2042 amdgpu_ta_if_debugfs_init(adev);
2043
2044 amdgpu_debugfs_mes_event_log_init(adev);
2045
2046#if defined(CONFIG_DRM_AMD_DC)
2047 if (adev->dc_enabled)
2048 dtn_debugfs_init(adev);
2049#endif
2050
2051 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
2052 struct amdgpu_ring *ring = adev->rings[i];
2053
2054 if (!ring)
2055 continue;
2056
2057 amdgpu_debugfs_ring_init(adev, ring);
2058 }
2059
2060 for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
2061 if (!amdgpu_vcnfw_log)
2062 break;
2063
2064 if (adev->vcn.harvest_config & (1 << i))
2065 continue;
2066
2067 amdgpu_debugfs_vcn_fwlog_init(adev, i, &adev->vcn.inst[i]);
2068 }
2069
2070 if (amdgpu_umsch_mm & amdgpu_umsch_mm_fwlog)
2071 amdgpu_debugfs_umsch_fwlog_init(adev, &adev->umsch_mm);
2072
2073 amdgpu_debugfs_vcn_sched_mask_init(adev);
2074 amdgpu_debugfs_jpeg_sched_mask_init(adev);
2075 amdgpu_debugfs_gfx_sched_mask_init(adev);
2076 amdgpu_debugfs_compute_sched_mask_init(adev);
2077 amdgpu_debugfs_sdma_sched_mask_init(adev);
2078
2079 amdgpu_ras_debugfs_create_all(adev);
2080 amdgpu_rap_debugfs_init(adev);
2081 amdgpu_securedisplay_debugfs_init(adev);
2082 amdgpu_fw_attestation_debugfs_init(adev);
2083 amdgpu_psp_debugfs_init(adev);
2084
2085 debugfs_create_file("amdgpu_evict_vram", 0400, root, adev,
2086 &amdgpu_evict_vram_fops);
2087 debugfs_create_file("amdgpu_evict_gtt", 0400, root, adev,
2088 &amdgpu_evict_gtt_fops);
2089 debugfs_create_file("amdgpu_test_ib", 0400, root, adev,
2090 &amdgpu_debugfs_test_ib_fops);
2091 debugfs_create_file("amdgpu_vm_info", 0444, root, adev,
2092 &amdgpu_debugfs_vm_info_fops);
2093 debugfs_create_file("amdgpu_benchmark", 0200, root, adev,
2094 &amdgpu_benchmark_fops);
2095
2096 adev->debugfs_vbios_blob.data = adev->bios;
2097 adev->debugfs_vbios_blob.size = adev->bios_size;
2098 debugfs_create_blob("amdgpu_vbios", 0444, root,
2099 &adev->debugfs_vbios_blob);
2100
2101 if (adev->discovery.debugfs_blob.size)
2102 debugfs_create_blob("amdgpu_discovery", 0444, root,
2103 &adev->discovery.debugfs_blob);
2104
2105 return 0;
2106}
2107
2108static int amdgpu_pt_info_read(struct seq_file *m, void *unused)
2109{
2110 struct drm_file *file;
2111 struct amdgpu_fpriv *fpriv;
2112 struct amdgpu_bo *root_bo;
2113 struct amdgpu_device *adev;
2114 int r;
2115
2116 file = m->private;
2117 if (!file)
2118 return -EINVAL;
2119
2120 adev = drm_to_adev(file->minor->dev);
2121 fpriv = file->driver_priv;
2122 if (!fpriv || !fpriv->vm.root.bo)
2123 return -ENODEV;
2124
2125 root_bo = amdgpu_bo_ref(fpriv->vm.root.bo);
2126 r = amdgpu_bo_reserve(root_bo, true);
2127 if (r) {
2128 amdgpu_bo_unref(&root_bo);
2129 return -EINVAL;
2130 }
2131
2132 seq_printf(m, "pd_address: 0x%llx\n", amdgpu_gmc_pd_addr(fpriv->vm.root.bo));
2133 seq_printf(m, "max_pfn: 0x%llx\n", adev->vm_manager.max_pfn);
2134 seq_printf(m, "num_level: 0x%x\n", adev->vm_manager.num_level);
2135 seq_printf(m, "block_size: 0x%x\n", adev->vm_manager.block_size);
2136 seq_printf(m, "fragment_size: 0x%x\n", adev->vm_manager.fragment_size);
2137
2138 amdgpu_bo_unreserve(root_bo);
2139 amdgpu_bo_unref(&root_bo);
2140
2141 return 0;
2142}
2143
2144static int amdgpu_pt_info_open(struct inode *inode, struct file *file)
2145{
2146 return single_open(file, amdgpu_pt_info_read, inode->i_private);
2147}
2148
2149static const struct file_operations amdgpu_pt_info_fops = {
2150 .owner = THIS_MODULE,
2151 .open = amdgpu_pt_info_open,
2152 .read = seq_read,
2153 .llseek = seq_lseek,
2154 .release = single_release,
2155};
2156
2157void amdgpu_debugfs_vm_init(struct drm_file *file)
2158{
2159 debugfs_create_file("vm_pagetable_info", 0444, file->debugfs_client, file,
2160 &amdgpu_pt_info_fops);
2161}
2162
2163#else
2164int amdgpu_debugfs_init(struct amdgpu_device *adev)
2165{
2166 return 0;
2167}
2168int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
2169{
2170 return 0;
2171}
2172void amdgpu_debugfs_vm_init(struct drm_file *file)
2173{
2174}
2175#endif