OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [include/] [linux/] [hrtimer.h] - Blame information for rev 81

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 *  include/linux/hrtimer.h
3
 *
4
 *  hrtimers - High-resolution kernel timers
5
 *
6
 *   Copyright(C) 2005, Thomas Gleixner <tglx@linutronix.de>
7
 *   Copyright(C) 2005, Red Hat, Inc., Ingo Molnar
8
 *
9
 *  data type definitions, declarations, prototypes
10
 *
11
 *  Started by: Thomas Gleixner and Ingo Molnar
12
 *
13
 *  For licencing details see kernel-base/COPYING
14
 */
15
#ifndef _LINUX_HRTIMER_H
16
#define _LINUX_HRTIMER_H
17
 
18
#include <linux/rbtree.h>
19
#include <linux/ktime.h>
20
#include <linux/init.h>
21
#include <linux/list.h>
22
#include <linux/wait.h>
23
 
24
struct hrtimer_clock_base;
25
struct hrtimer_cpu_base;
26
 
27
/*
28
 * Mode arguments of xxx_hrtimer functions:
29
 */
30
enum hrtimer_mode {
31
        HRTIMER_MODE_ABS,       /* Time value is absolute */
32
        HRTIMER_MODE_REL,       /* Time value is relative to now */
33
};
34
 
35
/*
36
 * Return values for the callback function
37
 */
38
enum hrtimer_restart {
39
        HRTIMER_NORESTART,      /* Timer is not restarted */
40
        HRTIMER_RESTART,        /* Timer must be restarted */
41
};
42
 
43
/*
44
 * hrtimer callback modes:
45
 *
46
 *      HRTIMER_CB_SOFTIRQ:             Callback must run in softirq context
47
 *      HRTIMER_CB_IRQSAFE:             Callback may run in hardirq context
48
 *      HRTIMER_CB_IRQSAFE_NO_RESTART:  Callback may run in hardirq context and
49
 *                                      does not restart the timer
50
 *      HRTIMER_CB_IRQSAFE_NO_SOFTIRQ:  Callback must run in hardirq context
51
 *                                      Special mode for tick emultation
52
 */
53
enum hrtimer_cb_mode {
54
        HRTIMER_CB_SOFTIRQ,
55
        HRTIMER_CB_IRQSAFE,
56
        HRTIMER_CB_IRQSAFE_NO_RESTART,
57
        HRTIMER_CB_IRQSAFE_NO_SOFTIRQ,
58
};
59
 
60
/*
61
 * Values to track state of the timer
62
 *
63
 * Possible states:
64
 *
65
 * 0x00         inactive
66
 * 0x01         enqueued into rbtree
67
 * 0x02         callback function running
68
 * 0x04         callback pending (high resolution mode)
69
 *
70
 * Special case:
71
 * 0x03         callback function running and enqueued
72
 *              (was requeued on another CPU)
73
 * The "callback function running and enqueued" status is only possible on
74
 * SMP. It happens for example when a posix timer expired and the callback
75
 * queued a signal. Between dropping the lock which protects the posix timer
76
 * and reacquiring the base lock of the hrtimer, another CPU can deliver the
77
 * signal and rearm the timer. We have to preserve the callback running state,
78
 * as otherwise the timer could be removed before the softirq code finishes the
79
 * the handling of the timer.
80
 *
81
 * The HRTIMER_STATE_ENQUEUE bit is always or'ed to the current state to
82
 * preserve the HRTIMER_STATE_CALLBACK bit in the above scenario.
83
 *
84
 * All state transitions are protected by cpu_base->lock.
85
 */
86
#define HRTIMER_STATE_INACTIVE  0x00
87
#define HRTIMER_STATE_ENQUEUED  0x01
88
#define HRTIMER_STATE_CALLBACK  0x02
89
#define HRTIMER_STATE_PENDING   0x04
90
 
91
/**
92
 * struct hrtimer - the basic hrtimer structure
93
 * @node:       red black tree node for time ordered insertion
94
 * @expires:    the absolute expiry time in the hrtimers internal
95
 *              representation. The time is related to the clock on
96
 *              which the timer is based.
97
 * @function:   timer expiry callback function
98
 * @base:       pointer to the timer base (per cpu and per clock)
99
 * @state:      state information (See bit values above)
100
 * @cb_mode:    high resolution timer feature to select the callback execution
101
 *               mode
102
 * @cb_entry:   list head to enqueue an expired timer into the callback list
103
 * @start_site: timer statistics field to store the site where the timer
104
 *              was started
105
 * @start_comm: timer statistics field to store the name of the process which
106
 *              started the timer
107
 * @start_pid: timer statistics field to store the pid of the task which
108
 *              started the timer
109
 *
110
 * The hrtimer structure must be initialized by hrtimer_init()
111
 */
