PowerOP, PowerOP Core, 1/2
Subsystems (3)
PATCH 1/1 PowerOP, PowerOP Core, 1/2
The PowerOP Core provides completely arch independent interface to create and control operating points which consist of arbitrary subset of power parameters available on a certain platform. Also, PowerOP Core provides optional SysFS interface to access operating point from userspace.
Documentation/powerop.txt new file +62 -0
@@ -0,0 +1,62 @@ +Introduction + +The PowerOP Core provides completely arch independent interface +to create and control operating points which consist of arbitrary +subset of power parameters available on a certain platform. + +PowerOP Core upper layer interface provides the following capabilities: +- to register an operating point by passing an identifier of the point +represented by a string and arbitrary subset of power parameters available on a +certain platform by a string (parameter name) and value pairs. +- to unregister operating point by name +- to set operating point by name +- to get and set values of arbitrary subset of platform power parameters + associated this a point (point is passed by name or NULL to get current + parameter values from hw) + +SysFS Interface + +- _optional_ SysFS interface. If SysFs interface is enabled each operating point +registered with PowerOP core appears under /sys/power/. /sys/power/<op>/ will +contain an attribute for each power parameter. Power parameters are rw. An +operating point may be activated by writing its name to /sys/power/active. The +hardware power parameters currently set may be read via /sys/power/hw/, a +special operating point that reads parameter attribute values from hardware, for +diagnostic purposes. +Operating points creation with help of SysFS interface is _optional_ +_configurable_ feature. Operating points are created by writing the name of the +operating point to /sys/power/new. This may be a job for configfs. + +NOTE: PowerOP cpufreq integration does _not_ change cpufreq user interface - +it remains _exactly_ the same. Please see PowerOP cpufreq integration patch +set. + +Overview + +PowerOP get and register point APIs use name/value pairs for the power +parameters which eliminate the need for data structure sharing between +the PM core and consumers of the PowerOP API. + +This also enables a variable argument list for the registration and get +APIs. Some operating points may only need to work with a subset of the +power parameters. In this case the creator of the operating point only +needs to provide the name/value pair for the parameters required for +that point. The rest are set to a don't care value by the internals. + +PowerOP is a building block for power management on systems that have a +large set of power parameter that can adjusted to maximize power and +operational efficiency. Mobile consumer devices are examples of these +systems that require the PowerOP features. However, PowerOP works +just as well on systems with one or two parameters. The API allows the +h/w layer to define what parameters are available on that platform. + +Operating points can be registered at anytime. Registration can occur +from a architecture init-call, loadable kernel module or some other +layer. Operating point registration notifiers are provided for layers, +such as cpufreq, that could take advantage of new operating +points that become available or just need to know when operating points +are loaded. + +PowerOP continues to support in kernel governor concepts from cpufreq as well +as userspace policy managers. +
include/linux/powerop.h new file +58 -0
58 lines not on this page · raw message
include/linux/powerop_sysfs.h new file +35 -0
@@ -0,0 +1,35 @@ +/* +* PowerOP SysFS interface to register power parameter names available on +* a platform +* +* Author: Eugeny S. Mints <[email protected]> +* +* 2006 (C) Nomad Global Solutions, Inc. This file is licensed under +* the terms of the GNU General Public License version 2. This program +* is licensed "as is" without any warranty of any kind, whether express +* or implied. +*/ + +#ifndef __POWEROP_SYSFS_H__ +#define __POWEROP_SYSFS_H__ + +#ifdef CONFIG_POWEROP_SYSFS + +#include <linux/sysfs.h> + +int powerop_sysfs_register_pwr_params (struct attribute **param_attrs); +void powerop_sysfs_unregister_pwr_params (struct attribute **param_attrs); +#else +static inline int +powerop_sysfs_register_pwr_params (struct attribute **param_attrs) +{ +return 0 ; +} + +static inline void +powerop_sysfs_unregister_pwr_params (struct attribute **param_attrs) +{ +} +#endif /* CONFIG_POWEROP_SYSFS */ + +#endif /*__POWEROP_SYSFS_H__*/
kernel/power/Kconfig +28 -0
@@ -130,3 +130,31 @@ config SUSPEND_SMP bool depends on HOTPLUG_CPU && X86 && PM default y + +# +# powerop +# + +menu "PowerOP (Power Management)" + +config POWEROP + tristate "PowerOP Core" + help + +config POWEROP_SYSFS + bool "Enable PowerOP sysfs interface" + depends on PM && POWEROP && SYSFS + help + +config POWEROP_SYSFS_OP_CREATE + bool "Enable creation of operating point via sysfs interface" + depends on POWEROP_SYSFS + help + +config POWEROP_SYSFS_OP_DEBUG_IF + bool "Enable special hw operating point" + depends on POWEROP_SYSFS + help + "hw point(ro) is used to get snapshots of power parameter values" + +endmenu
kernel/power/Makefile +9 -0
@@ -8,3 +8,12 @@ obj-$(CONFIG_PM_LEGACY) += pm.o obj-$(CONFIG_SOFTWARE_SUSPEND) += swsusp.o disk.o snapshot.o swap.o user.o obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o + +# PowerOP + +powerop-pm-objs := powerop.o +ifeq ($(CONFIG_POWEROP_SYSFS),y) + powerop-pm-objs += powerop_sysfs.o +endif + +obj-$(CONFIG_POWEROP) += powerop-pm.o
kernel/power/main.c +2 -2
@@ -18,7 +18,7 @@ #include <linux/pm.h>#include <linux/console.h> #include <linux/cpu.h> #include <linux/resume-trace.h> - +#include <linux/module.h> #include "power.h" /*This is just an arbitrary number */
@@ -232,7 +232,7 @@ int pm_suspend(suspend_state_t state)decl_subsys (power,NULL ,NULL ); - +EXPORT_SYMBOL_GPL (power_subsys);/** * state - control system power state.
kernel/power/powerop.c new file +439 -0
439 lines not on this page · raw message
kernel/power/powerop_point.h new file +36 -0
@@ -0,0 +1,36 @@ +/* +* PowerOP core non-public header +* +* Author: Eugeny S. Mints <[email protected]> +* +* 2006 (C) Nomad Global Solutions, Inc. This file is licensed under +* the terms of the GNU General Public License version 2. This program +* is licensed "as is" without any warranty of any kind, whether express +* or implied. +* +* Based on ideas and code by Todd Poynor <[email protected]> +*/ +#ifndef __POWEROP_INT_H__ +#define __POWEROP_INT_H__ + +#define POWEROP_MAX_OPT_NAME_LENGTH 32 + +/** +* struct powerop_point - PowerOP Core representation of operating point +* @kobj: hook to reference an operating point in some arch independent way +* (for ex. sysfs) +* @md_opt: pointer to opaque arch dependent set of power parameters +* +*/ +struct powerop_point { +struct kobject kobj; +void *md_opt; +struct list_head node; +#ifdef CONFIG_POWEROP_SYSFS +struct completion released; +#endif +}; + +#define to_namedop (_kobj) container_of(_kobj, struct powerop_point, kobj) + +#endif /* __POWEROP_INT_H__ */
kernel/power/powerop_sysfs.c new file +255 -0
255 lines not on this page · raw message
kernel/power/powerop_sysfs_point.h new file +42 -0
42 lines not on this page · raw message