intel_guc_log_debugfs.c revision 1.2
1// SPDX-License-Identifier: MIT
2/*
3 * Copyright �� 2020 Intel Corporation
4 */
5
6#include <linux/fs.h>
7#include <drm/drm_print.h>
8
9#include "gt/debugfs_gt.h"
10#include "intel_guc.h"
11#include "intel_guc_log.h"
12#include "intel_guc_log_debugfs.h"
13
14#ifdef notyet
15
16static int guc_log_dump_show(struct seq_file *m, void *data)
17{
18	struct drm_printer p = drm_seq_file_printer(m);
19
20	return intel_guc_log_dump(m->private, &p, false);
21}
22DEFINE_GT_DEBUGFS_ATTRIBUTE(guc_log_dump);
23
24static int guc_load_err_log_dump_show(struct seq_file *m, void *data)
25{
26	struct drm_printer p = drm_seq_file_printer(m);
27
28	return intel_guc_log_dump(m->private, &p, true);
29}
30DEFINE_GT_DEBUGFS_ATTRIBUTE(guc_load_err_log_dump);
31
32static int guc_log_level_get(void *data, u64 *val)
33{
34	struct intel_guc_log *log = data;
35
36	if (!intel_guc_is_used(log_to_guc(log)))
37		return -ENODEV;
38
39	*val = intel_guc_log_get_level(log);
40
41	return 0;
42}
43
44static int guc_log_level_set(void *data, u64 val)
45{
46	struct intel_guc_log *log = data;
47
48	if (!intel_guc_is_used(log_to_guc(log)))
49		return -ENODEV;
50
51	return intel_guc_log_set_level(log, val);
52}
53
54DEFINE_SIMPLE_ATTRIBUTE(guc_log_level_fops,
55			guc_log_level_get, guc_log_level_set,
56			"%lld\n");
57
58static int guc_log_relay_open(struct inode *inode, struct file *file)
59{
60	struct intel_guc_log *log = inode->i_private;
61
62	if (!intel_guc_is_ready(log_to_guc(log)))
63		return -ENODEV;
64
65	file->private_data = log;
66
67	return intel_guc_log_relay_open(log);
68}
69
70static ssize_t
71guc_log_relay_write(struct file *filp,
72		    const char __user *ubuf,
73		    size_t cnt,
74		    loff_t *ppos)
75{
76	struct intel_guc_log *log = filp->private_data;
77	int val;
78	int ret;
79
80	ret = kstrtoint_from_user(ubuf, cnt, 0, &val);
81	if (ret < 0)
82		return ret;
83
84	/*
85	 * Enable and start the guc log relay on value of 1.
86	 * Flush log relay for any other value.
87	 */
88	if (val == 1)
89		ret = intel_guc_log_relay_start(log);
90	else
91		intel_guc_log_relay_flush(log);
92
93	return ret ?: cnt;
94}
95
96static int guc_log_relay_release(struct inode *inode, struct file *file)
97{
98	struct intel_guc_log *log = inode->i_private;
99
100	intel_guc_log_relay_close(log);
101	return 0;
102}
103
104static const struct file_operations guc_log_relay_fops = {
105	.owner = THIS_MODULE,
106	.open = guc_log_relay_open,
107	.write = guc_log_relay_write,
108	.release = guc_log_relay_release,
109};
110
111#endif /* notyet */
112
113void intel_guc_log_debugfs_register(struct intel_guc_log *log,
114				    struct dentry *root)
115{
116	STUB();
117#ifdef notyet
118	static const struct debugfs_gt_file files[] = {
119		{ "guc_log_dump", &guc_log_dump_fops, NULL },
120		{ "guc_load_err_log_dump", &guc_load_err_log_dump_fops, NULL },
121		{ "guc_log_level", &guc_log_level_fops, NULL },
122		{ "guc_log_relay", &guc_log_relay_fops, NULL },
123	};
124
125	if (!intel_guc_is_supported(log_to_guc(log)))
126		return;
127
128	intel_gt_debugfs_register_files(root, files, ARRAY_SIZE(files), log);
129#endif
130}
131