[Nouveau] [PATCH v2 22/22] debugfs: add boost interface to change the boost_mode
Karol Herbst
nouveau at karolherbst.de
Mon Mar 21 16:16:40 UTC 2016
Signed-off-by: Karol Herbst <nouveau at karolherbst.de>
---
drm/nouveau/nouveau_debugfs.c | 76 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 76 insertions(+)
diff --git a/drm/nouveau/nouveau_debugfs.c b/drm/nouveau/nouveau_debugfs.c
index 3d0dc19..31b309f 100644
--- a/drm/nouveau/nouveau_debugfs.c
+++ b/drm/nouveau/nouveau_debugfs.c
@@ -180,6 +180,81 @@ static const struct file_operations nouveau_pstate_fops = {
.write = nouveau_debugfs_pstate_set,
};
+static void
+nouveau_debugfs_boost_get_entry(struct seq_file *m, u8 mode, u8 entry, u16 value)
+{
+ if (value) {
+ if (mode == entry)
+ seq_printf(m, "*%i", entry);
+ else
+ seq_printf(m, " %i", entry);
+ seq_printf(m, ": %u MHz\n", value);
+ }
+}
+
+static int
+nouveau_debugfs_boost_get(struct seq_file *m, void *data)
+{
+ struct drm_info_node *node = (struct drm_info_node *) m->private;
+ struct nouveau_debugfs *debugfs = nouveau_debugfs(node->minor->dev);
+ struct nvif_object *ctrl = &debugfs->ctrl;
+ struct nvif_control_boost_info_v0 info = {};
+ int ret;
+
+ ret = nvif_mthd(ctrl, NVIF_CONTROL_BOOST_INFO, &info, sizeof(info));
+ if (ret)
+ return ret;
+
+ nouveau_debugfs_boost_get_entry(m, info.mode, 0, info.base_mhz);
+ nouveau_debugfs_boost_get_entry(m, info.mode, 1, info.boost_mhz);
+ nouveau_debugfs_boost_get_entry(m, info.mode, 2, info.max_mhz);
+ return 0;
+}
+
+static ssize_t
+nouveau_debugfs_boost_set(struct file *file, const char __user *ubuf,
+ size_t len, loff_t *offp)
+{
+ struct seq_file *m = file->private_data;
+ struct drm_info_node *node = (struct drm_info_node *) m->private;
+ struct nouveau_debugfs *debugfs = nouveau_debugfs(node->minor->dev);
+ struct nvif_object *ctrl = &debugfs->ctrl;
+ struct nvif_control_boost_set_v0 args = {};
+ char buf[3] = {};
+ int ret;
+ u8 value;
+
+ if (len >= sizeof(buf))
+ return -EINVAL;
+
+ if (copy_from_user(buf, ubuf, len))
+ return -EFAULT;
+
+ ret = kstrtou8(buf, 10, &value);
+ if (ret)
+ return ret;
+
+ args.mode = value;
+ ret = nvif_mthd(ctrl, NVIF_CONTROL_BOOST_SET, &args, sizeof(args));
+ if (ret)
+ return ret;
+
+ return len;
+}
+
+static int
+nouveau_debugfs_boost_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, nouveau_debugfs_boost_get, inode->i_private);
+}
+
+static const struct file_operations nouveau_boost_fops = {
+ .owner = THIS_MODULE,
+ .open = nouveau_debugfs_boost_open,
+ .read = seq_read,
+ .write = nouveau_debugfs_boost_set,
+};
+
static struct drm_info_list nouveau_debugfs_list[] = {
{ "vbios.rom", nouveau_debugfs_vbios_image, 0, NULL },
};
@@ -189,6 +264,7 @@ static const struct nouveau_debugfs_files {
const char *name;
const struct file_operations *fops;
} nouveau_debugfs_files[] = {
+ {"boost", &nouveau_boost_fops},
{"pstate", &nouveau_pstate_fops},
};
--
2.7.4
More information about the Nouveau
mailing list