]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Foundation/Core/Dxe/ArchProtocol/Timer/Timer.h
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Core / Dxe / ArchProtocol / Timer / Timer.h
1 /*++
2
3 Copyright (c) 2004, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 Timer.h
15
16 Abstract:
17
18 Timer Architectural Protocol as defined in the DXE CIS
19
20 This code is used to provide the timer tick for the DXE core.
21
22 --*/
23
24 #ifndef _ARCH_PROTOCOL_TIMER_H_
25 #define _ARCH_PROTOCOL_TIMER_H_
26
27 //
28 // Global ID for the Timer Architectural Protocol
29 //
30 #define EFI_TIMER_ARCH_PROTOCOL_GUID \
31 { 0x26baccb3, 0x6f42, 0x11d4, 0xbc, 0xe7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 }
32
33 //
34 // Declare forward reference for the Timer Architectural Protocol
35 //
36 EFI_FORWARD_DECLARATION (EFI_TIMER_ARCH_PROTOCOL);
37
38 typedef
39 VOID
40 (EFIAPI *EFI_TIMER_NOTIFY) (
41 IN UINT64 Time
42 );
43 /*++
44
45 Routine Description:
46
47 This function of this type is called when a timer interrupt fires. This
48 function executes at TPL_HIGH_LEVEL. The DXE Core will register a funtion
49 of tyis type to be called for the timer interrupt, so it can know how much
50 time has passed. This information is used to signal timer based events.
51
52 Arguments:
53
54 Time - Time since the last timer interrupt in 100 ns units. This will
55 typically be TimerPeriod, but if a timer interrupt is missed, and the
56 EFI_TIMER_ARCH_PROTOCOL driver can detect missed interrupts, then Time
57 will contain the actual amount of time since the last interrupt.
58
59 Returns:
60
61 None.
62
63 --*/
64
65 typedef
66 EFI_STATUS
67 (EFIAPI *EFI_TIMER_REGISTER_HANDLER) (
68 IN EFI_TIMER_ARCH_PROTOCOL *This,
69 IN EFI_TIMER_NOTIFY NotifyFunction
70 );
71 /*++
72
73 Routine Description:
74
75 This function registers the handler NotifyFunction so it is called every time
76 the timer interrupt fires. It also passes the amount of time since the last
77 handler call to the NotifyFunction. If NotifyFunction is NULL, then the
78 handler is unregistered. If the handler is registered, then EFI_SUCCESS is
79 returned. If the CPU does not support registering a timer interrupt handler,
80 then EFI_UNSUPPORTED is returned. If an attempt is made to register a handler
81 when a handler is already registered, then EFI_ALREADY_STARTED is returned.
82 If an attempt is made to unregister a handler when a handler is not registered,
83 then EFI_INVALID_PARAMETER is returned. If an error occurs attempting to
84 register the NotifyFunction with the timer interrupt, then EFI_DEVICE_ERROR
85 is returned.
86
87 Arguments:
88
89 This - The EFI_TIMER_ARCH_PROTOCOL instance.
90
91 NotifyFunction - The function to call when a timer interrupt fires. This
92 function executes at TPL_HIGH_LEVEL. The DXE Core will
93 register a handler for the timer interrupt, so it can know
94 how much time has passed. This information is used to
95 signal timer based events. NULL will unregister the handler.
96
97 Returns:
98
99 EFI_SUCCESS - The timer handler was registered.
100
101 EFI_UNSUPPORTED - The platform does not support timer interrupts.
102
103 EFI_ALREADY_STARTED - NotifyFunction is not NULL, and a handler is already
104 registered.
105
106 EFI_INVALID_PARAMETER - NotifyFunction is NULL, and a handler was not
107 previously registered.
108
109 EFI_DEVICE_ERROR - The timer handler could not be registered.
110
111 --*/
112
113 typedef
114 EFI_STATUS
115 (EFIAPI *EFI_TIMER_SET_TIMER_PERIOD) (
116 IN EFI_TIMER_ARCH_PROTOCOL *This,
117 IN UINT64 TimerPeriod
118 );
119 /*++
120
121 Routine Description:
122
123 This function adjusts the period of timer interrupts to the value specified
124 by TimerPeriod. If the timer period is updated, then the selected timer
125 period is stored in EFI_TIMER.TimerPeriod, and EFI_SUCCESS is returned. If
126 the timer hardware is not programmable, then EFI_UNSUPPORTED is returned.
127 If an error occurs while attempting to update the timer period, then the
128 timer hardware will be put back in its state prior to this call, and
129 EFI_DEVICE_ERROR is returned. If TimerPeriod is 0, then the timer interrupt
130 is disabled. This is not the same as disabling the CPU's interrupts.
131 Instead, it must either turn off the timer hardware, or it must adjust the
132 interrupt controller so that a CPU interrupt is not generated when the timer
133 interrupt fires.
134
135 Arguments:
136
137 This - The EFI_TIMER_ARCH_PROTOCOL instance.
138
139 TimerPeriod - The rate to program the timer interrupt in 100 nS units. If
140 the timer hardware is not programmable, then EFI_UNSUPPORTED is
141 returned. If the timer is programmable, then the timer period
142 will be rounded up to the nearest timer period that is supported
143 by the timer hardware. If TimerPeriod is set to 0, then the
144 timer interrupts will be disabled.
145
146 Returns:
147
148 EFI_SUCCESS - The timer period was changed.
149
150 EFI_UNSUPPORTED - The platform cannot change the period of the timer interrupt.
151
152 EFI_DEVICE_ERROR - The timer period could not be changed due to a device error.
153
154 --*/
155
156 typedef
157 EFI_STATUS
158 (EFIAPI *EFI_TIMER_GET_TIMER_PERIOD) (
159 IN EFI_TIMER_ARCH_PROTOCOL *This,
160 OUT UINT64 *TimerPeriod
161 );
162 /*++
163
164 Routine Description:
165
166 This function retrieves the period of timer interrupts in 100 ns units,
167 returns that value in TimerPeriod, and returns EFI_SUCCESS. If TimerPeriod
168 is NULL, then EFI_INVALID_PARAMETER is returned. If a TimerPeriod of 0 is
169 returned, then the timer is currently disabled.
170
171 Arguments:
172
173 This - The EFI_TIMER_ARCH_PROTOCOL instance.
174
175 TimerPeriod - A pointer to the timer period to retrieve in 100 ns units. If
176 0 is returned, then the timer is currently disabled.
177
178 Returns:
179
180 EFI_SUCCESS - The timer period was returned in TimerPeriod.
181
182 EFI_INVALID_PARAMETER - TimerPeriod is NULL.
183
184 --*/
185
186 typedef
187 EFI_STATUS
188 (EFIAPI *EFI_TIMER_GENERATE_SOFT_INTERRUPT) (
189 IN EFI_TIMER_ARCH_PROTOCOL *This
190 );
191 /*++
192
193 Routine Description:
194
195 This function generates a soft timer interrupt. If the platform does not support soft
196 timer interrupts, then EFI_UNSUPPORTED is returned. Otherwise, EFI_SUCCESS is returned.
197 If a handler has been registered through the EFI_TIMER_ARCH_PROTOCOL.RegisterHandler()
198 service, then a soft timer interrupt will be generated. If the timer interrupt is
199 enabled when this service is called, then the registered handler will be invoked. The
200 registered handler should not be able to distinguish a hardware-generated timer
201 interrupt from a software-generated timer interrupt.
202
203 Arguments:
204
205 This - The EFI_TIMER_ARCH_PROTOCOL instance.
206
207 Returns:
208
209 EFI_SUCCESS - The soft timer interrupt was generated.
210
211 EFI_UNSUPPORTEDT - The platform does not support the generation of soft timer interrupts.
212
213 --*/
214
215 //
216 // Interface stucture for the Timer Architectural Protocol
217 //
218 typedef struct _EFI_TIMER_ARCH_PROTOCOL {
219 EFI_TIMER_REGISTER_HANDLER RegisterHandler;
220 EFI_TIMER_SET_TIMER_PERIOD SetTimerPeriod;
221 EFI_TIMER_GET_TIMER_PERIOD GetTimerPeriod;
222 EFI_TIMER_GENERATE_SOFT_INTERRUPT GenerateSoftInterrupt;
223 } EFI_TIMER_ARCH_PROTOCOL;
224
225 /*++
226
227 Protocol Description:
228 This protocol provides the services to initialize a periodic timer
229 interrupt, and to register a handler that is called each time the timer
230 interrupt fires. It may also provide a service to adjust the rate of the
231 periodic timer interrupt. When a timer interrupt occurs, the handler is
232 passed the amount of time that has passed since the previous timer
233 interrupt.
234
235 Parameters:
236
237 RegisterHandler - Registers a handler that will be called each time the
238 timer interrupt fires. TimerPeriod defines the minimum
239 time between timer interrupts, so TimerPeriod will also
240 be the minimum time between calls to the registered
241 handler.
242
243 SetTimerPeriod - Sets the period of the timer interrupt in 100 nS units.
244 This function is optional, and may return EFI_UNSUPPORTED.
245 If this function is supported, then the timer period will
246 be rounded up to the nearest supported timer period.
247
248 GetTimerPeriod - Retrieves the period of the timer interrupt in 100 nS units.
249
250 GenerateSoftInterrupt -
251 Generates a soft timer interrupt that simulates the firing of
252 the timer interrupt. This service can be used to invoke the
253 registered handler if the timer interrupt has been masked for
254 a period of time.
255
256 --*/
257
258 extern EFI_GUID gEfiTimerArchProtocolGuid;
259
260 #endif