blob: 16f5953da93911df847590d2bddfdebbab22fa7a [file] [log] [blame]
/*
* Copyright (c) 2009-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_oca_interface.h
//! \brief Common interface and structure for OCA
//!
#ifndef __MOS_OCA_INTERFACE_H__
#define __MOS_OCA_INTERFACE_H__
typedef uint64_t MOS_OCA_BUFFER_HANDLE;
#define OCA_HEAP_INVALID_OFFSET ((uint32_t)-1)
typedef struct _MOS_OCA_LOG_HEADER
{
uint32_t m_Type; //!< Oca log type. Refer to MOS_OCA_LOG_TYPE.
uint32_t m_HeaderSize; //!< The size for extented message header.
uint32_t m_DataSize; //!< The size of data block without message header.
}MOS_OCA_LOG_HEADER, *PMOS_OCA_LOG_HEADER;
class MosOcaInterface
{
public:
//!
//! \brief Destructor
//!
virtual ~MosOcaInterface() {}
//!
//! \brief Get the idle oca buffer, which is neither used by hw nor locked, and lock it for edit.
//! \param [in] pMosContext
//! pointer to MOS_INTERFACE
//! \param [in] CurrentGpuContextHandle
//! Gpu context handle
//! \return MOS_OCA_BUFFER_HANDLE
//! return the handle for oca buffer
//!
virtual MOS_OCA_BUFFER_HANDLE LockOcaBufAvailable(PMOS_CONTEXT pMosContext, uint32_t CurrentGpuContextHandle)
{
return 0;
}
//!
//! \brief Unlock the oca buffer when edit complete.
//! \param [in] hOcaBuf
//! Oca buffer handle.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS UnlockOcaBuf(MOS_OCA_BUFFER_HANDLE hOcaBuf)
{
return MOS_STATUS_UNIMPLEMENTED;
}
//!
//! \brief Oca operation which should be called at the beginning of 1st level batch buffer start.
//! \param [out] gpuVaOcaBuffer
//! The gfx virtual address of oca buffer, which should be set to GPR11 by LRI at the
//! beginning of 1st level batch buffer no matter return value is MOS_STATUS_SUCCESS or not.
//! \param [in] hOcaBuf
//! Oca buffer handle.
//! \param [in] pMosContext
//! Pointer to MOS_CONTEXT.
//! \param [in] pMosResource
//! Pointer to the MOS_RESOURCE.
//! \param [in] offsetOf1stLevelBB
//! Offset for current BB in pMosResource.
//! \param [in] bUseSizeOfResource
//! If true, use size of pMosResource for batch buffer, else use sizeOf1stLevelBB.
//! \param [in] sizeOf1stLevelBB
//! Size of BB. Ignore if bUseSizeOfResource == true.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS On1stLevelBBStart(uint64_t &gpuVaOcaBuffer, MOS_OCA_BUFFER_HANDLE hOcaBuf, PMOS_CONTEXT pMosContext, void *pMosResource,
uint32_t offsetOf1stLevelBB, bool bUseSizeOfResource, uint32_t sizeOf1stLevelBB)
{
// The GPR11 need to be reset to 0 to disable UMD_OCA for current workload.
gpuVaOcaBuffer = 0;
return MOS_STATUS_UNIMPLEMENTED;
}
//!
//! \brief Oca operation which should be called before adding batch buffer end command for 1st
//! level batch buffer.
//! \param [in] hOcaBuf
//! Oca buffer handle.
//! \param [in] mosCtx
//! DDI device context.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS On1stLevelBBEnd(MOS_OCA_BUFFER_HANDLE hOcaBuf, PMOS_CONTEXT mosCtx)
{
return MOS_STATUS_UNIMPLEMENTED;
}
//!
//! \brief Oca operation which should be called before sending start sub level batch buffer command.
//! \param [in] hOcaBuf
//! Oca buffer handle.
//! \param [in] pMosContext
//! Pointer to MOS_CONTEXT.
//! \param [in] pMosResource
//! Pointer to the MOS_RESOURCE.
//! \param [in] offsetOfSubLevelBB
//! Offset for current BB in pMosResource.
//! \param [in] bUseSizeOfResource
//! If true, use size of pMosResource for batch buffer, else use sizeOfIndirectState.
//! \param [in] sizeOfSubLevelBB
//! Size of BB. Ignore if bUseSizeOfResource == true.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS OnSubLevelBBStart(MOS_OCA_BUFFER_HANDLE hOcaBuf, PMOS_CONTEXT pMosContext, void *pMosResource, uint32_t offsetOfSubLevelBB, bool bUseSizeOfResource, uint32_t sizeOfSubLevelBB)
{
return MOS_STATUS_UNIMPLEMENTED;
}
//!
//! \brief Oca operation which should be called when indirect states being added.
//! \param [in] hOcaBuf
//! Oca buffer handle.
//! \param [in] pMosContext
//! Pointer to MOS_CONTEXT.
//! \param [in] pMosResource
//! Pointer to the MOS_RESOURCE.
//! \param [in] offsetOfIndirectState
//! Offset for current state in pMosResource.
//! \param [in] bUseSizeOfResource
//! If true, use size of pMosResource for indirect state, else use sizeOfIndirectState.
//! \param [in] sizeOfIndirectState
//! Size of indirect state. Ignore if bUseSizeOfResource == true.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS OnIndirectState(MOS_OCA_BUFFER_HANDLE hOcaBuf, PMOS_CONTEXT pMosContext, void *pMosResource, uint32_t offsetOfIndirectState, bool bUseSizeOfResource, uint32_t sizeOfIndirectState)
{
return MOS_STATUS_UNIMPLEMENTED;
}
//!
//! \brief Oca operation which should be called before adding dispatch states,
//! e.g. VEB_DI_IECP_STATE and MEDIA_OBJECT_WALKER.
//! \param [out] offsetInIndirectStateHeap
//! The start offset of current dispatch in indirect state heap, which should be set to low 32 bits
//! of GPR12 by LRI before dispatch commands being added.
//! OCA_HEAP_INVALID_OFFSET means no need to configure GPR12, otherwise the register need be configured
//! no matter return value being MOS_STATUS_SUCCESS or not.
//! \param [in] hOcaBuf
//! Oca buffer handle.
//! \param [in] mosCtx
//! DDI device context.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS OnDispatch(uint32_t &offsetInIndirectStateHeap, MOS_OCA_BUFFER_HANDLE hOcaBuf, PMOS_CONTEXT mosCtx)
{
offsetInIndirectStateHeap = OCA_HEAP_INVALID_OFFSET;
return MOS_STATUS_UNIMPLEMENTED;
}
//!
//! \brief Add string to oca log section
//! \param [in] hOcaBuf
//! Oca buffer handle.
//! \param [in] mosCtx
//! DDI device context.
//! \param [in] str
//! string to be added.
//! \param [in] maxCount
//! size of the buffer pointed by str.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS TraceMessage(MOS_OCA_BUFFER_HANDLE hOcaBuf, PMOS_CONTEXT mosCtx, const char *str, uint32_t maxCount)
{
return MOS_STATUS_UNIMPLEMENTED;
}
//!
//! \brief Add resource to dump list.
//! \param [in] hOcaBuf
//! Oca buffer handle.
//! \param [in] mosCtx
//! DDI device context.
//! \param [in] resource
//! Reference to MOS_RESOURCE.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS AddResourceToDumpList(MOS_OCA_BUFFER_HANDLE hOcaBuf, PMOS_CONTEXT mosCtx, MOS_RESOURCE &resource)
{
return MOS_STATUS_UNIMPLEMENTED;
}
//!
//! \brief Add data block to oca log section.
//! \param [in] hOcaBuf
//! Oca buffer handle.
//! \param [in] mosCtx
//! DDI device context.
//! \param [in] pHeader
//! Log header. It can be extended by user. The acutal size of header is pHeader->m_HeaderSize.
//! \param [in] pData
//! Data block without log header. The acutal size of data block is pHeader->m_DataSize.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS DumpDataBlock(MOS_OCA_BUFFER_HANDLE hOcaBuf, PMOS_CONTEXT mosCtx, PMOS_OCA_LOG_HEADER pHeader, void *pData)
{
return MOS_STATUS_UNIMPLEMENTED;
}
//!
//! \brief Get the mutex for oca buffer handles protection.
//! \return PMOS_MUTEX
//! Return PMOS_MUTEX if successful, otherwise nullptr
//!
virtual PMOS_MUTEX GetMutex()
{
return nullptr;
}
};
#endif // #ifndef __MOS_OCA_INTERFACE_H__