Blame view

include/linux/clockchips.h 5.14 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
de68d9b17   Thomas Gleixner   clockevents: Allo...
10
  #ifdef CONFIG_GENERIC_CLOCKEVENTS_BUILD
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  
  #include <linux/clocksource.h>
  #include <linux/cpumask.h>
  #include <linux/ktime.h>
  #include <linux/notifier.h>
  
  struct clock_event_device;
  
  /* 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 ...
25
  	CLOCK_EVT_MODE_RESUME,
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
26
27
28
29
30
31
32
  };
  
  /* Clock event notification values */
  enum clock_event_nofitiers {
  	CLOCK_EVT_NOTIFY_ADD,
  	CLOCK_EVT_NOTIFY_BROADCAST_ON,
  	CLOCK_EVT_NOTIFY_BROADCAST_OFF,
1595f452f   Thomas Gleixner   clockevents: intr...
33
  	CLOCK_EVT_NOTIFY_BROADCAST_FORCE,
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
34
35
36
37
  	CLOCK_EVT_NOTIFY_BROADCAST_ENTER,
  	CLOCK_EVT_NOTIFY_BROADCAST_EXIT,
  	CLOCK_EVT_NOTIFY_SUSPEND,
  	CLOCK_EVT_NOTIFY_RESUME,
94df7de02   Sebastien Dugue   hrtimers: allow t...
38
  	CLOCK_EVT_NOTIFY_CPU_DYING,
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
39
40
41
42
43
44
45
46
  	CLOCK_EVT_NOTIFY_CPU_DEAD,
  };
  
  /*
   * Clock event features
   */
  #define CLOCK_EVT_FEAT_PERIODIC		0x000001
  #define CLOCK_EVT_FEAT_ONESHOT		0x000002
65516f8a7   Martin Schwidefsky   clockevents: Add ...
47
  #define CLOCK_EVT_FEAT_KTIME		0x000004
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
48
49
50
51
52
53
  /*
   * 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 ...
54
55
  #define CLOCK_EVT_FEAT_C3STOP		0x000008
  #define CLOCK_EVT_FEAT_DUMMY		0x000010
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
56
57
58
  
  /**
   * struct clock_event_device - clock event device descriptor
847b2f42b   Thomas Gleixner   clockevents: Rest...
59
60
   * @event_handler:	Assigned by the framework to be called by the low
   *			level handler of the event source
65516f8a7   Martin Schwidefsky   clockevents: Add ...
61
62
   * @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...
63
   * @next_event:		local storage for the next event in oneshot mode
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
64
65
66
67
   * @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...
68
69
70
71
72
   * @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...
73
74
   * @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...
75
   * @name:		ptr to clock event name
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
76
   * @rating:		variable to rate clock event devices
ce0be1273   Sergei Shtylyov   clockchips.h: ker...
77
78
   * @irq:		IRQ number (only for non CPU local devices)
   * @cpumask:		cpumask to indicate for which CPUs this device works
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
79
   * @list:		list head for the management code
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
80
81
   */
  struct clock_event_device {
847b2f42b   Thomas Gleixner   clockevents: Rest...
82
83
84
  	void			(*event_handler)(struct clock_event_device *);
  	int			(*set_next_event)(unsigned long evt,
  						  struct clock_event_device *);
65516f8a7   Martin Schwidefsky   clockevents: Add ...
85
86
  	int			(*set_next_ktime)(ktime_t expires,
  						  struct clock_event_device *);
847b2f42b   Thomas Gleixner   clockevents: Rest...
87
  	ktime_t			next_event;
97813f2fe   Jon Hunter   nohz: Allow 32-bi...
88
89
  	u64			max_delta_ns;
  	u64			min_delta_ns;
23af368e9   Thomas Gleixner   clockevents: Use ...
90
91
  	u32			mult;
  	u32			shift;
847b2f42b   Thomas Gleixner   clockevents: Rest...
92
93
94
95
96
97
98
  	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 *);
57f0fcbe1   Thomas Gleixner   clockevents: Prov...
99
100
  	unsigned long		min_delta_ticks;
  	unsigned long		max_delta_ticks;
847b2f42b   Thomas Gleixner   clockevents: Rest...
101
  	const char		*name;
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
102
103
  	int			rating;
  	int			irq;
320ab2b0b   Rusty Russell   cpumask: convert ...
104
  	const struct cpumask	*cpumask;
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
105
  	struct list_head	list;
847b2f42b   Thomas Gleixner   clockevents: Rest...
106
  } ____cacheline_aligned;
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  
  /*
   * 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...
129
130
  extern u64 clockevent_delta2ns(unsigned long latch,
  			       struct clock_event_device *evt);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
131
  extern void clockevents_register_device(struct clock_event_device *dev);
57f0fcbe1   Thomas Gleixner   clockevents: Prov...
132
133
134
  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...
135
  extern int clockevents_update_freq(struct clock_event_device *ce, u32 freq);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
136
137
  extern void clockevents_exchange_device(struct clock_event_device *old,
  					struct clock_event_device *new);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
138
139
140
  extern void clockevents_set_mode(struct clock_event_device *dev,
  				 enum clock_event_mode mode);
  extern int clockevents_register_notifier(struct notifier_block *nb);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
141
  extern int clockevents_program_event(struct clock_event_device *dev,
d1748302f   Martin Schwidefsky   clockevents: Make...
142
  				     ktime_t expires, bool force);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
143

7c1e76897   Venkatesh Pallipadi   clockevents: prev...
144
  extern void clockevents_handle_noop(struct clock_event_device *dev);
7d2f944a2   Thomas Gleixner   clocksource: Prov...
145
146
147
148
149
150
  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);
  }
de68d9b17   Thomas Gleixner   clockevents: Allo...
151
  #ifdef CONFIG_GENERIC_CLOCKEVENTS
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
152
  extern void clockevents_notify(unsigned long reason, void *arg);
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
153
  #else
de68d9b17   Thomas Gleixner   clockevents: Allo...
154
155
156
157
  # define clockevents_notify(reason, arg) do { } while (0)
  #endif
  
  #else /* CONFIG_GENERIC_CLOCKEVENTS_BUILD */
d316c57ff   Thomas Gleixner   [PATCH] clockeven...
158

d316c57ff   Thomas Gleixner   [PATCH] clockeven...
159
160
161
162
163
  #define clockevents_notify(reason, arg) do { } while (0)
  
  #endif
  
  #endif