1*35ffd701SAndroid Build Coastguard Worker /*============================================================================== 2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2017 Intel Corporation 3*35ffd701SAndroid Build Coastguard Worker 4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a 5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"), 6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation 7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the 9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions: 10*35ffd701SAndroid Build Coastguard Worker 11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included 12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software. 13*35ffd701SAndroid Build Coastguard Worker 14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE. 21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/ 22*35ffd701SAndroid Build Coastguard Worker 23*35ffd701SAndroid Build Coastguard Worker #pragma once 24*35ffd701SAndroid Build Coastguard Worker 25*35ffd701SAndroid Build Coastguard Worker #if (_DEBUG || _RELEASE_INTERNAL) && !__GMM_KMD__ 26*35ffd701SAndroid Build Coastguard Worker // Not doing #if__cplusplus >= 201103L check because partial C++11 support may 27*35ffd701SAndroid Build Coastguard Worker // work for this. We also want to catch C++11 unavailability due to not setting 28*35ffd701SAndroid Build Coastguard Worker // compiler options. 29*35ffd701SAndroid Build Coastguard Worker #if (_MSC_VER >= 1800) // VS 2013+ 30*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_AVAILABLE 1 31*35ffd701SAndroid Build Coastguard Worker #elif((__clang_major__ > 3) || ((__clang_major__ == 3) && (__clang_minor__ >= 5))) // clang 3.5+ 32*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_AVAILABLE 1 33*35ffd701SAndroid Build Coastguard Worker #elif((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8))) // g++ 4.8+ 34*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_AVAILABLE 1 35*35ffd701SAndroid Build Coastguard Worker #else 36*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_AVAILABLE 0 37*35ffd701SAndroid Build Coastguard Worker // Print out messages if GmmLog was disabled due to compiler issues 38*35ffd701SAndroid Build Coastguard Worker #define STRING2(x) #x 39*35ffd701SAndroid Build Coastguard Worker #define STRING(x) STRING2(x) 40*35ffd701SAndroid Build Coastguard Worker 41*35ffd701SAndroid Build Coastguard Worker #if (defined __GNUC__) 42*35ffd701SAndroid Build Coastguard Worker #pragma message "Detected g++ " STRING(__GNUC__) "." STRING(__GNUC_MINOR__) ". Minimum compiler version required for GmmLog is GCC 4.8.1. Disabling GmmLog." 43*35ffd701SAndroid Build Coastguard Worker #elif (defined __clang__) 44*35ffd701SAndroid Build Coastguard Worker #pragma message "Detected clang " STRING(__clang_major__) "." STRING(__clang_minor__) ". Minimum compiler version required for GmmLog is clang 3.5. Disabling GmmLog." 45*35ffd701SAndroid Build Coastguard Worker #elif (defined _MSC_VER) 46*35ffd701SAndroid Build Coastguard Worker #pragma message("Detected MSVC++ version " STRING(_MSC_VER) ". Minimum compiler version required for GmmLog is MSVC++ 1800. Disabling GmmLog") 47*35ffd701SAndroid Build Coastguard Worker #else 48*35ffd701SAndroid Build Coastguard Worker #pragma message "Unknown compiler. Disabling GmmLog." 49*35ffd701SAndroid Build Coastguard Worker #endif 50*35ffd701SAndroid Build Coastguard Worker 51*35ffd701SAndroid Build Coastguard Worker #undef STRING2 52*35ffd701SAndroid Build Coastguard Worker #undef STRING 53*35ffd701SAndroid Build Coastguard Worker #endif 54*35ffd701SAndroid Build Coastguard Worker #elif (_DEBUG || _RELEASE_INTERNAL) && __GMM_KMD__ && _WIN32 55*35ffd701SAndroid Build Coastguard Worker #define GMM_KMD_LOG_AVAILABLE 1 56*35ffd701SAndroid Build Coastguard Worker 57*35ffd701SAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////////// 58*35ffd701SAndroid Build Coastguard Worker /// GMM_KMD_LOG 59*35ffd701SAndroid Build Coastguard Worker /// Gmm logging macro to log a message in KMD mode. Exmaple: 60*35ffd701SAndroid Build Coastguard Worker /// GMM_KMD_LOG("Math Addition: %d + %d = %d \r\n", 1, 1, 2); 61*35ffd701SAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////////// 62*35ffd701SAndroid Build Coastguard Worker #define GMM_KMD_LOG(message, ...) \ 63*35ffd701SAndroid Build Coastguard Worker { \ 64*35ffd701SAndroid Build Coastguard Worker DWORD CurrentProcessId = (DWORD) (ULONG_PTR)PsGetCurrentProcessId(); \ 65*35ffd701SAndroid Build Coastguard Worker const WCHAR *format = L"%s%d.txt"; \ 66*35ffd701SAndroid Build Coastguard Worker WCHAR FileName[] = L"C:\\Intel\\IGfx\\GmmKmd_Proc_"; \ 67*35ffd701SAndroid Build Coastguard Worker WCHAR FullFileName[KM_FILENAME_LENGTH]; \ 68*35ffd701SAndroid Build Coastguard Worker \ 69*35ffd701SAndroid Build Coastguard Worker KmGenerateLogFileName(&FullFileName[0], format, FileName, CurrentProcessId); \ 70*35ffd701SAndroid Build Coastguard Worker \ 71*35ffd701SAndroid Build Coastguard Worker KM_FILE_IO_OBJ *pGmmKmdLog = KmFileOpen(pHwDevExt, FullFileName, false, false, true); \ 72*35ffd701SAndroid Build Coastguard Worker if (pGmmKmdLog != NULL) \ 73*35ffd701SAndroid Build Coastguard Worker { \ 74*35ffd701SAndroid Build Coastguard Worker KmFilePrintf(pGmmKmdLog, message, __VA_ARGS__); \ 75*35ffd701SAndroid Build Coastguard Worker KmFileClose(pGmmKmdLog, false); \ 76*35ffd701SAndroid Build Coastguard Worker } \ 77*35ffd701SAndroid Build Coastguard Worker } \ 78*35ffd701SAndroid Build Coastguard Worker 79*35ffd701SAndroid Build Coastguard Worker #else // else if Release driver || KMD 80*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_AVAILABLE 0 81*35ffd701SAndroid Build Coastguard Worker #endif 82*35ffd701SAndroid Build Coastguard Worker 83*35ffd701SAndroid Build Coastguard Worker #if GMM_LOG_AVAILABLE 84*35ffd701SAndroid Build Coastguard Worker 85*35ffd701SAndroid Build Coastguard Worker typedef enum GmmLogLevel 86*35ffd701SAndroid Build Coastguard Worker { 87*35ffd701SAndroid Build Coastguard Worker Off = 0, 88*35ffd701SAndroid Build Coastguard Worker Trace, 89*35ffd701SAndroid Build Coastguard Worker Info, 90*35ffd701SAndroid Build Coastguard Worker Error, // default 91*35ffd701SAndroid Build Coastguard Worker Critical, 92*35ffd701SAndroid Build Coastguard Worker }GmmLogLevel; 93*35ffd701SAndroid Build Coastguard Worker 94*35ffd701SAndroid Build Coastguard Worker #ifdef __cplusplus 95*35ffd701SAndroid Build Coastguard Worker 96*35ffd701SAndroid Build Coastguard Worker #include <iostream> 97*35ffd701SAndroid Build Coastguard Worker 98*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_FILE_SIZE 1024 * 1024 * 5 // Once log reaches this size, it will start in new file 99*35ffd701SAndroid Build Coastguard Worker #define GMM_ROTATE_FILE_NUMBER 3 // Once log is full, it'll save old log with .1/.2/.3 in name, and then start with .1 100*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_MASSAGE_MAX_SIZE 1024 101*35ffd701SAndroid Build Coastguard Worker #define GMM_LOGGER_NAME "gmm_logger" 102*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_FILENAME "gmm_log" 103*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_TAG "GmmLib" 104*35ffd701SAndroid Build Coastguard Worker #define GMM_UNKNOWN_PROCESS "Unknown_Proc" 105*35ffd701SAndroid Build Coastguard Worker #define GMM_PREFIX_STR "INTC GMM SPD: " 106*35ffd701SAndroid Build Coastguard Worker 107*35ffd701SAndroid Build Coastguard Worker #if _WIN32 108*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_REG_KEY_SUB_PATH "SOFTWARE\\Intel\\IGFX\\GMMLOG\\" 109*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_TO_FILE "LogToFile" 110*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_LEVEL_REGKEY "LogLevel" // GmmLogLevel 111*35ffd701SAndroid Build Coastguard Worker #endif //#if _WIN32 112*35ffd701SAndroid Build Coastguard Worker 113*35ffd701SAndroid Build Coastguard Worker extern "C" void GmmLibLogging(GmmLogLevel Level, const char* str, ...); 114*35ffd701SAndroid Build Coastguard Worker 115*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_TRACE(message, ...) GmmLibLogging(Trace, message, ##__VA_ARGS__) 116*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_TRACE_IF(expression, message, ...) if(expression) { GmmLibLogging(Trace, message, ##__VA_ARGS__);} 117*35ffd701SAndroid Build Coastguard Worker 118*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_INFO(message, ...) GmmLibLogging(Info, message, ##__VA_ARGS__) 119*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_INFO_IF(expression, message, ...) if(expression) { GmmLibLogging(Info, message, ##__VA_ARGS__);} 120*35ffd701SAndroid Build Coastguard Worker 121*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_ERROR(message, ...) GmmLibLogging(Error, message, ##__VA_ARGS__) 122*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_ERROR_IF(expression, message, ...) if(expression) { GmmLibLogging(Error, message, ##__VA_ARGS__);} 123*35ffd701SAndroid Build Coastguard Worker 124*35ffd701SAndroid Build Coastguard Worker #else // else C 125*35ffd701SAndroid Build Coastguard Worker 126*35ffd701SAndroid Build Coastguard Worker // Fwd Declarations of C-wrapper functions used for Logging 127*35ffd701SAndroid Build Coastguard Worker void GmmLibLogging(GmmLogLevel Level, const char* str, ...); 128*35ffd701SAndroid Build Coastguard Worker 129*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_TRACE(message, ...) GmmLibLogging(Trace, message, ##__VA_ARGS__) 130*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_TRACE_IF(expression, message, ...) if(expression) { GmmLibLogging(Trace, message, ##__VA_ARGS__);} 131*35ffd701SAndroid Build Coastguard Worker 132*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_INFO(message, ...) GmmLibLogging(Info, message, ##__VA_ARGS__) 133*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_INFO_IF(expression, message, ...) if(expression) { GmmLibLogging(Info, message, ##__VA_ARGS__);} 134*35ffd701SAndroid Build Coastguard Worker 135*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_ERROR(message, ...) GmmLibLogging(Error, message, ##__VA_ARGS__) 136*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_ERROR_IF(expression, message, ...) if(expression) { GmmLibLogging(Error, message, ##__VA_ARGS__);} 137*35ffd701SAndroid Build Coastguard Worker 138*35ffd701SAndroid Build Coastguard Worker #endif //#ifdef __cplusplus 139*35ffd701SAndroid Build Coastguard Worker 140*35ffd701SAndroid Build Coastguard Worker #else // else Gmm Log not available 141*35ffd701SAndroid Build Coastguard Worker 142*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_TRACE(message, ...) 143*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_TRACE_IF(expression, message, ...) 144*35ffd701SAndroid Build Coastguard Worker 145*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_INFO(message, ...) 146*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_INFO_IF(expression, message, ...) 147*35ffd701SAndroid Build Coastguard Worker 148*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_ERROR(message, ...) 149*35ffd701SAndroid Build Coastguard Worker #define GMM_LOG_ERROR_IF(expression, message, ...) 150*35ffd701SAndroid Build Coastguard Worker 151*35ffd701SAndroid Build Coastguard Worker #endif //#if _WIN32 152*35ffd701SAndroid Build Coastguard Worker 153*35ffd701SAndroid Build Coastguard Worker #if GMM_KMD_LOG_AVAILABLE 154*35ffd701SAndroid Build Coastguard Worker #else 155*35ffd701SAndroid Build Coastguard Worker 156*35ffd701SAndroid Build Coastguard Worker #define GMM_KMD_LOG(message, ...) 157*35ffd701SAndroid Build Coastguard Worker 158*35ffd701SAndroid Build Coastguard Worker #endif 159