Karol Herbst
2015-Nov-09 15:11 UTC
[Nouveau] [PATCH v2 0/5] move pstate interface to debugfs
I made a little changes in this series: 1. merge the two last patches together 2. unify the private data interface with the drm debugfs one now it should be very obvious for a new dev on how to add new files to debugfs and how to get access to the nouveau structs Karol Herbst (5): debugfs: add infrastructure to add files with other fops than only read debugfs: rename functions to indicate they are used inside drm debugfs: we need a ctrl object for debugfs debugfs: add copy of sysfs pstate interface ported to debugfs sysfs: remove pstate sysfs interface drm/nouveau/Kbuild | 1 - drm/nouveau/nouveau_debugfs.c | 230 +++++++++++++++++++++++++++++++++++++++++- drm/nouveau/nouveau_debugfs.h | 35 ++++++- drm/nouveau/nouveau_drm.c | 10 +- drm/nouveau/nouveau_drm.h | 2 +- drm/nouveau/nouveau_sysfs.c | 197 ------------------------------------ drm/nouveau/nouveau_sysfs.h | 21 ---- 7 files changed, 262 insertions(+), 234 deletions(-) delete mode 100644 drm/nouveau/nouveau_sysfs.c delete mode 100644 drm/nouveau/nouveau_sysfs.h -- 2.6.3
Karol Herbst
2015-Nov-09 15:11 UTC
[Nouveau] [PATCH v2 1/5] debugfs: add infrastructure to add files with other fops than only read
v2: use the same object for private data as with the drm debugfs functions Signed-off-by: Karol Herbst <nouveau at karolherbst.de> --- drm/nouveau/nouveau_debugfs.c | 54 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/drm/nouveau/nouveau_debugfs.c b/drm/nouveau/nouveau_debugfs.c index 5392e07..fe53743 100644 --- a/drm/nouveau/nouveau_debugfs.c +++ b/drm/nouveau/nouveau_debugfs.c @@ -28,6 +28,7 @@ * Ben Skeggs <bskeggs at redhat.com> */ +#include <linux/debugfs.h> #include "nouveau_debugfs.h" #include "nouveau_drm.h" @@ -48,17 +49,66 @@ static struct drm_info_list nouveau_debugfs_list[] = { }; #define NOUVEAU_DEBUGFS_ENTRIES ARRAY_SIZE(nouveau_debugfs_list) +static const struct nouveau_debugfs_files { + const char *name; + const struct file_operations *fops; +} nouveau_debugfs_files[] = {}; + + +static int +nouveau_debugfs_create_file(struct drm_minor *minor, + const struct nouveau_debugfs_files *ndf) +{ + struct drm_info_node *node; + + node = kmalloc(sizeof(*node), GFP_KERNEL); + + if (node == NULL) + return -ENOMEM; + + node->minor = minor; + node->info_ent = (const void *)ndf->fops; + node->dent = debugfs_create_file(ndf->name, S_IRUGO | S_IWUSR, minor->debugfs_root, + node, ndf->fops); + + if (!node->dent) { + kfree(node); + return -ENOMEM; + } + + mutex_lock(&minor->debugfs_lock); + list_add(&node->list, &minor->debugfs_list); + mutex_unlock(&minor->debugfs_lock); + + return 0; +} + int nouveau_debugfs_init(struct drm_minor *minor) { - drm_debugfs_create_files(nouveau_debugfs_list, NOUVEAU_DEBUGFS_ENTRIES, + int i, ret; + + for (i = 0; i < ARRAY_SIZE(nouveau_debugfs_files); i++) { + ret = nouveau_debugfs_create_file(minor, &nouveau_debugfs_files[i]); + + if (ret) + return ret; + } + + return drm_debugfs_create_files(nouveau_debugfs_list, NOUVEAU_DEBUGFS_ENTRIES, minor->debugfs_root, minor); - return 0; } void nouveau_debugfs_takedown(struct drm_minor *minor) { + int i; + drm_debugfs_remove_files(nouveau_debugfs_list, NOUVEAU_DEBUGFS_ENTRIES, minor); + + for (i = 0; i < ARRAY_SIZE(nouveau_debugfs_files); i++) { + drm_debugfs_remove_files((struct drm_info_list *)nouveau_debugfs_files[i].fops, + 1, minor); + } } -- 2.6.3
Karol Herbst
2015-Nov-09 15:11 UTC
[Nouveau] [PATCH v2 2/5] debugfs: rename functions to indicate they are used inside drm
we will need our own debugfs_init and cleanup functions, because nouveau_drm isn't ready while the drm ones are called by drm Signed-off-by: Karol Herbst <nouveau at karolherbst.de> --- drm/nouveau/nouveau_debugfs.c | 4 ++-- drm/nouveau/nouveau_debugfs.h | 9 +++++---- drm/nouveau/nouveau_drm.c | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/drm/nouveau/nouveau_debugfs.c b/drm/nouveau/nouveau_debugfs.c index fe53743..7c21465 100644 --- a/drm/nouveau/nouveau_debugfs.c +++ b/drm/nouveau/nouveau_debugfs.c @@ -84,7 +84,7 @@ nouveau_debugfs_create_file(struct drm_minor *minor, } int -nouveau_debugfs_init(struct drm_minor *minor) +nouveau_drm_debugfs_init(struct drm_minor *minor) { int i, ret; @@ -100,7 +100,7 @@ nouveau_debugfs_init(struct drm_minor *minor) } void -nouveau_debugfs_takedown(struct drm_minor *minor) +nouveau_drm_debugfs_cleanup(struct drm_minor *minor) { int i; diff --git a/drm/nouveau/nouveau_debugfs.h b/drm/nouveau/nouveau_debugfs.h index a62af6f..42d65c9 100644 --- a/drm/nouveau/nouveau_debugfs.h +++ b/drm/nouveau/nouveau_debugfs.h @@ -4,16 +4,17 @@ #include <drm/drmP.h> #if defined(CONFIG_DEBUG_FS) -extern int nouveau_debugfs_init(struct drm_minor *); -extern void nouveau_debugfs_takedown(struct drm_minor *); +extern int nouveau_drm_debugfs_init(struct drm_minor *); +extern void nouveau_drm_debugfs_cleanup(struct drm_minor *); #else static inline int -nouveau_debugfs_init(struct drm_minor *minor) +nouveau_drm_debugfs_init(struct drm_minor *minor) { return 0; } -static inline void nouveau_debugfs_takedown(struct drm_minor *minor) +static inline void +nouveau_drm_debugfs_cleanup(struct drm_minor *minor) { } diff --git a/drm/nouveau/nouveau_drm.c b/drm/nouveau/nouveau_drm.c index bdcc9b9..abbeb58 100644 --- a/drm/nouveau/nouveau_drm.c +++ b/drm/nouveau/nouveau_drm.c @@ -928,8 +928,8 @@ driver_stub = { .lastclose = nouveau_vga_lastclose, #if defined(CONFIG_DEBUG_FS) - .debugfs_init = nouveau_debugfs_init, - .debugfs_cleanup = nouveau_debugfs_takedown, + .debugfs_init = nouveau_drm_debugfs_init, + .debugfs_cleanup = nouveau_drm_debugfs_cleanup, #endif .get_vblank_counter = drm_vblank_count, -- 2.6.3
Karol Herbst
2015-Nov-09 15:11 UTC
[Nouveau] [PATCH v2 3/5] debugfs: we need a ctrl object for debugfs
Signed-off-by: Karol Herbst <nouveau at karolherbst.de> --- drm/nouveau/nouveau_debugfs.c | 30 ++++++++++++++++++++++++++++++ drm/nouveau/nouveau_debugfs.h | 26 ++++++++++++++++++++++++++ drm/nouveau/nouveau_drm.c | 2 ++ drm/nouveau/nouveau_drm.h | 1 + 4 files changed, 59 insertions(+) diff --git a/drm/nouveau/nouveau_debugfs.c b/drm/nouveau/nouveau_debugfs.c index 7c21465..6f317a7 100644 --- a/drm/nouveau/nouveau_debugfs.c +++ b/drm/nouveau/nouveau_debugfs.c @@ -29,6 +29,7 @@ */ #include <linux/debugfs.h> +#include <nvif/ioctl.h> #include "nouveau_debugfs.h" #include "nouveau_drm.h" @@ -112,3 +113,32 @@ nouveau_drm_debugfs_cleanup(struct drm_minor *minor) 1, minor); } } + +int +nouveau_debugfs_init(struct nouveau_drm *drm) +{ + int ret; + + drm->debugfs = kzalloc(sizeof(*drm->debugfs), GFP_KERNEL); + if (!drm->debugfs) { + return-ENOMEM; + } + + ret = nvif_object_init(&drm->device.object, NVDRM_CONTROL, + NVIF_IOCTL_NEW_V0_CONTROL, NULL, 0, &drm->debugfs->ctrl); + + if (ret) + return ret; + + return 0; +} + +void +nouveau_debugfs_cleanup(struct nouveau_drm *drm) +{ + if (drm->debugfs && drm->debugfs->ctrl.priv) + nvif_object_fini(&drm->debugfs->ctrl); + + kfree(drm->debugfs); + drm->debugfs = NULL; +} diff --git a/drm/nouveau/nouveau_debugfs.h b/drm/nouveau/nouveau_debugfs.h index 42d65c9..6b89fb1 100644 --- a/drm/nouveau/nouveau_debugfs.h +++ b/drm/nouveau/nouveau_debugfs.h @@ -4,8 +4,23 @@ #include <drm/drmP.h> #if defined(CONFIG_DEBUG_FS) + +#include "nouveau_drm.h" + +struct nouveau_debugfs { + struct nvif_object ctrl; +}; + +static inline struct nouveau_debugfs * +nouveau_debugfs(struct drm_device *dev) +{ + return nouveau_drm(dev)->debugfs; +} + extern int nouveau_drm_debugfs_init(struct drm_minor *); extern void nouveau_drm_debugfs_cleanup(struct drm_minor *); +extern int nouveau_debugfs_init(struct nouveau_drm *); +extern void nouveau_debugfs_cleanup(struct nouveau_drm *); #else static inline int nouveau_drm_debugfs_init(struct drm_minor *minor) @@ -18,6 +33,17 @@ nouveau_drm_debugfs_cleanup(struct drm_minor *minor) { } +static inline int +nouveau_debugfs_init(struct nouveau_drm *) +{ + return 0; +} + +static inline void +nouveau_debugfs_cleanup(struct nouveau_drm *) +{ +} + #endif #endif diff --git a/drm/nouveau/nouveau_drm.c b/drm/nouveau/nouveau_drm.c index abbeb58..634ad78 100644 --- a/drm/nouveau/nouveau_drm.c +++ b/drm/nouveau/nouveau_drm.c @@ -448,6 +448,7 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags) goto fail_dispinit; } + nouveau_debugfs_init(drm); nouveau_sysfs_init(dev); nouveau_hwmon_init(dev); nouveau_accel_init(drm); @@ -487,6 +488,7 @@ nouveau_drm_unload(struct drm_device *dev) nouveau_accel_fini(drm); nouveau_hwmon_fini(dev); nouveau_sysfs_fini(dev); + nouveau_debugfs_cleanup(drm); if (dev->mode_config.num_crtc) nouveau_display_fini(dev); diff --git a/drm/nouveau/nouveau_drm.h b/drm/nouveau/nouveau_drm.h index 3050042..376d11c 100644 --- a/drm/nouveau/nouveau_drm.h +++ b/drm/nouveau/nouveau_drm.h @@ -163,6 +163,7 @@ struct nouveau_drm { /* power management */ struct nouveau_hwmon *hwmon; struct nouveau_sysfs *sysfs; + struct nouveau_debugfs *debugfs; /* display power reference */ bool have_disp_power_ref; -- 2.6.3
Karol Herbst
2015-Nov-09 15:11 UTC
[Nouveau] [PATCH v2 4/5] debugfs: add copy of sysfs pstate interface ported to debugfs
Signed-off-by: Karol Herbst <nouveau at karolherbst.de> --- drm/nouveau/nouveau_debugfs.c | 146 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 144 insertions(+), 2 deletions(-) diff --git a/drm/nouveau/nouveau_debugfs.c b/drm/nouveau/nouveau_debugfs.c index 6f317a7..61134c8 100644 --- a/drm/nouveau/nouveau_debugfs.c +++ b/drm/nouveau/nouveau_debugfs.c @@ -45,6 +45,147 @@ nouveau_debugfs_vbios_image(struct seq_file *m, void *data) return 0; } +static int +nouveau_debugfs_pstate_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; + struct nvif_control_pstate_info_v0 info = {}; + int ret, i; + + if (!debugfs) + return -ENODEV; + + ctrl = &debugfs->ctrl; + + ret = nvif_mthd(ctrl, NVIF_CONTROL_PSTATE_INFO, + &info, sizeof(info)); + if (ret) + return ret; + + for (i = 0; i < info.count + 1; i++) { + const s32 state = i < info.count ? i : + NVIF_CONTROL_PSTATE_ATTR_V0_STATE_CURRENT; + struct nvif_control_pstate_attr_v0 attr = { + .state = state, + .index = 0, + }; + + ret = nvif_mthd(ctrl, NVIF_CONTROL_PSTATE_ATTR, + &attr, sizeof(attr)); + if (ret) + return ret; + + if (i < info.count) + seq_printf(m, "%02x:", attr.state); + else + seq_printf(m, "%s:", info.pwrsrc == 0 ? "DC" : + info.pwrsrc == 1 ? "AC" : + "--"); + + attr.index = 0; + do { + attr.state = state; + ret = nvif_mthd(ctrl, + NVIF_CONTROL_PSTATE_ATTR, + &attr, sizeof(attr)); + if (ret) + return ret; + + seq_printf(m, " %s %d", attr.name, attr.min); + if (attr.min != attr.max) + seq_printf(m, "-%d", attr.max); + seq_printf(m, " %s", attr.unit); + } while (attr.index); + + if (state >= 0) { + if (info.ustate_ac == state) + seq_printf(m, " AC"); + if (info.ustate_dc == state) + seq_printf(m, " DC"); + if (info.pstate == state) + seq_printf(m, " *"); + } else { + if (info.ustate_ac < -1) + seq_printf(m, " AC"); + if (info.ustate_dc < -1) + seq_printf(m, " DC"); + } + + seq_printf(m, "\n"); + } + + return 0; +} + +static ssize_t +nouveau_debugfs_pstate_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; + struct nvif_control_pstate_user_v0 args = { .pwrsrc = -EINVAL }; + char buf[32] = {}, *tmp, *cur = buf; + long value, ret; + + if (!debugfs) + return -ENODEV; + + ctrl = &debugfs->ctrl; + + if (len >= sizeof(buf)) + return -EINVAL; + + if (copy_from_user(buf, ubuf, len)) + return -EFAULT; + + if ((tmp = strchr(buf, '\n'))) + *tmp = '\0'; + + if (!strncasecmp(cur, "dc:", 3)) { + args.pwrsrc = 0; + cur += 3; + } else + if (!strncasecmp(cur, "ac:", 3)) { + args.pwrsrc = 1; + cur += 3; + } + + if (!strcasecmp(cur, "none")) + args.ustate = NVIF_CONTROL_PSTATE_USER_V0_STATE_UNKNOWN; + else + if (!strcasecmp(cur, "auto")) + args.ustate = NVIF_CONTROL_PSTATE_USER_V0_STATE_PERFMON; + else { + ret = kstrtol(cur, 16, &value); + if (ret) + return ret; + args.ustate = value; + } + + ret = nvif_mthd(ctrl, NVIF_CONTROL_PSTATE_USER, + &args, sizeof(args)); + if (ret < 0) + return ret; + + return len; +} + +static int +nouveau_debugfs_pstate_open(struct inode *inode, struct file *file) +{ + return single_open(file, nouveau_debugfs_pstate_get, inode->i_private); +} + +static const struct file_operations nouveau_pstate_fops = { + .owner = THIS_MODULE, + .open = nouveau_debugfs_pstate_open, + .read = seq_read, + .write = nouveau_debugfs_pstate_set, +}; + static struct drm_info_list nouveau_debugfs_list[] = { { "vbios.rom", nouveau_debugfs_vbios_image, 0, NULL }, }; @@ -53,8 +194,9 @@ static struct drm_info_list nouveau_debugfs_list[] = { static const struct nouveau_debugfs_files { const char *name; const struct file_operations *fops; -} nouveau_debugfs_files[] = {}; - +} nouveau_debugfs_files[] = { + {"pstate", &nouveau_pstate_fops}, +}; static int nouveau_debugfs_create_file(struct drm_minor *minor, -- 2.6.3
Karol Herbst
2015-Nov-09 15:11 UTC
[Nouveau] [PATCH v2 5/5] sysfs: remove pstate sysfs interface
Signed-off-by: Karol Herbst <nouveau at karolherbst.de> --- drm/nouveau/Kbuild | 1 - drm/nouveau/nouveau_debugfs.c | 2 +- drm/nouveau/nouveau_drm.c | 4 - drm/nouveau/nouveau_drm.h | 1 - drm/nouveau/nouveau_sysfs.c | 197 ------------------------------------------ drm/nouveau/nouveau_sysfs.h | 21 ----- 6 files changed, 1 insertion(+), 225 deletions(-) delete mode 100644 drm/nouveau/nouveau_sysfs.c delete mode 100644 drm/nouveau/nouveau_sysfs.h diff --git a/drm/nouveau/Kbuild b/drm/nouveau/Kbuild index a34b437..2527bf4 100644 --- a/drm/nouveau/Kbuild +++ b/drm/nouveau/Kbuild @@ -24,7 +24,6 @@ nouveau-y += nouveau_hwmon.o nouveau-$(CONFIG_COMPAT) += nouveau_ioc32.o nouveau-y += nouveau_nvif.o nouveau-$(CONFIG_NOUVEAU_PLATFORM_DRIVER) += nouveau_platform.o -nouveau-y += nouveau_sysfs.o nouveau-y += nouveau_usif.o # userspace <-> nvif nouveau-y += nouveau_vga.o diff --git a/drm/nouveau/nouveau_debugfs.c b/drm/nouveau/nouveau_debugfs.c index 61134c8..d99af3a 100644 --- a/drm/nouveau/nouveau_debugfs.c +++ b/drm/nouveau/nouveau_debugfs.c @@ -266,7 +266,7 @@ nouveau_debugfs_init(struct nouveau_drm *drm) return-ENOMEM; } - ret = nvif_object_init(&drm->device.object, NVDRM_CONTROL, + ret = nvif_object_init(&drm->device.object, 0, NVIF_IOCTL_NEW_V0_CONTROL, NULL, 0, &drm->debugfs->ctrl); if (ret) diff --git a/drm/nouveau/nouveau_drm.c b/drm/nouveau/nouveau_drm.c index 634ad78..5b1746b 100644 --- a/drm/nouveau/nouveau_drm.c +++ b/drm/nouveau/nouveau_drm.c @@ -42,7 +42,6 @@ #include "nouveau_ttm.h" #include "nouveau_gem.h" #include "nouveau_vga.h" -#include "nouveau_sysfs.h" #include "nouveau_hwmon.h" #include "nouveau_acpi.h" #include "nouveau_bios.h" @@ -449,7 +448,6 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags) } nouveau_debugfs_init(drm); - nouveau_sysfs_init(dev); nouveau_hwmon_init(dev); nouveau_accel_init(drm); nouveau_fbcon_init(dev); @@ -487,7 +485,6 @@ nouveau_drm_unload(struct drm_device *dev) nouveau_fbcon_fini(dev); nouveau_accel_fini(drm); nouveau_hwmon_fini(dev); - nouveau_sysfs_fini(dev); nouveau_debugfs_cleanup(drm); if (dev->mode_config.num_crtc) @@ -1005,7 +1002,6 @@ static void nouveau_display_options(void) DRM_DEBUG_DRIVER("... modeset : %d\n", nouveau_modeset); DRM_DEBUG_DRIVER("... runpm : %d\n", nouveau_runtime_pm); DRM_DEBUG_DRIVER("... vram_pushbuf : %d\n", nouveau_vram_pushbuf); - DRM_DEBUG_DRIVER("... pstate : %d\n", nouveau_pstate); } static const struct dev_pm_ops nouveau_pm_ops = { diff --git a/drm/nouveau/nouveau_drm.h b/drm/nouveau/nouveau_drm.h index 376d11c..72b7eee 100644 --- a/drm/nouveau/nouveau_drm.h +++ b/drm/nouveau/nouveau_drm.h @@ -162,7 +162,6 @@ struct nouveau_drm { /* power management */ struct nouveau_hwmon *hwmon; - struct nouveau_sysfs *sysfs; struct nouveau_debugfs *debugfs; /* display power reference */ diff --git a/drm/nouveau/nouveau_sysfs.c b/drm/nouveau/nouveau_sysfs.c deleted file mode 100644 index 5dac354..0000000 --- a/drm/nouveau/nouveau_sysfs.c +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright 2013 Red Hat Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * Authors: Ben Skeggs <bskeggs at redhat.com> - */ - -#include <nvif/os.h> -#include <nvif/class.h> -#include <nvif/ioctl.h> - -#include "nouveau_sysfs.h" - -MODULE_PARM_DESC(pstate, "enable sysfs pstate file, which will be moved in the future"); -int nouveau_pstate; -module_param_named(pstate, nouveau_pstate, int, 0400); - -static inline struct drm_device * -drm_device(struct device *d) -{ - return dev_get_drvdata(d); -} - -#define snappendf(p,r,f,a...) do { \ - snprintf(p, r, f, ##a); \ - r -= strlen(p); \ - p += strlen(p); \ -} while(0) - -static ssize_t -nouveau_sysfs_pstate_get(struct device *d, struct device_attribute *a, char *b) -{ - struct nouveau_sysfs *sysfs = nouveau_sysfs(drm_device(d)); - struct nvif_control_pstate_info_v0 info = {}; - size_t cnt = PAGE_SIZE; - char *buf = b; - int ret, i; - - ret = nvif_mthd(&sysfs->ctrl, NVIF_CONTROL_PSTATE_INFO, - &info, sizeof(info)); - if (ret) - return ret; - - for (i = 0; i < info.count + 1; i++) { - const s32 state = i < info.count ? i : - NVIF_CONTROL_PSTATE_ATTR_V0_STATE_CURRENT; - struct nvif_control_pstate_attr_v0 attr = { - .state = state, - .index = 0, - }; - - ret = nvif_mthd(&sysfs->ctrl, NVIF_CONTROL_PSTATE_ATTR, - &attr, sizeof(attr)); - if (ret) - return ret; - - if (i < info.count) - snappendf(buf, cnt, "%02x:", attr.state); - else - snappendf(buf, cnt, "%s:", info.pwrsrc == 0 ? "DC" : - info.pwrsrc == 1 ? "AC" : - "--"); - - attr.index = 0; - do { - attr.state = state; - ret = nvif_mthd(&sysfs->ctrl, - NVIF_CONTROL_PSTATE_ATTR, - &attr, sizeof(attr)); - if (ret) - return ret; - - snappendf(buf, cnt, " %s %d", attr.name, attr.min); - if (attr.min != attr.max) - snappendf(buf, cnt, "-%d", attr.max); - snappendf(buf, cnt, " %s", attr.unit); - } while (attr.index); - - if (state >= 0) { - if (info.ustate_ac == state) - snappendf(buf, cnt, " AC"); - if (info.ustate_dc == state) - snappendf(buf, cnt, " DC"); - if (info.pstate == state) - snappendf(buf, cnt, " *"); - } else { - if (info.ustate_ac < -1) - snappendf(buf, cnt, " AC"); - if (info.ustate_dc < -1) - snappendf(buf, cnt, " DC"); - } - - snappendf(buf, cnt, "\n"); - } - - return strlen(b); -} - -static ssize_t -nouveau_sysfs_pstate_set(struct device *d, struct device_attribute *a, - const char *buf, size_t count) -{ - struct nouveau_sysfs *sysfs = nouveau_sysfs(drm_device(d)); - struct nvif_control_pstate_user_v0 args = { .pwrsrc = -EINVAL }; - long value, ret; - char *tmp; - - if ((tmp = strchr(buf, '\n'))) - *tmp = '\0'; - - if (!strncasecmp(buf, "dc:", 3)) { - args.pwrsrc = 0; - buf += 3; - } else - if (!strncasecmp(buf, "ac:", 3)) { - args.pwrsrc = 1; - buf += 3; - } - - if (!strcasecmp(buf, "none")) - args.ustate = NVIF_CONTROL_PSTATE_USER_V0_STATE_UNKNOWN; - else - if (!strcasecmp(buf, "auto")) - args.ustate = NVIF_CONTROL_PSTATE_USER_V0_STATE_PERFMON; - else { - ret = kstrtol(buf, 16, &value); - if (ret) - return ret; - args.ustate = value; - } - - ret = nvif_mthd(&sysfs->ctrl, NVIF_CONTROL_PSTATE_USER, - &args, sizeof(args)); - if (ret < 0) - return ret; - - return count; -} - -static DEVICE_ATTR(pstate, S_IRUGO | S_IWUSR, - nouveau_sysfs_pstate_get, nouveau_sysfs_pstate_set); - -void -nouveau_sysfs_fini(struct drm_device *dev) -{ - struct nouveau_sysfs *sysfs = nouveau_sysfs(dev); - struct nouveau_drm *drm = nouveau_drm(dev); - struct nvif_device *device = &drm->device; - - if (sysfs && sysfs->ctrl.priv) { - device_remove_file(nvxx_device(device)->dev, &dev_attr_pstate); - nvif_object_fini(&sysfs->ctrl); - } - - drm->sysfs = NULL; - kfree(sysfs); -} - -int -nouveau_sysfs_init(struct drm_device *dev) -{ - struct nouveau_drm *drm = nouveau_drm(dev); - struct nvif_device *device = &drm->device; - struct nouveau_sysfs *sysfs; - int ret; - - if (!nouveau_pstate) - return 0; - - sysfs = drm->sysfs = kzalloc(sizeof(*sysfs), GFP_KERNEL); - if (!sysfs) - return -ENOMEM; - - ret = nvif_object_init(&device->object, 0, NVIF_IOCTL_NEW_V0_CONTROL, - NULL, 0, &sysfs->ctrl); - if (ret == 0) - device_create_file(nvxx_device(device)->dev, &dev_attr_pstate); - - return 0; -} diff --git a/drm/nouveau/nouveau_sysfs.h b/drm/nouveau/nouveau_sysfs.h deleted file mode 100644 index 4e5ea92..0000000 --- a/drm/nouveau/nouveau_sysfs.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef __NOUVEAU_SYSFS_H__ -#define __NOUVEAU_SYSFS_H__ - -#include "nouveau_drm.h" - -struct nouveau_sysfs { - struct nvif_object ctrl; -}; - -static inline struct nouveau_sysfs * -nouveau_sysfs(struct drm_device *dev) -{ - return nouveau_drm(dev)->sysfs; -} - -int nouveau_sysfs_init(struct drm_device *); -void nouveau_sysfs_fini(struct drm_device *); - -extern int nouveau_pstate; - -#endif -- 2.6.3
Maybe Matching Threads
- [PATCH] debugfs: don't emit parameter names
- [PATCH] drm/nouveau: Add DRM_NOUVEAU_DEBUG option
- [PATCH] nouveau: no need to check return value of debugfs_create functions
- [PATCH] drm/nouveau: remove checks for return value of debugfs functions
- [PATCH 0/2] drm/nouveau: Allow parsing vbios.rom with nvbios from debugfs