aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorStephen Rothwell <sfr@canb.auug.org.au>2005-09-27 12:18:47 -0400
committerStephen Rothwell <sfr@canb.auug.org.au>2005-09-27 12:18:47 -0400
commit544cbbaed4de962fb0e831e8799ab01c448ff37d (patch)
tree3f03ca171a9f8c2e80bdca050d8714994cd6de9f /arch/powerpc
parent99a2379cdddcc4e8579e70deb80479450ed65d49 (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.c68
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 */
45extern LpEventHandler lpEventHandler[HvLpEvent_Type_NumTypes]; 46static LpEventHandler lpEventHandler[HvLpEvent_Type_NumTypes];
47static unsigned lpEventHandlerPaths[HvLpEvent_Type_NumTypes];
46 48
47static struct HvLpEvent * get_next_hvlpevent(void) 49static 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 */
204int 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}
212EXPORT_SYMBOL(HvLpEvent_registerHandler);
213
214int 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}
233EXPORT_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 */
240int 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
253int 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
201static int proc_lpevents_show(struct seq_file *m, void *v) 267static int proc_lpevents_show(struct seq_file *m, void *v)
202{ 268{
203 int cpu, i; 269 int cpu, i;