~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to include/linux/pm_qos.h

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
 
25
struct pm_qos_request {
 
26
        struct plist_node node;
 
27
        int pm_qos_class;
 
28
};
 
29
 
 
30
struct dev_pm_qos_request {
 
31
        struct plist_node node;
 
32
        struct device *dev;
 
33
};
 
34
 
 
35
enum 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
 */
 
46
struct 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 */
 
55
enum 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
 
 
61
static 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
 
67
int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node,
 
68
                         enum pm_qos_req_action action, int value);
 
69
void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class,
 
70
                        s32 value);
 
71
void pm_qos_update_request(struct pm_qos_request *req,
 
72
                           s32 new_value);
 
73
void pm_qos_remove_request(struct pm_qos_request *req);
 
74
 
 
75
int pm_qos_request(int pm_qos_class);
 
76
int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier);
 
77
int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier);
 
78
int pm_qos_request_active(struct pm_qos_request *req);
 
79
s32 pm_qos_read_value(struct pm_qos_constraints *c);
 
80
 
 
81
s32 dev_pm_qos_read_value(struct device *dev);
 
82
int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req,
 
83
                           s32 value);
 
84
int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value);
 
85
int dev_pm_qos_remove_request(struct dev_pm_qos_request *req);
 
86
int dev_pm_qos_add_notifier(struct device *dev,
 
87
                            struct notifier_block *notifier);
 
88
int dev_pm_qos_remove_notifier(struct device *dev,
 
89
                               struct notifier_block *notifier);
 
90
int dev_pm_qos_add_global_notifier(struct notifier_block *notifier);
 
91
int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier);
 
92
void dev_pm_qos_constraints_init(struct device *dev);
 
93
void dev_pm_qos_constraints_destroy(struct device *dev);
 
94
#else
 
95
static inline int pm_qos_update_target(struct pm_qos_constraints *c,
 
96
                                       struct plist_node *node,
 
97
                                       enum pm_qos_req_action action,
 
98
                                       int value)
 
99
                        { return 0; }
 
100
static inline void pm_qos_add_request(struct pm_qos_request *req,
 
101
                                      int pm_qos_class, s32 value)
 
102
                        { return; }
 
103
static inline void pm_qos_update_request(struct pm_qos_request *req,
 
104
                                         s32 new_value)
 
105
                        { return; }
 
106
static inline void pm_qos_remove_request(struct pm_qos_request *req)
 
107
                        { return; }
 
108
 
 
109
static inline int pm_qos_request(int pm_qos_class)
 
110
                        { return 0; }
 
111
static inline int pm_qos_add_notifier(int pm_qos_class,
 
112
                                      struct notifier_block *notifier)
 
113
                        { return 0; }
 
114
static inline int pm_qos_remove_notifier(int pm_qos_class,
 
115
                                         struct notifier_block *notifier)
 
116
                        { return 0; }
 
117
static inline int pm_qos_request_active(struct pm_qos_request *req)
 
118
                        { return 0; }
 
119
static inline s32 pm_qos_read_value(struct pm_qos_constraints *c)
 
120
                        { return 0; }
 
121
 
 
122
static inline s32 dev_pm_qos_read_value(struct device *dev)
 
123
                        { return 0; }
 
124
static inline int dev_pm_qos_add_request(struct device *dev,
 
125
                                         struct dev_pm_qos_request *req,
 
126
                                         s32 value)
 
127
                        { return 0; }
 
128
static inline int dev_pm_qos_update_request(struct dev_pm_qos_request *req,
 
129
                                            s32 new_value)
 
130
                        { return 0; }
 
131
static inline int dev_pm_qos_remove_request(struct dev_pm_qos_request *req)
 
132
                        { return 0; }
 
133
static inline int dev_pm_qos_add_notifier(struct device *dev,
 
134
                                          struct notifier_block *notifier)
 
135
                        { return 0; }
 
136
static inline int dev_pm_qos_remove_notifier(struct device *dev,
 
137
                                             struct notifier_block *notifier)
 
138
                        { return 0; }
 
139
static inline int dev_pm_qos_add_global_notifier(
 
140
                                        struct notifier_block *notifier)
 
141
                        { return 0; }
 
142
static inline int dev_pm_qos_remove_global_notifier(
 
143
                                        struct notifier_block *notifier)
 
144
                        { return 0; }
 
145
static inline void dev_pm_qos_constraints_init(struct device *dev)
 
146
{
 
147
        dev->power.power_state = PMSG_ON;
 
148
}
 
149
static inline void dev_pm_qos_constraints_destroy(struct device *dev)
 
150
{
 
151
        dev->power.power_state = PMSG_INVALID;
 
152
}
 
153
#endif
 
154
 
 
155
#endif