2 * sysfs.c - sysfs support
4 * (C) 2006-2007 Shaohua Li <shaohua.li@intel.com>
6 * This code is licenced under the GPL.
9 #include <linux/kernel.h>
10 #include <linux/cpuidle.h>
11 #include <linux/sysfs.h>
12 #include <linux/slab.h>
13 #include <linux/cpu.h>
14 #include <linux/completion.h>
15 #include <linux/capability.h>
16 #include <linux/device.h>
17 #include <linux/kobject.h>
21 static ssize_t
show_available_governors(struct device
*dev
,
22 struct device_attribute
*attr
,
26 struct cpuidle_governor
*tmp
;
28 mutex_lock(&cpuidle_lock
);
29 list_for_each_entry(tmp
, &cpuidle_governors
, governor_list
) {
30 if (i
>= (ssize_t
) (PAGE_SIZE
- (CPUIDLE_NAME_LEN
+ 2)))
33 i
+= scnprintf(&buf
[i
], CPUIDLE_NAME_LEN
+ 1, "%s ", tmp
->name
);
37 i
+= sprintf(&buf
[i
], "\n");
38 mutex_unlock(&cpuidle_lock
);
42 static ssize_t
show_current_driver(struct device
*dev
,
43 struct device_attribute
*attr
,
47 struct cpuidle_driver
*drv
;
49 spin_lock(&cpuidle_driver_lock
);
50 drv
= cpuidle_get_driver();
52 ret
= sprintf(buf
, "%s\n", drv
->name
);
54 ret
= sprintf(buf
, "none\n");
55 spin_unlock(&cpuidle_driver_lock
);
60 static ssize_t
show_current_governor(struct device
*dev
,
61 struct device_attribute
*attr
,
66 mutex_lock(&cpuidle_lock
);
67 if (cpuidle_curr_governor
)
68 ret
= sprintf(buf
, "%s\n", cpuidle_curr_governor
->name
);
70 ret
= sprintf(buf
, "none\n");
71 mutex_unlock(&cpuidle_lock
);
76 static ssize_t
store_current_governor(struct device
*dev
,
77 struct device_attribute
*attr
,
78 const char *buf
, size_t count
)
80 char gov_name
[CPUIDLE_NAME_LEN
+ 1];
82 struct cpuidle_governor
*gov
;
84 ret
= sscanf(buf
, "%" __stringify(CPUIDLE_NAME_LEN
) "s", gov_name
);
88 mutex_lock(&cpuidle_lock
);
90 list_for_each_entry(gov
, &cpuidle_governors
, governor_list
) {
91 if (!strncmp(gov
->name
, gov_name
, CPUIDLE_NAME_LEN
)) {
92 ret
= cpuidle_switch_governor(gov
);
96 mutex_unlock(&cpuidle_lock
);
98 return ret
? ret
: count
;
101 static DEVICE_ATTR(available_governors
, 0444, show_available_governors
, NULL
);
102 static DEVICE_ATTR(current_driver
, 0444, show_current_driver
, NULL
);
103 static DEVICE_ATTR(current_governor
, 0644, show_current_governor
,
104 store_current_governor
);
105 static DEVICE_ATTR(current_governor_ro
, 0444, show_current_governor
, NULL
);
107 static struct attribute
*cpuidle_attrs
[] = {
108 &dev_attr_available_governors
.attr
,
109 &dev_attr_current_driver
.attr
,
110 &dev_attr_current_governor
.attr
,
111 &dev_attr_current_governor_ro
.attr
,
115 static struct attribute_group cpuidle_attr_group
= {
116 .attrs
= cpuidle_attrs
,
121 * cpuidle_add_interface - add CPU global sysfs attributes
122 * @dev: the target device
124 int cpuidle_add_interface(struct device
*dev
)
126 return sysfs_create_group(&dev
->kobj
, &cpuidle_attr_group
);
130 * cpuidle_remove_interface - remove CPU global sysfs attributes
131 * @dev: the target device
133 void cpuidle_remove_interface(struct device
*dev
)
135 sysfs_remove_group(&dev
->kobj
, &cpuidle_attr_group
);
138 struct cpuidle_attr
{
139 struct attribute attr
;
140 ssize_t (*show
)(struct cpuidle_device
*, char *);
141 ssize_t (*store
)(struct cpuidle_device
*, const char *, size_t count
);
144 #define attr_to_cpuidleattr(a) container_of(a, struct cpuidle_attr, attr)
146 struct cpuidle_device_kobj
{
147 struct cpuidle_device
*dev
;
148 struct completion kobj_unregister
;
152 static inline struct cpuidle_device
*to_cpuidle_device(struct kobject
*kobj
)
154 struct cpuidle_device_kobj
*kdev
=
155 container_of(kobj
, struct cpuidle_device_kobj
, kobj
);
160 static ssize_t
cpuidle_show(struct kobject
*kobj
, struct attribute
*attr
,
164 struct cpuidle_device
*dev
= to_cpuidle_device(kobj
);
165 struct cpuidle_attr
*cattr
= attr_to_cpuidleattr(attr
);
168 mutex_lock(&cpuidle_lock
);
169 ret
= cattr
->show(dev
, buf
);
170 mutex_unlock(&cpuidle_lock
);
175 static ssize_t
cpuidle_store(struct kobject
*kobj
, struct attribute
*attr
,
176 const char *buf
, size_t count
)
179 struct cpuidle_device
*dev
= to_cpuidle_device(kobj
);
180 struct cpuidle_attr
*cattr
= attr_to_cpuidleattr(attr
);
183 mutex_lock(&cpuidle_lock
);
184 ret
= cattr
->store(dev
, buf
, count
);
185 mutex_unlock(&cpuidle_lock
);
190 static const struct sysfs_ops cpuidle_sysfs_ops
= {
191 .show
= cpuidle_show
,
192 .store
= cpuidle_store
,
195 static void cpuidle_sysfs_release(struct kobject
*kobj
)
197 struct cpuidle_device_kobj
*kdev
=
198 container_of(kobj
, struct cpuidle_device_kobj
, kobj
);
200 complete(&kdev
->kobj_unregister
);
203 static struct kobj_type ktype_cpuidle
= {
204 .sysfs_ops
= &cpuidle_sysfs_ops
,
205 .release
= cpuidle_sysfs_release
,
208 struct cpuidle_state_attr
{
209 struct attribute attr
;
210 ssize_t (*show
)(struct cpuidle_state
*, \
211 struct cpuidle_state_usage
*, char *);
212 ssize_t (*store
)(struct cpuidle_state
*, \
213 struct cpuidle_state_usage
*, const char *, size_t);
216 #define define_one_state_ro(_name, show) \
217 static struct cpuidle_state_attr attr_##_name = __ATTR(_name, 0444, show, NULL)
219 #define define_one_state_rw(_name, show, store) \
220 static struct cpuidle_state_attr attr_##_name = __ATTR(_name, 0644, show, store)
222 #define define_show_state_function(_name) \
223 static ssize_t show_state_##_name(struct cpuidle_state *state, \
224 struct cpuidle_state_usage *state_usage, char *buf) \
226 return sprintf(buf, "%u\n", state->_name);\
229 #define define_show_state_ull_function(_name) \
230 static ssize_t show_state_##_name(struct cpuidle_state *state, \
231 struct cpuidle_state_usage *state_usage, \
234 return sprintf(buf, "%llu\n", state_usage->_name);\
237 #define define_show_state_str_function(_name) \
238 static ssize_t show_state_##_name(struct cpuidle_state *state, \
239 struct cpuidle_state_usage *state_usage, \
242 if (state->_name[0] == '\0')\
243 return sprintf(buf, "<null>\n");\
244 return sprintf(buf, "%s\n", state->_name);\
247 #define define_show_state_time_function(_name) \
248 static ssize_t show_state_##_name(struct cpuidle_state *state, \
249 struct cpuidle_state_usage *state_usage, \
252 return sprintf(buf, "%llu\n", ktime_to_us(state->_name##_ns)); \
255 define_show_state_time_function(exit_latency
)
256 define_show_state_time_function(target_residency
)
257 define_show_state_function(power_usage
)
258 define_show_state_ull_function(usage
)
259 define_show_state_str_function(name
)
260 define_show_state_str_function(desc
)
261 define_show_state_ull_function(above
)
262 define_show_state_ull_function(below
)
264 static ssize_t
show_state_time(struct cpuidle_state
*state
,
265 struct cpuidle_state_usage
*state_usage
,
268 return sprintf(buf
, "%llu\n", ktime_to_us(state_usage
->time_ns
));
271 static ssize_t
show_state_disable(struct cpuidle_state
*state
,
272 struct cpuidle_state_usage
*state_usage
,
275 return sprintf(buf
, "%llu\n",
276 state_usage
->disable
& CPUIDLE_STATE_DISABLED_BY_USER
);
279 static ssize_t
store_state_disable(struct cpuidle_state
*state
,
280 struct cpuidle_state_usage
*state_usage
,
281 const char *buf
, size_t size
)
286 if (!capable(CAP_SYS_ADMIN
))
289 err
= kstrtouint(buf
, 0, &value
);
294 state_usage
->disable
|= CPUIDLE_STATE_DISABLED_BY_USER
;
296 state_usage
->disable
&= ~CPUIDLE_STATE_DISABLED_BY_USER
;
301 static ssize_t
show_state_default_status(struct cpuidle_state
*state
,
302 struct cpuidle_state_usage
*state_usage
,
305 return sprintf(buf
, "%s\n",
306 state
->flags
& CPUIDLE_FLAG_OFF
? "disabled" : "enabled");
309 define_one_state_ro(name
, show_state_name
);
310 define_one_state_ro(desc
, show_state_desc
);
311 define_one_state_ro(latency
, show_state_exit_latency
);
312 define_one_state_ro(residency
, show_state_target_residency
);
313 define_one_state_ro(power
, show_state_power_usage
);
314 define_one_state_ro(usage
, show_state_usage
);
315 define_one_state_ro(time
, show_state_time
);
316 define_one_state_rw(disable
, show_state_disable
, store_state_disable
);
317 define_one_state_ro(above
, show_state_above
);
318 define_one_state_ro(below
, show_state_below
);
319 define_one_state_ro(default_status
, show_state_default_status
);
321 static struct attribute
*cpuidle_state_default_attrs
[] = {
325 &attr_residency
.attr
,
332 &attr_default_status
.attr
,
336 struct cpuidle_state_kobj
{
337 struct cpuidle_state
*state
;
338 struct cpuidle_state_usage
*state_usage
;
339 struct completion kobj_unregister
;
341 struct cpuidle_device
*device
;
344 #ifdef CONFIG_SUSPEND
345 #define define_show_state_s2idle_ull_function(_name) \
346 static ssize_t show_state_s2idle_##_name(struct cpuidle_state *state, \
347 struct cpuidle_state_usage *state_usage, \
350 return sprintf(buf, "%llu\n", state_usage->s2idle_##_name);\
353 define_show_state_s2idle_ull_function(usage
);
354 define_show_state_s2idle_ull_function(time
);
356 #define define_one_state_s2idle_ro(_name, show) \
357 static struct cpuidle_state_attr attr_s2idle_##_name = \
358 __ATTR(_name, 0444, show, NULL)
360 define_one_state_s2idle_ro(usage
, show_state_s2idle_usage
);
361 define_one_state_s2idle_ro(time
, show_state_s2idle_time
);
363 static struct attribute
*cpuidle_state_s2idle_attrs
[] = {
364 &attr_s2idle_usage
.attr
,
365 &attr_s2idle_time
.attr
,
369 static const struct attribute_group cpuidle_state_s2idle_group
= {
371 .attrs
= cpuidle_state_s2idle_attrs
,
374 static void cpuidle_add_s2idle_attr_group(struct cpuidle_state_kobj
*kobj
)
378 if (!kobj
->state
->enter_s2idle
)
381 ret
= sysfs_create_group(&kobj
->kobj
, &cpuidle_state_s2idle_group
);
383 pr_debug("%s: sysfs attribute group not created\n", __func__
);
386 static void cpuidle_remove_s2idle_attr_group(struct cpuidle_state_kobj
*kobj
)
388 if (kobj
->state
->enter_s2idle
)
389 sysfs_remove_group(&kobj
->kobj
, &cpuidle_state_s2idle_group
);
392 static inline void cpuidle_add_s2idle_attr_group(struct cpuidle_state_kobj
*kobj
) { }
393 static inline void cpuidle_remove_s2idle_attr_group(struct cpuidle_state_kobj
*kobj
) { }
394 #endif /* CONFIG_SUSPEND */
396 #define kobj_to_state_obj(k) container_of(k, struct cpuidle_state_kobj, kobj)
397 #define kobj_to_state(k) (kobj_to_state_obj(k)->state)
398 #define kobj_to_state_usage(k) (kobj_to_state_obj(k)->state_usage)
399 #define kobj_to_device(k) (kobj_to_state_obj(k)->device)
400 #define attr_to_stateattr(a) container_of(a, struct cpuidle_state_attr, attr)
402 static ssize_t
cpuidle_state_show(struct kobject
*kobj
, struct attribute
*attr
,
406 struct cpuidle_state
*state
= kobj_to_state(kobj
);
407 struct cpuidle_state_usage
*state_usage
= kobj_to_state_usage(kobj
);
408 struct cpuidle_state_attr
*cattr
= attr_to_stateattr(attr
);
411 ret
= cattr
->show(state
, state_usage
, buf
);
416 static ssize_t
cpuidle_state_store(struct kobject
*kobj
, struct attribute
*attr
,
417 const char *buf
, size_t size
)
420 struct cpuidle_state
*state
= kobj_to_state(kobj
);
421 struct cpuidle_state_usage
*state_usage
= kobj_to_state_usage(kobj
);
422 struct cpuidle_state_attr
*cattr
= attr_to_stateattr(attr
);
423 struct cpuidle_device
*dev
= kobj_to_device(kobj
);
426 ret
= cattr
->store(state
, state_usage
, buf
, size
);
428 /* reset poll time cache */
429 dev
->poll_limit_ns
= 0;
434 static const struct sysfs_ops cpuidle_state_sysfs_ops
= {
435 .show
= cpuidle_state_show
,
436 .store
= cpuidle_state_store
,
439 static void cpuidle_state_sysfs_release(struct kobject
*kobj
)
441 struct cpuidle_state_kobj
*state_obj
= kobj_to_state_obj(kobj
);
443 complete(&state_obj
->kobj_unregister
);
446 static struct kobj_type ktype_state_cpuidle
= {
447 .sysfs_ops
= &cpuidle_state_sysfs_ops
,
448 .default_attrs
= cpuidle_state_default_attrs
,
449 .release
= cpuidle_state_sysfs_release
,
452 static inline void cpuidle_free_state_kobj(struct cpuidle_device
*device
, int i
)
454 cpuidle_remove_s2idle_attr_group(device
->kobjs
[i
]);
455 kobject_put(&device
->kobjs
[i
]->kobj
);
456 wait_for_completion(&device
->kobjs
[i
]->kobj_unregister
);
457 kfree(device
->kobjs
[i
]);
458 device
->kobjs
[i
] = NULL
;
462 * cpuidle_add_state_sysfs - adds cpuidle states sysfs attributes
463 * @device: the target device
465 static int cpuidle_add_state_sysfs(struct cpuidle_device
*device
)
467 int i
, ret
= -ENOMEM
;
468 struct cpuidle_state_kobj
*kobj
;
469 struct cpuidle_device_kobj
*kdev
= device
->kobj_dev
;
470 struct cpuidle_driver
*drv
= cpuidle_get_cpu_driver(device
);
472 /* state statistics */
473 for (i
= 0; i
< drv
->state_count
; i
++) {
474 kobj
= kzalloc(sizeof(struct cpuidle_state_kobj
), GFP_KERNEL
);
479 kobj
->state
= &drv
->states
[i
];
480 kobj
->state_usage
= &device
->states_usage
[i
];
481 kobj
->device
= device
;
482 init_completion(&kobj
->kobj_unregister
);
484 ret
= kobject_init_and_add(&kobj
->kobj
, &ktype_state_cpuidle
,
485 &kdev
->kobj
, "state%d", i
);
487 kobject_put(&kobj
->kobj
);
490 cpuidle_add_s2idle_attr_group(kobj
);
491 kobject_uevent(&kobj
->kobj
, KOBJ_ADD
);
492 device
->kobjs
[i
] = kobj
;
498 for (i
= i
- 1; i
>= 0; i
--)
499 cpuidle_free_state_kobj(device
, i
);
504 * cpuidle_remove_driver_sysfs - removes the cpuidle states sysfs attributes
505 * @device: the target device
507 static void cpuidle_remove_state_sysfs(struct cpuidle_device
*device
)
509 struct cpuidle_driver
*drv
= cpuidle_get_cpu_driver(device
);
512 for (i
= 0; i
< drv
->state_count
; i
++)
513 cpuidle_free_state_kobj(device
, i
);
516 #ifdef CONFIG_CPU_IDLE_MULTIPLE_DRIVERS
517 #define kobj_to_driver_kobj(k) container_of(k, struct cpuidle_driver_kobj, kobj)
518 #define attr_to_driver_attr(a) container_of(a, struct cpuidle_driver_attr, attr)
520 #define define_one_driver_ro(_name, show) \
521 static struct cpuidle_driver_attr attr_driver_##_name = \
522 __ATTR(_name, 0444, show, NULL)
524 struct cpuidle_driver_kobj
{
525 struct cpuidle_driver
*drv
;
526 struct completion kobj_unregister
;
530 struct cpuidle_driver_attr
{
531 struct attribute attr
;
532 ssize_t (*show
)(struct cpuidle_driver
*, char *);
533 ssize_t (*store
)(struct cpuidle_driver
*, const char *, size_t);
536 static ssize_t
show_driver_name(struct cpuidle_driver
*drv
, char *buf
)
540 spin_lock(&cpuidle_driver_lock
);
541 ret
= sprintf(buf
, "%s\n", drv
? drv
->name
: "none");
542 spin_unlock(&cpuidle_driver_lock
);
547 static void cpuidle_driver_sysfs_release(struct kobject
*kobj
)
549 struct cpuidle_driver_kobj
*driver_kobj
= kobj_to_driver_kobj(kobj
);
550 complete(&driver_kobj
->kobj_unregister
);
553 static ssize_t
cpuidle_driver_show(struct kobject
*kobj
, struct attribute
*attr
,
557 struct cpuidle_driver_kobj
*driver_kobj
= kobj_to_driver_kobj(kobj
);
558 struct cpuidle_driver_attr
*dattr
= attr_to_driver_attr(attr
);
561 ret
= dattr
->show(driver_kobj
->drv
, buf
);
566 static ssize_t
cpuidle_driver_store(struct kobject
*kobj
, struct attribute
*attr
,
567 const char *buf
, size_t size
)
570 struct cpuidle_driver_kobj
*driver_kobj
= kobj_to_driver_kobj(kobj
);
571 struct cpuidle_driver_attr
*dattr
= attr_to_driver_attr(attr
);
574 ret
= dattr
->store(driver_kobj
->drv
, buf
, size
);
579 define_one_driver_ro(name
, show_driver_name
);
581 static const struct sysfs_ops cpuidle_driver_sysfs_ops
= {
582 .show
= cpuidle_driver_show
,
583 .store
= cpuidle_driver_store
,
586 static struct attribute
*cpuidle_driver_default_attrs
[] = {
587 &attr_driver_name
.attr
,
591 static struct kobj_type ktype_driver_cpuidle
= {
592 .sysfs_ops
= &cpuidle_driver_sysfs_ops
,
593 .default_attrs
= cpuidle_driver_default_attrs
,
594 .release
= cpuidle_driver_sysfs_release
,
598 * cpuidle_add_driver_sysfs - adds the driver name sysfs attribute
599 * @dev: the target device
601 static int cpuidle_add_driver_sysfs(struct cpuidle_device
*dev
)
603 struct cpuidle_driver_kobj
*kdrv
;
604 struct cpuidle_device_kobj
*kdev
= dev
->kobj_dev
;
605 struct cpuidle_driver
*drv
= cpuidle_get_cpu_driver(dev
);
608 kdrv
= kzalloc(sizeof(*kdrv
), GFP_KERNEL
);
613 init_completion(&kdrv
->kobj_unregister
);
615 ret
= kobject_init_and_add(&kdrv
->kobj
, &ktype_driver_cpuidle
,
616 &kdev
->kobj
, "driver");
618 kobject_put(&kdrv
->kobj
);
622 kobject_uevent(&kdrv
->kobj
, KOBJ_ADD
);
623 dev
->kobj_driver
= kdrv
;
629 * cpuidle_remove_driver_sysfs - removes the driver name sysfs attribute
630 * @dev: the target device
632 static void cpuidle_remove_driver_sysfs(struct cpuidle_device
*dev
)
634 struct cpuidle_driver_kobj
*kdrv
= dev
->kobj_driver
;
635 kobject_put(&kdrv
->kobj
);
636 wait_for_completion(&kdrv
->kobj_unregister
);
640 static inline int cpuidle_add_driver_sysfs(struct cpuidle_device
*dev
)
645 static inline void cpuidle_remove_driver_sysfs(struct cpuidle_device
*dev
)
652 * cpuidle_add_device_sysfs - adds device specific sysfs attributes
653 * @device: the target device
655 int cpuidle_add_device_sysfs(struct cpuidle_device
*device
)
659 ret
= cpuidle_add_state_sysfs(device
);
663 ret
= cpuidle_add_driver_sysfs(device
);
665 cpuidle_remove_state_sysfs(device
);
670 * cpuidle_remove_device_sysfs : removes device specific sysfs attributes
671 * @device : the target device
673 void cpuidle_remove_device_sysfs(struct cpuidle_device
*device
)
675 cpuidle_remove_driver_sysfs(device
);
676 cpuidle_remove_state_sysfs(device
);
680 * cpuidle_add_sysfs - creates a sysfs instance for the target device
681 * @dev: the target device
683 int cpuidle_add_sysfs(struct cpuidle_device
*dev
)
685 struct cpuidle_device_kobj
*kdev
;
686 struct device
*cpu_dev
= get_cpu_device((unsigned long)dev
->cpu
);
690 * Return if cpu_device is not setup for this CPU.
692 * This could happen if the arch did not set up cpu_device
693 * since this CPU is not in cpu_present mask and the
694 * driver did not send a correct CPU mask during registration.
695 * Without this check we would end up passing bogus
696 * value for &cpu_dev->kobj in kobject_init_and_add()
701 kdev
= kzalloc(sizeof(*kdev
), GFP_KERNEL
);
705 dev
->kobj_dev
= kdev
;
707 init_completion(&kdev
->kobj_unregister
);
709 error
= kobject_init_and_add(&kdev
->kobj
, &ktype_cpuidle
, &cpu_dev
->kobj
,
712 kobject_put(&kdev
->kobj
);
716 kobject_uevent(&kdev
->kobj
, KOBJ_ADD
);
722 * cpuidle_remove_sysfs - deletes a sysfs instance on the target device
723 * @dev: the target device
725 void cpuidle_remove_sysfs(struct cpuidle_device
*dev
)
727 struct cpuidle_device_kobj
*kdev
= dev
->kobj_dev
;
729 kobject_put(&kdev
->kobj
);
730 wait_for_completion(&kdev
->kobj_unregister
);