Blame view

include/linux/clockchips.h 6.56 KB
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
1
2
3
4
5
6
7
8
9
  /*  linux/include/linux/clockchips.h
   *
   *  This file contains the structure definitions for clockchips.
   *
   *  If you are not a clockchip, or the time of day code, you should
   *  not be including this file!
   */
  #ifndef _LINUX_CLOCKCHIPS_H
  #define _LINUX_CLOCKCHIPS_H
4dbad816f   Daniel Lezcano   timer: move enum ...
10
11
12
13
14
15
16
17
18
19
20
21
22
  /* Clock event notification values */
  enum clock_event_nofitiers {
  	CLOCK_EVT_NOTIFY_ADD,
  	CLOCK_EVT_NOTIFY_BROADCAST_ON,
  	CLOCK_EVT_NOTIFY_BROADCAST_OFF,
  	CLOCK_EVT_NOTIFY_BROADCAST_FORCE,
  	CLOCK_EVT_NOTIFY_BROADCAST_ENTER,
  	CLOCK_EVT_NOTIFY_BROADCAST_EXIT,
  	CLOCK_EVT_NOTIFY_SUSPEND,
  	CLOCK_EVT_NOTIFY_RESUME,
  	CLOCK_EVT_NOTIFY_CPU_DYING,
  	CLOCK_EVT_NOTIFY_CPU_DEAD,
  };
de68d9b17   Thomas Gleixner   clockevents: Allo...
23
  #ifdef CONFIG_GENERIC_CLOCKEVENTS_BUILD
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
24
25
26
27
28
29
30
  
  #include <linux/clocksource.h>
  #include <linux/cpumask.h>
  #include <linux/ktime.h>
  #include <linux/notifier.h>
  
  struct clock_event_device;
ccf33d688   Thomas Gleixner   clockevents: Add ...
31
  struct module;
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
32
33
34
35
36
37
38
  
  /* Clock event mode commands */
  enum clock_event_mode {
  	CLOCK_EVT_MODE_UNUSED = 0,
  	CLOCK_EVT_MODE_SHUTDOWN,
  	CLOCK_EVT_MODE_PERIODIC,
  	CLOCK_EVT_MODE_ONESHOT,
18de5bc4c   Thomas Gleixner   clockevents: fix ...
39
  	CLOCK_EVT_MODE_RESUME,
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
40
  };
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
41
42
43
44
45
  /*
   * Clock event features
   */
  #define CLOCK_EVT_FEAT_PERIODIC		0x000001
  #define CLOCK_EVT_FEAT_ONESHOT		0x000002
65516f8a7   Martin Schwidefsky   clockevents: Add ...
46
  #define CLOCK_EVT_FEAT_KTIME		0x000004
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
47
48
49
50
51
52
  /*
   * x86(64) specific misfeatures:
   *
   * - Clockevent source stops in C3 State and needs broadcast support.
   * - Local APIC timer is used as a dummy device.
   */
65516f8a7   Martin Schwidefsky   clockevents: Add ...
53
54
  #define CLOCK_EVT_FEAT_C3STOP		0x000008
  #define CLOCK_EVT_FEAT_DUMMY		0x000010
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
55

d2348fb6f   Daniel Lezcano   tick: Dynamically...
56
57
58
59
  /*
   * Core shall set the interrupt affinity dynamically in broadcast mode
   */
  #define CLOCK_EVT_FEAT_DYNIRQ		0x000020
3713c0cfd   Soren Brinkmann   clockchips: Add F...
60
  #define CLOCK_EVT_FEAT_PERCPU		0x000040
d2348fb6f   Daniel Lezcano   tick: Dynamically...
61

