2005-04-16 15:20:36 -07:00
/*
* HvLpEvent . h
* Copyright ( C ) 2001 Mike Corrigan IBM Corporation
2005-06-21 17:15:33 -07:00
*
2005-04-16 15:20:36 -07:00
* 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 .
2005-06-21 17:15:33 -07:00
*
2005-04-16 15:20:36 -07:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2005-06-21 17:15:33 -07:00
*
2005-04-16 15:20:36 -07:00
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
2005-06-21 17:15:33 -07:00
/* This file contains the class for HV events in the system. */
2005-11-02 15:53:01 +11:00
# ifndef _ASM_POWERPC_ISERIES_HV_LP_EVENT_H
# define _ASM_POWERPC_ISERIES_HV_LP_EVENT_H
2005-04-16 15:20:36 -07:00
# include <asm/types.h>
# include <asm/ptrace.h>
2005-11-02 13:46:07 +11:00
# include <asm/iseries/hv_types.h>
2005-11-02 11:11:11 +11:00
# include <asm/iseries/hv_call_event.h>
2005-04-16 15:20:36 -07:00
2005-06-21 17:15:33 -07:00
/*
* HvLpEvent is the structure for Lp Event messages passed between
* partitions through PLIC .
*/
struct HvEventFlags {
u8 xValid : 1 ; /* Indicates a valid request x00-x00 */
u8 xRsvd1 : 4 ; /* Reserved ... */
u8 xAckType : 1 ; /* Immediate or deferred ... */
u8 xAckInd : 1 ; /* Indicates if ACK required ... */
u8 xFunction : 1 ; /* Interrupt or Acknowledge ... */
2005-04-16 15:20:36 -07:00
} ;
2005-06-21 17:15:33 -07:00
struct HvLpEvent {
struct HvEventFlags xFlags ; /* Event flags x00-x00 */
u8 xType ; /* Type of message x01-x01 */
u16 xSubtype ; /* Subtype for event x02-x03 */
u8 xSourceLp ; /* Source LP x04-x04 */
u8 xTargetLp ; /* Target LP x05-x05 */
u8 xSizeMinus1 ; /* Size of Derived class - 1 x06-x06 */
u8 xRc ; /* RC for Ack flows x07-x07 */
u16 xSourceInstanceId ; /* Source sides instance id x08-x09 */
u16 xTargetInstanceId ; /* Target sides instance id x0A-x0B */
2005-04-16 15:20:36 -07:00
union {
2005-06-21 17:15:33 -07:00
u32 xSubtypeData ; /* Data usable by the subtype x0C-x0F */
u16 xSubtypeDataShort [ 2 ] ; /* Data as 2 shorts */
u8 xSubtypeDataChar [ 4 ] ; /* Data as 4 chars */
2005-04-16 15:20:36 -07:00
} x ;
2005-06-21 17:15:33 -07:00
u64 xCorrelationToken ; /* Unique value for source/type x10-x17 */
2005-04-16 15:20:36 -07:00
} ;
typedef void ( * LpEventHandler ) ( struct HvLpEvent * , struct pt_regs * ) ;
2005-06-21 17:15:33 -07:00
/* Register a handler for an event type - returns 0 on success */
extern int HvLpEvent_registerHandler ( HvLpEvent_Type eventType ,
LpEventHandler hdlr ) ;
2005-04-16 15:20:36 -07:00
2005-06-21 17:15:33 -07:00
/*
* Unregister a handler for an event type
*
* This call will sleep until the handler being removed is guaranteed to
* be no longer executing on any CPU . Do not call with locks held .
*
* returns 0 on success
* Unregister will fail if there are any paths open for the type
*/
extern int HvLpEvent_unregisterHandler ( HvLpEvent_Type eventType ) ;
2005-04-16 15:20:36 -07:00
2005-06-21 17:15:33 -07:00
/*
* Open an Lp Event Path for an event type
* returns 0 on success
* openPath will fail if there is no handler registered for the event type .
* The lpIndex specified is the partition index for the target partition
* ( for VirtualIo , VirtualLan and SessionMgr ) other types specify zero )
*/
extern int HvLpEvent_openPath ( HvLpEvent_Type eventType , HvLpIndex lpIndex ) ;
2005-04-16 15:20:36 -07:00
2005-06-21 17:15:33 -07:00
/*
* Close an Lp Event Path for a type and partition
* returns 0 on sucess
*/
extern int HvLpEvent_closePath ( HvLpEvent_Type eventType , HvLpIndex lpIndex ) ;
2005-04-16 15:20:36 -07:00
# define HvLpEvent_Type_Hypervisor 0
# define HvLpEvent_Type_MachineFac 1
# define HvLpEvent_Type_SessionMgr 2
# define HvLpEvent_Type_SpdIo 3
# define HvLpEvent_Type_VirtualBus 4
# define HvLpEvent_Type_PciIo 5
# define HvLpEvent_Type_RioIo 6
# define HvLpEvent_Type_VirtualLan 7
# define HvLpEvent_Type_VirtualIo 8
# define HvLpEvent_Type_NumTypes 9
# define HvLpEvent_Rc_Good 0
# define HvLpEvent_Rc_BufferNotAvailable 1
# define HvLpEvent_Rc_Cancelled 2
# define HvLpEvent_Rc_GenericError 3
# define HvLpEvent_Rc_InvalidAddress 4
# define HvLpEvent_Rc_InvalidPartition 5
# define HvLpEvent_Rc_InvalidSize 6
# define HvLpEvent_Rc_InvalidSubtype 7
# define HvLpEvent_Rc_InvalidSubtypeData 8
# define HvLpEvent_Rc_InvalidType 9
# define HvLpEvent_Rc_PartitionDead 10
# define HvLpEvent_Rc_PathClosed 11
# define HvLpEvent_Rc_SubtypeError 12
# define HvLpEvent_Function_Ack 0
# define HvLpEvent_Function_Int 1
# define HvLpEvent_AckInd_NoAck 0
# define HvLpEvent_AckInd_DoAck 1
# define HvLpEvent_AckType_ImmediateAck 0
# define HvLpEvent_AckType_DeferredAck 1
# define HvLpDma_Direction_LocalToRemote 0
# define HvLpDma_Direction_RemoteToLocal 1
# define HvLpDma_AddressType_TceIndex 0
# define HvLpDma_AddressType_RealAddress 1
# define HvLpDma_Rc_Good 0
# define HvLpDma_Rc_Error 1
# define HvLpDma_Rc_PartitionDead 2
# define HvLpDma_Rc_PathClosed 3
# define HvLpDma_Rc_InvalidAddress 4
# define HvLpDma_Rc_InvalidLength 5
2005-11-02 15:53:01 +11:00
# endif /* _ASM_POWERPC_ISERIES_HV_LP_EVENT_H */