xref: /linux-6.15/drivers/vfio/debugfs.c (revision 2202844e)
1*2202844eSLongfang Liu // SPDX-License-Identifier: GPL-2.0-only
2*2202844eSLongfang Liu /*
3*2202844eSLongfang Liu  * Copyright (c) 2023, HiSilicon Ltd.
4*2202844eSLongfang Liu  */
5*2202844eSLongfang Liu 
6*2202844eSLongfang Liu #include <linux/device.h>
7*2202844eSLongfang Liu #include <linux/debugfs.h>
8*2202844eSLongfang Liu #include <linux/seq_file.h>
9*2202844eSLongfang Liu #include <linux/vfio.h>
10*2202844eSLongfang Liu #include "vfio.h"
11*2202844eSLongfang Liu 
12*2202844eSLongfang Liu static struct dentry *vfio_debugfs_root;
13*2202844eSLongfang Liu 
vfio_device_state_read(struct seq_file * seq,void * data)14*2202844eSLongfang Liu static int vfio_device_state_read(struct seq_file *seq, void *data)
15*2202844eSLongfang Liu {
16*2202844eSLongfang Liu 	struct device *vf_dev = seq->private;
17*2202844eSLongfang Liu 	struct vfio_device *vdev = container_of(vf_dev,
18*2202844eSLongfang Liu 						struct vfio_device, device);
19*2202844eSLongfang Liu 	enum vfio_device_mig_state state;
20*2202844eSLongfang Liu 	int ret;
21*2202844eSLongfang Liu 
22*2202844eSLongfang Liu 	BUILD_BUG_ON(VFIO_DEVICE_STATE_NR !=
23*2202844eSLongfang Liu 		     VFIO_DEVICE_STATE_PRE_COPY_P2P + 1);
24*2202844eSLongfang Liu 
25*2202844eSLongfang Liu 	ret = vdev->mig_ops->migration_get_state(vdev, &state);
26*2202844eSLongfang Liu 	if (ret)
27*2202844eSLongfang Liu 		return -EINVAL;
28*2202844eSLongfang Liu 
29*2202844eSLongfang Liu 	switch (state) {
30*2202844eSLongfang Liu 	case VFIO_DEVICE_STATE_ERROR:
31*2202844eSLongfang Liu 		seq_puts(seq, "ERROR\n");
32*2202844eSLongfang Liu 		break;
33*2202844eSLongfang Liu 	case VFIO_DEVICE_STATE_STOP:
34*2202844eSLongfang Liu 		seq_puts(seq, "STOP\n");
35*2202844eSLongfang Liu 		break;
36*2202844eSLongfang Liu 	case VFIO_DEVICE_STATE_RUNNING:
37*2202844eSLongfang Liu 		seq_puts(seq, "RUNNING\n");
38*2202844eSLongfang Liu 		break;
39*2202844eSLongfang Liu 	case VFIO_DEVICE_STATE_STOP_COPY:
40*2202844eSLongfang Liu 		seq_puts(seq, "STOP_COPY\n");
41*2202844eSLongfang Liu 		break;
42*2202844eSLongfang Liu 	case VFIO_DEVICE_STATE_RESUMING:
43*2202844eSLongfang Liu 		seq_puts(seq, "RESUMING\n");
44*2202844eSLongfang Liu 		break;
45*2202844eSLongfang Liu 	case VFIO_DEVICE_STATE_RUNNING_P2P:
46*2202844eSLongfang Liu 		seq_puts(seq, "RUNNING_P2P\n");
47*2202844eSLongfang Liu 		break;
48*2202844eSLongfang Liu 	case VFIO_DEVICE_STATE_PRE_COPY:
49*2202844eSLongfang Liu 		seq_puts(seq, "PRE_COPY\n");
50*2202844eSLongfang Liu 		break;
51*2202844eSLongfang Liu 	case VFIO_DEVICE_STATE_PRE_COPY_P2P:
52*2202844eSLongfang Liu 		seq_puts(seq, "PRE_COPY_P2P\n");
53*2202844eSLongfang Liu 		break;
54*2202844eSLongfang Liu 	default:
55*2202844eSLongfang Liu 		seq_puts(seq, "Invalid\n");
56*2202844eSLongfang Liu 	}
57*2202844eSLongfang Liu 
58*2202844eSLongfang Liu 	return 0;
59*2202844eSLongfang Liu }
60*2202844eSLongfang Liu 
vfio_device_debugfs_init(struct vfio_device * vdev)61*2202844eSLongfang Liu void vfio_device_debugfs_init(struct vfio_device *vdev)
62*2202844eSLongfang Liu {
63*2202844eSLongfang Liu 	struct device *dev = &vdev->device;
64*2202844eSLongfang Liu 
65*2202844eSLongfang Liu 	vdev->debug_root = debugfs_create_dir(dev_name(vdev->dev),
66*2202844eSLongfang Liu 					      vfio_debugfs_root);
67*2202844eSLongfang Liu 
68*2202844eSLongfang Liu 	if (vdev->mig_ops) {
69*2202844eSLongfang Liu 		struct dentry *vfio_dev_migration = NULL;
70*2202844eSLongfang Liu 
71*2202844eSLongfang Liu 		vfio_dev_migration = debugfs_create_dir("migration",
72*2202844eSLongfang Liu 							vdev->debug_root);
73*2202844eSLongfang Liu 		debugfs_create_devm_seqfile(dev, "state", vfio_dev_migration,
74*2202844eSLongfang Liu 					    vfio_device_state_read);
75*2202844eSLongfang Liu 	}
76*2202844eSLongfang Liu }
77*2202844eSLongfang Liu 
vfio_device_debugfs_exit(struct vfio_device * vdev)78*2202844eSLongfang Liu void vfio_device_debugfs_exit(struct vfio_device *vdev)
79*2202844eSLongfang Liu {
80*2202844eSLongfang Liu 	debugfs_remove_recursive(vdev->debug_root);
81*2202844eSLongfang Liu }
82*2202844eSLongfang Liu 
vfio_debugfs_create_root(void)83*2202844eSLongfang Liu void vfio_debugfs_create_root(void)
84*2202844eSLongfang Liu {
85*2202844eSLongfang Liu 	vfio_debugfs_root = debugfs_create_dir("vfio", NULL);
86*2202844eSLongfang Liu }
87*2202844eSLongfang Liu 
vfio_debugfs_remove_root(void)88*2202844eSLongfang Liu void vfio_debugfs_remove_root(void)
89*2202844eSLongfang Liu {
90*2202844eSLongfang Liu 	debugfs_remove_recursive(vfio_debugfs_root);
91*2202844eSLongfang Liu 	vfio_debugfs_root = NULL;
92*2202844eSLongfang Liu }
93