• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * tick internal variable and functions used by low/high res code
3  */
4 #include <linux/hrtimer.h>
5 #include <linux/tick.h>
6 
7 #include "timekeeping.h"
8 
9 extern seqlock_t jiffies_lock;
10 
11 #define CS_NAME_LEN	32
12 
13 #ifdef CONFIG_GENERIC_CLOCKEVENTS_BUILD
14 
15 #define TICK_DO_TIMER_NONE	-1
16 #define TICK_DO_TIMER_BOOT	-2
17 
18 DECLARE_PER_CPU(struct tick_device, tick_cpu_device);
19 extern ktime_t tick_next_period;
20 extern ktime_t tick_period;
21 extern int tick_do_timer_cpu __read_mostly;
22 
23 extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast);
24 extern void tick_handle_periodic(struct clock_event_device *dev);
25 extern void tick_check_new_device(struct clock_event_device *dev);
26 extern void tick_handover_do_timer(int *cpup);
27 extern void tick_shutdown(unsigned int *cpup);
28 extern void tick_suspend(void);
29 extern void tick_resume(void);
30 extern bool tick_check_replacement(struct clock_event_device *curdev,
31 				   struct clock_event_device *newdev);
32 extern void tick_install_replacement(struct clock_event_device *dev);
33 
34 extern void clockevents_shutdown(struct clock_event_device *dev);
35 
36 extern ssize_t sysfs_get_uname(const char *buf, char *dst, size_t cnt);
37 
38 /*
39  * NO_HZ / high resolution timer shared code
40  */
41 #ifdef CONFIG_TICK_ONESHOT
42 extern void tick_setup_oneshot(struct clock_event_device *newdev,
43 			       void (*handler)(struct clock_event_device *),
44 			       ktime_t nextevt);
45 extern int tick_program_event(ktime_t expires, int force);
46 extern void tick_oneshot_notify(void);
47 extern int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *));
48 extern void tick_resume_oneshot(void);
49 # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
50 extern void tick_broadcast_setup_oneshot(struct clock_event_device *bc);
51 extern int tick_broadcast_oneshot_control(unsigned long reason);
52 extern void tick_broadcast_switch_to_oneshot(void);
53 extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup);
54 extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc);
55 extern int tick_broadcast_oneshot_active(void);
56 extern void tick_check_oneshot_broadcast_this_cpu(void);
57 bool tick_broadcast_oneshot_available(void);
58 # else /* BROADCAST */
tick_broadcast_setup_oneshot(struct clock_event_device * bc)59 static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
60 {
61 	BUG();
62 }
tick_broadcast_oneshot_control(unsigned long reason)63 static inline int tick_broadcast_oneshot_control(unsigned long reason) { return 0; }
tick_broadcast_switch_to_oneshot(void)64 static inline void tick_broadcast_switch_to_oneshot(void) { }
tick_shutdown_broadcast_oneshot(unsigned int * cpup)65 static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
tick_broadcast_oneshot_active(void)66 static inline int tick_broadcast_oneshot_active(void) { return 0; }
tick_check_oneshot_broadcast_this_cpu(void)67 static inline void tick_check_oneshot_broadcast_this_cpu(void) { }
tick_broadcast_oneshot_available(void)68 static inline bool tick_broadcast_oneshot_available(void) { return true; }
69 # endif /* !BROADCAST */
70 
71 #else /* !ONESHOT */
72 static inline
tick_setup_oneshot(struct clock_event_device * newdev,void (* handler)(struct clock_event_device *),ktime_t nextevt)73 void tick_setup_oneshot(struct clock_event_device *newdev,
74 			void (*handler)(struct clock_event_device *),
75 			ktime_t nextevt)
76 {
77 	BUG();
78 }
tick_resume_oneshot(void)79 static inline void tick_resume_oneshot(void)
80 {
81 	BUG();
82 }
tick_program_event(ktime_t expires,int force)83 static inline int tick_program_event(ktime_t expires, int force)
84 {
85 	return 0;
86 }
tick_oneshot_notify(void)87 static inline void tick_oneshot_notify(void) { }
tick_broadcast_setup_oneshot(struct clock_event_device * bc)88 static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
89 {
90 	BUG();
91 }
tick_broadcast_oneshot_control(unsigned long reason)92 static inline int tick_broadcast_oneshot_control(unsigned long reason) { return 0; }
tick_shutdown_broadcast_oneshot(unsigned int * cpup)93 static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
tick_resume_broadcast_oneshot(struct clock_event_device * bc)94 static inline int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
95 {
96 	return 0;
97 }
tick_broadcast_oneshot_active(void)98 static inline int tick_broadcast_oneshot_active(void) { return 0; }
tick_broadcast_oneshot_available(void)99 static inline bool tick_broadcast_oneshot_available(void) { return false; }
100 #endif /* !TICK_ONESHOT */
101 
102 /* NO_HZ_FULL internal */
103 #ifdef CONFIG_NO_HZ_FULL
104 extern void tick_nohz_init(void);
105 # else
tick_nohz_init(void)106 static inline void tick_nohz_init(void) { }
107 #endif
108 
109 /*
110  * Broadcasting support
111  */
112 #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
113 extern int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu);
114 extern void tick_install_broadcast_device(struct clock_event_device *dev);
115 extern int tick_is_broadcast_device(struct clock_event_device *dev);
116 extern void tick_broadcast_on_off(unsigned long reason, int *oncpu);
117 extern void tick_shutdown_broadcast(unsigned int *cpup);
118 extern void tick_suspend_broadcast(void);
119 extern int tick_resume_broadcast(void);
120 extern void tick_broadcast_init(void);
121 extern void
122 tick_set_periodic_handler(struct clock_event_device *dev, int broadcast);
123 int tick_broadcast_update_freq(struct clock_event_device *dev, u32 freq);
124 
125 #else /* !BROADCAST */
126 
tick_install_broadcast_device(struct clock_event_device * dev)127 static inline void tick_install_broadcast_device(struct clock_event_device *dev)
128 {
129 }
130 
tick_is_broadcast_device(struct clock_event_device * dev)131 static inline int tick_is_broadcast_device(struct clock_event_device *dev)
132 {
133 	return 0;
134 }
tick_device_uses_broadcast(struct clock_event_device * dev,int cpu)135 static inline int tick_device_uses_broadcast(struct clock_event_device *dev,
136 					     int cpu)
137 {
138 	return 0;
139 }
tick_do_periodic_broadcast(struct clock_event_device * d)140 static inline void tick_do_periodic_broadcast(struct clock_event_device *d) { }
tick_broadcast_on_off(unsigned long reason,int * oncpu)141 static inline void tick_broadcast_on_off(unsigned long reason, int *oncpu) { }
tick_shutdown_broadcast(unsigned int * cpup)142 static inline void tick_shutdown_broadcast(unsigned int *cpup) { }
tick_suspend_broadcast(void)143 static inline void tick_suspend_broadcast(void) { }
tick_resume_broadcast(void)144 static inline int tick_resume_broadcast(void) { return 0; }
tick_broadcast_init(void)145 static inline void tick_broadcast_init(void) { }
tick_broadcast_update_freq(struct clock_event_device * dev,u32 freq)146 static inline int tick_broadcast_update_freq(struct clock_event_device *dev,
147 					     u32 freq) { return -ENODEV; }
148 
149 /*
150  * Set the periodic handler in non broadcast mode
151  */
tick_set_periodic_handler(struct clock_event_device * dev,int broadcast)152 static inline void tick_set_periodic_handler(struct clock_event_device *dev,
153 					     int broadcast)
154 {
155 	dev->event_handler = tick_handle_periodic;
156 }
157 #endif /* !BROADCAST */
158 
159 /*
160  * Check, if the device is functional or a dummy for broadcast
161  */
tick_device_is_functional(struct clock_event_device * dev)162 static inline int tick_device_is_functional(struct clock_event_device *dev)
163 {
164 	return !(dev->features & CLOCK_EVT_FEAT_DUMMY);
165 }
166 
167 int __clockevents_update_freq(struct clock_event_device *dev, u32 freq);
168 
169 #endif
170 
171 extern void do_timer(unsigned long ticks);
172 extern void update_wall_time(void);
173