blob: 60f6f18e45b758b1f1f469215c6d8a6384811e54 [file] [log] [blame]
/*
* Copyright (c) 2019, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file mos_util_debug_next.h
//! \brief
//! \brief Common OS Debug and Print utilities across different platform
//! \details Provides assert and print to debug console functionality
//! All MOS debug and print utilities will only function in debug or
//! release internal drivers, in a release driver they will be NOPs.
//!
#ifndef __MOS_UTIL_DEBUG_NEXT_H__
#define __MOS_UTIL_DEBUG_NEXT_H__
#include "mos_defs.h"
#include "mos_util_debug_specific.h"
#include "mos_utilities.h"
class MosUtilDebug
{
public:
MosUtilDebug() = delete;
~MosUtilDebug() = delete;
#if MOS_MESSAGES_ENABLED
//!
//! \brief Initialize the MOS message params structure and HLT.
//! \details Initialize the MOS message params structure and HLT,
//! to be called during device creation
//! \param [in] mosCtx
//! os device ctx handle
//! \return void
//!
static void MosMessageInit(MOS_CONTEXT_HANDLE mosCtx);
//!
//! \brief Frees the MOS message buffer and MOS message parameters structure
//! \details Frees the MOS message buffer and MOS message parameters structure,
//! to be called during device destruction
//! \return void
//!
static void MosMessageClose();
//!
//! \brief Form a string that will prefix MOS's log file name
//! \details Form a string that will prefix MOS's log file name
//! The default log file location will be under
//! %ProgramData%\Intel\Logs or %DriverData%\Intel\Logs
//! depending on OS version
//! \param PCHAR fileNamePrefix
//! [out] Pointer to the string where the prefix is returned
//! \param [in] mosCtx
//! os device ctx handle
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
static MOS_STATUS MosLogFileNamePrefix(char *fileNamePrefix, MOS_CONTEXT_HANDLE mosCtx);
//!
//! \brief Enable or disable asserts of a particular component, it is used by ULT also
//! \details Enable or disable asserts of a particular component
//! \param MOS_COMPONENT_ID compID
//! [in] Indicates which component
//! \param int32_t bEnable
//! [in] Enable/disable flag
//! \return void
//!
static void MosCompAssertEnableDisable(MOS_COMPONENT_ID compID, int32_t bEnable);
#endif // MOS_MESSAGES_ENABLED
#if MOS_ASSERT_ENABLED
//!
//! \brief MOS assert function for MOS internal use
//! \details Halts the cpu in debug mode when expression resolves to zero
//! and only if assert enabled for both comp and sub-comp.
//! Nop in release version
//! Called by MOS_ASSERT macro only
//! \param MOS_COMPONENT_ID compID
//! [in] Indicates which component
//! \param uint8_t subCompID
//! [in] Indicates which sub-component
//! \return void
//!
static void MosAssert(
MOS_COMPONENT_ID compID,
uint8_t subCompID);
#endif // MOS_ASSERT_ENABLED
#if MOS_MESSAGES_ENABLED
//!
//! \brief Checks whether debug messages should be printed.
//! \details Determines by the print level, component and sub-component IDs
//! whether the debug message should be printed.
//! \param MOS_MESSAGE_LEVEL level
//! [in] Level of the message
//! \param MOS_COMPONENT_ID compID
//! [in] Indicates which component
//! \param uint8_t subCompID
//! [in] Indicates which sub-component
//! \param const char *message
//! [in] pointer to the message format string
//! \return int32_t
//!
static int32_t MosShouldPrintMessage(
MOS_MESSAGE_LEVEL level,
MOS_COMPONENT_ID compID,
uint8_t subCompID,
const char *const message);
#endif
private:
#if MOS_MESSAGES_ENABLED
//!
//! \brief Add preface information to the HLT log when initialized
//! \details Add preface information to the HLT log when initialized
//! Used internally by MOS_HLTInit().
//! \param PFILE pFile
//! [out] Pointer to the log file
//! \return void
//!
static void MosHltpPreface(
PFILE pFile);
/*----------------------------------------------------------------------------
| Name : MOS_HltpCopyFile
| Purpose : Copy all file content from the source file to the target file.
| Arguments : szFileName - source file name to copy from
| pFile - target file
| Returns : Returns one of the MOS_STATUS error codes if failed,
| else MOS_STATUS_SUCCESS
| Comments :
\---------------------------------------------------------------------------*/
static MOS_STATUS MosHltpCopyFile(PFILE pFile, const PCCHAR szFileName);
//!
//! \brief Set debug message level for a sub-component within a component
//! \details Set debug message level for a sub-component within a component
//! \param MOS_COMPONENT_ID compID
//! [in] Indicates which component
//! \param uint8_t subCompID
//! [in] Indicates which sub-component
//! \param MOS_MESSAGE_LEVEL msgLevel
//! [in] Message level that the sub component allows
//! \return void
//!
static void MosSetSubCompMessageLevel(MOS_COMPONENT_ID compID, uint8_t subCompID, MOS_MESSAGE_LEVEL msgLevel);
//!
//! \brief Set debug message level for a particular component
//! \details Set debug message level for a particular component
//! \param MOS_COMPONENT_ID compID
//! [in] Indicates which component
//! \param MOS_MESSAGE_LEVEL msgLevel
//! [in] Message level that the component allows
//! \return void
//!
static void MosSetCompMessageLevel(MOS_COMPONENT_ID compID, MOS_MESSAGE_LEVEL msgLevel);
//!
//! \brief Set debug message level for all components
//! \details Set all component to the same msg level
//! \param MOS_MESSAGE_LEVEL msgLevel
//! [in] Message level that all components allow
//! \return void
//!
static void MosSetCompMessageLevelAll(MOS_MESSAGE_LEVEL msgLevel);
//!
//! \brief Enable/disable asserts for a sub-component within a component
//! \details Enable/disable asserts for a sub-component within a component
//! \param MOS_COMPONENT_ID compID
//! [in] Indicates which component
//! \param uint8_t subCompID
//! [in] Indicates which sub-component
//! \param int32_t iFlag
//! [in] Enable/disable flag
//! \return void
//!
static void MosSubCompAssertEnableDisable(MOS_COMPONENT_ID compID, uint8_t subCompID, int32_t bEnable);
//!
//! \brief Set debug message level and asserts for a component and its sub-components.
//! \details Set debug message level and asserts for a component and its sub-components.
//! This includes registering all sub-components.
//! \param MOS_COMPONENT_ID compID
//! [in] Indicates which component
//! \param [in] mosCtx
//! os device ctx handle
//! \return void
//!
static void MosMessageInitComponent(MOS_COMPONENT_ID compID, MOS_CONTEXT_HANDLE mosCtx);
//!
//! \brief Initialize or refresh the Hybrid Log and Trace facility
//! \details Initialize or refresh the Hybrid Log and Trace facility
//! Called during MOS init
//! \param [in] mosCtx
//! os device ctx handle
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
static MOS_STATUS MosHLTInit(MOS_CONTEXT_HANDLE mosCtx);
//!
//! \brief Initialize or refresh the DDI Dump facility
//! \details Initialize or refresh the DDI Dump facility
//! Called during MOS init
//! \param [in] mosCtx
//! os device ctx handle
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
static MOS_STATUS MosDDIDumpInit(MOS_CONTEXT_HANDLE mosCtx);
//!
//! \brief Close file handles and frees resources
//! \details Close file handles and frees resources
//! Called during MOS close
//! \return void
//!
static void MosHLTClose();
// !
//! \brief Close file handles and frees resources
//! \details Close file handles and frees resources
//! Called during MOS close
//! \return void
//!
static void MosDDIDumpClose();
#endif // MOS_MESSAGES_ENABLED
#if MOS_ASSERT_ENABLED
//!
//! \brief Checks whether assert should be hit.
//! \details Determines by the component and sub-component IDs
//! whether an assert should be hit.
//! \param MOS_COMPONENT_ID compID
//! [in] Indicates which component
//! \param uint8_t subCompID
//! [in] Indicates which sub-component
//! \return int32_t
//!
static int32_t MosShouldAssert(MOS_COMPONENT_ID compID, uint8_t subCompID);
#endif
public:
#if MOS_MESSAGES_ENABLED
static const char * const *m_mosLogLevelName;
static const char * const *m_mosComponentName;
//Temporarily defined as the reference to compatible with the cases using uf key to enable/disable APG.
static MOS_MESSAGE_PARAMS m_mosMsgParams;
static MOS_MESSAGE_PARAMS m_mosMsgParamsDdiDump;
#endif
#if MOS_MESSAGES_ENABLED
static const char* const m_mosLogPathTemplate;
static const char* const m_DdiLogPathTemplate;
static const MOS_USER_FEATURE_VALUE_ID (* const m_pcComponentUserFeatureKeys)[3];
static const uint8_t* const m_subComponentCount;
static const PCCHAR m_mosUltLogPathPrefix;
static const PCCHAR m_mosLogPathPrefix;
#endif
};
#if MOS_MESSAGES_ENABLED
class FunctionTrace
{
public:
FunctionTrace(MOS_COMPONENT_ID compID, uint8_t subCompID, const char* name) :
m_compID(compID),
m_subCompID(subCompID),
m_name(name)
{
MOS_VERBOSEMESSAGE(m_compID, m_subCompID, "Enter Function: %s\r\n", m_name);
}
virtual ~FunctionTrace()
{
MOS_VERBOSEMESSAGE(m_compID, m_subCompID, "Exit Function: %s\r\n", m_name);
}
protected:
MOS_COMPONENT_ID m_compID = MOS_COMPONENT_COUNT;
uint8_t m_subCompID = 0;
const char *m_name = nullptr;
};
#define MOS_FUNCTION_TRACE(_compID, _subCompID) FunctionTrace trace(_compID, _subCompID, __FUNCTION__);
#else
#define MOS_FUNCTION_TRACE(_compID, _subCompID)
#endif // #if MOS_MESSAGES_ENABLED
#endif // __MOS_UTIL_DEBUG_NEXT_H__