blob: d6bda2b8b557c2ee29c6244a119e5080647e4a04 [file] [log] [blame]
/*
* Copyright (c) 2019-2020, 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_context_specific_next.cpp
//! \brief Container for Linux/Android specific parameters shared across different GPU contexts of the same device instance
//!
#include "mos_os.h"
#include "mos_util_debug_next.h"
#include "mos_resource_defs.h"
#include <unistd.h>
#include <dlfcn.h>
#include "hwinfo_linux.h"
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <time.h>
#if MOS_MEDIASOLO_SUPPORTED
#include "mos_os_solo.h"
#endif // MOS_MEDIASOLO_SUPPORTED
#include "mos_solo_generic.h"
#include "mos_context_specific_next.h"
#include "mos_gpucontextmgr_next.h"
#include "mos_cmdbufmgr_next.h"
#include "media_user_settings_mgr.h"
#define BATCH_BUFFER_SIZE 0x80000
OsContextSpecificNext::OsContextSpecificNext()
{
MOS_OS_FUNCTION_ENTER;
}
OsContextSpecificNext::~OsContextSpecificNext()
{
MOS_OS_FUNCTION_ENTER;
}
MOS_STATUS OsContextSpecificNext::Init(DDI_DEVICE_CONTEXT ddiDriverContext)
{
uint32_t iDeviceId = 0;
MOS_STATUS eStatus;
uint32_t i = 0;
MOS_OS_FUNCTION_ENTER;
eStatus = MOS_STATUS_SUCCESS;
PMOS_CONTEXT osDriverContext = (PMOS_CONTEXT)ddiDriverContext;
if (GetOsContextValid() == false)
{
if( nullptr == osDriverContext ||
0 >= osDriverContext->fd )
{
MOS_OS_ASSERT(false);
return MOS_STATUS_INVALID_HANDLE;
}
m_fd = osDriverContext->fd;
m_bufmgr = mos_bufmgr_gem_init(m_fd, BATCH_BUFFER_SIZE);
if (nullptr == m_bufmgr)
{
MOS_OS_ASSERTMESSAGE("Not able to allocate buffer manager, fd=0x%d", m_fd);
return MOS_STATUS_INVALID_PARAMETER;
}
mos_bufmgr_gem_enable_reuse(m_bufmgr);
osDriverContext->bufmgr = m_bufmgr;
//Latency reducation:replace HWGetDeviceID to get device using ioctl from drm.
iDeviceId = mos_bufmgr_gem_get_devid(m_bufmgr);
m_isAtomSOC = IS_ATOMSOC(iDeviceId);
m_skuTable.reset();
m_waTable.reset();
MosUtilities::MosZeroMemory(&m_platformInfo, sizeof(m_platformInfo));
MosUtilities::MosZeroMemory(&m_gtSystemInfo, sizeof(m_gtSystemInfo));
eStatus = NullHW::Init(osDriverContext);
if (!NullHW::IsEnabled())
{
eStatus = HWInfo_GetGfxInfo(m_fd, m_bufmgr, &m_platformInfo, &m_skuTable, &m_waTable, &m_gtSystemInfo);
}
else
{
m_platformInfo = osDriverContext->platform;
m_skuTable = osDriverContext->SkuTable;
m_waTable = osDriverContext->WaTable;
m_gtSystemInfo = osDriverContext->gtSystemInfo;
iDeviceId = osDriverContext->iDeviceId;
}
if (eStatus != MOS_STATUS_SUCCESS)
{
MOS_OS_ASSERTMESSAGE("Fatal error - unsuccesfull Sku/Wa/GtSystemInfo initialization");
return eStatus;
}
if (MEDIA_IS_SKU(&m_skuTable, FtrEnableMediaKernels) == 0)
{
MEDIA_WR_WA(&m_waTable, WaHucStreamoutOnlyDisable, 0);
}
MediaUserSettingsMgr::MediaUserSettingsInit(m_platformInfo.eProductFamily);
MosUtilities::MosTraceSetupInfo(
(VA_MAJOR_VERSION << 16) | VA_MINOR_VERSION,
m_platformInfo.eProductFamily,
m_platformInfo.eRenderCoreFamily,
(m_platformInfo.usRevId << 16) | m_platformInfo.usDeviceID);
GMM_SKU_FEATURE_TABLE gmmSkuTable = {};
GMM_WA_TABLE gmmWaTable = {};
GMM_GT_SYSTEM_INFO gmmGtInfo = {};
eStatus = HWInfo_GetGmmInfo(m_fd, &gmmSkuTable, &gmmWaTable, &gmmGtInfo);
if (MOS_STATUS_SUCCESS != eStatus)
{
MOS_OS_ASSERTMESSAGE("Fatal error - unsuccesfull Gmm Sku/Wa/GtSystemInfo initialization");
return eStatus;
}
GmmExportEntries gmmFuncs = {};
GMM_STATUS gmmStatus = OpenGmm(&gmmFuncs);
if (gmmStatus != GMM_SUCCESS)
{
MOS_OS_ASSERTMESSAGE("Fatal error - gmm init failed.");
return MOS_STATUS_INVALID_PARAMETER;
}
// init GMM context
gmmStatus = gmmFuncs.pfnCreateSingletonContext(m_platformInfo,
&gmmSkuTable,
&gmmWaTable,
&gmmGtInfo);
if (gmmStatus != GMM_SUCCESS)
{
MOS_OS_ASSERTMESSAGE("Fatal error - gmm CreateSingletonContext failed.");
return MOS_STATUS_INVALID_PARAMETER;
}
m_gmmClientContext = gmmFuncs.pfnCreateClientContext((GMM_CLIENT)GMM_LIBVA_LINUX);
m_auxTableMgr = AuxTableMgr::CreateAuxTableMgr(m_bufmgr, &m_skuTable);
MOS_USER_FEATURE_VALUE_DATA UserFeatureData;
MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_SIM_ENABLE_ID,
&UserFeatureData,
osDriverContext);
#endif
osDriverContext->bSimIsActive = (int32_t)UserFeatureData.i32Data;
m_useSwSwizzling = osDriverContext->bSimIsActive || MEDIA_IS_SKU(&m_skuTable, FtrUseSwSwizzling);
m_tileYFlag = MEDIA_IS_SKU(&m_skuTable, FtrTileY);
m_use64BitRelocs = true;
if (!NullHW::IsEnabled())
{
osDriverContext->iDeviceId = iDeviceId;
osDriverContext->SkuTable = m_skuTable;
osDriverContext->WaTable = m_waTable;
osDriverContext->gtSystemInfo = m_gtSystemInfo;
osDriverContext->platform = m_platformInfo;
}
osDriverContext->pGmmClientContext = m_gmmClientContext;
osDriverContext->m_auxTableMgr = m_auxTableMgr;
osDriverContext->bUseSwSwizzling = m_useSwSwizzling;
osDriverContext->bTileYFlag = m_tileYFlag;
osDriverContext->bIsAtomSOC = m_isAtomSOC;
osDriverContext->m_osDeviceContext = this;
m_usesPatchList = true;
m_usesGfxAddress = false;
SetOsContextValid(true);
// Prepare the command buffer manager
m_cmdBufMgr = CmdBufMgrNext::GetObject();
MOS_OS_CHK_NULL_RETURN(m_cmdBufMgr);
MOS_OS_CHK_STATUS_RETURN(m_cmdBufMgr->Initialize(this, COMMAND_BUFFER_SIZE/2));
// Prepare the gpu Context manager
m_gpuContextMgr = GpuContextMgrNext::GetObject(&m_gtSystemInfo, this);
MOS_OS_CHK_NULL_RETURN(m_gpuContextMgr);
//It must be done with m_gpuContextMgr ready. Insides it will create gpu context.
#ifdef _MMC_SUPPORTED
m_mosDecompression = MOS_New(MosDecompression, osDriverContext);
MOS_OS_CHK_NULL_RETURN(m_mosDecompression);
osDriverContext->ppMediaMemDecompState = m_mosDecompression->GetMediaMemDecompState();
MOS_OS_CHK_NULL_RETURN(osDriverContext->ppMediaMemDecompState);
if (*osDriverContext->ppMediaMemDecompState == nullptr)
{
MOS_OS_NORMALMESSAGE("Decomp state creation failed");
}
#endif
m_mosMediaCopy = MOS_New(MosMediaCopy, osDriverContext);
MOS_OS_CHK_NULL_RETURN(m_mosMediaCopy);
osDriverContext->ppMediaCopyState = m_mosMediaCopy->GetMediaCopyState();
MOS_OS_CHK_NULL_RETURN(osDriverContext->ppMediaCopyState);
if (*osDriverContext->ppMediaCopyState == nullptr)
{
MOS_OS_ASSERTMESSAGE("Media Copy state creation failed");
}
}
return eStatus;
}
void OsContextSpecificNext::Destroy()
{
MOS_OS_FUNCTION_ENTER;
if (GetOsContextValid() == true)
{
if (m_auxTableMgr != nullptr)
{
MOS_Delete(m_auxTableMgr);
m_auxTableMgr = nullptr;
}
m_skuTable.reset();
m_waTable.reset();
mos_bufmgr_destroy(m_bufmgr);
GmmExportEntries GmmFuncs;
GMM_STATUS gmmStatus = OpenGmm(&GmmFuncs);
if (gmmStatus == GMM_SUCCESS)
{
GmmFuncs.pfnDeleteClientContext((GMM_CLIENT_CONTEXT *)m_gmmClientContext);
m_gmmClientContext = nullptr;
GmmFuncs.pfnDestroySingletonContext();
}
else
{
MOS_OS_ASSERTMESSAGE("gmm init failed.");
}
SetOsContextValid(false);
}
}