112
struct hrtimer {
113
        struct rb_node                  node;
114
        ktime_t                         expires;
115
        enum hrtimer_restart            (*function)(struct hrtimer *);
116
        struct hrtimer_clock_base       *base;
117
        unsigned long                   state;
118
#ifdef CONFIG_HIGH_RES_TIMERS
119
        enum hrtimer_cb_mode            cb_mode;
120
        struct list_head                cb_entry;
121
#endif
122
#ifdef CONFIG_TIMER_STATS
123
        void                            *start_site;
124
        char                            start_comm[16];
125
        int                             start_pid;
126
#endif
127
};
128
 
129
/**
130
 * struct hrtimer_sleeper - simple sleeper structure
131
 * @timer:      embedded timer structure
132
 * @task:       task to wake up
133
 *
134
 * task is set to NULL, when the timer expires.
135
 */
136
struct hrtimer_sleeper {
137
        struct hrtimer timer;
138
        struct task_struct *task;
139
};
140
 
141
/**
142
 * struct hrtimer_clock_base - the timer base for a specific clock
143
 * @cpu_base:           per cpu clock base
144
 * @index:              clock type index for per_cpu support when moving a
145
 *                      timer to a base on another cpu.
146
 * @active:             red black tree root node for the active timers
147
 * @first:              pointer to the timer node which expires first
148
 * @resolution:         the resolution of the clock, in nanoseconds
149
 * @get_time:           function to retrieve the current time of the clock
150
 * @get_softirq_time:   function to retrieve the current time from the softirq
151
 * @softirq_time:       the time when running the hrtimer queue in the softirq
152
 * @cb_pending:         list of timers where the callback is pending
153
 * @offset:             offset of this clock to the monotonic base
154
 * @reprogram:          function to reprogram the timer event
155
 */
156
struct hrtimer_clock_base {
157
        struct hrtimer_cpu_base *cpu_base;
158
        clockid_t               index;
159
        struct rb_root          active;
160
        struct rb_node          *first;
161
        ktime_t                 resolution;
162
        ktime_t                 (*get_time)(void);
163
        ktime_t                 (*get_softirq_time)(void);
164
        ktime_t                 softirq_time;
165
#ifdef CONFIG_HIGH_RES_TIMERS
166
        ktime_t                 offset;
167
        int                     (*reprogram)(struct hrtimer *t,
168
                                             struct hrtimer_clock_base *b,
169
                                             ktime_t n);
170
#endif
171
};
172
 
173
#define HRTIMER_MAX_CLOCK_BASES 2
174
 
175
/*
176
 * struct hrtimer_cpu_base - the per cpu clock bases
177
 * @lock:               lock protecting the base and associated clock bases
178
 *                      and timers
179
 * @lock_key:           the lock_class_key for use with lockdep
180
 * @clock_base:         array of clock bases for this cpu
181
 * @curr_timer:         the timer which is executing a callback right now
182
 * @expires_next:       absolute time of the next event which was scheduled
183
 *                      via clock_set_next_event()
184
 * @hres_active:        State of high resolution mode
185
 * @check_clocks:       Indictator, when set evaluate time source and clock
186
 *                      event devices whether high resolution mode can be
187
 *                      activated.
188
 * @cb_pending:         Expired timers are moved from the rbtree to this
189
 *                      list in the timer interrupt. The list is processed
190
 *                      in the softirq.
191
 * @nr_events:          Total number of timer interrupt events
192
 */
193
struct hrtimer_cpu_base {
194
        spinlock_t                      lock;
195
        struct lock_class_key           lock_key;
196
        struct hrtimer_clock_base       clock_base[HRTIMER_MAX_CLOCK_BASES];
197
#ifdef CONFIG_HIGH_RES_TIMERS
198
        ktime_t                         expires_next;
199
        int                             hres_active;
200
        struct list_head                cb_pending;
201
        unsigned long                   nr_events;
202
#endif
203
};
204
 
205
#ifdef CONFIG_HIGH_RES_TIMERS
206
struct clock_event_device;
207
 
208
extern void clock_was_set(void);
209
extern void hres_timers_resume(void);
210
extern void hrtimer_interrupt(struct clock_event_device *dev);
211
 
212
/*
213
 * In high resolution mode the time reference must be read accurate
214
 */
215
static inline ktime_t hrtimer_cb_get_time(struct hrtimer *timer)
216
{
217
        return timer->base->get_time();
218
}
219
 
220
/*
221
 * The resolution of the clocks. The resolution value is returned in
222
 * the clock_getres() system call to give application programmers an
223
 * idea of the (in)accuracy of timers. Timer values are rounded up to
224
 * this resolution values.
225
 */
