diff --git a/include/hardware/power.h b/include/hardware/power.h index cc6f5b93..c451d670 100644 --- a/include/hardware/power.h +++ b/include/hardware/power.h @@ -17,6 +17,7 @@ #ifndef ANDROID_INCLUDE_HARDWARE_POWER_H #define ANDROID_INCLUDE_HARDWARE_POWER_H +#include #include #include #include @@ -29,12 +30,25 @@ __BEGIN_DECLS #define POWER_MODULE_API_VERSION_0_2 HARDWARE_MODULE_API_VERSION(0, 2) #define POWER_MODULE_API_VERSION_0_3 HARDWARE_MODULE_API_VERSION(0, 3) #define POWER_MODULE_API_VERSION_0_4 HARDWARE_MODULE_API_VERSION(0, 4) +#define POWER_MODULE_API_VERSION_0_5 HARDWARE_MODULE_API_VERSION(0, 5) /** * The id of this module */ #define POWER_HARDWARE_MODULE_ID "power" +/* + * Platform-level sleep state stats. + * Maximum length of Platform-level sleep state name. + */ +#define POWER_STATE_NAME_MAX_LENGTH 100 + +/* + * Platform-level sleep state stats. + * Maximum length of Platform-level sleep state voter name. + */ +#define POWER_STATE_VOTER_NAME_MAX_LENGTH 100 + /* * Power hint identifiers passed to (*powerHint) */ @@ -56,6 +70,91 @@ typedef enum { POWER_FEATURE_DOUBLE_TAP_TO_WAKE = 0x00000001 } feature_t; +/* + * Platform-level sleep state stats: + * power_state_voter_t struct is useful for describing the individual voters when a + * Platform-level sleep state is chosen by aggregation of votes from multiple + * clients/system conditions. + * + * This helps in attirbuting what in the device is blocking the device from + * entering the lowest Platform-level sleep state. + */ +typedef struct { + /* + * Name of the voter. + */ + char name[POWER_STATE_VOTER_NAME_MAX_LENGTH]; + + /* + * Total time in msec the voter voted for the platform sleep state since boot. + */ + uint64_t total_time_in_msec_voted_for_since_boot; + + /* + * Number of times the voter voted for the platform sleep state since boot. + */ + uint64_t total_number_of_times_voted_since_boot; +} power_state_voter_t; + +/* + * Platform-level sleep state stats: + * power_state_platform_sleep_state_t represents the Platform-level sleep state the + * device is capable of getting into. + * + * SoCs usually have more than one Platform-level sleep state. + * + * The caller calls the get_number_of_platform_modes function to figure out the size + * of power_state_platform_sleep_state_t array where each array element represents + * a specific Platform-level sleep state. + * + * Higher the index deeper the state is i.e. lesser steady-state power is consumed + * by the platform to be resident in that state. + * + * Caller allocates power_state_voter_t *voters for each Platform-level sleep state by + * calling get_voter_list. + */ +typedef struct { + /* + * Platform-level Sleep state name. + */ + char name[POWER_STATE_NAME_MAX_LENGTH]; + + /* + * Time spent in msec at this platform-level sleep state since boot. + */ + uint64_t residency_in_msec_since_boot; + + /* + * Total number of times system entered this state. + */ + uint64_t total_transitions; + + /* + * This platform-level sleep state can only be reached during system suspend. + */ + bool supported_only_in_suspend; + + /* + * The following fields are useful if the Platform-level sleep state + * is chosen by aggregation votes from multiple clients/system conditions. + * All the voters have to say yes or all the system conditions need to be + * met to enter a platform-level sleep state. + * + * Setting number_of_voters to zero implies either the info is not available + * or the system does not follow a voting mechanism to choose this + * Platform-level sleep state. + */ + uint32_t number_of_voters; + + /* + * Voter list - Has to be allocated by the caller. + * + * Caller allocates power_state_voter_t *voters for each Platform-level sleep state + * by calling get_voter_list. + */ + power_state_voter_t *voters; +} power_state_platform_sleep_state_t; + /** * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM * and the fields of this data structure must begin with hw_module_t @@ -69,6 +168,10 @@ typedef struct power_module { * startup, such as to set default cpufreq parameters. This is * called only by the Power HAL instance loaded by * PowerManagerService. + * + * Platform-level sleep state stats: + * Can Also be used to initiate device specific Platform-level + * Sleep state nodes from version 0.5 onwards. */ void (*init)(struct power_module *module); @@ -166,6 +269,62 @@ typedef struct power_module { */ void (*setFeature)(struct power_module *module, feature_t feature, int state); + /* + * Platform-level sleep state stats: + * Report cumulative info on the statistics on platform-level sleep states since boot. + * + * Caller of the function queries the get_number_of_sleep_states and allocates the + * memory for the power_state_platform_sleep_state_t *list before calling this function. + * + * power_stats module is responsible to assign values to all the fields as + * necessary. + * + * Higher the index deeper the state is i.e. lesser steady-state power is consumed + * by the platform to be resident in that state. + * + * The function returns 0 on success or negative value -errno on error. + * EINVAL - *list is NULL. + * EIO - filesystem nodes access error. + * + * availability: version 0.5 + */ + int (*get_platform_low_power_stats)(struct power_module *module, + power_state_platform_sleep_state_t *list); + + /* + * Platform-level sleep state stats: + * This function is called to determine the number of platform-level sleep states + * for get_platform_low_power_stats. + * + * The value returned by this function is used to allocate memory for + * power_state_platform_sleep_state_t *list for get_platform_low_power_stats. + * + * The number of parameters must not change for successive calls. + * + * Return number of parameters on success or negative value -errno on error. + * EIO - filesystem nodes access error. + * + * availability: version 0.5 + */ + ssize_t (*get_number_of_platform_modes)(struct power_module *module); + + /* + * Platform-level sleep state stats: + * Provides the number of voters for each of the Platform-level sleep state. + * + * Caller uses this function to allocate memory for the power_state_voter_t list. + * + * Caller has to allocate the space for the *voter array which is + * get_number_of_platform_modes() long. + * + * Return 0 on success or negative value -errno on error. + * EINVAL - *voter is NULL. + * EIO - filesystem nodes access error. + * + * availability: version 0.5 + */ + int (*get_voter_list)(struct power_module *module, size_t *voter); + } power_module_t;