1 /*
2  * HvLpEvent.h
3  * Copyright (C) 2001  Mike Corrigan IBM Corporation
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18  */
19 
20 //======================================================================
21 //
22 //	This file contains the class for HV events in the system.
23 //
24 //=====================================================================
25 #ifndef _HVLPEVENT_H
26 #define _HVLPEVENT_H
27 
28 #include <asm/types.h>
29 #include <asm/ptrace.h>
30 #include <asm/iSeries/HvTypes.h>
31 #ifndef _HVCALLEVENT_H
32 #include <asm/iSeries/HvCallEvent.h>
33 #endif
34 
35 
36 //=====================================================================
37 //
38 // HvLpEvent is the structure for Lp Event messages passed between
39 // partitions through PLIC.
40 //
41 //=====================================================================
42 
43 struct HvEventFlags
44 {
45 	u8	xValid:1;		// Indicates a valid request	x00-x00
46 	u8	xRsvd1:4;		// Reserved			...
47 	u8	xAckType:1;		// Immediate or deferred	...
48 	u8	xAckInd:1;		// Indicates if ACK required	...
49 	u8	xFunction:1;		// Interrupt or Acknowledge	...
50 };
51 
52 
53 struct HvLpEvent
54 {
55 	struct HvEventFlags xFlags;	// Event flags			x00-x00
56 	u8	xType;			// Type of message		x01-x01
57 	u16	xSubtype;		// Subtype for event		x02-x03
58 	u8	xSourceLp;		// Source LP			x04-x04
59 	u8	xTargetLp;		// Target LP			x05-x05
60 	u8	xSizeMinus1;		// Size of Derived class - 1	x06-x06
61 	u8	xRc;			// RC for Ack flows		x07-x07
62 	u16	xSourceInstanceId;	// Source sides instance id	x08-x09
63 	u16	xTargetInstanceId;	// Target sides instance id	x0A-x0B
64 	union {
65 		u32	xSubtypeData;	// Data usable by the subtype	x0C-x0F
66 		u16	xSubtypeDataShort[2];	// Data as 2 shorts
67 		u8	xSubtypeDataChar[4];	// Data as 4 chars
68 	} x;
69 
70 	u64	xCorrelationToken;	// Unique value for source/type x10-x17
71 };
72 
73 // Lp Event handler function
74 typedef void (*LpEventHandler)(struct HvLpEvent *, struct pt_regs *);
75 
76 // Register a handler for an event type
77 //  returns 0 on success
78 extern int HvLpEvent_registerHandler( HvLpEvent_Type eventType, LpEventHandler hdlr);
79 
80 // Unregister a handler for an event type
81 //  returns 0 on success
82 //  Unregister will fail if there are any paths open for the type
83 extern int HvLpEvent_unregisterHandler( HvLpEvent_Type eventType );
84 
85 // Open an Lp Event Path for an event type
86 //  returns 0 on success
87 //  openPath will fail if there is no handler registered for the event type.
88 //  The lpIndex specified is the partition index for the target partition
89 //  (for VirtualIo, VirtualLan and SessionMgr) other types specify zero)
90 extern int HvLpEvent_openPath( HvLpEvent_Type eventType, HvLpIndex lpIndex );
91 
92 
93 // Close an Lp Event Path for a type and partition
94 //  returns 0 on success
95 extern int HvLpEvent_closePath( HvLpEvent_Type eventType, HvLpIndex lpIndex );
96 
97 #define HvLpEvent_Type_Hypervisor 0
98 #define HvLpEvent_Type_MachineFac 1
99 #define HvLpEvent_Type_SessionMgr 2
100 #define HvLpEvent_Type_SpdIo      3
101 #define HvLpEvent_Type_VirtualBus 4
102 #define HvLpEvent_Type_PciIo      5
103 #define HvLpEvent_Type_RioIo      6
104 #define HvLpEvent_Type_VirtualLan 7
105 #define HvLpEvent_Type_VirtualIo  8
106 #define HvLpEvent_Type_NumTypes   9
107 
108 #define HvLpEvent_Rc_Good 0
109 #define HvLpEvent_Rc_BufferNotAvailable 1
110 #define HvLpEvent_Rc_Cancelled 2
111 #define HvLpEvent_Rc_GenericError 3
112 #define HvLpEvent_Rc_InvalidAddress 4
113 #define HvLpEvent_Rc_InvalidPartition 5
114 #define HvLpEvent_Rc_InvalidSize 6
115 #define HvLpEvent_Rc_InvalidSubtype 7
116 #define HvLpEvent_Rc_InvalidSubtypeData 8
117 #define HvLpEvent_Rc_InvalidType 9
118 #define HvLpEvent_Rc_PartitionDead 10
119 #define HvLpEvent_Rc_PathClosed 11
120 #define HvLpEvent_Rc_SubtypeError 12
121 
122 #define HvLpEvent_Function_Ack 0
123 #define HvLpEvent_Function_Int 1
124 
125 #define HvLpEvent_AckInd_NoAck 0
126 #define HvLpEvent_AckInd_DoAck 1
127 
128 #define HvLpEvent_AckType_ImmediateAck 0
129 #define HvLpEvent_AckType_DeferredAck 1
130 
131 #define HvLpDma_Direction_LocalToRemote 0
132 #define HvLpDma_Direction_RemoteToLocal 1
133 
134 #define HvLpDma_AddressType_TceIndex 0
135 #define HvLpDma_AddressType_RealAddress 1
136 
137 #define HvLpDma_Rc_Good 0
138 #define HvLpDma_Rc_Error 1
139 #define HvLpDma_Rc_PartitionDead 2
140 #define HvLpDma_Rc_PathClosed 3
141 #define HvLpDma_Rc_InvalidAddress 4
142 #define HvLpDma_Rc_InvalidLength 5
143 
144 #endif // _HVLPEVENT_H
145