2007-02-16 12:28:02 +03:00
/*
* tick internal variable and functions used by low / high res code
*/
2011-01-27 18:00:32 +03:00
# include <linux/hrtimer.h>
# include <linux/tick.h>
2008-09-22 20:46:37 +04:00
2014-07-17 01:04:02 +04:00
# include "timekeeping.h"
2015-03-25 15:07:37 +03:00
# include "tick-sched.h"
2014-07-17 01:04:02 +04:00
2015-03-25 15:05:19 +03:00
# ifdef CONFIG_GENERIC_CLOCKEVENTS
2008-09-22 20:46:37 +04:00
2015-04-02 12:26:06 +03:00
# define TICK_DO_TIMER_NONE -1
# define TICK_DO_TIMER_BOOT -2
2008-09-22 20:46:37 +04:00
2007-02-16 12:28:02 +03:00
DECLARE_PER_CPU ( struct tick_device , tick_cpu_device ) ;
extern ktime_t tick_next_period ;
extern ktime_t tick_period ;
2007-05-08 11:30:03 +04:00
extern int tick_do_timer_cpu __read_mostly ;
2007-02-16 12:28:02 +03:00
extern void tick_setup_periodic ( struct clock_event_device * dev , int broadcast ) ;
extern void tick_handle_periodic ( struct clock_event_device * dev ) ;
2013-04-26 00:31:47 +04:00
extern void tick_check_new_device ( struct clock_event_device * dev ) ;
2015-04-03 03:38:05 +03:00
extern void tick_shutdown ( unsigned int cpu ) ;
2013-04-26 00:31:48 +04:00
extern void tick_suspend ( void ) ;
2015-03-25 15:11:04 +03:00
extern void tick_resume ( void ) ;
2013-04-26 00:31:50 +04:00
extern bool tick_check_replacement ( struct clock_event_device * curdev ,
struct clock_event_device * newdev ) ;
extern void tick_install_replacement ( struct clock_event_device * dev ) ;
2015-03-25 15:07:37 +03:00
extern int tick_is_oneshot_available ( void ) ;
2015-03-25 15:11:52 +03:00
extern struct tick_device * tick_get_device ( int cpu ) ;
2007-02-16 12:28:02 +03:00
2015-02-27 14:51:32 +03:00
extern int clockevents_tick_resume ( struct clock_event_device * dev ) ;
2015-03-25 15:06:47 +03:00
/* Check, if the device is functional or a dummy for broadcast */
static inline int tick_device_is_functional ( struct clock_event_device * dev )
{
return ! ( dev - > features & CLOCK_EVT_FEAT_DUMMY ) ;
}
2008-09-16 22:32:50 +04:00
2015-06-02 15:08:46 +03:00
static inline enum clock_event_state clockevent_get_state ( struct clock_event_device * dev )
{
2015-06-02 15:30:11 +03:00
return dev - > state_use_accessors ;
2015-06-02 15:08:46 +03:00
}
static inline void clockevent_set_state ( struct clock_event_device * dev ,
enum clock_event_state state )
{
2015-06-02 15:30:11 +03:00
dev - > state_use_accessors = state ;
2015-06-02 15:08:46 +03:00
}
2015-03-25 15:06:47 +03:00
extern void clockevents_shutdown ( struct clock_event_device * dev ) ;
2015-03-25 15:07:37 +03:00
extern void clockevents_exchange_device ( struct clock_event_device * old ,
struct clock_event_device * new ) ;
2015-06-02 15:08:46 +03:00
extern void clockevents_switch_state ( struct clock_event_device * dev ,
enum clock_event_state state ) ;
2015-03-25 15:11:52 +03:00
extern int clockevents_program_event ( struct clock_event_device * dev ,
ktime_t expires , bool force ) ;
2015-03-25 15:07:37 +03:00
extern void clockevents_handle_noop ( struct clock_event_device * dev ) ;
2015-03-25 15:06:47 +03:00
extern int __clockevents_update_freq ( struct clock_event_device * dev , u32 freq ) ;
2013-10-11 21:11:55 +04:00
extern ssize_t sysfs_get_uname ( const char * buf , char * dst , size_t cnt ) ;
2007-02-16 12:28:03 +03:00
2015-03-25 15:06:47 +03:00
/* Broadcasting support */
2015-04-02 12:26:06 +03:00
# ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
2007-02-16 12:28:02 +03:00
extern int tick_device_uses_broadcast ( struct clock_event_device * dev , int cpu ) ;
2013-04-26 00:31:47 +04:00
extern void tick_install_broadcast_device ( struct clock_event_device * dev ) ;
2007-02-16 12:28:02 +03:00
extern int tick_is_broadcast_device ( struct clock_event_device * dev ) ;
2015-04-03 03:38:05 +03:00
extern void tick_shutdown_broadcast ( unsigned int cpu ) ;
2007-03-06 10:25:42 +03:00
extern void tick_suspend_broadcast ( void ) ;
2015-03-25 15:11:04 +03:00
extern void tick_resume_broadcast ( void ) ;
extern bool tick_resume_check_broadcast ( void ) ;
2013-03-05 17:25:32 +04:00
extern void tick_broadcast_init ( void ) ;
2015-03-25 15:06:47 +03:00
extern void tick_set_periodic_handler ( struct clock_event_device * dev , int broadcast ) ;
extern int tick_broadcast_update_freq ( struct clock_event_device * dev , u32 freq ) ;
2015-03-25 15:07:37 +03:00
extern struct tick_device * tick_get_broadcast_device ( void ) ;
extern struct cpumask * tick_get_broadcast_mask ( void ) ;
2015-04-02 12:26:06 +03:00
# else /* !CONFIG_GENERIC_CLOCKEVENTS_BROADCAST: */
2015-03-25 15:06:47 +03:00
static inline void tick_install_broadcast_device ( struct clock_event_device * dev ) { }
static inline int tick_is_broadcast_device ( struct clock_event_device * dev ) { return 0 ; }
static inline int tick_device_uses_broadcast ( struct clock_event_device * dev , int cpu ) { return 0 ; }
2007-02-16 12:28:02 +03:00
static inline void tick_do_periodic_broadcast ( struct clock_event_device * d ) { }
2015-04-03 03:38:05 +03:00
static inline void tick_shutdown_broadcast ( unsigned int cpu ) { }
2007-03-06 10:25:42 +03:00
static inline void tick_suspend_broadcast ( void ) { }
2015-03-25 15:11:04 +03:00
static inline void tick_resume_broadcast ( void ) { }
static inline bool tick_resume_check_broadcast ( void ) { return false ; }
2013-03-05 17:25:32 +04:00
static inline void tick_broadcast_init ( void ) { }
2015-03-25 15:06:47 +03:00
static inline int tick_broadcast_update_freq ( struct clock_event_device * dev , u32 freq ) { return - ENODEV ; }
2007-02-16 12:28:02 +03:00
2015-03-25 15:06:47 +03:00
/* Set the periodic handler in non broadcast mode */
static inline void tick_set_periodic_handler ( struct clock_event_device * dev , int broadcast )
2007-02-16 12:28:02 +03:00
{
dev - > event_handler = tick_handle_periodic ;
}
2015-04-02 12:26:06 +03:00
# endif /* !CONFIG_GENERIC_CLOCKEVENTS_BROADCAST */
# else /* !GENERIC_CLOCKEVENTS: */
static inline void tick_suspend ( void ) { }
static inline void tick_resume ( void ) { }
# endif /* !GENERIC_CLOCKEVENTS */
/* Oneshot related functions */
# ifdef CONFIG_TICK_ONESHOT
extern void tick_setup_oneshot ( struct clock_event_device * newdev ,
void ( * handler ) ( struct clock_event_device * ) ,
ktime_t nextevt ) ;
extern int tick_program_event ( ktime_t expires , int force ) ;
extern void tick_oneshot_notify ( void ) ;
extern int tick_switch_to_oneshot ( void ( * handler ) ( struct clock_event_device * ) ) ;
extern void tick_resume_oneshot ( void ) ;
static inline bool tick_oneshot_possible ( void ) { return true ; }
extern int tick_oneshot_mode_active ( void ) ;
extern void tick_clock_notify ( void ) ;
extern int tick_check_oneshot_change ( int allow_nohz ) ;
extern int tick_init_highres ( void ) ;
# else /* !CONFIG_TICK_ONESHOT: */
static inline
void tick_setup_oneshot ( struct clock_event_device * newdev ,
void ( * handler ) ( struct clock_event_device * ) ,
ktime_t nextevt ) { BUG ( ) ; }
static inline void tick_resume_oneshot ( void ) { BUG ( ) ; }
static inline int tick_program_event ( ktime_t expires , int force ) { return 0 ; }
static inline void tick_oneshot_notify ( void ) { }
static inline bool tick_oneshot_possible ( void ) { return false ; }
static inline int tick_oneshot_mode_active ( void ) { return 0 ; }
static inline void tick_clock_notify ( void ) { }
static inline int tick_check_oneshot_change ( int allow_nohz ) { return 0 ; }
# endif /* !CONFIG_TICK_ONESHOT */
2007-02-16 12:28:02 +03:00
2015-03-25 15:06:47 +03:00
/* Functions related to oneshot broadcasting */
# if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && defined(CONFIG_TICK_ONESHOT)
extern void tick_broadcast_setup_oneshot ( struct clock_event_device * bc ) ;
extern void tick_broadcast_switch_to_oneshot ( void ) ;
2015-04-03 03:38:05 +03:00
extern void tick_shutdown_broadcast_oneshot ( unsigned int cpu ) ;
2015-03-25 15:06:47 +03:00
extern int tick_broadcast_oneshot_active ( void ) ;
extern void tick_check_oneshot_broadcast_this_cpu ( void ) ;
bool tick_broadcast_oneshot_available ( void ) ;
2015-03-25 15:07:37 +03:00
extern struct cpumask * tick_get_broadcast_oneshot_mask ( void ) ;
2015-04-02 12:26:06 +03:00
# else /* !(BROADCAST && ONESHOT): */
2015-03-25 15:06:47 +03:00
static inline void tick_broadcast_setup_oneshot ( struct clock_event_device * bc ) { BUG ( ) ; }
static inline void tick_broadcast_switch_to_oneshot ( void ) { }
2015-04-03 03:38:05 +03:00
static inline void tick_shutdown_broadcast_oneshot ( unsigned int cpu ) { }
2015-03-25 15:06:47 +03:00
static inline int tick_broadcast_oneshot_active ( void ) { return 0 ; }
static inline void tick_check_oneshot_broadcast_this_cpu ( void ) { }
static inline bool tick_broadcast_oneshot_available ( void ) { return tick_oneshot_possible ( ) ; }
2015-04-02 12:26:06 +03:00
# endif /* !(BROADCAST && ONESHOT) */
2011-02-01 11:34:58 +03:00
2015-03-25 15:06:47 +03:00
/* NO_HZ_FULL internal */
# ifdef CONFIG_NO_HZ_FULL
extern void tick_nohz_init ( void ) ;
# else
static inline void tick_nohz_init ( void ) { }
# endif
2015-04-15 00:08:58 +03:00
2015-05-27 01:50:33 +03:00
# ifdef CONFIG_NO_HZ_COMMON
extern unsigned long tick_nohz_active ;
# else
# define tick_nohz_active (0)
# endif
# if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON)
2015-05-27 01:50:35 +03:00
extern void timers_update_migration ( bool update_nohz ) ;
2015-05-27 01:50:33 +03:00
# else
2015-05-27 01:50:35 +03:00
static inline void timers_update_migration ( bool update_nohz ) { }
2015-05-27 01:50:33 +03:00
# endif
DECLARE_PER_CPU ( struct hrtimer_cpu_base , hrtimer_bases ) ;
2015-04-15 00:08:58 +03:00
extern u64 get_next_timer_interrupt ( unsigned long basej , u64 basem ) ;
2016-07-04 12:50:36 +03:00
void timer_clear_idle ( void ) ;