5d1638acb   Preeti U Murthy   tick: Introduce h...
62
63
64
65
  /*
   * Clockevent device is based on a hrtimer for broadcast
   */
  #define CLOCK_EVT_FEAT_HRTIMER		0x000080
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
66
67
  /**
   * struct clock_event_device - clock event device descriptor
847b2f42b   Thomas Gleixner   clockevents: Rest...
68
69
   * @event_handler:	Assigned by the framework to be called by the low
   *			level handler of the event source
65516f8a7   Martin Schwidefsky   clockevents: Add ...
70
71
   * @set_next_event:	set next event function using a clocksource delta
   * @set_next_ktime:	set next event function using a direct ktime value
847b2f42b   Thomas Gleixner   clockevents: Rest...
72
   * @next_event:		local storage for the next event in oneshot mode
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
73
74
75
76
   * @max_delta_ns:	maximum delta value in ns
   * @min_delta_ns:	minimum delta value in ns
   * @mult:		nanosecond to cycles multiplier
   * @shift:		nanoseconds to cycles divisor (power of two)
847b2f42b   Thomas Gleixner   clockevents: Rest...
77
78
79
80
81
   * @mode:		operating mode assigned by the management code
   * @features:		features
   * @retries:		number of forced programming retries
   * @set_mode:		set mode function
   * @broadcast:		function to broadcast events
57f0fcbe1   Thomas Gleixner   clockevents: Prov...
82
83
   * @min_delta_ticks:	minimum delta value in ticks stored for reconfiguration
   * @max_delta_ticks:	maximum delta value in ticks stored for reconfiguration
847b2f42b   Thomas Gleixner   clockevents: Rest...
84
   * @name:		ptr to clock event name
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
85
   * @rating:		variable to rate clock event devices
ce0be1273   Sergei Shtylyov   clockchips.h: ker...
86
   * @irq:		IRQ number (only for non CPU local devices)
5d1638acb   Preeti U Murthy   tick: Introduce h...
87
   * @bound_on:		Bound on CPU
ce0be1273   Sergei Shtylyov   clockchips.h: ker...
88
   * @cpumask:		cpumask to indicate for which CPUs this device works
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
89
   * @list:		list head for the management code
ccf33d688   Thomas Gleixner   clockevents: Add ...
90
   * @owner:		module reference
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
91
92
   */
  struct clock_event_device {
847b2f42b   Thomas Gleixner   clockevents: Rest...
93
94
95
  	void			(*event_handler)(struct clock_event_device *);
  	int			(*set_next_event)(unsigned long evt,
  						  struct clock_event_device *);
65516f8a7   Martin Schwidefsky   clockevents: Add ...
96
97
  	int			(*set_next_ktime)(ktime_t expires,
  						  struct clock_event_device *);
847b2f42b   Thomas Gleixner   clockevents: Rest...
98
  	ktime_t			next_event;
97813f2fe   Jon Hunter   nohz: Allow 32-bi...
99
100
  	u64			max_delta_ns;
  	u64			min_delta_ns;
23af368e9   Thomas Gleixner   clockevents: Use ...
101
102
  	u32			mult;
  	u32			shift;
847b2f42b   Thomas Gleixner   clockevents: Rest...
103
104
105
106
107
108
109
  	enum clock_event_mode	mode;
  	unsigned int		features;
  	unsigned long		retries;
  
  	void			(*broadcast)(const struct cpumask *mask);
  	void			(*set_mode)(enum clock_event_mode mode,
  					    struct clock_event_device *);
adc78e6b9   Rafael J. Wysocki   timekeeping: Add ...
110
111
  	void			(*suspend)(struct clock_event_device *);
  	void			(*resume)(struct clock_event_device *);
57f0fcbe1   Thomas Gleixner   clockevents: Prov...
112
113
  	unsigned long		min_delta_ticks;
  	unsigned long		max_delta_ticks;
847b2f42b   Thomas Gleixner   clockevents: Rest...
114
  	const char		*name;
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
115
116
  	int			rating;
  	int			irq;
5d1638acb   Preeti U Murthy   tick: Introduce h...
117
  	int			bound_on;
320ab2b0b   Rusty Russell   cpumask: convert ...
118
  	const struct cpumask	*cpumask;
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
119
  	struct list_head	list;
ccf33d688   Thomas Gleixner   clockevents: Add ...
120
  	struct module		*owner;
847b2f42b   Thomas Gleixner   clockevents: Rest...
121
  } ____cacheline_aligned;
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
  
  /*
   * Calculate a multiplication factor for scaled math, which is used to convert
   * nanoseconds based values to clock ticks:
   *
   * clock_ticks = (nanoseconds * factor) >> shift.
   *
   * div_sc is the rearranged equation to calculate a factor from a given clock
   * ticks / nanoseconds ratio:
   *
   * factor = (clock_ticks << shift) / nanoseconds
   */
  static inline unsigned long div_sc(unsigned long ticks, unsigned long nsec,
  				   int shift)
  {
  	uint64_t tmp = ((uint64_t)ticks) << shift;
  
  	do_div(tmp, nsec);
  	return (unsigned long) tmp;
  }
  
  /* Clock event layer functions */
97813f2fe   Jon Hunter   nohz: Allow 32-bi...
144
145
  extern u64 clockevent_delta2ns(unsigned long latch,
  			       struct clock_event_device *evt);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
