Skip to content

Commit

Permalink
[Encode] add huc status check for VP9 XeHpm
Browse files Browse the repository at this point in the history
add huc status check for VP9 XeHpm.
  • Loading branch information
bai-isaac authored and intel-mediadev committed Mar 8, 2024
1 parent f4397c2 commit c9bcdd2
Show file tree
Hide file tree
Showing 2 changed files with 143 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include "mhw_vdbox_vdenc_xe_hpm.h"
#include "mhw_mi_g12_X.h"
#include "mos_solo_generic.h"
#include "codechal_hw_g12_X.h"

MOS_STATUS CodechalVdencVp9StateXe_Xpm::SetTileCommands(
PMOS_COMMAND_BUFFER cmdBuffer)
Expand Down Expand Up @@ -614,9 +615,49 @@ MOS_STATUS CodechalVdencVp9StateXe_Xpm::AllocateResources()
&m_vdencCumulativeCuCountStreamoutSurface),
"Failed to allocate VDEnc Cumulative CU Count Streamout Surface");

// HUC STATUS 2 Buffer for HuC status check in COND_BB_END
allocParamsForSurface.dwBytes = sizeof(uint64_t);
allocParamsForSurface.pBufName = "Huc authentication status Buffer";
allocParamsForSurface.ResUsageType = MOS_HW_RESOURCE_USAGE_ENCODE_INTERNAL_READ_WRITE_NOCACHE;
eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource(
m_osInterface,
&allocParamsForSurface,
&m_hucAuthBuf);

if (eStatus != MOS_STATUS_SUCCESS)
{
CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate Huc authentication status Buffer.");
return eStatus;
}

for (auto j = 0; j < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; j++)
{
// second level batch buffer
m_2ndLevelBB[j] = {};
m_2ndLevelBB[j].bSecondLevel = true;
ENCODE_CHK_STATUS_RETURN(Mhw_AllocateBb(
m_hwInterface->GetOsInterface(),
&m_2ndLevelBB[j],
nullptr,
CODECHAL_CACHELINE_SIZE));
}

return eStatus;
}

CodechalVdencVp9StateXe_Xpm::~CodechalVdencVp9StateXe_Xpm()
{
CODECHAL_ENCODE_FUNCTION_ENTER;

m_osInterface->pfnFreeResource(m_osInterface, &m_hucAuthBuf);

for (auto j = 0; j < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; j++)
{
MOS_STATUS eStatus = Mhw_FreeBb(m_hwInterface->GetOsInterface(), &m_2ndLevelBB[j], nullptr);
ENCODE_ASSERT(eStatus == MOS_STATUS_SUCCESS);
}
}

MOS_STATUS CodechalVdencVp9StateXe_Xpm::Initialize(CodechalSetting * settings)
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalVdencVp9StateG12::Initialize(settings));
Expand Down Expand Up @@ -1164,3 +1205,95 @@ MOS_STATUS CodechalVdencVp9StateXe_Xpm::ConstructPicStateBatchBuf(

return eStatus;
}

MOS_STATUS CodechalVdencVp9StateXe_Xpm::PackHucAuthCmds(MOS_COMMAND_BUFFER &cmdBuffer)
{
CODECHAL_ENCODE_FUNCTION_ENTER;

// Write HuC Load Info Mask
MHW_MI_STORE_DATA_PARAMS storeDataParams{};
storeDataParams.pOsResource = &m_hucAuthBuf;
storeDataParams.dwResourceOffset = 0;
storeDataParams.dwValue = HUC_LOAD_INFO_REG_MASK_G12;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiStoreDataImmCmd(&cmdBuffer, &storeDataParams));

// Store Huc Auth register
MHW_MI_STORE_REGISTER_MEM_PARAMS storeRegParams{};
storeRegParams.presStoreBuffer = &m_hucAuthBuf;
storeRegParams.dwOffset = sizeof(uint32_t);
storeRegParams.dwRegister = m_hucInterface->GetMmioRegisters(MHW_VDBOX_NODE_1)->hucLoadInfoOffset;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiStoreRegisterMemCmd(&cmdBuffer, &storeRegParams));

MHW_MI_FLUSH_DW_PARAMS flushDwParams{};
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd(&cmdBuffer, &flushDwParams));

// Check Huc auth: if equals to 0 continue chained BB until reset, otherwise send BB end cmd.
uint32_t compareOperation = mhw_mi_g12_X::MI_CONDITIONAL_BATCH_BUFFER_END_CMD::COMPARE_OPERATION_MADEQUALIDD;
auto hwInterface = dynamic_cast<CodechalHwInterfaceG12 *>(m_hwInterface);
CODECHAL_ENCODE_CHK_STATUS_RETURN(hwInterface->SendCondBbEndCmd(
&m_hucAuthBuf, 0, 0, false, true, compareOperation, &cmdBuffer));

