c362535618049a6b5428c3716a50109657b728da
[mirror/winof/.git] / core / bus / kernel / bus_driver.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
4  *\r
5  * This software is available to you under the OpenIB.org BSD license\r
6  * below:\r
7  *\r
8  *     Redistribution and use in source and binary forms, with or\r
9  *     without modification, are permitted provided that the following\r
10  *     conditions are met:\r
11  *\r
12  *      - Redistributions of source code must retain the above\r
13  *        copyright notice, this list of conditions and the following\r
14  *        disclaimer.\r
15  *\r
16  *      - Redistributions in binary form must reproduce the above\r
17  *        copyright notice, this list of conditions and the following\r
18  *        disclaimer in the documentation and/or other materials\r
19  *        provided with the distribution.\r
20  *\r
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
22  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
23  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
24  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
25  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
26  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
27  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
28  * SOFTWARE.\r
29  *\r
30  * $Id$\r
31  */\r
32 \r
33 \r
34 \r
35 #if !defined _BUS_DRIVER_H_\r
36 #define _BUS_DRIVER_H_\r
37 \r
38 #include "complib/cl_types.h"\r
39 #include "complib/cl_atomic.h"\r
40 #include "complib/cl_debug.h"\r
41 #include "complib/cl_mutex.h"\r
42 #include "complib/cl_qlist.h"\r
43 #include "complib/cl_ptr_vector.h"\r
44 #include "complib/cl_pnp_po.h"\r
45 #include "iba/ib_al.h"\r
46 #include "bus_port_mgr.h"\r
47 #include "bus_iou_mgr.h"\r
48 #include "al_dev.h"\r
49 /* Safe string functions. */\r
50 #if WINVER == 0x500\r
51 /*\r
52  * Windows 2000 doesn't support the inline version of safe strings.\r
53  * Force the use of the library version of safe strings.\r
54  */\r
55 #define NTSTRSAFE_LIB\r
56 #endif\r
57 #include <ntstrsafe.h>\r
58 \r
59 \r
60 /*\r
61  * Main header for IB Bus driver.\r
62  */\r
63 \r
64 #define BUS_ENTER( lvl )                        \\r
65         CL_ENTER( lvl, bus_globals.dbg_lvl )\r
66 \r
67 #define BUS_EXIT( lvl )                         \\r
68         CL_EXIT( lvl, bus_globals.dbg_lvl )\r
69 \r
70 #define BUS_TRACE( lvl, msg )           \\r
71         CL_TRACE( lvl, bus_globals.dbg_lvl, msg )\r
72 \r
73 #define BUS_TRACE_EXIT( lvl, msg )      \\r
74         CL_TRACE_EXIT( lvl, bus_globals.dbg_lvl, msg )\r
75 \r
76 #define BUS_PRINT( lvl, msg )           \\r
77         CL_PRINT( lvl, bus_globals.dbg_lvl, msg )\r
78 \r
79 /* single character Macro elemination */\r
80 #define XBUS_PRINT( lvl, msg )\r
81 #define XBUS_ENTER( lvl )\r
82 #define XBUS_EXIT( lvl )\r
83 \r
84 #define BUS_DBG_ERROR   CL_DBG_ERROR\r
85 #define BUS_DBG_DRV             (1 << 0)\r
86 #define BUS_DBG_PNP             (1 << 1)\r
87 #define BUS_DBG_POWER   (1 << 2)\r
88 #define BUS_DBG_PORT    (1 << 3)\r
89 #define BUS_DBG_IOU             (1 << 4)\r
90 \r
91 /*\r
92  * ALLOC_PRAGMA sections:\r
93  *      PAGE\r
94  *              Default pagable code.  Won't be locked in memory.\r
95  *\r
96  *      PAGE_PNP\r
97  *              Code that needs to be locked in memory when the device is\r
98  *              in the paging, crash dump, or hibernation path.\r
99  */\r
100 \r
101 /*\r
102  * Device extension for the device object that serves as entry point for \r
103  * the interface and IOCTL requests.\r
104  */\r
105 typedef struct _bus_fdo_ext\r
106 {\r
107         cl_pnp_po_ext_t                 cl_ext;\r
108 \r
109         /*\r
110          * Device power map returned by the bus driver for the device, used \r
111          * when sending IRP_MN_SET_POWER for device state in response to \r
112          * IRP_MN_SET_POWER for system state.\r
113          */\r
114         DEVICE_POWER_STATE              po_state[PowerSystemMaximum];\r
115 \r
116         port_mgr_t                              *p_port_mgr;\r
117         iou_mgr_t                               *p_iou_mgr;\r
118 \r
119         /* Number of references on the upper interface. */\r
120         atomic32_t                              n_al_ifc_ref;\r
121         /* Number of references on the CI interface. */\r
122         atomic32_t                              n_ci_ifc_ref;\r
123 \r
124         struct _bus_filter_instance *bus_filter;\r
125 \r
126 }       bus_fdo_ext_t;\r
127 \r
128 \r
129 /*\r
130  * Device extension for bus driver PDOs.\r
131  */\r
132 typedef struct _bus_pdo_ext\r
133 {\r
134         cl_pnp_po_ext_t                 cl_ext;\r
135 \r
136         cl_list_item_t                  list_item;\r
137 \r
138         /* All reported PDOs are children of an HCA. */\r
139         ib_ca_handle_t                  h_ca;\r
140 \r
141         /*\r
142          * CA GUID copy - in case we get IRPs after the CA\r
143          * handle has been released.\r
144          */\r
145         net64_t                                 ca_guid;\r
146 \r
147         POWER_STATE                             dev_po_state;\r
148 \r
149         /*\r
150          * Pointer to the bus root device extension.  Used to manage access to\r
151          * child PDO pointer vector when a child is removed politely.\r
152          */\r
153         bus_fdo_ext_t                   *p_parent_ext;\r
154 \r
155         /*\r
156          * The following two flags are exclusively set, but can both be FALSE.\r
157          * Flag that indicates whether the device is present in the system or not.\r
158          * This affects how a IRP_MN_REMOVE_DEVICE IRP is handled for a child PDO.\r
159          * This flag is cleared when:\r
160          *      - an HCA (for IPoIB devices) is removed from the system for all port\r
161          *      devices loaded for that HCA\r
162          *      - an IOU is reported as removed by the CIA.\r
163          */\r
164         boolean_t                               b_present;\r
165 \r
166         /*\r
167          * Flag that indicates whether the device has been reported to the PnP\r
168          * manager as having been removed.  That is, the device was reported\r
169          * in a previous BusRelations query and not in a subsequent one.\r
170          * This flag is set when\r
171          *      - the device is in the surprise remove state when the parent bus\r
172          *      device is removed\r
173          *      - the device is found to be not present during a BusRelations query\r
174          *      and thus not reported.\r
175          */\r
176         boolean_t                               b_reported_missing;\r
177 \r
178         /* Flag to control the behaviour of the driver during hibernation */\r
179         uint32_t                                b_hibernating;\r
180 \r
181         /* work item for handling Power Management request */\r
182         PIO_WORKITEM                    p_po_work_item;\r
183         boolean_t                           is_partition_pdo;\r
184 }       bus_pdo_ext_t;\r
185 \r
186 /* pkey configuration */\r
187 typedef struct _pkey_conf_t\r
188 {\r
189         pkey_array_t    pkeys_per_port;\r
190         struct _pkey_conf_t *next_conf;\r
191 }pkey_conf_t;\r
192 \r
193 /*\r
194  * Global Driver parameters.\r
195  */\r
196 typedef struct _bus_globals\r
197 {\r
198         /* Debug level. */\r
199         uint32_t                                dbg_lvl;\r
200 \r
201         /* Flag to control loading of Ip Over Ib driver for each HCA port. */\r
202         uint32_t                                b_report_port_nic;\r
203 \r
204         /* Driver object.  Used for registering of Plug and Play notifications. */\r
205         DRIVER_OBJECT                   *p_driver_obj;\r
206 \r
207         /* IBAL PNP event register handles */\r
208         ib_pnp_handle_t                 h_pnp_port;\r
209         ib_pnp_handle_t                 h_pnp_iou;\r
210 \r
211         /* pkey array to be read */\r
212         pkey_conf_t                             *p_pkey_conf;\r
213 \r
214 }       bus_globals_t;\r
215 \r
216 \r
217 extern bus_globals_t    bus_globals;\r
218 \r
219 /*\r
220  * Each instance of a bus filter on an HCA device stack (InfiniBandController)\r
221  * populates a bus_filter_t slot in g_bus_filters[MAX_BUS_FILTERS]; see\r
222  * bus_add_device(). Therefore MAX_BUS_FILTERS represents the MAX number of\r
223  * HCA's supported in a single system.\r
224  */\r
225 #define MAX_BUS_FILTERS 16\r
226 #define BFI_MAGIC               0xcafebabe\r
227 \r
228 #define BFI_PORT_MGR_OBJ        1\r
229 #define BFI_IOU_MGR_OBJ         2\r
230 \r
231 \r
232 typedef struct _bus_filter_instance\r
233 {\r
234         /* Pointer to the bus filter instance FDO extention.\r
235          * if p_bus_ext is NULL, then it's an empty slot available for allocation\r
236          */\r
237         bus_fdo_ext_t                   *p_bus_ext;\r
238 \r
239         /* HCA guid for which this bus filter is servicing */\r
240         ib_net64_t                              ca_guid;\r
241 \r
242         /* PORT management - on a per HCA basis */\r
243         port_mgr_t                              *p_port_mgr;\r
244         cl_obj_t                                *p_port_mgr_obj;\r
245 \r
246         /* IOU management - on a per HCA basis */\r
247         iou_mgr_t                               *p_iou_mgr;\r
248         cl_obj_t                                *p_iou_mgr_obj;\r
249 #if DBG\r
250         ULONG                                   magic; // initial/temp debug\r
251         char                                    whoami[8];\r
252 #endif\r
253 \r
254 }       bus_filter_t;\r
255 \r
256 extern bus_filter_t     g_bus_filters[MAX_BUS_FILTERS];\r
257 extern ULONG g_bfi_InstanceCount;\r
258 extern KEVENT g_ControlEvent;   // serializes InstanceCount & g_bus_filters\r
259 \r
260 extern bus_filter_t *alloc_bfi( IN DRIVER_OBJECT *, OUT int * );\r
261 extern int free_bfi( IN bus_filter_t *p_bfi );\r
262 extern int get_bfi_count( void );\r
263 extern bus_filter_t *get_bfi_by_obj( IN int obj_type, IN cl_obj_t *p_obj );\r
264 extern bus_filter_t *get_bfi_by_ca_guid( IN net64_t ca_guid );\r
265 extern bus_filter_t *get_set_bfi_by_ca_guid( IN net64_t ca_guid );\r
266 extern char *get_obj_state_str(cl_state_t state);\r
267 \r
268 inline VOID lock_control_event() {\r
269         KeWaitForSingleObject(&g_ControlEvent, Executive, KernelMode , FALSE, NULL);\r
270 }\r
271 \r
272 inline VOID unlock_control_event() {\r
273         KeSetEvent(&g_ControlEvent, 0, FALSE);\r
274 }\r
275 \r
276 #endif  /* !defined _BUS_DRIVER_H_ */\r