[IBBUS] added support for creating vendor defined devices.
[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 /* Windows pnp device information */\r
130 #define MAX_DEVICE_ID_LEN     200\r
131 #define MAX_DEVICE_STRING_LEN           MAX_DEVICE_ID_LEN + 2   //add extra 4 bytes in case we need double NULL ending\r
132 typedef struct _child_device_info {\r
133         wchar_t         device_id[MAX_DEVICE_STRING_LEN];  \r
134         uint32_t    device_id_size;\r
135         wchar_t     compatible_id[MAX_DEVICE_STRING_LEN];\r
136         uint32_t    compatible_id_size;\r
137         wchar_t     hardware_id[MAX_DEVICE_STRING_LEN];\r
138         uint32_t    hardware_id_size;\r
139         wchar_t     description[MAX_DEVICE_STRING_LEN];\r
140         uint32_t    description_size;\r
141         wchar_t     pkey[20];\r
142 }  child_device_info_t;\r
143 \r
144 typedef struct _child_device_info_list{\r
145         child_device_info_t io_device_info;\r
146         struct _child_device_info_list *next_device_info;\r
147 }child_device_info_list_t;\r
148 \r
149 \r
150 /*\r
151  * Device extension for bus driver PDOs.\r
152  */\r
153 typedef struct _bus_pdo_ext\r
154 {\r
155         cl_pnp_po_ext_t                 cl_ext;\r
156 \r
157         cl_list_item_t                  list_item;\r
158 \r
159         /* All reported PDOs are children of an HCA. */\r
160         ib_ca_handle_t                  h_ca;\r
161 \r
162         /*\r
163          * CA GUID copy - in case we get IRPs after the CA\r
164          * handle has been released.\r
165          */\r
166         net64_t                                 ca_guid;\r
167 \r
168         POWER_STATE                             dev_po_state;\r
169 \r
170         /*\r
171          * Pointer to the bus root device extension.  Used to manage access to\r
172          * child PDO pointer vector when a child is removed politely.\r
173          */\r
174         bus_fdo_ext_t                   *p_parent_ext;\r
175 \r
176         /*\r
177          * The following two flags are exclusively set, but can both be FALSE.\r
178          * Flag that indicates whether the device is present in the system or not.\r
179          * This affects how a IRP_MN_REMOVE_DEVICE IRP is handled for a child PDO.\r
180          * This flag is cleared when:\r
181          *      - an HCA (for IPoIB devices) is removed from the system for all port\r
182          *      devices loaded for that HCA\r
183          *      - an IOU is reported as removed by the CIA.\r
184          */\r
185         boolean_t                               b_present;\r
186 \r
187         /*\r
188          * Flag that indicates whether the device has been reported to the PnP\r
189          * manager as having been removed.  That is, the device was reported\r
190          * in a previous BusRelations query and not in a subsequent one.\r
191          * This flag is set when\r
192          *      - the device is in the surprise remove state when the parent bus\r
193          *      device is removed\r
194          *      - the device is found to be not present during a BusRelations query\r
195          *      and thus not reported.\r
196          */\r
197         boolean_t                               b_reported_missing;\r
198 \r
199         /* Flag to control the behaviour of the driver during hibernation */\r
200         uint32_t                                b_hibernating;\r
201 \r
202         /* work item for handling Power Management request */\r
203         PIO_WORKITEM                    p_po_work_item;\r
204         boolean_t                               hca_acquired;\r
205         child_device_info_t             *p_pdo_device_info;\r
206 }       bus_pdo_ext_t;\r
207 \r
208 /* pkey configuration */\r
209 typedef struct _pkey_conf_t\r
210 {\r
211         pkey_array_t    pkeys_per_port;\r
212         struct _pkey_conf_t *next_conf;\r
213 }pkey_conf_t;\r
214 \r
215 \r
216 /*\r
217  * Global Driver parameters.\r
218  */\r
219 typedef struct _bus_globals\r
220 {\r
221         /* Debug level. */\r
222         uint32_t                                dbg_lvl;\r
223 \r
224         /* Flag to control loading of Ip Over Ib driver for each HCA port. */\r
225         uint32_t                                b_report_port_nic;\r
226 \r
227         /* Driver object.  Used for registering of Plug and Play notifications. */\r
228         DRIVER_OBJECT                   *p_driver_obj;\r
229 \r
230         /* IBAL PNP event register handles */\r
231         ib_pnp_handle_t                 h_pnp_port;\r
232         ib_pnp_handle_t                 h_pnp_iou;\r
233 \r
234         /* pkey array to be read */\r
235         pkey_conf_t                             *p_pkey_conf;\r
236 \r
237         /* saved devices info*/\r
238         child_device_info_list_t *p_device_list;\r
239 \r
240 }       bus_globals_t;\r
241 \r
242 \r
243 extern bus_globals_t    bus_globals;\r
244 \r
245 /*\r
246  * Each instance of a bus filter on an HCA device stack (InfiniBandController)\r
247  * populates a bus_filter_t slot in g_bus_filters[MAX_BUS_FILTERS]; see\r
248  * bus_add_device(). Therefore MAX_BUS_FILTERS represents the MAX number of\r
249  * HCA's supported in a single system.\r
250  */\r
251 #define MAX_BUS_FILTERS 16\r
252 #define BFI_MAGIC               0xcafebabe\r
253 \r
254 #define BFI_PORT_MGR_OBJ        1\r
255 #define BFI_IOU_MGR_OBJ         2\r
256 \r
257 \r
258 typedef struct _bus_filter_instance\r
259 {\r
260         /* Pointer to the bus filter instance FDO extention.\r
261          * if p_bus_ext is NULL, then it's an empty slot available for allocation\r
262          */\r
263         bus_fdo_ext_t                   *p_bus_ext;\r
264 \r
265         /* HCA guid for which this bus filter is servicing */\r
266         ib_net64_t                              ca_guid;\r
267 \r
268         /* PORT management - on a per HCA basis */\r
269         port_mgr_t                              *p_port_mgr;\r
270         cl_obj_t                                *p_port_mgr_obj;\r
271 \r
272         /* IOU management - on a per HCA basis */\r
273         iou_mgr_t                               *p_iou_mgr;\r
274         cl_obj_t                                *p_iou_mgr_obj;\r
275 #if DBG\r
276         ULONG                                   magic; // initial/temp debug\r
277         char                                    whoami[8];\r
278 #endif\r
279 \r
280 }       bus_filter_t;\r
281 \r
282 extern bus_filter_t     g_bus_filters[MAX_BUS_FILTERS];\r
283 extern ULONG g_bfi_InstanceCount;\r
284 extern KEVENT g_ControlEvent;   // serializes InstanceCount & g_bus_filters\r
285 \r
286 extern bus_filter_t *alloc_bfi( IN DRIVER_OBJECT *, OUT int * );\r
287 extern int free_bfi( IN bus_filter_t *p_bfi );\r
288 extern int get_bfi_count( void );\r
289 extern bus_filter_t *get_bfi_by_obj( IN int obj_type, IN cl_obj_t *p_obj );\r
290 extern bus_filter_t *get_bfi_by_ca_guid( IN net64_t ca_guid );\r
291 extern bus_filter_t *get_set_bfi_by_ca_guid( IN net64_t ca_guid );\r
292 extern char *get_obj_state_str(cl_state_t state);\r
293 \r
294 inline VOID lock_control_event() {\r
295         KeWaitForSingleObject(&g_ControlEvent, Executive, KernelMode , FALSE, NULL);\r
296 }\r
297 \r
298 inline VOID unlock_control_event() {\r
299         KeSetEvent(&g_ControlEvent, 0, FALSE);\r
300 }\r
301 \r
302 #endif  /* !defined _BUS_DRIVER_H_ */\r