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