diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2005-09-27 12:18:47 -0400 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2005-09-27 12:18:47 -0400 |
commit | 544cbbaed4de962fb0e831e8799ab01c448ff37d (patch) | |
tree | 3f03ca171a9f8c2e80bdca050d8714994cd6de9f /arch/powerpc | |
parent | 99a2379cdddcc4e8579e70deb80479450ed65d49 (diff) |
powerpc: Merge HvLpEvent.c into lpevents.c
These two files were intimately connected, so just merge them.
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/platforms/iseries/lpevents.c | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/arch/powerpc/platforms/iseries/lpevents.c b/arch/powerpc/platforms/iseries/lpevents.c index 819298a8a4db..883603027ccf 100644 --- a/arch/powerpc/platforms/iseries/lpevents.c +++ b/arch/powerpc/platforms/iseries/lpevents.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <asm/iSeries/ItLpQueue.h> | 18 | #include <asm/iSeries/ItLpQueue.h> |
19 | #include <asm/iSeries/HvLpEvent.h> | 19 | #include <asm/iSeries/HvLpEvent.h> |
20 | #include <asm/iSeries/HvCallEvent.h> | 20 | #include <asm/iSeries/HvCallEvent.h> |
21 | #include <asm/iSeries/ItLpNaca.h> | ||
21 | 22 | ||
22 | /* | 23 | /* |
23 | * The LpQueue is used to pass event data from the hypervisor to | 24 | * The LpQueue is used to pass event data from the hypervisor to |
@@ -42,7 +43,8 @@ static char *event_types[HvLpEvent_Type_NumTypes] = { | |||
42 | }; | 43 | }; |
43 | 44 | ||
44 | /* Array of LpEvent handler functions */ | 45 | /* Array of LpEvent handler functions */ |
45 | extern LpEventHandler lpEventHandler[HvLpEvent_Type_NumTypes]; | 46 | static LpEventHandler lpEventHandler[HvLpEvent_Type_NumTypes]; |
47 | static unsigned lpEventHandlerPaths[HvLpEvent_Type_NumTypes]; | ||
46 | 48 | ||
47 | static struct HvLpEvent * get_next_hvlpevent(void) | 49 | static struct HvLpEvent * get_next_hvlpevent(void) |
48 | { | 50 | { |
@@ -198,6 +200,70 @@ void setup_hvlpevent_queue(void) | |||
198 | hvlpevent_queue.xIndex = 0; | 200 | hvlpevent_queue.xIndex = 0; |
199 | } | 201 | } |
200 | 202 | ||
203 | /* Register a handler for an LpEvent type */ | ||
204 | int HvLpEvent_registerHandler(HvLpEvent_Type eventType, LpEventHandler handler) | ||
205 | { | ||
206 | if (eventType < HvLpEvent_Type_NumTypes) { | ||
207 | lpEventHandler[eventType] = handler; | ||
208 | return 0; | ||
209 | } | ||
210 | return 1; | ||
211 | } | ||
212 | EXPORT_SYMBOL(HvLpEvent_registerHandler); | ||
213 | |||
214 | int HvLpEvent_unregisterHandler(HvLpEvent_Type eventType) | ||
215 | { | ||
216 | might_sleep(); | ||
217 | |||
218 | if (eventType < HvLpEvent_Type_NumTypes) { | ||
219 | if (!lpEventHandlerPaths[eventType]) { | ||
220 | lpEventHandler[eventType] = NULL; | ||
221 | /* | ||
222 | * We now sleep until all other CPUs have scheduled. | ||
223 | * This ensures that the deletion is seen by all | ||
224 | * other CPUs, and that the deleted handler isn't | ||
225 | * still running on another CPU when we return. | ||
226 | */ | ||
227 | synchronize_rcu(); | ||
228 | return 0; | ||
229 | } | ||
230 | } | ||
231 | return 1; | ||
232 | } | ||
233 | EXPORT_SYMBOL(HvLpEvent_unregisterHandler); | ||
234 | |||
235 | /* | ||
236 | * lpIndex is the partition index of the target partition. | ||
237 | * needed only for VirtualIo, VirtualLan and SessionMgr. Zero | ||
238 | * indicates to use our partition index - for the other types. | ||
239 | */ | ||
240 | int HvLpEvent_openPath(HvLpEvent_Type eventType, HvLpIndex lpIndex) | ||
241 | { | ||
242 | if ((eventType < HvLpEvent_Type_NumTypes) && | ||
243 | lpEventHandler[eventType]) { | ||
244 | if (lpIndex == 0) | ||
245 | lpIndex = itLpNaca.xLpIndex; | ||
246 | HvCallEvent_openLpEventPath(lpIndex, eventType); | ||
247 | ++lpEventHandlerPaths[eventType]; | ||
248 | return 0; | ||
249 | } | ||
250 | return 1; | ||
251 | } | ||
252 | |||
253 | int HvLpEvent_closePath(HvLpEvent_Type eventType, HvLpIndex lpIndex) | ||
254 | { | ||
255 | if ((eventType < HvLpEvent_Type_NumTypes) && | ||
256 | lpEventHandler[eventType] && | ||
257 | lpEventHandlerPaths[eventType]) { | ||
258 | if (lpIndex == 0) | ||
259 | lpIndex = itLpNaca.xLpIndex; | ||
260 | HvCallEvent_closeLpEventPath(lpIndex, eventType); | ||
261 | --lpEventHandlerPaths[eventType]; | ||
262 | return 0; | ||
263 | } | ||
264 | return 1; | ||
265 | } | ||
266 | |||
201 | static int proc_lpevents_show(struct seq_file *m, void *v) | 267 | static int proc_lpevents_show(struct seq_file *m, void *v) |
202 | { | 268 | { |
203 | int cpu, i; | 269 | int cpu, i; |