226
# define KTIME_HIGH_RES         (ktime_t) { .tv64 = 1 }
227
# define KTIME_MONOTONIC_RES    KTIME_HIGH_RES
228
 
229
#else
230
 
231
# define KTIME_MONOTONIC_RES    KTIME_LOW_RES
232
 
233
/*
234
 * clock_was_set() is a NOP for non- high-resolution systems. The
235
 * time-sorted order guarantees that a timer does not expire early and
236
 * is expired in the next softirq when the clock was advanced.
237
 */
238
static inline void clock_was_set(void) { }
239
 
240
static inline void hres_timers_resume(void) { }
241
 
242
/*
243
 * In non high resolution mode the time reference is taken from
244
 * the base softirq time variable.
245
 */
246
static inline ktime_t hrtimer_cb_get_time(struct hrtimer *timer)
247
{
248
        return timer->base->softirq_time;
249
}
250
 
251
#endif
252
 
253
extern ktime_t ktime_get(void);
254
extern ktime_t ktime_get_real(void);
255
 
256
/* Exported timer functions: */
257
 
258
/* Initialize timers: */
259
extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock,
260
                         enum hrtimer_mode mode);
261
 
262
/* Basic timer operations: */
263
extern int hrtimer_start(struct hrtimer *timer, ktime_t tim,
264
                         const enum hrtimer_mode mode);
265
extern int hrtimer_cancel(struct hrtimer *timer);
266
extern int hrtimer_try_to_cancel(struct hrtimer *timer);
267
 
268
static inline int hrtimer_restart(struct hrtimer *timer)
269
{
270
        return hrtimer_start(timer, timer->expires, HRTIMER_MODE_ABS);
271
}
272
 
273
/* Query timers: */
274
extern ktime_t hrtimer_get_remaining(const struct hrtimer *timer);
275
extern int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp);
276
 
277
extern ktime_t hrtimer_get_next_event(void);
278
 
279
/*
280
 * A timer is active, when it is enqueued into the rbtree or the callback
281
 * function is running.
282
 */
283
static inline int hrtimer_active(const struct hrtimer *timer)
284
{
285
        return timer->state != HRTIMER_STATE_INACTIVE;
286
}
287
 
288
/*
289
 * Helper function to check, whether the timer is on one of the queues
290
 */
291
static inline int hrtimer_is_queued(struct hrtimer *timer)
292
{
293
        return timer->state &
294
                (HRTIMER_STATE_ENQUEUED | HRTIMER_STATE_PENDING);
295
}
296
 
297
/* Forward a hrtimer so it expires after now: */
298
extern unsigned long
299
hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval);
300
 
301
/* Precise sleep: */
302
extern long hrtimer_nanosleep(struct timespec *rqtp,
303
                              struct timespec *rmtp,
304
                              const enum hrtimer_mode mode,
305
                              const clockid_t clockid);
306
extern long hrtimer_nanosleep_restart(struct restart_block *restart_block);
307
 
308
extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl,
309
                                 struct task_struct *tsk);
310
 
311
/* Soft interrupt function to run the hrtimer queues: */
312
extern void hrtimer_run_queues(void);
313
 
314
/* Bootup initialization: */
315
extern void __init hrtimers_init(void);
316
 
317
#if BITS_PER_LONG < 64
318
extern unsigned long ktime_divns(const ktime_t kt, s64 div);
319
#else /* BITS_PER_LONG < 64 */
320
# define ktime_divns(kt, div)           (unsigned long)((kt).tv64 / (div))
321
#endif
322
 
323
/* Show pending timers: */
324
extern void sysrq_timer_list_show(void);
325
 
326
/*
327
 * Timer-statistics info:
328
 */
329
#ifdef CONFIG_TIMER_STATS
330
 
331
extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
332
                                     void *timerf, char *comm,
333
                                     unsigned int timer_flag);
334
 
335
static inline void timer_stats_account_hrtimer(struct hrtimer *timer)
336
{
337
        timer_stats_update_stats(timer, timer->start_pid, timer->start_site,
338
                                 timer->function, timer->start_comm, 0);
339
}
340
 
341
extern void __timer_stats_hrtimer_set_start_info(struct hrtimer *timer,
342
                                                 void *addr);
343
 
344
static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer)
345
{
346
        __timer_stats_hrtimer_set_start_info(timer, __builtin_return_address(0));
347
}
348
 
349
static inline void timer_stats_hrtimer_clear_start_info(struct hrtimer *timer)
350
{
351
        timer->start_site = NULL;
352
}
353
#else
354
static inline void timer_stats_account_hrtimer(struct hrtimer *timer)
355
{
356
}
357
 
358
static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer)
359
{
360
}
361
 
362
static inline void timer_stats_hrtimer_clear_start_info(struct hrtimer *timer)
363
{
364
}
365
#endif
366
 
367
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.