// Chained BB loop
auto miItf = static_cast<MhwMiInterfaceG12 *>(m_miInterface);
CODECHAL_ENCODE_CHK_NULL_RETURN(miItf);
CODECHAL_ENCODE_CHK_STATUS_RETURN(miItf->AddMiBatchBufferStartCmd(&cmdBuffer, m_batchBuf, true));

return MOS_STATUS_SUCCESS;
}

MOS_STATUS CodechalVdencVp9StateXe_Xpm::CheckHucLoadStatus()
{
CODECHAL_ENCODE_FUNCTION_ENTER;

MOS_COMMAND_BUFFER cmdBuffer{};
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));

// add media reset check 100ms, which equals to 1080p WDT threshold
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->SetWatchdogTimerThreshold(1920, 1080, true));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddWatchdogTimerStopCmd(&cmdBuffer));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddWatchdogTimerStartCmd(&cmdBuffer));

// program 2nd level chained BB for Huc auth
m_batchBuf = &m_2ndLevelBB[m_currRecycledBufIdx];
CODECHAL_ENCODE_CHK_NULL_RETURN(m_batchBuf);

MOS_LOCK_PARAMS lockFlags{};
lockFlags.WriteOnly = true;

uint8_t *data = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, &(m_batchBuf->OsResource), &lockFlags);
CODECHAL_ENCODE_CHK_NULL_RETURN(data);

MOS_COMMAND_BUFFER hucAuthCmdBuffer;
MOS_ZeroMemory(&hucAuthCmdBuffer, sizeof(hucAuthCmdBuffer));
hucAuthCmdBuffer.pCmdBase = (uint32_t *)data;
hucAuthCmdBuffer.pCmdPtr = hucAuthCmdBuffer.pCmdBase;
hucAuthCmdBuffer.iRemaining = m_batchBuf->iSize;
hucAuthCmdBuffer.OsResource = m_batchBuf->OsResource;
hucAuthCmdBuffer.cmdBuf1stLvl = &cmdBuffer;

//pak check huc status command
CODECHAL_ENCODE_CHK_STATUS_RETURN(PackHucAuthCmds(hucAuthCmdBuffer));

CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnUnlockResource(m_osInterface, &(m_batchBuf->OsResource)));

// BB start for 2nd level BB
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferStartCmd(&cmdBuffer, m_batchBuf));

m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);

return MOS_STATUS_SUCCESS;
}

MOS_STATUS CodechalVdencVp9StateXe_Xpm::HuCBrcInitReset()
{
CODECHAL_ENCODE_FUNCTION_ENTER;

if (MEDIA_IS_WA(m_waTable, WaCheckHucAuthenticationStatus))
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(CheckHucLoadStatus());
}

CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalVdencVp9StateG12::HuCBrcInitReset());

return MOS_STATUS_SUCCESS;
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,13 @@ class CodechalVdencVp9StateXe_Xpm : public CodechalVdencVp9StateG12
//!
//! \brief Destructor
//!
virtual ~CodechalVdencVp9StateXe_Xpm() {}
virtual ~CodechalVdencVp9StateXe_Xpm();

virtual MOS_STATUS SetTileCommands(
PMOS_COMMAND_BUFFER cmdBuffer) override; // override this function to add new cmd

MOS_STATUS SetSequenceStructs() override;
MOS_STATUS HuCBrcInitReset() override;

//!
//! \struct HucPakStitchDmemEncXehp
Expand Down Expand Up @@ -118,6 +119,14 @@ class CodechalVdencVp9StateXe_Xpm : public CodechalVdencVp9StateG12

MOS_STATUS ConstructPicStateBatchBuf(
PMOS_RESOURCE picStateBuffer) override;

MOS_STATUS CheckHucLoadStatus();
MOS_STATUS PackHucAuthCmds(MOS_COMMAND_BUFFER &cmdBuffer);

//Resources
MOS_RESOURCE m_hucAuthBuf = {}; //!< Huc authentication buffer
MHW_BATCH_BUFFER m_2ndLevelBB[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {}; //!< 2nd level batch buffer
PMHW_BATCH_BUFFER m_batchBuf = nullptr;
};

#endif // __CODECHAL_VDENC_VP9_XE_XPM_H__

0 comments on commit c9bcdd2

Please sign in to comment.