187444254SRoy Sun // SPDX-License-Identifier: MIT
287444254SRoy Sun /* Copyright 2021 Advanced Micro Devices, Inc.
387444254SRoy Sun *
487444254SRoy Sun * Permission is hereby granted, free of charge, to any person obtaining a
587444254SRoy Sun * copy of this software and associated documentation files (the "Software"),
687444254SRoy Sun * to deal in the Software without restriction, including without limitation
787444254SRoy Sun * the rights to use, copy, modify, merge, publish, distribute, sublicense,
887444254SRoy Sun * and/or sell copies of the Software, and to permit persons to whom the
987444254SRoy Sun * Software is furnished to do so, subject to the following conditions:
1087444254SRoy Sun *
1187444254SRoy Sun * The above copyright notice and this permission notice shall be included in
1287444254SRoy Sun * all copies or substantial portions of the Software.
1387444254SRoy Sun *
1487444254SRoy Sun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1587444254SRoy Sun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1687444254SRoy Sun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1787444254SRoy Sun * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1887444254SRoy Sun * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1987444254SRoy Sun * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2087444254SRoy Sun * OTHER DEALINGS IN THE SOFTWARE.
2187444254SRoy Sun *
2287444254SRoy Sun * Authors: David Nieto
2387444254SRoy Sun * Roy Sun
2487444254SRoy Sun */
2587444254SRoy Sun
2687444254SRoy Sun #include <linux/debugfs.h>
2787444254SRoy Sun #include <linux/list.h>
2887444254SRoy Sun #include <linux/module.h>
2987444254SRoy Sun #include <linux/uaccess.h>
3087444254SRoy Sun #include <linux/reboot.h>
3187444254SRoy Sun #include <linux/syscalls.h>
3287444254SRoy Sun
3387444254SRoy Sun #include <drm/amdgpu_drm.h>
3487444254SRoy Sun #include <drm/drm_debugfs.h>
35af0b5416SChristian König #include <drm/drm_drv.h>
36f2863650SYunxiang Li #include <drm/drm_file.h>
3787444254SRoy Sun
3887444254SRoy Sun #include "amdgpu.h"
3987444254SRoy Sun #include "amdgpu_vm.h"
4087444254SRoy Sun #include "amdgpu_gem.h"
4187444254SRoy Sun #include "amdgpu_ctx.h"
4287444254SRoy Sun #include "amdgpu_fdinfo.h"
4387444254SRoy Sun
4487444254SRoy Sun
4587444254SRoy Sun static const char *amdgpu_ip_name[AMDGPU_HW_IP_NUM] = {
4687444254SRoy Sun [AMDGPU_HW_IP_GFX] = "gfx",
4787444254SRoy Sun [AMDGPU_HW_IP_COMPUTE] = "compute",
4887444254SRoy Sun [AMDGPU_HW_IP_DMA] = "dma",
4987444254SRoy Sun [AMDGPU_HW_IP_UVD] = "dec",
5087444254SRoy Sun [AMDGPU_HW_IP_VCE] = "enc",
5187444254SRoy Sun [AMDGPU_HW_IP_UVD_ENC] = "enc_1",
5287444254SRoy Sun [AMDGPU_HW_IP_VCN_DEC] = "dec",
5387444254SRoy Sun [AMDGPU_HW_IP_VCN_ENC] = "enc",
5487444254SRoy Sun [AMDGPU_HW_IP_VCN_JPEG] = "jpeg",
55523c1280SLang Yu [AMDGPU_HW_IP_VPE] = "vpe",
5687444254SRoy Sun };
5787444254SRoy Sun
amdgpu_show_fdinfo(struct drm_printer * p,struct drm_file * file)58376c25f8SRob Clark void amdgpu_show_fdinfo(struct drm_printer *p, struct drm_file *file)
5987444254SRoy Sun {
60af0b5416SChristian König struct amdgpu_fpriv *fpriv = file->driver_priv;
619bdc1992SChristian König struct amdgpu_vm *vm = &fpriv->vm;
62af0b5416SChristian König
63*74ef9527SYunxiang Li struct amdgpu_mem_stats stats[__AMDGPU_PL_NUM];
64af0b5416SChristian König ktime_t usage[AMDGPU_HW_IP_NUM];
6504bdba46STvrtko Ursulin const char *pl_name[] = {
6604bdba46STvrtko Ursulin [TTM_PL_VRAM] = "vram",
6704bdba46STvrtko Ursulin [TTM_PL_TT] = "gtt",
6804bdba46STvrtko Ursulin [TTM_PL_SYSTEM] = "cpu",
69aa2ac51cSTvrtko Ursulin [AMDGPU_PL_GDS] = "gds",
70aa2ac51cSTvrtko Ursulin [AMDGPU_PL_GWS] = "gws",
71aa2ac51cSTvrtko Ursulin [AMDGPU_PL_OA] = "oa",
72aa2ac51cSTvrtko Ursulin [AMDGPU_PL_DOORBELL] = "doorbell",
7304bdba46STvrtko Ursulin };
7404bdba46STvrtko Ursulin unsigned int hw_ip, i;
7587444254SRoy Sun
76*74ef9527SYunxiang Li amdgpu_vm_get_memory(vm, stats);
77af0b5416SChristian König amdgpu_ctx_mgr_usage(&fpriv->ctx_mgr, usage);
7887444254SRoy Sun
79af0b5416SChristian König /*
80af0b5416SChristian König * ******************************************************************
81af0b5416SChristian König * For text output format description please see drm-usage-stats.rst!
82af0b5416SChristian König * ******************************************************************
83af0b5416SChristian König */
84af0b5416SChristian König
85376c25f8SRob Clark drm_printf(p, "pasid:\t%u\n", fpriv->vm.pasid);
8604bdba46STvrtko Ursulin
87aa2ac51cSTvrtko Ursulin for (i = 0; i < ARRAY_SIZE(pl_name); i++) {
88aa2ac51cSTvrtko Ursulin if (!pl_name[i])
89aa2ac51cSTvrtko Ursulin continue;
90aa2ac51cSTvrtko Ursulin
9104bdba46STvrtko Ursulin drm_print_memory_stats(p,
9204bdba46STvrtko Ursulin &stats[i].drm,
9304bdba46STvrtko Ursulin DRM_GEM_OBJECT_RESIDENT |
9404bdba46STvrtko Ursulin DRM_GEM_OBJECT_PURGEABLE,
9504bdba46STvrtko Ursulin pl_name[i]);
96aa2ac51cSTvrtko Ursulin }
9704bdba46STvrtko Ursulin
9804bdba46STvrtko Ursulin /* Legacy amdgpu keys, alias to drm-resident-memory-: */
9904bdba46STvrtko Ursulin drm_printf(p, "drm-memory-vram:\t%llu KiB\n",
100f2863650SYunxiang Li stats[TTM_PL_VRAM].drm.resident/1024UL);
10104bdba46STvrtko Ursulin drm_printf(p, "drm-memory-gtt: \t%llu KiB\n",
102f2863650SYunxiang Li stats[TTM_PL_TT].drm.resident/1024UL);
10304bdba46STvrtko Ursulin drm_printf(p, "drm-memory-cpu: \t%llu KiB\n",
104f2863650SYunxiang Li stats[TTM_PL_SYSTEM].drm.resident/1024UL);
10504bdba46STvrtko Ursulin
10604bdba46STvrtko Ursulin /* Amdgpu specific memory accounting keys: */
107376c25f8SRob Clark drm_printf(p, "amd-evicted-vram:\t%llu KiB\n",
10804bdba46STvrtko Ursulin stats[TTM_PL_VRAM].evicted/1024UL);
109376c25f8SRob Clark drm_printf(p, "amd-requested-vram:\t%llu KiB\n",
110*74ef9527SYunxiang Li (stats[TTM_PL_VRAM].drm.shared +
111*74ef9527SYunxiang Li stats[TTM_PL_VRAM].drm.private) / 1024UL);
112376c25f8SRob Clark drm_printf(p, "amd-requested-gtt:\t%llu KiB\n",
113*74ef9527SYunxiang Li (stats[TTM_PL_TT].drm.shared +
114*74ef9527SYunxiang Li stats[TTM_PL_TT].drm.private) / 1024UL);
115ba1a58d5SAlex Deucher
116af0b5416SChristian König for (hw_ip = 0; hw_ip < AMDGPU_HW_IP_NUM; ++hw_ip) {
117af0b5416SChristian König if (!usage[hw_ip])
11887444254SRoy Sun continue;
11987444254SRoy Sun
1203dc6d835SSrinivasan Shanmugam drm_printf(p, "drm-engine-%s:\t%lld ns\n", amdgpu_ip_name[hw_ip],
121af0b5416SChristian König ktime_to_ns(usage[hw_ip]));
12287444254SRoy Sun }
12387444254SRoy Sun }
124