ed190bf932558bf29a762aeb42a2e38c8e161ba5
[mirror/winof/.git] / hw / mlx4 / kernel / hca / wmi.c
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Copyright (c) 1996-2003 Intel 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: al.c 1611 2006-08-20 14:48:55Z sleybo $\r
31  */\r
32 \r
33 #include "precomp.h"\r
34 \r
35 #ifdef USE_WDM_FRAMEWORK\r
36 \r
37 #pragma warning( disable : 4206)\r
38 \r
39 #else\r
40 \r
41 #if defined(EVENT_TRACING)\r
42 #include "wmi.tmh"\r
43 #endif\r
44 \r
45 NTSTATUS\r
46 WmiRegistration(\r
47         WDFDEVICE      Device\r
48         )\r
49 /*++\r
50 Routine Description\r
51 \r
52         Registers with WMI as a data provider for this\r
53         instance of the device\r
54 \r
55 --*/\r
56 {\r
57         WDF_WMI_PROVIDER_CONFIG providerConfig;\r
58         WDF_WMI_INSTANCE_CONFIG instanceConfig;\r
59         PFDO_DEVICE_DATA deviceData;\r
60         NTSTATUS status;\r
61         DECLARE_CONST_UNICODE_STRING(hcaRsrcName, HCARESOURCENAME);\r
62 \r
63         PAGED_CODE();\r
64 \r
65         deviceData = FdoGetData(Device);\r
66 \r
67         //\r
68         // Register WMI classes.\r
69         // First specify the resource name which contain the binary mof resource.\r
70         //\r
71         status = WdfDeviceAssignMofResourceName(Device, &hcaRsrcName);\r
72         if (!NT_SUCCESS(status)) {\r
73                 return status;\r
74         }\r
75 \r
76         WDF_WMI_PROVIDER_CONFIG_INIT(&providerConfig, &MLX4_HCA_WMI_STD_DATA_GUID);\r
77         providerConfig.MinInstanceBufferSize = sizeof(HCA_WMI_STD_DATA);\r
78 \r
79         //\r
80         // You would want to create a WDFWMIPROVIDER handle separately if you are\r
81         // going to dynamically create instances on the provider.  Since we are\r
82         // statically creating one instance, there is no need to create the provider\r
83         // handle.\r
84         //\r
85         WDF_WMI_INSTANCE_CONFIG_INIT_PROVIDER_CONFIG(&instanceConfig, &providerConfig);\r
86 \r
87         //\r
88         // By setting Register to TRUE, we tell the framework to create a provider\r
89         // as part of the Instance creation call. This eliminates the need to\r
90         // call WdfWmiProviderRegister.\r
91         //\r
92         instanceConfig.Register = TRUE;\r
93         instanceConfig.EvtWmiInstanceQueryInstance = EvtStdDataQueryInstance;\r
94         instanceConfig.EvtWmiInstanceSetInstance = EvtStdDataSetInstance;\r
95         instanceConfig.EvtWmiInstanceSetItem = EvtStdDataSetItem;\r
96 \r
97         status = WdfWmiInstanceCreate(  Device,\r
98                 &instanceConfig, WDF_NO_OBJECT_ATTRIBUTES, WDF_NO_HANDLE );\r
99 \r
100         return status;\r
101 }\r
102 \r
103 //\r
104 // WMI System Call back functions\r
105 //\r
106 NTSTATUS\r
107 EvtStdDataSetItem(\r
108         IN  WDFWMIINSTANCE WmiInstance,\r
109         IN  ULONG DataItemId,\r
110         IN  ULONG InBufferSize,\r
111         IN  PVOID InBuffer\r
112         )\r
113 /*++\r
114 \r
115 Routine Description:\r
116 \r
117         This routine is a callback into the driver to set for the contents of\r
118         an instance.\r
119 \r
120 Arguments:\r
121 \r
122         WmiInstance is the instance being set\r
123 \r
124         DataItemId has the id of the data item being set\r
125 \r
126         InBufferSize has the size of the data item passed\r
127 \r
128         InBuffer has the new values for the data item\r
129 \r
130 Return Value:\r
131 \r
132         status\r
133 \r
134 --*/\r
135 {\r
136         PFDO_DEVICE_DATA fdoData;\r
137 \r
138         PAGED_CODE();\r
139 \r
140         fdoData = FdoGetData(WdfWmiInstanceGetDevice(WmiInstance));\r
141 \r
142         switch(DataItemId)\r
143         {\r
144         case 1:\r
145                 if (InBufferSize < sizeof(ULONG)) {\r
146                         return STATUS_BUFFER_TOO_SMALL;\r
147                 }\r
148                 fdoData->WmiData.DebugPrintLevel = *((PULONG)InBuffer);\r
149                 return STATUS_SUCCESS;\r
150 \r
151         case 2:\r
152                 if (InBufferSize < sizeof(ULONG)) {\r
153                         return STATUS_BUFFER_TOO_SMALL;\r
154                 }\r
155                 fdoData->WmiData.DebugPrintFlags = *((PULONG)InBuffer);\r
156                 return STATUS_SUCCESS;\r
157 \r
158         default:\r
159                 return STATUS_WMI_READ_ONLY;\r
160         }\r
161 }\r
162 \r
163 NTSTATUS\r
164 EvtStdDataSetInstance(\r
165         IN  WDFWMIINSTANCE WmiInstance,\r
166         IN  ULONG InBufferSize,\r
167         IN  PVOID InBuffer\r
168         )\r
169 /*++\r
170 \r
171 Routine Description:\r
172 \r
173         This routine is a callback into the driver to set for the contents of\r
174         an instance.\r
175 \r
176 Arguments:\r
177 \r
178         WmiInstance is the instance being set\r
179 \r
180         BufferSize has the size of the data block passed\r
181 \r
182         Buffer has the new values for the data block\r
183 \r
184 Return Value:\r
185 \r
186         status\r
187 \r
188 --*/\r
189 {\r
190         PFDO_DEVICE_DATA   fdoData;\r
191 \r
192         UNREFERENCED_PARAMETER(InBufferSize);\r
193 \r
194         PAGED_CODE();\r
195 \r
196         fdoData = FdoGetData(WdfWmiInstanceGetDevice(WmiInstance));\r
197 \r
198         //\r
199         // We will update only writable elements.\r
200         //\r
201         memcpy( &fdoData->WmiData, InBuffer, \r
202                 min(sizeof(HCA_WMI_STD_DATA), InBufferSize));\r
203 \r
204         return STATUS_SUCCESS;\r
205 }\r
206 \r
207 NTSTATUS\r
208 EvtStdDataQueryInstance(\r
209         IN  WDFWMIINSTANCE WmiInstance,\r
210         IN  ULONG OutBufferSize,\r
211         IN  PVOID OutBuffer,\r
212         OUT PULONG BufferUsed\r
213         )\r
214 /*++\r
215 \r
216 Routine Description:\r
217 \r
218         This routine is a callback into the driver to set for the contents of\r
219         a wmi instance\r
220 \r
221 Arguments:\r
222 \r
223         WmiInstance is the instance being set\r
224 \r
225         OutBufferSize on has the maximum size available to write the data\r
226                 block.\r
227 \r
228         OutBuffer on return is filled with the returned data block\r
229 \r
230         BufferUsed pointer containing how many bytes are required (upon failure) or\r
231                 how many bytes were used (upon success)\r
232 \r
233 Return Value:\r
234 \r
235         status\r
236 \r
237 --*/\r
238 {\r
239         PFDO_DEVICE_DATA fdoData;\r
240 \r
241         UNREFERENCED_PARAMETER(OutBufferSize);\r
242 \r
243         PAGED_CODE();\r
244 \r
245         fdoData = FdoGetData(WdfWmiInstanceGetDevice(WmiInstance));\r
246 \r
247         *BufferUsed = sizeof (HCA_WMI_STD_DATA);\r
248         * (PHCA_WMI_STD_DATA) OutBuffer = fdoData->WmiData;\r
249 \r
250         return STATUS_SUCCESS;\r
251 }\r
252 \r
253 #endif\r
254 \r