Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Definitions related to Power Management Quality of Service (PM QoS).
0004  *
0005  * Copyright (C) 2020 Intel Corporation
0006  *
0007  * Authors:
0008  *  Mark Gross <mgross@linux.intel.com>
0009  *  Rafael J. Wysocki <rafael.j.wysocki@intel.com>
0010  */
0011 
0012 #ifndef _LINUX_PM_QOS_H
0013 #define _LINUX_PM_QOS_H
0014 
0015 #include <linux/plist.h>
0016 #include <linux/notifier.h>
0017 #include <linux/device.h>
0018 
0019 enum pm_qos_flags_status {
0020     PM_QOS_FLAGS_UNDEFINED = -1,
0021     PM_QOS_FLAGS_NONE,
0022     PM_QOS_FLAGS_SOME,
0023     PM_QOS_FLAGS_ALL,
0024 };
0025 
0026 #define PM_QOS_DEFAULT_VALUE    (-1)
0027 #define PM_QOS_LATENCY_ANY  S32_MAX
0028 #define PM_QOS_LATENCY_ANY_NS   ((s64)PM_QOS_LATENCY_ANY * NSEC_PER_USEC)
0029 
0030 #define PM_QOS_CPU_LATENCY_DEFAULT_VALUE    (2000 * USEC_PER_SEC)
0031 #define PM_QOS_RESUME_LATENCY_DEFAULT_VALUE PM_QOS_LATENCY_ANY
0032 #define PM_QOS_RESUME_LATENCY_NO_CONSTRAINT PM_QOS_LATENCY_ANY
0033 #define PM_QOS_RESUME_LATENCY_NO_CONSTRAINT_NS  PM_QOS_LATENCY_ANY_NS
0034 #define PM_QOS_LATENCY_TOLERANCE_DEFAULT_VALUE  0
0035 #define PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE  0
0036 #define PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE  FREQ_QOS_MAX_DEFAULT_VALUE
0037 #define PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT  (-1)
0038 
0039 #define PM_QOS_FLAG_NO_POWER_OFF    (1 << 0)
0040 
0041 enum pm_qos_type {
0042     PM_QOS_UNITIALIZED,
0043     PM_QOS_MAX,     /* return the largest value */
0044     PM_QOS_MIN,     /* return the smallest value */
0045 };
0046 
0047 /*
0048  * Note: The lockless read path depends on the CPU accessing target_value
0049  * or effective_flags atomically.  Atomic access is only guaranteed on all CPU
0050  * types linux supports for 32 bit quantites
0051  */
0052 struct pm_qos_constraints {
0053     struct plist_head list;
0054     s32 target_value;   /* Do not change to 64 bit */
0055     s32 default_value;
0056     s32 no_constraint_value;
0057     enum pm_qos_type type;
0058     struct blocking_notifier_head *notifiers;
0059 };
0060 
0061 struct pm_qos_request {
0062     struct plist_node node;
0063     struct pm_qos_constraints *qos;
0064 };
0065 
0066 struct pm_qos_flags_request {
0067     struct list_head node;
0068     s32 flags;  /* Do not change to 64 bit */
0069 };
0070 
0071 struct pm_qos_flags {
0072     struct list_head list;
0073     s32 effective_flags;    /* Do not change to 64 bit */
0074 };
0075 
0076 
0077 #define FREQ_QOS_MIN_DEFAULT_VALUE  0
0078 #define FREQ_QOS_MAX_DEFAULT_VALUE  S32_MAX
0079 
0080 enum freq_qos_req_type {
0081     FREQ_QOS_MIN = 1,
0082     FREQ_QOS_MAX,
0083 };
0084 
0085 struct freq_constraints {
0086     struct pm_qos_constraints min_freq;
0087     struct blocking_notifier_head min_freq_notifiers;
0088     struct pm_qos_constraints max_freq;
0089     struct blocking_notifier_head max_freq_notifiers;
0090 };
0091 
0092 struct freq_qos_request {
0093     enum freq_qos_req_type type;
0094     struct plist_node pnode;
0095     struct freq_constraints *qos;
0096 };
0097 
0098 
0099 enum dev_pm_qos_req_type {
0100     DEV_PM_QOS_RESUME_LATENCY = 1,
0101     DEV_PM_QOS_LATENCY_TOLERANCE,
0102     DEV_PM_QOS_MIN_FREQUENCY,
0103     DEV_PM_QOS_MAX_FREQUENCY,
0104     DEV_PM_QOS_FLAGS,
0105 };
0106 
0107 struct dev_pm_qos_request {
0108     enum dev_pm_qos_req_type type;
0109     union {
0110         struct plist_node pnode;
0111         struct pm_qos_flags_request flr;
0112         struct freq_qos_request freq;
0113     } data;
0114     struct device *dev;
0115 };
0116 
0117 struct dev_pm_qos {
0118     struct pm_qos_constraints resume_latency;
0119     struct pm_qos_constraints latency_tolerance;
0120     struct freq_constraints freq;
0121     struct pm_qos_flags flags;
0122     struct dev_pm_qos_request *resume_latency_req;
0123     struct dev_pm_qos_request *latency_tolerance_req;
0124     struct dev_pm_qos_request *flags_req;
0125 };
0126 
0127 /* Action requested to pm_qos_update_target */
0128 enum pm_qos_req_action {
0129     PM_QOS_ADD_REQ,     /* Add a new request */
0130     PM_QOS_UPDATE_REQ,  /* Update an existing request */
0131     PM_QOS_REMOVE_REQ   /* Remove an existing request */
0132 };
0133 
0134 static inline int dev_pm_qos_request_active(struct dev_pm_qos_request *req)
0135 {
0136     return req->dev != NULL;
0137 }
0138 
0139 s32 pm_qos_read_value(struct pm_qos_constraints *c);
0140 int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node,
0141              enum pm_qos_req_action action, int value);
0142 bool pm_qos_update_flags(struct pm_qos_flags *pqf,
0143              struct pm_qos_flags_request *req,
0144              enum pm_qos_req_action action, s32 val);
0145 
0146 #ifdef CONFIG_CPU_IDLE
0147 s32 cpu_latency_qos_limit(void);
0148 bool cpu_latency_qos_request_active(struct pm_qos_request *req);
0149 void cpu_latency_qos_add_request(struct pm_qos_request *req, s32 value);
0150 void cpu_latency_qos_update_request(struct pm_qos_request *req, s32 new_value);
0151 void cpu_latency_qos_remove_request(struct pm_qos_request *req);
0152 #else
0153 static inline s32 cpu_latency_qos_limit(void) { return INT_MAX; }
0154 static inline bool cpu_latency_qos_request_active(struct pm_qos_request *req)
0155 {
0156     return false;
0157 }
0158 static inline void cpu_latency_qos_add_request(struct pm_qos_request *req,
0159                            s32 value) {}
0160 static inline void cpu_latency_qos_update_request(struct pm_qos_request *req,
0161                           s32 new_value) {}
0162 static inline void cpu_latency_qos_remove_request(struct pm_qos_request *req) {}
0163 #endif
0164 
0165 #ifdef CONFIG_PM
0166 enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, s32 mask);
0167 enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev, s32 mask);
0168 s32 __dev_pm_qos_resume_latency(struct device *dev);
0169 s32 dev_pm_qos_read_value(struct device *dev, enum dev_pm_qos_req_type type);
0170 int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req,
0171                enum dev_pm_qos_req_type type, s32 value);
0172 int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value);
0173 int dev_pm_qos_remove_request(struct dev_pm_qos_request *req);
0174 int dev_pm_qos_add_notifier(struct device *dev,
0175                 struct notifier_block *notifier,
0176                 enum dev_pm_qos_req_type type);
0177 int dev_pm_qos_remove_notifier(struct device *dev,
0178                    struct notifier_block *notifier,
0179                    enum dev_pm_qos_req_type type);
0180 void dev_pm_qos_constraints_init(struct device *dev);
0181 void dev_pm_qos_constraints_destroy(struct device *dev);
0182 int dev_pm_qos_add_ancestor_request(struct device *dev,
0183                     struct dev_pm_qos_request *req,
0184                     enum dev_pm_qos_req_type type, s32 value);
0185 int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value);
0186 void dev_pm_qos_hide_latency_limit(struct device *dev);
0187 int dev_pm_qos_expose_flags(struct device *dev, s32 value);
0188 void dev_pm_qos_hide_flags(struct device *dev);
0189 int dev_pm_qos_update_flags(struct device *dev, s32 mask, bool set);
0190 s32 dev_pm_qos_get_user_latency_tolerance(struct device *dev);
0191 int dev_pm_qos_update_user_latency_tolerance(struct device *dev, s32 val);
0192 int dev_pm_qos_expose_latency_tolerance(struct device *dev);
0193 void dev_pm_qos_hide_latency_tolerance(struct device *dev);
0194 
0195 static inline s32 dev_pm_qos_requested_resume_latency(struct device *dev)
0196 {
0197     return dev->power.qos->resume_latency_req->data.pnode.prio;
0198 }
0199 
0200 static inline s32 dev_pm_qos_requested_flags(struct device *dev)
0201 {
0202     return dev->power.qos->flags_req->data.flr.flags;
0203 }
0204 
0205 static inline s32 dev_pm_qos_raw_resume_latency(struct device *dev)
0206 {
0207     return IS_ERR_OR_NULL(dev->power.qos) ?
0208         PM_QOS_RESUME_LATENCY_NO_CONSTRAINT :
0209         pm_qos_read_value(&dev->power.qos->resume_latency);
0210 }
0211 #else
0212 static inline enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev,
0213                               s32 mask)
0214             { return PM_QOS_FLAGS_UNDEFINED; }
0215 static inline enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev,
0216                             s32 mask)
0217             { return PM_QOS_FLAGS_UNDEFINED; }
0218 static inline s32 __dev_pm_qos_resume_latency(struct device *dev)
0219             { return PM_QOS_RESUME_LATENCY_NO_CONSTRAINT; }
0220 static inline s32 dev_pm_qos_read_value(struct device *dev,
0221                     enum dev_pm_qos_req_type type)
0222 {
0223     switch (type) {
0224     case DEV_PM_QOS_RESUME_LATENCY:
0225         return PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
0226     case DEV_PM_QOS_MIN_FREQUENCY:
0227         return PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE;
0228     case DEV_PM_QOS_MAX_FREQUENCY:
0229         return PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE;
0230     default:
0231         WARN_ON(1);
0232         return 0;
0233     }
0234 }
0235 
0236 static inline int dev_pm_qos_add_request(struct device *dev,
0237                      struct dev_pm_qos_request *req,
0238                      enum dev_pm_qos_req_type type,
0239                      s32 value)
0240             { return 0; }
0241 static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req,
0242                         s32 new_value)
0243             { return 0; }
0244 static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req)
0245             { return 0; }
0246 static inline int dev_pm_qos_add_notifier(struct device *dev,
0247                       struct notifier_block *notifier,
0248                       enum dev_pm_qos_req_type type)
0249             { return 0; }
0250 static inline int dev_pm_qos_remove_notifier(struct device *dev,
0251                          struct notifier_block *notifier,
0252                          enum dev_pm_qos_req_type type)
0253             { return 0; }
0254 static inline void dev_pm_qos_constraints_init(struct device *dev)
0255 {
0256     dev->power.power_state = PMSG_ON;
0257 }
0258 static inline void dev_pm_qos_constraints_destroy(struct device *dev)
0259 {
0260     dev->power.power_state = PMSG_INVALID;
0261 }
0262 static inline int dev_pm_qos_add_ancestor_request(struct device *dev,
0263                           struct dev_pm_qos_request *req,
0264                           enum dev_pm_qos_req_type type,
0265                           s32 value)
0266             { return 0; }
0267 static inline int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value)
0268             { return 0; }
0269 static inline void dev_pm_qos_hide_latency_limit(struct device *dev) {}
0270 static inline int dev_pm_qos_expose_flags(struct device *dev, s32 value)
0271             { return 0; }
0272 static inline void dev_pm_qos_hide_flags(struct device *dev) {}
0273 static inline int dev_pm_qos_update_flags(struct device *dev, s32 m, bool set)
0274             { return 0; }
0275 static inline s32 dev_pm_qos_get_user_latency_tolerance(struct device *dev)
0276             { return PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT; }
0277 static inline int dev_pm_qos_update_user_latency_tolerance(struct device *dev, s32 val)
0278             { return 0; }
0279 static inline int dev_pm_qos_expose_latency_tolerance(struct device *dev)
0280             { return 0; }
0281 static inline void dev_pm_qos_hide_latency_tolerance(struct device *dev) {}
0282 
0283 static inline s32 dev_pm_qos_requested_resume_latency(struct device *dev)
0284 {
0285     return PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
0286 }
0287 static inline s32 dev_pm_qos_requested_flags(struct device *dev) { return 0; }
0288 static inline s32 dev_pm_qos_raw_resume_latency(struct device *dev)
0289 {
0290     return PM_QOS_RESUME_LATENCY_NO_CONSTRAINT;
0291 }
0292 #endif
0293 
0294 static inline int freq_qos_request_active(struct freq_qos_request *req)
0295 {
0296     return !IS_ERR_OR_NULL(req->qos);
0297 }
0298 
0299 void freq_constraints_init(struct freq_constraints *qos);
0300 
0301 s32 freq_qos_read_value(struct freq_constraints *qos,
0302             enum freq_qos_req_type type);
0303 
0304 int freq_qos_add_request(struct freq_constraints *qos,
0305              struct freq_qos_request *req,
0306              enum freq_qos_req_type type, s32 value);
0307 int freq_qos_update_request(struct freq_qos_request *req, s32 new_value);
0308 int freq_qos_remove_request(struct freq_qos_request *req);
0309 int freq_qos_apply(struct freq_qos_request *req,
0310            enum pm_qos_req_action action, s32 value);
0311 
0312 int freq_qos_add_notifier(struct freq_constraints *qos,
0313               enum freq_qos_req_type type,
0314               struct notifier_block *notifier);
0315 int freq_qos_remove_notifier(struct freq_constraints *qos,
0316                  enum freq_qos_req_type type,
0317                  struct notifier_block *notifier);
0318 
0319 #endif