linux/include/linux/devfreq.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * devfreq: Generic Dynamic Voltage and Frequency Scaling (DVFS) Framework
   4 *          for Non-CPU Devices.
   5 *
   6 * Copyright (C) 2011 Samsung Electronics
   7 *      MyungJoo Ham <myungjoo.ham@samsung.com>
   8 */
   9
  10#ifndef __LINUX_DEVFREQ_H__
  11#define __LINUX_DEVFREQ_H__
  12
  13#include <linux/device.h>
  14#include <linux/notifier.h>
  15#include <linux/pm_opp.h>
  16#include <linux/pm_qos.h>
  17
  18#define DEVFREQ_NAME_LEN 16
  19
  20/* DEVFREQ governor name */
  21#define DEVFREQ_GOV_SIMPLE_ONDEMAND     "simple_ondemand"
  22#define DEVFREQ_GOV_PERFORMANCE         "performance"
  23#define DEVFREQ_GOV_POWERSAVE           "powersave"
  24#define DEVFREQ_GOV_USERSPACE           "userspace"
  25#define DEVFREQ_GOV_PASSIVE             "passive"
  26
  27/* DEVFREQ notifier interface */
  28#define DEVFREQ_TRANSITION_NOTIFIER     (0)
  29
  30/* Transition notifiers of DEVFREQ_TRANSITION_NOTIFIER */
  31#define DEVFREQ_PRECHANGE               (0)
  32#define DEVFREQ_POSTCHANGE              (1)
  33
  34/* DEVFREQ work timers */
  35enum devfreq_timer {
  36        DEVFREQ_TIMER_DEFERRABLE = 0,
  37        DEVFREQ_TIMER_DELAYED,
  38        DEVFREQ_TIMER_NUM,
  39};
  40
  41struct devfreq;
  42struct devfreq_governor;
  43
  44/**
  45 * struct devfreq_dev_status - Data given from devfreq user device to
  46 *                           governors. Represents the performance
  47 *                           statistics.
  48 * @total_time:         The total time represented by this instance of
  49 *                      devfreq_dev_status
  50 * @busy_time:          The time that the device was working among the
  51 *                      total_time.
  52 * @current_frequency:  The operating frequency.
  53 * @private_data:       An entry not specified by the devfreq framework.
  54 *                      A device and a specific governor may have their
  55 *                      own protocol with private_data. However, because
  56 *                      this is governor-specific, a governor using this
  57 *                      will be only compatible with devices aware of it.
  58 */
  59struct devfreq_dev_status {
  60        /* both since the last measure */
  61        unsigned long total_time;
  62        unsigned long busy_time;
  63        unsigned long current_frequency;
  64        void *private_data;
  65};
  66
  67/*
  68 * The resulting frequency should be at most this. (this bound is the
  69 * least upper bound; thus, the resulting freq should be lower or same)
  70 * If the flag is not set, the resulting frequency should be at most the
  71 * bound (greatest lower bound)
  72 */
  73#define DEVFREQ_FLAG_LEAST_UPPER_BOUND          0x1
  74
  75/**
  76 * struct devfreq_dev_profile - Devfreq's user device profile
  77 * @initial_freq:       The operating frequency when devfreq_add_device() is
  78 *                      called.
  79 * @polling_ms:         The polling interval in ms. 0 disables polling.
  80 * @timer:              Timer type is either deferrable or delayed timer.
  81 * @target:             The device should set its operating frequency at
  82 *                      freq or lowest-upper-than-freq value. If freq is
  83 *                      higher than any operable frequency, set maximum.
  84 *                      Before returning, target function should set
  85 *                      freq at the current frequency.
  86 *                      The "flags" parameter's possible values are
  87 *                      explained above with "DEVFREQ_FLAG_*" macros.
  88 * @get_dev_status:     The device should provide the current performance
  89 *                      status to devfreq. Governors are recommended not to
  90 *                      use this directly. Instead, governors are recommended
  91 *                      to use devfreq_update_stats() along with
  92 *                      devfreq.last_status.
  93 * @get_cur_freq:       The device should provide the current frequency
  94 *                      at which it is operating.
  95 * @exit:               An optional callback that is called when devfreq
  96 *                      is removing the devfreq object due to error or
  97 *                      from devfreq_remove_device() call. If the user
  98 *                      has registered devfreq->nb at a notifier-head,
  99 *                      this is the time to unregister it.
 100 * @freq_table:         Optional list of frequencies to support statistics
 101 *                      and freq_table must be generated in ascending order.
 102 * @max_state:          The size of freq_table.
 103 */
 104struct devfreq_dev_profile {
 105        unsigned long initial_freq;
 106        unsigned int polling_ms;
 107        enum devfreq_timer timer;
 108
 109        int (*target)(struct device *dev, unsigned long *freq, u32 flags);
 110        int (*get_dev_status)(struct device *dev,
 111                              struct devfreq_dev_status *stat);
 112        int (*get_cur_freq)(struct device *dev, unsigned long *freq);
 113        void (*exit)(struct device *dev);
 114
 115        unsigned long *freq_table;
 116        unsigned int max_state;
 117};
 118
 119/**
 120 * struct devfreq_stats - Statistics of devfreq device behavior
 121 * @total_trans:        Number of devfreq transitions.
 122 * @trans_table:        Statistics of devfreq transitions.
 123 * @time_in_state:      Statistics of devfreq states.
 124 * @last_update:        The last time stats were updated.
 125 */
 126struct devfreq_stats {
 127        unsigned int total_trans;
 128        unsigned int *trans_table;
 129        u64 *time_in_state;
 130        u64 last_update;
 131};
 132
 133/**
 134 * struct devfreq - Device devfreq structure
 135 * @node:       list node - contains the devices with devfreq that have been
 136 *              registered.
 137 * @lock:       a mutex to protect accessing devfreq.
 138 * @dev:        device registered by devfreq class. dev.parent is the device
 139 *              using devfreq.
 140 * @profile:    device-specific devfreq profile
 141 * @governor:   method how to choose frequency based on the usage.
 142 * @governor_name:      devfreq governor name for use with this devfreq
 143 * @nb:         notifier block used to notify devfreq object that it should
 144 *              reevaluate operable frequencies. Devfreq users may use
 145 *              devfreq.nb to the corresponding register notifier call chain.
 146 * @work:       delayed work for load monitoring.
 147 * @previous_freq:      previously configured frequency value.
 148 * @last_status:        devfreq user device info, performance statistics
 149 * @data:       Private data of the governor. The devfreq framework does not
 150 *              touch this.
 151 * @user_min_freq_req:  PM QoS minimum frequency request from user (via sysfs)
 152 * @user_max_freq_req:  PM QoS maximum frequency request from user (via sysfs)
 153 * @scaling_min_freq:   Limit minimum frequency requested by OPP interface
 154 * @scaling_max_freq:   Limit maximum frequency requested by OPP interface
 155 * @stop_polling:        devfreq polling status of a device.
 156 * @suspend_freq:        frequency of a device set during suspend phase.
 157 * @resume_freq:         frequency of a device set in resume phase.
 158 * @suspend_count:       suspend requests counter for a device.
 159 * @stats:      Statistics of devfreq device behavior
 160 * @transition_notifier_list: list head of DEVFREQ_TRANSITION_NOTIFIER notifier
 161 * @nb_min:             Notifier block for DEV_PM_QOS_MIN_FREQUENCY
 162 * @nb_max:             Notifier block for DEV_PM_QOS_MAX_FREQUENCY
 163 *
 164 * This structure stores the devfreq information for a given device.
 165 *
 166 * Note that when a governor accesses entries in struct devfreq in its
 167 * functions except for the context of callbacks defined in struct
 168 * devfreq_governor, the governor should protect its access with the
 169 * struct mutex lock in struct devfreq. A governor may use this mutex
 170 * to protect its own private data in ``void *data`` as well.
 171 */
 172struct devfreq {
 173        struct list_head node;
 174
 175        struct mutex lock;
 176        struct device dev;
 177        struct devfreq_dev_profile *profile;
 178        const struct devfreq_governor *governor;
 179        char governor_name[DEVFREQ_NAME_LEN];
 180        struct notifier_block nb;
 181        struct delayed_work work;
 182
 183        unsigned long previous_freq;
 184        struct devfreq_dev_status last_status;
 185
 186        void *data; /* private data for governors */
 187
 188        struct dev_pm_qos_request user_min_freq_req;
 189        struct dev_pm_qos_request user_max_freq_req;
 190        unsigned long scaling_min_freq;
 191        unsigned long scaling_max_freq;
 192        bool stop_polling;
 193
 194        unsigned long suspend_freq;
 195        unsigned long resume_freq;
 196        atomic_t suspend_count;
 197
 198        /* information for device frequency transitions */
 199        struct devfreq_stats stats;
 200
 201        struct srcu_notifier_head transition_notifier_list;
 202
 203        struct notifier_block nb_min;
 204        struct notifier_block nb_max;
 205};
 206
 207struct devfreq_freqs {
 208        unsigned long old;
 209        unsigned long new;
 210};
 211
 212#if defined(CONFIG_PM_DEVFREQ)
 213struct devfreq *devfreq_add_device(struct device *dev,
 214                                struct devfreq_dev_profile *profile,
 215                                const char *governor_name,
 216                                void *data);
 217int devfreq_remove_device(struct devfreq *devfreq);
 218struct devfreq *devm_devfreq_add_device(struct device *dev,
 219                                struct devfreq_dev_profile *profile,
 220                                const char *governor_name,
 221                                void *data);
 222void devm_devfreq_remove_device(struct device *dev, struct devfreq *devfreq);
 223
 224/* Supposed to be called by PM callbacks */
 225int devfreq_suspend_device(struct devfreq *devfreq);
 226int devfreq_resume_device(struct devfreq *devfreq);
 227
 228void devfreq_suspend(void);
 229void devfreq_resume(void);
 230
 231/**
 232 * update_devfreq() - Reevaluate the device and configure frequency
 233 * @devfreq:    the devfreq device
 234 *
 235 * Note: devfreq->lock must be held
 236 */
 237int update_devfreq(struct devfreq *devfreq);
 238
 239/* Helper functions for devfreq user device driver with OPP. */
 240struct dev_pm_opp *devfreq_recommended_opp(struct device *dev,
 241                                unsigned long *freq, u32 flags);
 242int devfreq_register_opp_notifier(struct device *dev,
 243                                struct devfreq *devfreq);
 244int devfreq_unregister_opp_notifier(struct device *dev,
 245                                struct devfreq *devfreq);
 246int devm_devfreq_register_opp_notifier(struct device *dev,
 247                                struct devfreq *devfreq);
 248void devm_devfreq_unregister_opp_notifier(struct device *dev,
 249                                struct devfreq *devfreq);
 250int devfreq_register_notifier(struct devfreq *devfreq,
 251                                struct notifier_block *nb,
 252                                unsigned int list);
 253int devfreq_unregister_notifier(struct devfreq *devfreq,
 254                                struct notifier_block *nb,
 255                                unsigned int list);
 256int devm_devfreq_register_notifier(struct device *dev,
 257                                struct devfreq *devfreq,
 258                                struct notifier_block *nb,
 259                                unsigned int list);
 260void devm_devfreq_unregister_notifier(struct device *dev,
 261                                struct devfreq *devfreq,
 262                                struct notifier_block *nb,
 263                                unsigned int list);
 264struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev, int index);
 265
 266#if IS_ENABLED(CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND)
 267/**
 268 * struct devfreq_simple_ondemand_data - ``void *data`` fed to struct devfreq
 269 *      and devfreq_add_device
 270 * @upthreshold:        If the load is over this value, the frequency jumps.
 271 *                      Specify 0 to use the default. Valid value = 0 to 100.
 272 * @downdifferential:   If the load is under upthreshold - downdifferential,
 273 *                      the governor may consider slowing the frequency down.
 274 *                      Specify 0 to use the default. Valid value = 0 to 100.
 275 *                      downdifferential < upthreshold must hold.
 276 *
 277 * If the fed devfreq_simple_ondemand_data pointer is NULL to the governor,
 278 * the governor uses the default values.
 279 */
 280struct devfreq_simple_ondemand_data {
 281        unsigned int upthreshold;
 282        unsigned int downdifferential;
 283};
 284#endif
 285
 286#if IS_ENABLED(CONFIG_DEVFREQ_GOV_PASSIVE)
 287/**
 288 * struct devfreq_passive_data - ``void *data`` fed to struct devfreq
 289 *      and devfreq_add_device
 290 * @parent:     the devfreq instance of parent device.
 291 * @get_target_freq:    Optional callback, Returns desired operating frequency
 292 *                      for the device using passive governor. That is called
 293 *                      when passive governor should decide the next frequency
 294 *                      by using the new frequency of parent devfreq device
 295 *                      using governors except for passive governor.
 296 *                      If the devfreq device has the specific method to decide
 297 *                      the next frequency, should use this callback.
 298 * @this:       the devfreq instance of own device.
 299 * @nb:         the notifier block for DEVFREQ_TRANSITION_NOTIFIER list
 300 *
 301 * The devfreq_passive_data have to set the devfreq instance of parent
 302 * device with governors except for the passive governor. But, don't need to
 303 * initialize the 'this' and 'nb' field because the devfreq core will handle
 304 * them.
 305 */
 306struct devfreq_passive_data {
 307        /* Should set the devfreq instance of parent device */
 308        struct devfreq *parent;
 309
 310        /* Optional callback to decide the next frequency of passvice device */
 311        int (*get_target_freq)(struct devfreq *this, unsigned long *freq);
 312
 313        /* For passive governor's internal use. Don't need to set them */
 314        struct devfreq *this;
 315        struct notifier_block nb;
 316};
 317#endif
 318
 319#else /* !CONFIG_PM_DEVFREQ */
 320static inline struct devfreq *devfreq_add_device(struct device *dev,
 321                                        struct devfreq_dev_profile *profile,
 322                                        const char *governor_name,
 323                                        void *data)
 324{
 325        return ERR_PTR(-ENOSYS);
 326}
 327
 328static inline int devfreq_remove_device(struct devfreq *devfreq)
 329{
 330        return 0;
 331}
 332
 333static inline struct devfreq *devm_devfreq_add_device(struct device *dev,
 334                                        struct devfreq_dev_profile *profile,
 335                                        const char *governor_name,
 336                                        void *data)
 337{
 338        return ERR_PTR(-ENOSYS);
 339}
 340
 341static inline void devm_devfreq_remove_device(struct device *dev,
 342                                        struct devfreq *devfreq)
 343{
 344}
 345
 346static inline int devfreq_suspend_device(struct devfreq *devfreq)
 347{
 348        return 0;
 349}
 350
 351static inline int devfreq_resume_device(struct devfreq *devfreq)
 352{
 353        return 0;
 354}
 355
 356static inline void devfreq_suspend(void) {}
 357static inline void devfreq_resume(void) {}
 358
 359static inline struct dev_pm_opp *devfreq_recommended_opp(struct device *dev,
 360                                        unsigned long *freq, u32 flags)
 361{
 362        return ERR_PTR(-EINVAL);
 363}
 364
 365static inline int devfreq_register_opp_notifier(struct device *dev,
 366                                        struct devfreq *devfreq)
 367{
 368        return -EINVAL;
 369}
 370
 371static inline int devfreq_unregister_opp_notifier(struct device *dev,
 372                                        struct devfreq *devfreq)
 373{
 374        return -EINVAL;
 375}
 376
 377static inline int devm_devfreq_register_opp_notifier(struct device *dev,
 378                                        struct devfreq *devfreq)
 379{
 380        return -EINVAL;
 381}
 382
 383static inline void devm_devfreq_unregister_opp_notifier(struct device *dev,
 384                                        struct devfreq *devfreq)
 385{
 386}
 387
 388static inline int devfreq_register_notifier(struct devfreq *devfreq,
 389                                        struct notifier_block *nb,
 390                                        unsigned int list)
 391{
 392        return 0;
 393}
 394
 395static inline int devfreq_unregister_notifier(struct devfreq *devfreq,
 396                                        struct notifier_block *nb,
 397                                        unsigned int list)
 398{
 399        return 0;
 400}
 401
 402static inline int devm_devfreq_register_notifier(struct device *dev,
 403                                        struct devfreq *devfreq,
 404                                        struct notifier_block *nb,
 405                                        unsigned int list)
 406{
 407        return 0;
 408}
 409
 410static inline void devm_devfreq_unregister_notifier(struct device *dev,
 411                                        struct devfreq *devfreq,
 412                                        struct notifier_block *nb,
 413                                        unsigned int list)
 414{
 415}
 416
 417static inline struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev,
 418                                        int index)
 419{
 420        return ERR_PTR(-ENODEV);
 421}
 422
 423static inline int devfreq_update_stats(struct devfreq *df)
 424{
 425        return -EINVAL;
 426}
 427#endif /* CONFIG_PM_DEVFREQ */
 428
 429#endif /* __LINUX_DEVFREQ_H__ */
 430