linux/include/linux/powercap.h
<<
>>
Prefs
   1/*
   2 * powercap.h: Data types and headers for sysfs power capping interface
   3 * Copyright (c) 2013, Intel Corporation.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms and conditions of the GNU General Public License,
   7 * version 2, as published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  12 * more details.
  13 *
  14 * You should have received a copy of the GNU General Public License along with
  15 * this program; if not, write to the Free Software Foundation, Inc.
  16 *
  17 */
  18
  19#ifndef __POWERCAP_H__
  20#define __POWERCAP_H__
  21
  22#include <linux/device.h>
  23#include <linux/idr.h>
  24
  25/*
  26 * A power cap class device can contain multiple powercap control_types.
  27 * Each control_type can have multiple power zones, which can be independently
  28 * controlled. Each power zone can have one or more constraints.
  29 */
  30
  31struct powercap_control_type;
  32struct powercap_zone;
  33struct powercap_zone_constraint;
  34
  35/**
  36 * struct powercap_control_type_ops - Define control type callbacks
  37 * @set_enable:         Enable/Disable whole control type.
  38 *                      Default is enabled. But this callback allows all zones
  39 *                      to be in disable state and remove any applied power
  40 *                      limits. If disabled power zone can only be monitored
  41 *                      not controlled.
  42 * @get_enable:         get Enable/Disable status.
  43 * @release:            Callback to inform that last reference to this
  44 *                      control type is closed. So it is safe to free data
  45 *                      structure associated with this control type.
  46 *                      This callback is mandatory if the client own memory
  47 *                      for the control type.
  48 *
  49 * This structure defines control type callbacks to be implemented by client
  50 * drivers
  51 */
  52struct powercap_control_type_ops {
  53        int (*set_enable) (struct powercap_control_type *, bool mode);
  54        int (*get_enable) (struct powercap_control_type *, bool *mode);
  55        int (*release) (struct powercap_control_type *);
  56};
  57
  58/**
  59 * struct powercap_control_type- Defines a powercap control_type
  60 * @name:               name of control_type
  61 * @dev:                device for this control_type
  62 * @idr:                idr to have unique id for its child
  63 * @root_node:          Root holding power zones for this control_type
  64 * @ops:                Pointer to callback struct
  65 * @node_lock:          mutex for control type
  66 * @allocated:          This is possible that client owns the memory
  67 *                      used by this structure. In this case
  68 *                      this flag is set to false by framework to
  69 *                      prevent deallocation during release process.
  70 *                      Otherwise this flag is set to true.
  71 * @ctrl_inst:          link to the control_type list
  72 *
  73 * Defines powercap control_type. This acts as a container for power
  74 * zones, which use same method to control power. E.g. RAPL, RAPL-PCI etc.
  75 * All fields are private and should not be used by client drivers.
  76 */
  77struct powercap_control_type {
  78        struct device dev;
  79        struct idr idr;
  80        int nr_zones;
  81        const struct powercap_control_type_ops *ops;
  82        struct mutex lock;
  83        bool allocated;
  84        struct list_head node;
  85};
  86
  87/**
  88 * struct powercap_zone_ops - Define power zone callbacks
  89 * @get_max_energy_range_uj:    Get maximum range of energy counter in
  90 *                              micro-joules.
  91 * @get_energy_uj:              Get current energy counter in micro-joules.
  92 * @reset_energy_uj:            Reset micro-joules energy counter.
  93 * @get_max_power_range_uw:     Get maximum range of power counter in
  94 *                              micro-watts.
  95 * @get_power_uw:               Get current power counter in micro-watts.
  96 * @set_enable:                 Enable/Disable power zone controls.
  97 *                              Default is enabled.
  98 * @get_enable:                 get Enable/Disable status.
  99 * @release:                    Callback to inform that last reference to this
 100 *                              control type is closed. So it is safe to free
 101 *                              data structure associated with this
 102 *                              control type. Mandatory, if client driver owns
 103 *                              the power_zone memory.
 104 *
 105 * This structure defines zone callbacks to be implemented by client drivers.
 106 * Client drives can define both energy and power related callbacks. But at
 107 * the least one type (either power or energy) is mandatory. Client drivers
 108 * should handle mutual exclusion, if required in callbacks.
 109 */
 110struct powercap_zone_ops {
 111        int (*get_max_energy_range_uj) (struct powercap_zone *, u64 *);
 112        int (*get_energy_uj) (struct powercap_zone *, u64 *);
 113        int (*reset_energy_uj) (struct powercap_zone *);
 114        int (*get_max_power_range_uw) (struct powercap_zone *, u64 *);
 115        int (*get_power_uw) (struct powercap_zone *, u64 *);
 116        int (*set_enable) (struct powercap_zone *, bool mode);
 117        int (*get_enable) (struct powercap_zone *, bool *mode);
 118        int (*release) (struct powercap_zone *);
 119};
 120
 121#define POWERCAP_ZONE_MAX_ATTRS         6
 122#define POWERCAP_CONSTRAINTS_ATTRS      8
 123#define MAX_CONSTRAINTS_PER_ZONE        10
 124/**
 125 * struct powercap_zone- Defines instance of a power cap zone
 126 * @id:                 Unique id
 127 * @name:               Power zone name.
 128 * @control_type_inst:  Control type instance for this zone.
 129 * @ops:                Pointer to the zone operation structure.
 130 * @dev:                Instance of a device.
 131 * @const_id_cnt:       Number of constraint defined.
 132 * @idr:                Instance to an idr entry for children zones.
 133 * @parent_idr:         To remove reference from the parent idr.
 134 * @private_data:       Private data pointer if any for this zone.
 135 * @zone_dev_attrs:     Attributes associated with this device.
 136 * @zone_attr_count:    Attribute count.
 137 * @dev_zone_attr_group: Attribute group for attributes.
 138 * @dev_attr_groups:    Attribute group store to register with device.
 139 * @allocated:          This is possible that client owns the memory
 140 *                      used by this structure. In this case
 141 *                      this flag is set to false by framework to
 142 *                      prevent deallocation during release process.
 143 *                      Otherwise this flag is set to true.
 144 * @constraint_ptr:     List of constraints for this zone.
 145 *
 146 * This defines a power zone instance. The fields of this structure are
 147 * private, and should not be used by client drivers.
 148 */
 149struct powercap_zone {
 150        int id;
 151        char *name;
 152        void *control_type_inst;
 153        const struct powercap_zone_ops *ops;
 154        struct device dev;
 155        int const_id_cnt;
 156        struct idr idr;
 157        struct idr *parent_idr;
 158        void *private_data;
 159        struct attribute **zone_dev_attrs;
 160        int zone_attr_count;
 161        struct attribute_group dev_zone_attr_group;
 162        const struct attribute_group *dev_attr_groups[2]; /* 1 group + NULL */
 163        bool allocated;
 164        struct powercap_zone_constraint *constraints;
 165};
 166
 167/**
 168 * struct powercap_zone_constraint_ops - Define constraint callbacks
 169 * @set_power_limit_uw:         Set power limit in micro-watts.
 170 * @get_power_limit_uw:         Get power limit in micro-watts.
 171 * @set_time_window_us:         Set time window in micro-seconds.
 172 * @get_time_window_us:         Get time window in micro-seconds.
 173 * @get_max_power_uw:           Get max power allowed in micro-watts.
 174 * @get_min_power_uw:           Get min power allowed in micro-watts.
 175 * @get_max_time_window_us:     Get max time window allowed in micro-seconds.
 176 * @get_min_time_window_us:     Get min time window allowed in micro-seconds.
 177 * @get_name:                   Get the name of constraint
 178 *
 179 * This structure is used to define the constraint callbacks for the client
 180 * drivers. The following callbacks are mandatory and can't be NULL:
 181 *  set_power_limit_uw
 182 *  get_power_limit_uw
 183 *  set_time_window_us
 184 *  get_time_window_us
 185 *  get_name
 186 *  Client drivers should handle mutual exclusion, if required in callbacks.
 187 */
 188struct powercap_zone_constraint_ops {
 189        int (*set_power_limit_uw) (struct powercap_zone *, int, u64);
 190        int (*get_power_limit_uw) (struct powercap_zone *, int, u64 *);
 191        int (*set_time_window_us) (struct powercap_zone *, int, u64);
 192        int (*get_time_window_us) (struct powercap_zone *, int, u64 *);
 193        int (*get_max_power_uw) (struct powercap_zone *, int, u64 *);
 194        int (*get_min_power_uw) (struct powercap_zone *, int, u64 *);
 195        int (*get_max_time_window_us) (struct powercap_zone *, int, u64 *);
 196        int (*get_min_time_window_us) (struct powercap_zone *, int, u64 *);
 197        const char *(*get_name) (struct powercap_zone *, int);
 198};
 199
 200/**
 201 * struct powercap_zone_constraint- Defines instance of a constraint
 202 * @id:                 Instance Id of this constraint.
 203 * @power_zone:         Pointer to the power zone for this constraint.
 204 * @ops:                Pointer to the constraint callbacks.
 205 *
 206 * This defines a constraint instance.
 207 */
 208struct powercap_zone_constraint {
 209        int id;
 210        struct powercap_zone *power_zone;
 211        const struct powercap_zone_constraint_ops *ops;
 212};
 213
 214
 215/* For clients to get their device pointer, may be used for dev_dbgs */
 216#define POWERCAP_GET_DEV(power_zone)    (&power_zone->dev)
 217
 218/**
 219* powercap_set_zone_data() - Set private data for a zone
 220* @power_zone:  A pointer to the valid zone instance.
 221* @pdata:       A pointer to the user private data.
 222*
 223* Allows client drivers to associate some private data to zone instance.
 224*/
 225static inline void powercap_set_zone_data(struct powercap_zone *power_zone,
 226                                                void *pdata)
 227{
 228        if (power_zone)
 229                power_zone->private_data = pdata;
 230}
 231
 232/**
 233* powercap_get_zone_data() - Get private data for a zone
 234* @power_zone:  A pointer to the valid zone instance.
 235*
 236* Allows client drivers to get private data associate with a zone,
 237* using call to powercap_set_zone_data.
 238*/
 239static inline void *powercap_get_zone_data(struct powercap_zone *power_zone)
 240{
 241        if (power_zone)
 242                return power_zone->private_data;
 243        return NULL;
 244}
 245
 246/**
 247* powercap_register_control_type() - Register a control_type with framework
 248* @control_type:        Pointer to client allocated memory for the control type
 249*                       structure storage. If this is NULL, powercap framework
 250*                       will allocate memory and own it.
 251*                       Advantage of this parameter is that client can embed
 252*                       this data in its data structures and allocate in a
 253*                       single call, preventing multiple allocations.
 254* @control_type_name:   The Name of this control_type, which will be shown
 255*                       in the sysfs Interface.
 256* @ops:                 Callbacks for control type. This parameter is optional.
 257*
 258* Used to create a control_type with the power capping class. Here control_type
 259* can represent a type of technology, which can control a range of power zones.
 260* For example a control_type can be RAPL (Running Average Power Limit)
 261* IntelĀ® 64 and IA-32 Processor Architectures. The name can be any string
 262* which must be unique, otherwise this function returns NULL.
 263* A pointer to the control_type instance is returned on success.
 264*/
 265struct powercap_control_type *powercap_register_control_type(
 266                                struct powercap_control_type *control_type,
 267                                const char *name,
 268                                const struct powercap_control_type_ops *ops);
 269
 270/**
 271* powercap_unregister_control_type() - Unregister a control_type from framework
 272* @instance:    A pointer to the valid control_type instance.
 273*
 274* Used to unregister a control_type with the power capping class.
 275* All power zones registered under this control type have to be unregistered
 276* before calling this function, or it will fail with an error code.
 277*/
 278int powercap_unregister_control_type(struct powercap_control_type *instance);
 279
 280/* Zone register/unregister API */
 281
 282/**
 283* powercap_register_zone() - Register a power zone
 284* @power_zone:  Pointer to client allocated memory for the power zone structure
 285*               storage. If this is NULL, powercap framework will allocate
 286*               memory and own it. Advantage of this parameter is that client
 287*               can embed this data in its data structures and allocate in a
 288*               single call, preventing multiple allocations.
 289* @control_type: A control_type instance under which this zone operates.
 290* @name:        A name for this zone.
 291* @parent:      A pointer to the parent power zone instance if any or NULL
 292* @ops:         Pointer to zone operation callback structure.
 293* @no_constraints: Number of constraints for this zone
 294* @const_ops:   Pointer to constraint callback structure
 295*
 296* Register a power zone under a given control type. A power zone must register
 297* a pointer to a structure representing zone callbacks.
 298* A power zone can be located under a parent power zone, in which case @parent
 299* should point to it.  Otherwise, if @parent is NULL, the new power zone will
 300* be located directly under the given control type
 301* For each power zone there may be a number of constraints that appear in the
 302* sysfs under that zone as attributes with unique numeric IDs.
 303* Returns pointer to the power_zone on success.
 304*/
 305struct powercap_zone *powercap_register_zone(
 306                        struct powercap_zone *power_zone,
 307                        struct powercap_control_type *control_type,
 308                        const char *name,
 309                        struct powercap_zone *parent,
 310                        const struct powercap_zone_ops *ops,
 311                        int nr_constraints,
 312                        const struct powercap_zone_constraint_ops *const_ops);
 313
 314/**
 315* powercap_unregister_zone() - Unregister a zone device
 316* @control_type:        A pointer to the valid instance of a control_type.
 317* @power_zone:  A pointer to the valid zone instance for a control_type
 318*
 319* Used to unregister a zone device for a control_type.  Caller should
 320* make sure that children for this zone are unregistered first.
 321*/
 322int powercap_unregister_zone(struct powercap_control_type *control_type,
 323                                struct powercap_zone *power_zone);
 324
 325#endif
 326