146
  extern void clockevents_register_device(struct clock_event_device *dev);
03e13cf5e   Thomas Gleixner   clockevents: Impl...
147
  extern int clockevents_unbind_device(struct clock_event_device *ced, int cpu);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
148

e5400321a   Magnus Damm   clockevents: Make...
149
  extern void clockevents_config(struct clock_event_device *dev, u32 freq);
57f0fcbe1   Thomas Gleixner   clockevents: Prov...
150
151
152
  extern void clockevents_config_and_register(struct clock_event_device *dev,
  					    u32 freq, unsigned long min_delta,
  					    unsigned long max_delta);
80b816b73   Thomas Gleixner   clockevents: Prov...
153
  extern int clockevents_update_freq(struct clock_event_device *ce, u32 freq);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
154
155
  extern void clockevents_exchange_device(struct clock_event_device *old,
  					struct clock_event_device *new);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
156
157
  extern void clockevents_set_mode(struct clock_event_device *dev,
  				 enum clock_event_mode mode);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
158
  extern int clockevents_program_event(struct clock_event_device *dev,
d1748302f   Martin Schwidefsky   clockevents: Make...
159
  				     ktime_t expires, bool force);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
160

7c1e76897   Venkatesh Pallipadi   clockevents: prev...
161
  extern void clockevents_handle_noop(struct clock_event_device *dev);
7d2f944a2   Thomas Gleixner   clocksource: Prov...
162
163
164
165
166
167
  static inline void
  clockevents_calc_mult_shift(struct clock_event_device *ce, u32 freq, u32 minsec)
  {
  	return clocks_calc_mult_shift(&ce->mult, &ce->shift, NSEC_PER_SEC,
  				      freq, minsec);
  }
adc78e6b9   Rafael J. Wysocki   timekeeping: Add ...
168
169
  extern void clockevents_suspend(void);
  extern void clockevents_resume(void);
12572dbb5   Mark Rutland   clockevents: Add ...
170
  #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
12ad10004   Mark Rutland   clockevents: Add ...
171
172
173
174
175
  #ifdef CONFIG_ARCH_HAS_TICK_BROADCAST
  extern void tick_broadcast(const struct cpumask *mask);
  #else
  #define tick_broadcast	NULL
  #endif
12572dbb5   Mark Rutland   clockevents: Add ...
176
177
  extern int tick_receive_broadcast(void);
  #endif
eaa907c54   Thomas Gleixner   tick: Provide a c...
178
  #if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && defined(CONFIG_TICK_ONESHOT)
5d1638acb   Preeti U Murthy   tick: Introduce h...
179
  extern void tick_setup_hrtimer_broadcast(void);
eaa907c54   Thomas Gleixner   tick: Provide a c...
180
181
182
  extern int tick_check_broadcast_expired(void);
  #else
  static inline int tick_check_broadcast_expired(void) { return 0; }
f1689bb7a   Thomas Gleixner   time: Fixup fallo...
183
  static inline void tick_setup_hrtimer_broadcast(void) {};
eaa907c54   Thomas Gleixner   tick: Provide a c...
184
  #endif
de68d9b17   Thomas Gleixner   clockevents: Allo...
185
  #ifdef CONFIG_GENERIC_CLOCKEVENTS
da7e6f45c   Preeti U Murthy   time: Change the ...
186
  extern int clockevents_notify(unsigned long reason, void *arg);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
187
  #else
da7e6f45c   Preeti U Murthy   time: Change the ...
188
  static inline int clockevents_notify(unsigned long reason, void *arg) { return 0; }
de68d9b17   Thomas Gleixner   clockevents: Allo...
189
190
191
  #endif
  
  #else /* CONFIG_GENERIC_CLOCKEVENTS_BUILD */
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
192

adc78e6b9   Rafael J. Wysocki   timekeeping: Add ...
193
194
  static inline void clockevents_suspend(void) {}
  static inline void clockevents_resume(void) {}
da7e6f45c   Preeti U Murthy   time: Change the ...
195
  static inline int clockevents_notify(unsigned long reason, void *arg) { return 0; }
19919226c   Thomas Gleixner   clockevents: Add ...
196
  static inline int tick_check_broadcast_expired(void) { return 0; }
849401b66   Preeti U Murthy   tick: Fixup more ...
197
  static inline void tick_setup_hrtimer_broadcast(void) {};
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
198
199
200
201
  
  #endif
  
  #endif