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>
This commit is contained in:
@@ -18,6 +18,7 @@
|
|||||||
#include <asm/iSeries/ItLpQueue.h>
|
#include <asm/iSeries/ItLpQueue.h>
|
||||||
#include <asm/iSeries/HvLpEvent.h>
|
#include <asm/iSeries/HvLpEvent.h>
|
||||||
#include <asm/iSeries/HvCallEvent.h>
|
#include <asm/iSeries/HvCallEvent.h>
|
||||||
|
#include <asm/iSeries/ItLpNaca.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The LpQueue is used to pass event data from the hypervisor to
|
* The LpQueue is used to pass event data from the hypervisor to
|
||||||
@@ -42,7 +43,8 @@ static char *event_types[HvLpEvent_Type_NumTypes] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Array of LpEvent handler functions */
|
/* Array of LpEvent handler functions */
|
||||||
extern LpEventHandler lpEventHandler[HvLpEvent_Type_NumTypes];
|
static LpEventHandler lpEventHandler[HvLpEvent_Type_NumTypes];
|
||||||
|
static unsigned lpEventHandlerPaths[HvLpEvent_Type_NumTypes];
|
||||||
|
|
||||||
static struct HvLpEvent * get_next_hvlpevent(void)
|
static struct HvLpEvent * get_next_hvlpevent(void)
|
||||||
{
|
{
|
||||||
@@ -198,6 +200,70 @@ void setup_hvlpevent_queue(void)
|
|||||||
hvlpevent_queue.xIndex = 0;
|
hvlpevent_queue.xIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Register a handler for an LpEvent type */
|
||||||
|
int HvLpEvent_registerHandler(HvLpEvent_Type eventType, LpEventHandler handler)
|
||||||
|
{
|
||||||
|
if (eventType < HvLpEvent_Type_NumTypes) {
|
||||||
|
lpEventHandler[eventType] = handler;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(HvLpEvent_registerHandler);
|
||||||
|
|
||||||
|
int HvLpEvent_unregisterHandler(HvLpEvent_Type eventType)
|
||||||
|
{
|
||||||
|
might_sleep();
|
||||||
|
|
||||||
|
if (eventType < HvLpEvent_Type_NumTypes) {
|
||||||
|
if (!lpEventHandlerPaths[eventType]) {
|
||||||
|
lpEventHandler[eventType] = NULL;
|
||||||
|
/*
|
||||||
|
* We now sleep until all other CPUs have scheduled.
|
||||||
|
* This ensures that the deletion is seen by all
|
||||||
|
* other CPUs, and that the deleted handler isn't
|
||||||
|
* still running on another CPU when we return.
|
||||||
|
*/
|
||||||
|
synchronize_rcu();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(HvLpEvent_unregisterHandler);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* lpIndex is the partition index of the target partition.
|
||||||
|
* needed only for VirtualIo, VirtualLan and SessionMgr. Zero
|
||||||
|
* indicates to use our partition index - for the other types.
|
||||||
|
*/
|
||||||
|
int HvLpEvent_openPath(HvLpEvent_Type eventType, HvLpIndex lpIndex)
|
||||||
|
{
|
||||||
|
if ((eventType < HvLpEvent_Type_NumTypes) &&
|
||||||
|
lpEventHandler[eventType]) {
|
||||||
|
if (lpIndex == 0)
|
||||||
|
lpIndex = itLpNaca.xLpIndex;
|
||||||
|
HvCallEvent_openLpEventPath(lpIndex, eventType);
|
||||||
|
++lpEventHandlerPaths[eventType];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int HvLpEvent_closePath(HvLpEvent_Type eventType, HvLpIndex lpIndex)
|
||||||
|
{
|
||||||
|
if ((eventType < HvLpEvent_Type_NumTypes) &&
|
||||||
|
lpEventHandler[eventType] &&
|
||||||
|
lpEventHandlerPaths[eventType]) {
|
||||||
|
if (lpIndex == 0)
|
||||||
|
lpIndex = itLpNaca.xLpIndex;
|
||||||
|
HvCallEvent_closeLpEventPath(lpIndex, eventType);
|
||||||
|
--lpEventHandlerPaths[eventType];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int proc_lpevents_show(struct seq_file *m, void *v)
|
static int proc_lpevents_show(struct seq_file *m, void *v)
|
||||||
{
|
{
|
||||||
int cpu, i;
|
int cpu, i;
|
||||||
|
@@ -1,88 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2001 Mike Corrigan IBM Corp
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version
|
|
||||||
* 2 of the License, or (at your option) any later version.
|
|
||||||
*/
|
|
||||||
#include <linux/stddef.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <asm/system.h>
|
|
||||||
#include <asm/iSeries/HvLpEvent.h>
|
|
||||||
#include <asm/iSeries/HvCallEvent.h>
|
|
||||||
#include <asm/iSeries/ItLpNaca.h>
|
|
||||||
|
|
||||||
/* Array of LpEvent handler functions */
|
|
||||||
LpEventHandler lpEventHandler[HvLpEvent_Type_NumTypes];
|
|
||||||
unsigned lpEventHandlerPaths[HvLpEvent_Type_NumTypes];
|
|
||||||
|
|
||||||
/* Register a handler for an LpEvent type */
|
|
||||||
|
|
||||||
int HvLpEvent_registerHandler( HvLpEvent_Type eventType, LpEventHandler handler )
|
|
||||||
{
|
|
||||||
int rc = 1;
|
|
||||||
if ( eventType < HvLpEvent_Type_NumTypes ) {
|
|
||||||
lpEventHandler[eventType] = handler;
|
|
||||||
rc = 0;
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int HvLpEvent_unregisterHandler( HvLpEvent_Type eventType )
|
|
||||||
{
|
|
||||||
int rc = 1;
|
|
||||||
|
|
||||||
might_sleep();
|
|
||||||
|
|
||||||
if ( eventType < HvLpEvent_Type_NumTypes ) {
|
|
||||||
if ( !lpEventHandlerPaths[eventType] ) {
|
|
||||||
lpEventHandler[eventType] = NULL;
|
|
||||||
rc = 0;
|
|
||||||
|
|
||||||
/* We now sleep until all other CPUs have scheduled. This ensures that
|
|
||||||
* the deletion is seen by all other CPUs, and that the deleted handler
|
|
||||||
* isn't still running on another CPU when we return. */
|
|
||||||
synchronize_rcu();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(HvLpEvent_registerHandler);
|
|
||||||
EXPORT_SYMBOL(HvLpEvent_unregisterHandler);
|
|
||||||
|
|
||||||
/* (lpIndex is the partition index of the target partition.
|
|
||||||
* needed only for VirtualIo, VirtualLan and SessionMgr. Zero
|
|
||||||
* indicates to use our partition index - for the other types)
|
|
||||||
*/
|
|
||||||
int HvLpEvent_openPath( HvLpEvent_Type eventType, HvLpIndex lpIndex )
|
|
||||||
{
|
|
||||||
int rc = 1;
|
|
||||||
if ( eventType < HvLpEvent_Type_NumTypes &&
|
|
||||||
lpEventHandler[eventType] ) {
|
|
||||||
if ( lpIndex == 0 )
|
|
||||||
lpIndex = itLpNaca.xLpIndex;
|
|
||||||
HvCallEvent_openLpEventPath( lpIndex, eventType );
|
|
||||||
++lpEventHandlerPaths[eventType];
|
|
||||||
rc = 0;
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
int HvLpEvent_closePath( HvLpEvent_Type eventType, HvLpIndex lpIndex )
|
|
||||||
{
|
|
||||||
int rc = 1;
|
|
||||||
if ( eventType < HvLpEvent_Type_NumTypes &&
|
|
||||||
lpEventHandler[eventType] &&
|
|
||||||
lpEventHandlerPaths[eventType] ) {
|
|
||||||
if ( lpIndex == 0 )
|
|
||||||
lpIndex = itLpNaca.xLpIndex;
|
|
||||||
HvCallEvent_closeLpEventPath( lpIndex, eventType );
|
|
||||||
--lpEventHandlerPaths[eventType];
|
|
||||||
rc = 0;
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
@@ -22,7 +22,7 @@ pci-obj-$(CONFIG_PPC_MULTIPLATFORM) += pci_dn.o pci_direct_iommu.o
|
|||||||
|
|
||||||
obj-$(CONFIG_PCI) += pci.o pci_iommu.o iomap.o $(pci-obj-y)
|
obj-$(CONFIG_PCI) += pci.o pci_iommu.o iomap.o $(pci-obj-y)
|
||||||
|
|
||||||
obj-$(CONFIG_PPC_ISERIES) += HvLpEvent.o iSeries_proc.o iSeries_htab.o \
|
obj-$(CONFIG_PPC_ISERIES) += iSeries_proc.o iSeries_htab.o \
|
||||||
iSeries_iommu.o
|
iSeries_iommu.o
|
||||||
|
|
||||||
obj-$(CONFIG_PPC_MULTIPLATFORM) += nvram.o i8259.o prom_init.o
|
obj-$(CONFIG_PPC_MULTIPLATFORM) += nvram.o i8259.o prom_init.o
|
||||||
|
Reference in New Issue
Block a user