1 /* 2 * Copyright (C) 2015 Red Hat, Inc. 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining 6 * a copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sublicense, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial 15 * portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26 #include <linux/string_helpers.h> 27 28 #include <drm/drm_debugfs.h> 29 #include <drm/drm_file.h> 30 #include <drm/drm_print.h> 31 32 #include "virtgpu_drv.h" 33 34 static void virtio_gpu_add_bool(struct seq_file *m, const char *name, 35 bool value) 36 { 37 seq_printf(m, "%-16s : %s\n", name, str_yes_no(value)); 38 } 39 40 static void virtio_gpu_add_int(struct seq_file *m, const char *name, int value) 41 { 42 seq_printf(m, "%-16s : %d\n", name, value); 43 } 44 45 static int virtio_gpu_features(struct seq_file *m, void *data) 46 { 47 struct drm_info_node *node = (struct drm_info_node *)m->private; 48 struct virtio_gpu_device *vgdev = node->minor->dev->dev_private; 49 50 virtio_gpu_add_bool(m, "virgl", vgdev->has_virgl_3d); 51 virtio_gpu_add_bool(m, "edid", vgdev->has_edid); 52 virtio_gpu_add_bool(m, "indirect", vgdev->has_indirect); 53 54 virtio_gpu_add_bool(m, "resource uuid", 55 vgdev->has_resource_assign_uuid); 56 57 virtio_gpu_add_bool(m, "blob resources", vgdev->has_resource_blob); 58 virtio_gpu_add_bool(m, "context init", vgdev->has_context_init); 59 virtio_gpu_add_int(m, "cap sets", vgdev->num_capsets); 60 virtio_gpu_add_int(m, "scanouts", vgdev->num_scanouts); 61 if (vgdev->host_visible_region.len) { 62 seq_printf(m, "%-16s : 0x%lx +0x%lx\n", "host visible region", 63 (unsigned long)vgdev->host_visible_region.addr, 64 (unsigned long)vgdev->host_visible_region.len); 65 } 66 return 0; 67 } 68 69 static int 70 virtio_gpu_debugfs_irq_info(struct seq_file *m, void *data) 71 { 72 struct drm_info_node *node = (struct drm_info_node *) m->private; 73 struct virtio_gpu_device *vgdev = node->minor->dev->dev_private; 74 75 seq_printf(m, "fence %llu %lld\n", 76 (u64)atomic64_read(&vgdev->fence_drv.last_fence_id), 77 vgdev->fence_drv.current_fence_id); 78 return 0; 79 } 80 81 static int 82 virtio_gpu_debugfs_host_visible_mm(struct seq_file *m, void *data) 83 { 84 struct drm_info_node *node = (struct drm_info_node *)m->private; 85 struct virtio_gpu_device *vgdev = node->minor->dev->dev_private; 86 struct drm_printer p; 87 88 if (!vgdev->has_host_visible) { 89 seq_puts(m, "Host allocations not visible to guest\n"); 90 return 0; 91 } 92 93 p = drm_seq_file_printer(m); 94 drm_mm_print(&vgdev->host_visible_mm, &p); 95 return 0; 96 } 97 98 static struct drm_info_list virtio_gpu_debugfs_list[] = { 99 { "virtio-gpu-features", virtio_gpu_features }, 100 { "virtio-gpu-irq-fence", virtio_gpu_debugfs_irq_info, 0, NULL }, 101 { "virtio-gpu-host-visible-mm", virtio_gpu_debugfs_host_visible_mm }, 102 }; 103 104 #define VIRTIO_GPU_DEBUGFS_ENTRIES ARRAY_SIZE(virtio_gpu_debugfs_list) 105 106 void 107 virtio_gpu_debugfs_init(struct drm_minor *minor) 108 { 109 drm_debugfs_create_files(virtio_gpu_debugfs_list, 110 VIRTIO_GPU_DEBUGFS_ENTRIES, 111 minor->debugfs_root, minor); 112 } 113