at v3.3 5.8 kB view raw
1#ifndef _LINUX_PM_QOS_H 2#define _LINUX_PM_QOS_H 3/* interface for the pm_qos_power infrastructure of the linux kernel. 4 * 5 * Mark Gross <mgross@linux.intel.com> 6 */ 7#include <linux/plist.h> 8#include <linux/notifier.h> 9#include <linux/miscdevice.h> 10#include <linux/device.h> 11 12#define PM_QOS_RESERVED 0 13#define PM_QOS_CPU_DMA_LATENCY 1 14#define PM_QOS_NETWORK_LATENCY 2 15#define PM_QOS_NETWORK_THROUGHPUT 3 16 17#define PM_QOS_NUM_CLASSES 4 18#define PM_QOS_DEFAULT_VALUE -1 19 20#define PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE (2000 * USEC_PER_SEC) 21#define PM_QOS_NETWORK_LAT_DEFAULT_VALUE (2000 * USEC_PER_SEC) 22#define PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE 0 23#define PM_QOS_DEV_LAT_DEFAULT_VALUE 0 24 25struct pm_qos_request { 26 struct plist_node node; 27 int pm_qos_class; 28}; 29 30struct dev_pm_qos_request { 31 struct plist_node node; 32 struct device *dev; 33}; 34 35enum pm_qos_type { 36 PM_QOS_UNITIALIZED, 37 PM_QOS_MAX, /* return the largest value */ 38 PM_QOS_MIN /* return the smallest value */ 39}; 40 41/* 42 * Note: The lockless read path depends on the CPU accessing 43 * target_value atomically. Atomic access is only guaranteed on all CPU 44 * types linux supports for 32 bit quantites 45 */ 46struct pm_qos_constraints { 47 struct plist_head list; 48 s32 target_value; /* Do not change to 64 bit */ 49 s32 default_value; 50 enum pm_qos_type type; 51 struct blocking_notifier_head *notifiers; 52}; 53 54/* Action requested to pm_qos_update_target */ 55enum pm_qos_req_action { 56 PM_QOS_ADD_REQ, /* Add a new request */ 57 PM_QOS_UPDATE_REQ, /* Update an existing request */ 58 PM_QOS_REMOVE_REQ /* Remove an existing request */ 59}; 60 61static inline int dev_pm_qos_request_active(struct dev_pm_qos_request *req) 62{ 63 return req->dev != 0; 64} 65 66#ifdef CONFIG_PM 67int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node, 68 enum pm_qos_req_action action, int value); 69void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class, 70 s32 value); 71void pm_qos_update_request(struct pm_qos_request *req, 72 s32 new_value); 73void pm_qos_remove_request(struct pm_qos_request *req); 74 75int pm_qos_request(int pm_qos_class); 76int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); 77int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); 78int pm_qos_request_active(struct pm_qos_request *req); 79s32 pm_qos_read_value(struct pm_qos_constraints *c); 80 81s32 __dev_pm_qos_read_value(struct device *dev); 82s32 dev_pm_qos_read_value(struct device *dev); 83int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, 84 s32 value); 85int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value); 86int dev_pm_qos_remove_request(struct dev_pm_qos_request *req); 87int dev_pm_qos_add_notifier(struct device *dev, 88 struct notifier_block *notifier); 89int dev_pm_qos_remove_notifier(struct device *dev, 90 struct notifier_block *notifier); 91int dev_pm_qos_add_global_notifier(struct notifier_block *notifier); 92int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier); 93void dev_pm_qos_constraints_init(struct device *dev); 94void dev_pm_qos_constraints_destroy(struct device *dev); 95int dev_pm_qos_add_ancestor_request(struct device *dev, 96 struct dev_pm_qos_request *req, s32 value); 97#else 98static inline int pm_qos_update_target(struct pm_qos_constraints *c, 99 struct plist_node *node, 100 enum pm_qos_req_action action, 101 int value) 102 { return 0; } 103static inline void pm_qos_add_request(struct pm_qos_request *req, 104 int pm_qos_class, s32 value) 105 { return; } 106static inline void pm_qos_update_request(struct pm_qos_request *req, 107 s32 new_value) 108 { return; } 109static inline void pm_qos_remove_request(struct pm_qos_request *req) 110 { return; } 111 112static inline int pm_qos_request(int pm_qos_class) 113{ 114 switch (pm_qos_class) { 115 case PM_QOS_CPU_DMA_LATENCY: 116 return PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE; 117 case PM_QOS_NETWORK_LATENCY: 118 return PM_QOS_NETWORK_LAT_DEFAULT_VALUE; 119 case PM_QOS_NETWORK_THROUGHPUT: 120 return PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE; 121 default: 122 return PM_QOS_DEFAULT_VALUE; 123 } 124} 125 126static inline int pm_qos_add_notifier(int pm_qos_class, 127 struct notifier_block *notifier) 128 { return 0; } 129static inline int pm_qos_remove_notifier(int pm_qos_class, 130 struct notifier_block *notifier) 131 { return 0; } 132static inline int pm_qos_request_active(struct pm_qos_request *req) 133 { return 0; } 134static inline s32 pm_qos_read_value(struct pm_qos_constraints *c) 135 { return 0; } 136 137static inline s32 __dev_pm_qos_read_value(struct device *dev) 138 { return 0; } 139static inline s32 dev_pm_qos_read_value(struct device *dev) 140 { return 0; } 141static inline int dev_pm_qos_add_request(struct device *dev, 142 struct dev_pm_qos_request *req, 143 s32 value) 144 { return 0; } 145static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req, 146 s32 new_value) 147 { return 0; } 148static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req) 149 { return 0; } 150static inline int dev_pm_qos_add_notifier(struct device *dev, 151 struct notifier_block *notifier) 152 { return 0; } 153static inline int dev_pm_qos_remove_notifier(struct device *dev, 154 struct notifier_block *notifier) 155 { return 0; } 156static inline int dev_pm_qos_add_global_notifier( 157 struct notifier_block *notifier) 158 { return 0; } 159static inline int dev_pm_qos_remove_global_notifier( 160 struct notifier_block *notifier) 161 { return 0; } 162static inline void dev_pm_qos_constraints_init(struct device *dev) 163{ 164 dev->power.power_state = PMSG_ON; 165} 166static inline void dev_pm_qos_constraints_destroy(struct device *dev) 167{ 168 dev->power.power_state = PMSG_INVALID; 169} 170static inline int dev_pm_qos_add_ancestor_request(struct device *dev, 171 struct dev_pm_qos_request *req, s32 value) 172 { return 0; } 173#endif 174 175#endif