2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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.
26 #include <linux/kthread.h>
28 #include <linux/debugfs.h>
34 int amdgpu_debugfs_add_files(struct amdgpu_device
*adev
,
35 const struct drm_info_list
*files
,
40 for (i
= 0; i
< adev
->debugfs_count
; i
++) {
41 if (adev
->debugfs
[i
].files
== files
) {
42 /* Already registered */
47 i
= adev
->debugfs_count
+ 1;
48 if (i
> AMDGPU_DEBUGFS_MAX_COMPONENTS
) {
49 DRM_ERROR("Reached maximum number of debugfs components.\n");
50 DRM_ERROR("Report so we increase "
51 "AMDGPU_DEBUGFS_MAX_COMPONENTS.\n");
54 adev
->debugfs
[adev
->debugfs_count
].files
= files
;
55 adev
->debugfs
[adev
->debugfs_count
].num_files
= nfiles
;
56 adev
->debugfs_count
= i
;
57 #if defined(CONFIG_DEBUG_FS)
58 drm_debugfs_create_files(files
, nfiles
,
59 adev
->ddev
->primary
->debugfs_root
,
65 #if defined(CONFIG_DEBUG_FS)
67 static ssize_t
amdgpu_debugfs_regs_read(struct file
*f
, char __user
*buf
,
68 size_t size
, loff_t
*pos
)
70 struct amdgpu_device
*adev
= file_inode(f
)->i_private
;
73 bool pm_pg_lock
, use_bank
;
74 unsigned instance_bank
, sh_bank
, se_bank
;
76 if (size
& 0x3 || *pos
& 0x3)
79 /* are we reading registers for which a PG lock is necessary? */
80 pm_pg_lock
= (*pos
>> 23) & 1;
82 if (*pos
& (1ULL << 62)) {
83 se_bank
= (*pos
& GENMASK_ULL(33, 24)) >> 24;
84 sh_bank
= (*pos
& GENMASK_ULL(43, 34)) >> 34;
85 instance_bank
= (*pos
& GENMASK_ULL(53, 44)) >> 44;
91 if (instance_bank
== 0x3FF)
92 instance_bank
= 0xFFFFFFFF;
98 *pos
&= (1UL << 22) - 1;
101 if ((sh_bank
!= 0xFFFFFFFF && sh_bank
>= adev
->gfx
.config
.max_sh_per_se
) ||
102 (se_bank
!= 0xFFFFFFFF && se_bank
>= adev
->gfx
.config
.max_shader_engines
))
104 mutex_lock(&adev
->grbm_idx_mutex
);
105 amdgpu_gfx_select_se_sh(adev
, se_bank
,
106 sh_bank
, instance_bank
);
110 mutex_lock(&adev
->pm
.mutex
);
115 if (*pos
> adev
->rmmio_size
)
118 value
= RREG32(*pos
>> 2);
119 r
= put_user(value
, (uint32_t *)buf
);
133 amdgpu_gfx_select_se_sh(adev
, 0xffffffff, 0xffffffff, 0xffffffff);
134 mutex_unlock(&adev
->grbm_idx_mutex
);
138 mutex_unlock(&adev
->pm
.mutex
);
143 static ssize_t
amdgpu_debugfs_regs_write(struct file
*f
, const char __user
*buf
,
144 size_t size
, loff_t
*pos
)
146 struct amdgpu_device
*adev
= file_inode(f
)->i_private
;
149 bool pm_pg_lock
, use_bank
;
150 unsigned instance_bank
, sh_bank
, se_bank
;
152 if (size
& 0x3 || *pos
& 0x3)
155 /* are we reading registers for which a PG lock is necessary? */
156 pm_pg_lock
= (*pos
>> 23) & 1;
158 if (*pos
& (1ULL << 62)) {
159 se_bank
= (*pos
& GENMASK_ULL(33, 24)) >> 24;
160 sh_bank
= (*pos
& GENMASK_ULL(43, 34)) >> 34;
161 instance_bank
= (*pos
& GENMASK_ULL(53, 44)) >> 44;
163 if (se_bank
== 0x3FF)
164 se_bank
= 0xFFFFFFFF;
165 if (sh_bank
== 0x3FF)
166 sh_bank
= 0xFFFFFFFF;
167 if (instance_bank
== 0x3FF)
168 instance_bank
= 0xFFFFFFFF;
174 *pos
&= (1UL << 22) - 1;
177 if ((sh_bank
!= 0xFFFFFFFF && sh_bank
>= adev
->gfx
.config
.max_sh_per_se
) ||
178 (se_bank
!= 0xFFFFFFFF && se_bank
>= adev
->gfx
.config
.max_shader_engines
))
180 mutex_lock(&adev
->grbm_idx_mutex
);
181 amdgpu_gfx_select_se_sh(adev
, se_bank
,
182 sh_bank
, instance_bank
);
186 mutex_lock(&adev
->pm
.mutex
);
191 if (*pos
> adev
->rmmio_size
)
194 r
= get_user(value
, (uint32_t *)buf
);
198 WREG32(*pos
>> 2, value
);
207 amdgpu_gfx_select_se_sh(adev
, 0xffffffff, 0xffffffff, 0xffffffff);
208 mutex_unlock(&adev
->grbm_idx_mutex
);
212 mutex_unlock(&adev
->pm
.mutex
);
217 static ssize_t
amdgpu_debugfs_regs_pcie_read(struct file
*f
, char __user
*buf
,
218 size_t size
, loff_t
*pos
)
220 struct amdgpu_device
*adev
= file_inode(f
)->i_private
;
224 if (size
& 0x3 || *pos
& 0x3)
230 value
= RREG32_PCIE(*pos
>> 2);
231 r
= put_user(value
, (uint32_t *)buf
);
244 static ssize_t
amdgpu_debugfs_regs_pcie_write(struct file
*f
, const char __user
*buf
,
245 size_t size
, loff_t
*pos
)
247 struct amdgpu_device
*adev
= file_inode(f
)->i_private
;
251 if (size
& 0x3 || *pos
& 0x3)
257 r
= get_user(value
, (uint32_t *)buf
);
261 WREG32_PCIE(*pos
>> 2, value
);
272 static ssize_t
amdgpu_debugfs_regs_didt_read(struct file
*f
, char __user
*buf
,
273 size_t size
, loff_t
*pos
)
275 struct amdgpu_device
*adev
= file_inode(f
)->i_private
;
279 if (size
& 0x3 || *pos
& 0x3)
285 value
= RREG32_DIDT(*pos
>> 2);
286 r
= put_user(value
, (uint32_t *)buf
);
299 static ssize_t
amdgpu_debugfs_regs_didt_write(struct file
*f
, const char __user
*buf
,
300 size_t size
, loff_t
*pos
)
302 struct amdgpu_device
*adev
= file_inode(f
)->i_private
;
306 if (size
& 0x3 || *pos
& 0x3)
312 r
= get_user(value
, (uint32_t *)buf
);
316 WREG32_DIDT(*pos
>> 2, value
);
327 static ssize_t
amdgpu_debugfs_regs_smc_read(struct file
*f
, char __user
*buf
,
328 size_t size
, loff_t
*pos
)
330 struct amdgpu_device
*adev
= file_inode(f
)->i_private
;
334 if (size
& 0x3 || *pos
& 0x3)
340 value
= RREG32_SMC(*pos
);
341 r
= put_user(value
, (uint32_t *)buf
);
354 static ssize_t
amdgpu_debugfs_regs_smc_write(struct file
*f
, const char __user
*buf
,
355 size_t size
, loff_t
*pos
)
357 struct amdgpu_device
*adev
= file_inode(f
)->i_private
;
361 if (size
& 0x3 || *pos
& 0x3)
367 r
= get_user(value
, (uint32_t *)buf
);
371 WREG32_SMC(*pos
, value
);
382 static ssize_t
amdgpu_debugfs_gca_config_read(struct file
*f
, char __user
*buf
,
383 size_t size
, loff_t
*pos
)
385 struct amdgpu_device
*adev
= file_inode(f
)->i_private
;
388 uint32_t *config
, no_regs
= 0;
390 if (size
& 0x3 || *pos
& 0x3)
393 config
= kmalloc_array(256, sizeof(*config
), GFP_KERNEL
);
397 /* version, increment each time something is added */
398 config
[no_regs
++] = 3;
399 config
[no_regs
++] = adev
->gfx
.config
.max_shader_engines
;
400 config
[no_regs
++] = adev
->gfx
.config
.max_tile_pipes
;
401 config
[no_regs
++] = adev
->gfx
.config
.max_cu_per_sh
;
402 config
[no_regs
++] = adev
->gfx
.config
.max_sh_per_se
;
403 config
[no_regs
++] = adev
->gfx
.config
.max_backends_per_se
;
404 config
[no_regs
++] = adev
->gfx
.config
.max_texture_channel_caches
;
405 config
[no_regs
++] = adev
->gfx
.config
.max_gprs
;
406 config
[no_regs
++] = adev
->gfx
.config
.max_gs_threads
;
407 config
[no_regs
++] = adev
->gfx
.config
.max_hw_contexts
;
408 config
[no_regs
++] = adev
->gfx
.config
.sc_prim_fifo_size_frontend
;
409 config
[no_regs
++] = adev
->gfx
.config
.sc_prim_fifo_size_backend
;
410 config
[no_regs
++] = adev
->gfx
.config
.sc_hiz_tile_fifo_size
;
411 config
[no_regs
++] = adev
->gfx
.config
.sc_earlyz_tile_fifo_size
;
412 config
[no_regs
++] = adev
->gfx
.config
.num_tile_pipes
;
413 config
[no_regs
++] = adev
->gfx
.config
.backend_enable_mask
;
414 config
[no_regs
++] = adev
->gfx
.config
.mem_max_burst_length_bytes
;
415 config
[no_regs
++] = adev
->gfx
.config
.mem_row_size_in_kb
;
416 config
[no_regs
++] = adev
->gfx
.config
.shader_engine_tile_size
;
417 config
[no_regs
++] = adev
->gfx
.config
.num_gpus
;
418 config
[no_regs
++] = adev
->gfx
.config
.multi_gpu_tile_size
;
419 config
[no_regs
++] = adev
->gfx
.config
.mc_arb_ramcfg
;
420 config
[no_regs
++] = adev
->gfx
.config
.gb_addr_config
;
421 config
[no_regs
++] = adev
->gfx
.config
.num_rbs
;
424 config
[no_regs
++] = adev
->rev_id
;
425 config
[no_regs
++] = adev
->pg_flags
;
426 config
[no_regs
++] = adev
->cg_flags
;
429 config
[no_regs
++] = adev
->family
;
430 config
[no_regs
++] = adev
->external_rev_id
;
433 config
[no_regs
++] = adev
->pdev
->device
;
434 config
[no_regs
++] = adev
->pdev
->revision
;
435 config
[no_regs
++] = adev
->pdev
->subsystem_device
;
436 config
[no_regs
++] = adev
->pdev
->subsystem_vendor
;
438 while (size
&& (*pos
< no_regs
* 4)) {
441 value
= config
[*pos
>> 2];
442 r
= put_user(value
, (uint32_t *)buf
);
458 static ssize_t
amdgpu_debugfs_sensor_read(struct file
*f
, char __user
*buf
,
459 size_t size
, loff_t
*pos
)
461 struct amdgpu_device
*adev
= file_inode(f
)->i_private
;
462 int idx
, x
, outsize
, r
, valuesize
;
465 if (size
& 3 || *pos
& 0x3)
471 /* convert offset to sensor number */
474 valuesize
= sizeof(values
);
475 if (adev
->powerplay
.pp_funcs
&& adev
->powerplay
.pp_funcs
->read_sensor
)
476 r
= amdgpu_dpm_read_sensor(adev
, idx
, &values
[0], &valuesize
);
480 if (size
> valuesize
)
487 r
= put_user(values
[x
++], (int32_t *)buf
);
494 return !r
? outsize
: r
;
497 static ssize_t
amdgpu_debugfs_wave_read(struct file
*f
, char __user
*buf
,
498 size_t size
, loff_t
*pos
)
500 struct amdgpu_device
*adev
= f
->f_inode
->i_private
;
503 uint32_t offset
, se
, sh
, cu
, wave
, simd
, data
[32];
505 if (size
& 3 || *pos
& 3)
509 offset
= (*pos
& GENMASK_ULL(6, 0));
510 se
= (*pos
& GENMASK_ULL(14, 7)) >> 7;
511 sh
= (*pos
& GENMASK_ULL(22, 15)) >> 15;
512 cu
= (*pos
& GENMASK_ULL(30, 23)) >> 23;
513 wave
= (*pos
& GENMASK_ULL(36, 31)) >> 31;
514 simd
= (*pos
& GENMASK_ULL(44, 37)) >> 37;
516 /* switch to the specific se/sh/cu */
517 mutex_lock(&adev
->grbm_idx_mutex
);
518 amdgpu_gfx_select_se_sh(adev
, se
, sh
, cu
);
521 if (adev
->gfx
.funcs
->read_wave_data
)
522 adev
->gfx
.funcs
->read_wave_data(adev
, simd
, wave
, data
, &x
);
524 amdgpu_gfx_select_se_sh(adev
, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
525 mutex_unlock(&adev
->grbm_idx_mutex
);
530 while (size
&& (offset
< x
* 4)) {
533 value
= data
[offset
>> 2];
534 r
= put_user(value
, (uint32_t *)buf
);
547 static ssize_t
amdgpu_debugfs_gpr_read(struct file
*f
, char __user
*buf
,
548 size_t size
, loff_t
*pos
)
550 struct amdgpu_device
*adev
= f
->f_inode
->i_private
;
553 uint32_t offset
, se
, sh
, cu
, wave
, simd
, thread
, bank
, *data
;
555 if (size
& 3 || *pos
& 3)
559 offset
= *pos
& GENMASK_ULL(11, 0);
560 se
= (*pos
& GENMASK_ULL(19, 12)) >> 12;
561 sh
= (*pos
& GENMASK_ULL(27, 20)) >> 20;
562 cu
= (*pos
& GENMASK_ULL(35, 28)) >> 28;
563 wave
= (*pos
& GENMASK_ULL(43, 36)) >> 36;
564 simd
= (*pos
& GENMASK_ULL(51, 44)) >> 44;
565 thread
= (*pos
& GENMASK_ULL(59, 52)) >> 52;
566 bank
= (*pos
& GENMASK_ULL(61, 60)) >> 60;
568 data
= kmalloc_array(1024, sizeof(*data
), GFP_KERNEL
);
572 /* switch to the specific se/sh/cu */
573 mutex_lock(&adev
->grbm_idx_mutex
);
574 amdgpu_gfx_select_se_sh(adev
, se
, sh
, cu
);
577 if (adev
->gfx
.funcs
->read_wave_vgprs
)
578 adev
->gfx
.funcs
->read_wave_vgprs(adev
, simd
, wave
, thread
, offset
, size
>>2, data
);
580 if (adev
->gfx
.funcs
->read_wave_sgprs
)
581 adev
->gfx
.funcs
->read_wave_sgprs(adev
, simd
, wave
, offset
, size
>>2, data
);
584 amdgpu_gfx_select_se_sh(adev
, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
585 mutex_unlock(&adev
->grbm_idx_mutex
);
590 value
= data
[offset
++];
591 r
= put_user(value
, (uint32_t *)buf
);
607 static const struct file_operations amdgpu_debugfs_regs_fops
= {
608 .owner
= THIS_MODULE
,
609 .read
= amdgpu_debugfs_regs_read
,
610 .write
= amdgpu_debugfs_regs_write
,
611 .llseek
= default_llseek
613 static const struct file_operations amdgpu_debugfs_regs_didt_fops
= {
614 .owner
= THIS_MODULE
,
615 .read
= amdgpu_debugfs_regs_didt_read
,
616 .write
= amdgpu_debugfs_regs_didt_write
,
617 .llseek
= default_llseek
619 static const struct file_operations amdgpu_debugfs_regs_pcie_fops
= {
620 .owner
= THIS_MODULE
,
621 .read
= amdgpu_debugfs_regs_pcie_read
,
622 .write
= amdgpu_debugfs_regs_pcie_write
,
623 .llseek
= default_llseek
625 static const struct file_operations amdgpu_debugfs_regs_smc_fops
= {
626 .owner
= THIS_MODULE
,
627 .read
= amdgpu_debugfs_regs_smc_read
,
628 .write
= amdgpu_debugfs_regs_smc_write
,
629 .llseek
= default_llseek
632 static const struct file_operations amdgpu_debugfs_gca_config_fops
= {
633 .owner
= THIS_MODULE
,
634 .read
= amdgpu_debugfs_gca_config_read
,
635 .llseek
= default_llseek
638 static const struct file_operations amdgpu_debugfs_sensors_fops
= {
639 .owner
= THIS_MODULE
,
640 .read
= amdgpu_debugfs_sensor_read
,
641 .llseek
= default_llseek
644 static const struct file_operations amdgpu_debugfs_wave_fops
= {
645 .owner
= THIS_MODULE
,
646 .read
= amdgpu_debugfs_wave_read
,
647 .llseek
= default_llseek
649 static const struct file_operations amdgpu_debugfs_gpr_fops
= {
650 .owner
= THIS_MODULE
,
651 .read
= amdgpu_debugfs_gpr_read
,
652 .llseek
= default_llseek
655 static const struct file_operations
*debugfs_regs
[] = {
656 &amdgpu_debugfs_regs_fops
,
657 &amdgpu_debugfs_regs_didt_fops
,
658 &amdgpu_debugfs_regs_pcie_fops
,
659 &amdgpu_debugfs_regs_smc_fops
,
660 &amdgpu_debugfs_gca_config_fops
,
661 &amdgpu_debugfs_sensors_fops
,
662 &amdgpu_debugfs_wave_fops
,
663 &amdgpu_debugfs_gpr_fops
,
666 static const char *debugfs_regs_names
[] = {
677 int amdgpu_debugfs_regs_init(struct amdgpu_device
*adev
)
679 struct drm_minor
*minor
= adev
->ddev
->primary
;
680 struct dentry
*ent
, *root
= minor
->debugfs_root
;
683 for (i
= 0; i
< ARRAY_SIZE(debugfs_regs
); i
++) {
684 ent
= debugfs_create_file(debugfs_regs_names
[i
],
685 S_IFREG
| S_IRUGO
, root
,
686 adev
, debugfs_regs
[i
]);
688 for (j
= 0; j
< i
; j
++) {
689 debugfs_remove(adev
->debugfs_regs
[i
]);
690 adev
->debugfs_regs
[i
] = NULL
;
696 i_size_write(ent
->d_inode
, adev
->rmmio_size
);
697 adev
->debugfs_regs
[i
] = ent
;
703 void amdgpu_debugfs_regs_cleanup(struct amdgpu_device
*adev
)
707 for (i
= 0; i
< ARRAY_SIZE(debugfs_regs
); i
++) {
708 if (adev
->debugfs_regs
[i
]) {
709 debugfs_remove(adev
->debugfs_regs
[i
]);
710 adev
->debugfs_regs
[i
] = NULL
;
715 static int amdgpu_debugfs_test_ib(struct seq_file
*m
, void *data
)
717 struct drm_info_node
*node
= (struct drm_info_node
*) m
->private;
718 struct drm_device
*dev
= node
->minor
->dev
;
719 struct amdgpu_device
*adev
= dev
->dev_private
;
722 /* hold on the scheduler */
723 for (i
= 0; i
< AMDGPU_MAX_RINGS
; i
++) {
724 struct amdgpu_ring
*ring
= adev
->rings
[i
];
726 if (!ring
|| !ring
->sched
.thread
)
728 kthread_park(ring
->sched
.thread
);
731 seq_printf(m
, "run ib test:\n");
732 r
= amdgpu_ib_ring_tests(adev
);
734 seq_printf(m
, "ib ring tests failed (%d).\n", r
);
736 seq_printf(m
, "ib ring tests passed.\n");
738 /* go on the scheduler */
739 for (i
= 0; i
< AMDGPU_MAX_RINGS
; i
++) {
740 struct amdgpu_ring
*ring
= adev
->rings
[i
];
742 if (!ring
|| !ring
->sched
.thread
)
744 kthread_unpark(ring
->sched
.thread
);
750 static int amdgpu_debugfs_get_vbios_dump(struct seq_file
*m
, void *data
)
752 struct drm_info_node
*node
= (struct drm_info_node
*) m
->private;
753 struct drm_device
*dev
= node
->minor
->dev
;
754 struct amdgpu_device
*adev
= dev
->dev_private
;
756 seq_write(m
, adev
->bios
, adev
->bios_size
);
760 static int amdgpu_debugfs_evict_vram(struct seq_file
*m
, void *data
)
762 struct drm_info_node
*node
= (struct drm_info_node
*)m
->private;
763 struct drm_device
*dev
= node
->minor
->dev
;
764 struct amdgpu_device
*adev
= dev
->dev_private
;
766 seq_printf(m
, "(%d)\n", amdgpu_bo_evict_vram(adev
));
770 static const struct drm_info_list amdgpu_debugfs_list
[] = {
771 {"amdgpu_vbios", amdgpu_debugfs_get_vbios_dump
},
772 {"amdgpu_test_ib", &amdgpu_debugfs_test_ib
},
773 {"amdgpu_evict_vram", &amdgpu_debugfs_evict_vram
}
776 int amdgpu_debugfs_init(struct amdgpu_device
*adev
)
778 return amdgpu_debugfs_add_files(adev
, amdgpu_debugfs_list
,
779 ARRAY_SIZE(amdgpu_debugfs_list
));
783 int amdgpu_debugfs_init(struct amdgpu_device
*adev
)
787 int amdgpu_debugfs_regs_init(struct amdgpu_device
*adev
)
791 void amdgpu_debugfs_regs_cleanup(struct amdgpu_device
*adev
) { }