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