1 /*
2 * Copyright � 2014 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sub license, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
14 * of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Wei Lin<wei.w.lin@intel.com>
26 * Yuting Yang<yuting.yang@intel.com>
27 */
28
29 #include <stdarg.h>
30 #include <stdint.h>
31 #include <stdlib.h>
32
33 #include "os_util_debug.h"
34
35 #if GENOS_MESSAGES_ENABLED
36 #include "os_utilities.h"
37
38 #define __GENOS_USER_FEATURE_KEY_MESSAGE_DEFAULT_VALUE 1
39 #define __GENOS_USER_FEATURE_KEY_MESSAGE_PRINT_ENABLED "Message Print Enabled"
40
41 #define __MEDIA_REGISTRY_SUBKEY_INTERNAL "LibVa"
42 #define __MEDIA_REGISTRY_SUBKEY_PERFORMANCE ""
43 #define __MEDIA_REGISTRY_SUBKEY_REPORT "LibVa/Report"
44
45 extern INT32 GenOsMemAllocCounter;
46
47 const PCCHAR GenOsLogPathTemplate = "%s/igd_%u.%s";
48
49 const PCCHAR DDILogPathTemplate = "%s\\ddi_dump_%d.%s";
50
51 const PCCHAR GENOS_LogLevelName[GENOS_MESSAGE_LVL_COUNT] = {
52 "",
53 "CRITICAL",
54 "NORMAL ",
55 "VERBOSE ",
56 "ENTER ",
57 "EXIT ",
58 "ENTER ",
59 "EXIT ",
60 };
61
62 const PCCHAR GENOS_ComponentName[GENOS_COMPONENT_COUNT] = {
63 "[GENOS]: ",
64 "[GENHW]: ",
65 "[LIBVA]:",
66 "[CM]: "
67 };
68
69 GENOS_MESSAGE_PARAMS g_GenOsMsgParams;
70 GENOS_MESSAGE_PARAMS g_GenOsMsgParams_DDI_Dump;
71
72 GENOS_USER_FEATURE_VALUE_ID pcComponentRegKeys[GENOS_COMPONENT_COUNT][3] = {
73 {
74 __GENOS_USER_FEATURE_KEY_MESSAGE_OS_TAG,
75 __GENOS_USER_FEATURE_KEY_BY_SUB_COMPONENT_OS,
76 __GENOS_USER_FEATURE_KEY_SUB_COMPONENT_OS_TAG},
77
78 {
79 __GENOS_USER_FEATURE_KEY_MESSAGE_HW_TAG,
80 __GENOS_USER_FEATURE_KEY_BY_SUB_COMPONENT_HW,
81 __GENOS_USER_FEATURE_KEY_SUB_COMPONENT_HW_TAG},
82
83 {
84 __GENOS_USER_FEATURE_KEY_MESSAGE_DDI_TAG,
85 __GENOS_USER_FEATURE_KEY_BY_SUB_COMPONENT_DDI,
86 __GENOS_USER_FEATURE_KEY_SUB_COMPONENT_DDI_TAG},
87
88 {
89 __GENOS_USER_FEATURE_KEY_MESSAGE_CM_TAG,
90 __GENOS_USER_FEATURE_KEY_BY_SUB_COMPONENT_CM,
91 __GENOS_USER_FEATURE_KEY_SUB_COMPONENT_CM_TAG}
92 };
93
94
95
96 UINT8 subComponentCount[GENOS_COMPONENT_COUNT] = {
97 GENOS_SUBCOMP_COUNT,
98 GENOS_HW_SUBCOMP_COUNT,
99 GENOS_DDI_SUBCOMP_COUNT,
100 GENOS_CM_SUBCOMP_COUNT
101 };
102
_GENOS_Assert(GENOS_COMPONENT_ID comp,uint8_t subComp)103 void _GENOS_Assert(GENOS_COMPONENT_ID comp,
104 uint8_t subComp)
105 {
106 abort();
107 }
108
109
GENOS_SetSubCompMessageLevel(GENOS_COMPONENT_ID compID,UINT8 subCompID,GENOS_MESSAGE_LEVEL msgLevel)110 VOID GENOS_SetSubCompMessageLevel(GENOS_COMPONENT_ID compID, UINT8 subCompID,
111 GENOS_MESSAGE_LEVEL msgLevel)
112 {
113 if (compID >= GENOS_COMPONENT_COUNT) {
114 GENOS_OS_ASSERTMESSAGE("Invalid component %d.", compID);
115 return;
116 }
117
118 if (subCompID >= GENOS_MAX_SUBCOMPONENT_COUNT) {
119 GENOS_OS_ASSERTMESSAGE("Invalid sub-component %d.", subCompID);
120 return;
121 }
122
123 g_GenOsMsgParams.components[compID].subComponents[subCompID].
124 uiMessageLevel = msgLevel;
125 }
126
GENOS_SetCompMessageLevel(GENOS_COMPONENT_ID compID,GENOS_MESSAGE_LEVEL msgLevel)127 VOID GENOS_SetCompMessageLevel(GENOS_COMPONENT_ID compID,
128 GENOS_MESSAGE_LEVEL msgLevel)
129 {
130 if (compID >= GENOS_COMPONENT_COUNT) {
131 GENOS_OS_ASSERTMESSAGE("Invalid component %d.", compID);
132 return;
133 }
134
135 g_GenOsMsgParams.components[compID].component.uiMessageLevel = msgLevel;
136 }
137
GENOS_SetCompMessageLevelAll(GENOS_MESSAGE_LEVEL msgLevel)138 VOID GENOS_SetCompMessageLevelAll(GENOS_MESSAGE_LEVEL msgLevel)
139 {
140 UINT32 i;
141
142 for (i = 0; i < GENOS_COMPONENT_COUNT; i++) {
143 GENOS_SetCompMessageLevel((GENOS_COMPONENT_ID) i, msgLevel);
144 }
145 }
146
GENOS_SubCompAssertEnableDisable(GENOS_COMPONENT_ID compID,UINT8 subCompID,BOOL bEnable)147 VOID GENOS_SubCompAssertEnableDisable(GENOS_COMPONENT_ID compID,
148 UINT8 subCompID, BOOL bEnable)
149 {
150 if (compID >= GENOS_COMPONENT_COUNT) {
151 GENOS_OS_ASSERTMESSAGE("Invalid component %d.", compID);
152 return;
153 }
154
155 if (subCompID >= GENOS_MAX_SUBCOMPONENT_COUNT) {
156 GENOS_OS_ASSERTMESSAGE("Invalid sub-component %d.", subCompID);
157 return;
158 }
159
160 g_GenOsMsgParams.components[compID].subComponents[subCompID].
161 bAssertEnabled = bEnable;
162 }
163
GENOS_CompAssertEnableDisable(GENOS_COMPONENT_ID compID,BOOL bEnable)164 VOID GENOS_CompAssertEnableDisable(GENOS_COMPONENT_ID compID, BOOL bEnable)
165 {
166 if (compID >= GENOS_COMPONENT_COUNT) {
167 GENOS_OS_ASSERTMESSAGE("Invalid component %d.", compID);
168 return;
169 }
170
171 g_GenOsMsgParams.components[compID].component.bAssertEnabled = bEnable;
172 }
173
GENOS_UserFeature_WriteValues(PGENOS_USER_FEATURE_INTERFACE fi,PGENOS_USER_FEATURE f)174 static GENOS_STATUS GENOS_UserFeature_WriteValues(PGENOS_USER_FEATURE_INTERFACE fi,
175 PGENOS_USER_FEATURE f)
176 {
177 // TODO
178 return GENOS_STATUS_SUCCESS;
179 }
180
GENOS_UserFeature_ReadValue(PGENOS_USER_FEATURE_INTERFACE fi,PGENOS_USER_FEATURE f,PCCHAR p,GENOS_USER_FEATURE_VALUE_TYPE vt)181 static GENOS_STATUS GENOS_UserFeature_ReadValue(PGENOS_USER_FEATURE_INTERFACE fi,
182 PGENOS_USER_FEATURE f,
183 PCCHAR p,
184 GENOS_USER_FEATURE_VALUE_TYPE vt)
185 {
186 // TODO
187 return GENOS_STATUS_SUCCESS;
188 }
189
GENOS_UserFeature_ReadValue_ID(PGENOS_USER_FEATURE_INTERFACE fi,PGENOS_USER_FEATURE f,GENOS_USER_FEATURE_VALUE_ID vID,GENOS_USER_FEATURE_VALUE_TYPE vt)190 static GENOS_STATUS GENOS_UserFeature_ReadValue_ID(PGENOS_USER_FEATURE_INTERFACE fi,
191 PGENOS_USER_FEATURE f,
192 GENOS_USER_FEATURE_VALUE_ID vID,
193 GENOS_USER_FEATURE_VALUE_TYPE vt)
194 {
195 // TODO
196 return GENOS_STATUS_SUCCESS;
197 }
198
GENOS_MessageInitComponent(GENOS_COMPONENT_ID compID)199 VOID GENOS_MessageInitComponent(GENOS_COMPONENT_ID compID)
200 {
201 GENOS_STATUS eStatus = GENOS_STATUS_SUCCESS;
202 GENOS_USER_FEATURE UserFeature;
203 GENOS_USER_FEATURE_VALUE UserFeatureValue =
204 { __GENOS_USER_FEATURE_KEY_INVALID_ID,
205 0,
206 0,
207 0,
208 0,
209 GENOS_USER_FEATURE_TYPE_INVALID,
210 GENOS_USER_FEATURE_VALUE_TYPE_INVALID,
211 0
212 };
213 UINT32 uiCompRegSetting;
214 UINT64 uiSubCompRegSetting;
215 UINT8 i;
216 GENOS_USER_FEATURE_VALUE_ID pcMessageKey = __GENOS_USER_FEATURE_KEY_INVALID_ID;
217 GENOS_USER_FEATURE_VALUE_ID pcBySubComponentsKey = __GENOS_USER_FEATURE_KEY_INVALID_ID;
218 GENOS_USER_FEATURE_VALUE_ID pcSubComponentsKey = __GENOS_USER_FEATURE_KEY_INVALID_ID;
219
220 if (compID >= GENOS_COMPONENT_COUNT) {
221 GENOS_OS_ASSERTMESSAGE("Invalid component %d.", compID);
222 return;
223 }
224
225 pcMessageKey = pcComponentRegKeys[compID][0];
226 pcBySubComponentsKey = pcComponentRegKeys[compID][1];
227 pcSubComponentsKey = pcComponentRegKeys[compID][2];
228
229 UserFeatureValue.u32Data =
230 __GENOS_USER_FEATURE_KEY_MESSAGE_DEFAULT_VALUE;
231 UserFeature.Type = GENOS_USER_FEATURE_TYPE_USER;
232 UserFeature.pPath = __MEDIA_REGISTRY_SUBKEY_INTERNAL;
233 UserFeature.pValues = &UserFeatureValue;
234 UserFeature.uiNumValues = 1;
235
236 eStatus = GENOS_UserFeature_ReadValue_ID(NULL,
237 &UserFeature,
238 pcMessageKey,
239 GENOS_USER_FEATURE_VALUE_TYPE_UINT32);
240
241 if (eStatus == GENOS_STATUS_READ_REGISTRY_FAILED) {
242 GENOS_UserFeature_WriteValues(NULL, &UserFeature);
243 }
244
245 uiCompRegSetting = UserFeatureValue.u32Data;
246
247 GENOS_SetCompMessageLevel(compID,
248 (GENOS_MESSAGE_LEVEL) (uiCompRegSetting &
249 0x7));
250 GENOS_CompAssertEnableDisable(compID, (uiCompRegSetting >> 3) & 0x1);
251
252 UserFeatureValue.bData = FALSE;
253
254 eStatus = GENOS_UserFeature_ReadValue_ID(NULL,
255 &UserFeature,
256 pcBySubComponentsKey,
257 GENOS_USER_FEATURE_VALUE_TYPE_UINT32);
258 if (eStatus == GENOS_STATUS_READ_REGISTRY_FAILED) {
259 GENOS_UserFeature_WriteValues(NULL, &UserFeature);
260 }
261
262 g_GenOsMsgParams.components[compID].bBySubComponent =
263 UserFeatureValue.bData;
264
265 if (g_GenOsMsgParams.components[compID].bBySubComponent) {
266 UserFeatureValue.u64Data = 0;
267
268 eStatus = GENOS_UserFeature_ReadValue_ID(NULL,
269 &UserFeature,
270 pcSubComponentsKey,
271 GENOS_USER_FEATURE_VALUE_TYPE_UINT64);
272
273 if (eStatus == GENOS_STATUS_READ_REGISTRY_FAILED) {
274 GENOS_UserFeature_WriteValues(NULL, &UserFeature);
275 }
276
277 uiSubCompRegSetting = UserFeatureValue.u64Data;
278
279 for (i = 0; i < subComponentCount[compID]; i++) {
280 GENOS_SetSubCompMessageLevel(compID, i,
281 (GENOS_MESSAGE_LEVEL)
282 (uiSubCompRegSetting &
283 0x7));
284 GENOS_SubCompAssertEnableDisable(compID, i,
285 (uiSubCompRegSetting >>
286 3) & 0x1);
287
288 uiSubCompRegSetting = (uiSubCompRegSetting >> 4);
289 }
290 }
291 }
292
GENOS_MessageInit()293 VOID GENOS_MessageInit()
294 {
295 UINT8 i;
296 GENOS_USER_FEATURE UserFeature;
297 GENOS_USER_FEATURE_VALUE UserFeatureValue =
298 { __GENOS_USER_FEATURE_KEY_INVALID_ID,
299 0,
300 0,
301 0,
302 0,
303 GENOS_USER_FEATURE_TYPE_INVALID,
304 GENOS_USER_FEATURE_VALUE_TYPE_INVALID,
305 0
306 };
307 GENOS_STATUS eStatus = GENOS_STATUS_SUCCESS;
308
309 if (g_GenOsMsgParams.uiCounter == 0) {
310 GenOsMemAllocCounter = 0;
311
312 GENOS_SetCompMessageLevelAll(GENOS_MESSAGE_LVL_CRITICAL);
313
314 for (i = 0; i < GENOS_COMPONENT_COUNT; i++) {
315 GENOS_MessageInitComponent((GENOS_COMPONENT_ID) i);
316 }
317
318 GENOS_ZeroMemory(&UserFeatureValue, sizeof(UserFeatureValue));
319 UserFeatureValue.bData = TRUE;
320 UserFeature.Type = GENOS_USER_FEATURE_TYPE_USER;
321 UserFeature.pPath = __MEDIA_REGISTRY_SUBKEY_INTERNAL;
322 UserFeature.pValues = &UserFeatureValue;
323 UserFeature.uiNumValues = 1;
324
325 eStatus = GENOS_UserFeature_ReadValue(NULL,
326 &UserFeature,
327 __GENOS_USER_FEATURE_KEY_MESSAGE_PRINT_ENABLED,
328 GENOS_USER_FEATURE_VALUE_TYPE_INT32);
329
330 if (eStatus == GENOS_STATUS_READ_REGISTRY_FAILED) {
331 GENOS_UserFeature_WriteValues(NULL, &UserFeature);
332 }
333
334 g_GenOsMsgParams.bUseOutputDebugString = UserFeatureValue.bData;
335 }
336 g_GenOsMsgParams.uiCounter++;
337
338 }
339
GENOS_MessageClose()340 VOID GENOS_MessageClose()
341 {
342 if (g_GenOsMsgParams.uiCounter == 1) {
343 GENOS_ZeroMemory(&g_GenOsMsgParams,
344 sizeof(GENOS_MESSAGE_PARAMS));
345 } else {
346 g_GenOsMsgParams.uiCounter--;
347 }
348 }
349
GENOS_ShouldPrintMessage(GENOS_MESSAGE_LEVEL level,GENOS_COMPONENT_ID compID,UINT8 subCompID,const PCCHAR message)350 static BOOL GENOS_ShouldPrintMessage(GENOS_MESSAGE_LEVEL level,
351 GENOS_COMPONENT_ID compID,
352 UINT8 subCompID, const PCCHAR message)
353 {
354 if (message == NULL) {
355 return FALSE;
356 }
357
358 if (compID >= GENOS_COMPONENT_COUNT ||
359 subCompID >= GENOS_MAX_SUBCOMPONENT_COUNT) {
360 return FALSE;
361 }
362 if (g_GenOsMsgParams.components[compID].component.uiMessageLevel <
363 level) {
364 return FALSE;
365 }
366
367 if (g_GenOsMsgParams.components[compID].bBySubComponent &&
368 g_GenOsMsgParams.components[compID].subComponents[subCompID].
369 uiMessageLevel < level) {
370 return FALSE;
371 }
372
373 return TRUE;
374 }
375
GENOS_Message(GENOS_MESSAGE_LEVEL level,const char * tag,GENOS_COMPONENT_ID comp,uint8_t subComp,const char * msg,...)376 void GENOS_Message(GENOS_MESSAGE_LEVEL level,
377 const char *tag,
378 GENOS_COMPONENT_ID comp,
379 uint8_t subComp,
380 const char *msg, ...)
381 {
382 FILE *stream = stderr;
383 va_list args;
384
385 if (!GENOS_ShouldPrintMessage(level, comp, subComp, msg)) {
386 return;
387 }
388
389 va_start(args, msg);
390 vfprintf(stream, msg, args);
391 fflush(stream);
392 }
393
394 #if GENOS_ASSERT_ENABLED
GENOS_ShouldAssert(GENOS_COMPONENT_ID compID,UINT8 subCompID)395 BOOL GENOS_ShouldAssert(GENOS_COMPONENT_ID compID, UINT8 subCompID)
396 {
397 if (compID >= GENOS_COMPONENT_COUNT ||
398 subCompID >= GENOS_MAX_SUBCOMPONENT_COUNT) {
399 return FALSE;
400 }
401
402 if (!g_GenOsMsgParams.components[compID].component.bAssertEnabled) {
403 return FALSE;
404 }
405
406 if (g_GenOsMsgParams.components[compID].bBySubComponent &&
407 !g_GenOsMsgParams.components[compID].subComponents[subCompID].
408 bAssertEnabled) {
409 return FALSE;
410 }
411
412 return TRUE;
413
414 }
415 #endif
416
417 #endif
418