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_ull_function(rejected
)
260 define_show_state_str_function(name
)
261 define_show_state_str_function(desc
)
262 define_show_state_ull_function(above
)
263 define_show_state_ull_function(below
)
265 static ssize_t
show_state_time(struct cpuidle_state
*state
,
266 struct cpuidle_state_usage
*state_usage
,
269 return sprintf(buf
, "%llu\n", ktime_to_us(state_usage
->time_ns
));
272 static ssize_t
show_state_disable(struct cpuidle_state
*state
,
273 struct cpuidle_state_usage
*state_usage
,
276 return sprintf(buf
, "%llu\n",
277 state_usage
->disable
& CPUIDLE_STATE_DISABLED_BY_USER
);
280 static ssize_t
store_state_disable(struct cpuidle_state
*state
,
281 struct cpuidle_state_usage
*state_usage
,
282 const char *buf
, size_t size
)
287 if (!capable(CAP_SYS_ADMIN
))
290 err
= kstrtouint(buf
, 0, &value
);
295 state_usage
->disable
|= CPUIDLE_STATE_DISABLED_BY_USER
;
297 state_usage
->disable
&= ~CPUIDLE_STATE_DISABLED_BY_USER
;
302 static ssize_t
show_state_default_status(struct cpuidle_state
*state
,
303 struct cpuidle_state_usage
*state_usage
,
306 return sprintf(buf
, "%s\n",
307 state
->flags
& CPUIDLE_FLAG_OFF
? "disabled" : "enabled");
310 define_one_state_ro(name
, show_state_name
);
311 define_one_state_ro(desc
, show_state_desc
);
312 define_one_state_ro(latency
, show_state_exit_latency
);
313 define_one_state_ro(residency
, show_state_target_residency
);
314 define_one_state_ro(power
, show_state_power_usage
);
315 define_one_state_ro(usage
, show_state_usage
);
316 define_one_state_ro(rejected
, show_state_rejected
);
317 define_one_state_ro(time
, show_state_time
);
318 define_one_state_rw(disable
, show_state_disable
, store_state_disable
);
319 define_one_state_ro(above
, show_state_above
);
320 define_one_state_ro(below
, show_state_below
);
321 define_one_state_ro(default_status
, show_state_default_status
);
323 static struct attribute
*cpuidle_state_default_attrs
[] = {
327 &attr_residency
.attr
,
335 &attr_default_status
.attr
,
339 struct cpuidle_state_kobj
{
340 struct cpuidle_state
*state
;
341 struct cpuidle_state_usage
*state_usage
;
342 struct completion kobj_unregister
;
344 struct cpuidle_device
*device
;
347 #ifdef CONFIG_SUSPEND
348 #define define_show_state_s2idle_ull_function(_name) \
349 static ssize_t show_state_s2idle_##_name(struct cpuidle_state *state, \
350 struct cpuidle_state_usage *state_usage, \
353 return sprintf(buf, "%llu\n", state_usage->s2idle_##_name);\
356 define_show_state_s2idle_ull_function(usage
);
357 define_show_state_s2idle_ull_function(time
);
359 #define define_one_state_s2idle_ro(_name, show) \
360 static struct cpuidle_state_attr attr_s2idle_##_name = \
361 __ATTR(_name, 0444, show, NULL)
363 define_one_state_s2idle_ro(usage
, show_state_s2idle_usage
);
364 define_one_state_s2idle_ro(time
, show_state_s2idle_time
);
366 static struct attribute
*cpuidle_state_s2idle_attrs
[] = {
367 &attr_s2idle_usage
.attr
,
368 &attr_s2idle_time
.attr
,
372 static const struct attribute_group cpuidle_state_s2idle_group
= {
374 .attrs
= cpuidle_state_s2idle_attrs
,
377 static void cpuidle_add_s2idle_attr_group(struct cpuidle_state_kobj
*kobj
)
381 if (!kobj
->state
->enter_s2idle
)
384 ret
= sysfs_create_group(&kobj
->kobj
, &cpuidle_state_s2idle_group
);
386 pr_debug("%s: sysfs attribute group not created\n", __func__
);
389 static void cpuidle_remove_s2idle_attr_group(struct cpuidle_state_kobj
*kobj
)
391 if (kobj
->state
->enter_s2idle
)
392 sysfs_remove_group(&kobj
->kobj
, &cpuidle_state_s2idle_group
);
395 static inline void cpuidle_add_s2idle_attr_group(struct cpuidle_state_kobj
*kobj
) { }
396 static inline void cpuidle_remove_s2idle_attr_group(struct cpuidle_state_kobj
*kobj
) { }
397 #endif /* CONFIG_SUSPEND */
399 #define kobj_to_state_obj(k) container_of(k, struct cpuidle_state_kobj, kobj)
400 #define kobj_to_state(k) (kobj_to_state_obj(k)->state)
401 #define kobj_to_state_usage(k) (kobj_to_state_obj(k)->state_usage)
402 #define kobj_to_device(k) (kobj_to_state_obj(k)->device)
403 #define attr_to_stateattr(a) container_of(a, struct cpuidle_state_attr, attr)
405 static ssize_t
cpuidle_state_show(struct kobject
*kobj
, struct attribute
*attr
,
409 struct cpuidle_state
*state
= kobj_to_state(kobj
);
410 struct cpuidle_state_usage
*state_usage
= kobj_to_state_usage(kobj
);
411 struct cpuidle_state_attr
*cattr
= attr_to_stateattr(attr
);
414 ret
= cattr
->show(state
, state_usage
, buf
);
419 static ssize_t
cpuidle_state_store(struct kobject
*kobj
, struct attribute
*attr
,
420 const char *buf
, size_t size
)
423 struct cpuidle_state
*state
= kobj_to_state(kobj
);
424 struct cpuidle_state_usage
*state_usage
= kobj_to_state_usage(kobj
);
425 struct cpuidle_state_attr
*cattr
= attr_to_stateattr(attr
);
426 struct cpuidle_device
*dev
= kobj_to_device(kobj
);
429 ret
= cattr
->store(state
, state_usage
, buf
, size
);
431 /* reset poll time cache */
432 dev
->poll_limit_ns
= 0;
437 static const struct sysfs_ops cpuidle_state_sysfs_ops
= {
438 .show
= cpuidle_state_show
,
439 .store
= cpuidle_state_store
,
442 static void cpuidle_state_sysfs_release(struct kobject
*kobj
)
444 struct cpuidle_state_kobj
*state_obj
= kobj_to_state_obj(kobj
);
446 complete(&state_obj
->kobj_unregister
);
449 static struct kobj_type ktype_state_cpuidle
= {
450 .sysfs_ops
= &cpuidle_state_sysfs_ops
,
451 .default_attrs
= cpuidle_state_default_attrs
,
452 .release
= cpuidle_state_sysfs_release
,
455 static inline void cpuidle_free_state_kobj(struct cpuidle_device
*device
, int i
)
457 cpuidle_remove_s2idle_attr_group(device
->kobjs
[i
]);
458 kobject_put(&device
->kobjs
[i
]->kobj
);
459 wait_for_completion(&device
->kobjs
[i
]->kobj_unregister
);
460 kfree(device
->kobjs
[i
]);
461 device
->kobjs
[i
] = NULL
;
465 * cpuidle_add_state_sysfs - adds cpuidle states sysfs attributes
466 * @device: the target device
468 static int cpuidle_add_state_sysfs(struct cpuidle_device
*device
)
470 int i
, ret
= -ENOMEM
;
471 struct cpuidle_state_kobj
*kobj
;
472 struct cpuidle_device_kobj
*kdev
= device
->kobj_dev
;
473 struct cpuidle_driver
*drv
= cpuidle_get_cpu_driver(device
);
475 /* state statistics */
476 for (i
= 0; i
< drv
->state_count
; i
++) {
477 kobj
= kzalloc(sizeof(struct cpuidle_state_kobj
), GFP_KERNEL
);
482 kobj
->state
= &drv
->states
[i
];
483 kobj
->state_usage
= &device
->states_usage
[i
];
484 kobj
->device
= device
;
485 init_completion(&kobj
->kobj_unregister
);
487 ret
= kobject_init_and_add(&kobj
->kobj
, &ktype_state_cpuidle
,
488 &kdev
->kobj
, "state%d", i
);
490 kobject_put(&kobj
->kobj
);
493 cpuidle_add_s2idle_attr_group(kobj
);
494 kobject_uevent(&kobj
->kobj
, KOBJ_ADD
);
495 device
->kobjs
[i
] = kobj
;
501 for (i
= i
- 1; i
>= 0; i
--)
502 cpuidle_free_state_kobj(device
, i
);
507 * cpuidle_remove_driver_sysfs - removes the cpuidle states sysfs attributes
508 * @device: the target device
510 static void cpuidle_remove_state_sysfs(struct cpuidle_device
*device
)
512 struct cpuidle_driver
*drv
= cpuidle_get_cpu_driver(device
);
515 for (i
= 0; i
< drv
->state_count
; i
++)
516 cpuidle_free_state_kobj(device
, i
);
519 #ifdef CONFIG_CPU_IDLE_MULTIPLE_DRIVERS
520 #define kobj_to_driver_kobj(k) container_of(k, struct cpuidle_driver_kobj, kobj)
521 #define attr_to_driver_attr(a) container_of(a, struct cpuidle_driver_attr, attr)
523 #define define_one_driver_ro(_name, show) \
524 static struct cpuidle_driver_attr attr_driver_##_name = \
525 __ATTR(_name, 0444, show, NULL)
527 struct cpuidle_driver_kobj
{
528 struct cpuidle_driver
*drv
;
529 struct completion kobj_unregister
;
533 struct cpuidle_driver_attr
{
534 struct attribute attr
;
535 ssize_t (*show
)(struct cpuidle_driver
*, char *);
536 ssize_t (*store
)(struct cpuidle_driver
*, const char *, size_t);
539 static ssize_t
show_driver_name(struct cpuidle_driver
*drv
, char *buf
)
543 spin_lock(&cpuidle_driver_lock
);
544 ret
= sprintf(buf
, "%s\n", drv
? drv
->name
: "none");
545 spin_unlock(&cpuidle_driver_lock
);
550 static void cpuidle_driver_sysfs_release(struct kobject
*kobj
)
552 struct cpuidle_driver_kobj
*driver_kobj
= kobj_to_driver_kobj(kobj
);
553 complete(&driver_kobj
->kobj_unregister
);
556 static ssize_t
cpuidle_driver_show(struct kobject
*kobj
, struct attribute
*attr
,
560 struct cpuidle_driver_kobj
*driver_kobj
= kobj_to_driver_kobj(kobj
);
561 struct cpuidle_driver_attr
*dattr
= attr_to_driver_attr(attr
);
564 ret
= dattr
->show(driver_kobj
->drv
, buf
);
569 static ssize_t
cpuidle_driver_store(struct kobject
*kobj
, struct attribute
*attr
,
570 const char *buf
, size_t size
)
573 struct cpuidle_driver_kobj
*driver_kobj
= kobj_to_driver_kobj(kobj
);
574 struct cpuidle_driver_attr
*dattr
= attr_to_driver_attr(attr
);
577 ret
= dattr
->store(driver_kobj
->drv
, buf
, size
);
582 define_one_driver_ro(name
, show_driver_name
);
584 static const struct sysfs_ops cpuidle_driver_sysfs_ops
= {
585 .show
= cpuidle_driver_show
,
586 .store
= cpuidle_driver_store
,
589 static struct attribute
*cpuidle_driver_default_attrs
[] = {
590 &attr_driver_name
.attr
,
594 static struct kobj_type ktype_driver_cpuidle
= {
595 .sysfs_ops
= &cpuidle_driver_sysfs_ops
,
596 .default_attrs
= cpuidle_driver_default_attrs
,
597 .release
= cpuidle_driver_sysfs_release
,
601 * cpuidle_add_driver_sysfs - adds the driver name sysfs attribute
602 * @dev: the target device
604 static int cpuidle_add_driver_sysfs(struct cpuidle_device
*dev
)
606 struct cpuidle_driver_kobj
*kdrv
;
607 struct cpuidle_device_kobj
*kdev
= dev
->kobj_dev
;
608 struct cpuidle_driver
*drv
= cpuidle_get_cpu_driver(dev
);
611 kdrv
= kzalloc(sizeof(*kdrv
), GFP_KERNEL
);
616 init_completion(&kdrv
->kobj_unregister
);
618 ret
= kobject_init_and_add(&kdrv
->kobj
, &ktype_driver_cpuidle
,
619 &kdev
->kobj
, "driver");
621 kobject_put(&kdrv
->kobj
);
625 kobject_uevent(&kdrv
->kobj
, KOBJ_ADD
);
626 dev
->kobj_driver
= kdrv
;
632 * cpuidle_remove_driver_sysfs - removes the driver name sysfs attribute
633 * @dev: the target device
635 static void cpuidle_remove_driver_sysfs(struct cpuidle_device
*dev
)
637 struct cpuidle_driver_kobj
*kdrv
= dev
->kobj_driver
;
638 kobject_put(&kdrv
->kobj
);
639 wait_for_completion(&kdrv
->kobj_unregister
);
643 static inline int cpuidle_add_driver_sysfs(struct cpuidle_device
*dev
)
648 static inline void cpuidle_remove_driver_sysfs(struct cpuidle_device
*dev
)
655 * cpuidle_add_device_sysfs - adds device specific sysfs attributes
656 * @device: the target device
658 int cpuidle_add_device_sysfs(struct cpuidle_device
*device
)
662 ret
= cpuidle_add_state_sysfs(device
);
666 ret
= cpuidle_add_driver_sysfs(device
);
668 cpuidle_remove_state_sysfs(device
);
673 * cpuidle_remove_device_sysfs : removes device specific sysfs attributes
674 * @device : the target device
676 void cpuidle_remove_device_sysfs(struct cpuidle_device
*device
)
678 cpuidle_remove_driver_sysfs(device
);
679 cpuidle_remove_state_sysfs(device
);
683 * cpuidle_add_sysfs - creates a sysfs instance for the target device
684 * @dev: the target device
686 int cpuidle_add_sysfs(struct cpuidle_device
*dev
)
688 struct cpuidle_device_kobj
*kdev
;
689 struct device
*cpu_dev
= get_cpu_device((unsigned long)dev
->cpu
);
693 * Return if cpu_device is not setup for this CPU.
695 * This could happen if the arch did not set up cpu_device
696 * since this CPU is not in cpu_present mask and the
697 * driver did not send a correct CPU mask during registration.
698 * Without this check we would end up passing bogus
699 * value for &cpu_dev->kobj in kobject_init_and_add()
704 kdev
= kzalloc(sizeof(*kdev
), GFP_KERNEL
);
708 dev
->kobj_dev
= kdev
;
710 init_completion(&kdev
->kobj_unregister
);
712 error
= kobject_init_and_add(&kdev
->kobj
, &ktype_cpuidle
, &cpu_dev
->kobj
,
715 kobject_put(&kdev
->kobj
);
719 kobject_uevent(&kdev
->kobj
, KOBJ_ADD
);
725 * cpuidle_remove_sysfs - deletes a sysfs instance on the target device
726 * @dev: the target device
728 void cpuidle_remove_sysfs(struct cpuidle_device
*dev
)
730 struct cpuidle_device_kobj
*kdev
= dev
->kobj_dev
;
732 kobject_put(&kdev
->kobj
);
733 wait_for_completion(&kdev
->kobj_unregister
);