/* * Copyright (C) 2018-2023 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/test/common/cmd_parse/gen_cmd_parse.h" // clang-format off using namespace NEO; using MI_ARB_CHECK = GenStruct::MI_ARB_CHECK; using MI_ATOMIC = GenStruct::MI_ATOMIC; using MI_BATCH_BUFFER_END = GenStruct::MI_BATCH_BUFFER_END; using MI_BATCH_BUFFER_START = GenStruct::MI_BATCH_BUFFER_START; using MI_LOAD_REGISTER_IMM = GenStruct::MI_LOAD_REGISTER_IMM; using MI_LOAD_REGISTER_MEM = GenStruct::MI_LOAD_REGISTER_MEM; using MI_STORE_REGISTER_MEM = GenStruct::MI_STORE_REGISTER_MEM; using MI_NOOP = GenStruct::MI_NOOP; using PIPE_CONTROL = GenStruct::PIPE_CONTROL; using PIPELINE_SELECT = GenStruct::PIPELINE_SELECT; using STATE_BASE_ADDRESS = GenStruct::STATE_BASE_ADDRESS; using MI_REPORT_PERF_COUNT = GenStruct::MI_REPORT_PERF_COUNT; using MI_MATH = GenStruct::MI_MATH; using MI_LOAD_REGISTER_REG = GenStruct::MI_LOAD_REGISTER_REG; using MI_SEMAPHORE_WAIT = GenStruct::MI_SEMAPHORE_WAIT; using MI_STORE_DATA_IMM = GenStruct::MI_STORE_DATA_IMM; using MI_FLUSH_DW = GenStruct::MI_FLUSH_DW; using MI_USER_INTERRUPT = GenGfxFamily::MI_USER_INTERRUPT; using XY_COPY_BLT = GenGfxFamily::XY_COPY_BLT; using XY_BLOCK_COPY_BLT = GenGfxFamily::XY_BLOCK_COPY_BLT; using XY_COLOR_BLT = GenGfxFamily::XY_COLOR_BLT; // clang-format on template <> STATE_BASE_ADDRESS *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return STATE_BASE_ADDRESS::COMMAND_TYPE_GFXPIPE == pCmd->TheStructure.Common.CommandType && STATE_BASE_ADDRESS::COMMAND_SUBTYPE_GFXPIPE_COMMON == pCmd->TheStructure.Common.CommandSubtype && STATE_BASE_ADDRESS::_3D_COMMAND_OPCODE_GFXPIPE_NONPIPELINED == pCmd->TheStructure.Common._3DCommandOpcode && STATE_BASE_ADDRESS::_3D_COMMAND_SUB_OPCODE_STATE_BASE_ADDRESS == pCmd->TheStructure.Common._3DCommandSubOpcode ? pCmd : nullptr; } template <> PIPE_CONTROL *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return PIPE_CONTROL::COMMAND_TYPE_GFXPIPE == pCmd->TheStructure.Common.CommandType && PIPE_CONTROL::COMMAND_SUBTYPE_GFXPIPE_3D == pCmd->TheStructure.Common.CommandSubtype && PIPE_CONTROL::_3D_COMMAND_OPCODE_PIPE_CONTROL == pCmd->TheStructure.Common._3DCommandOpcode && PIPE_CONTROL::_3D_COMMAND_SUB_OPCODE_PIPE_CONTROL == pCmd->TheStructure.Common._3DCommandSubOpcode ? pCmd : nullptr; } template <> PIPELINE_SELECT *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return PIPELINE_SELECT::COMMAND_TYPE_GFXPIPE == pCmd->TheStructure.Common.CommandType && PIPELINE_SELECT::COMMAND_SUBTYPE_GFXPIPE_SINGLE_DW == pCmd->TheStructure.Common.CommandSubtype && PIPELINE_SELECT::_3D_COMMAND_OPCODE_GFXPIPE_NONPIPELINED == pCmd->TheStructure.Common._3DCommandOpcode && PIPELINE_SELECT::_3D_COMMAND_SUB_OPCODE_PIPELINE_SELECT == pCmd->TheStructure.Common._3DCommandSubOpcode ? pCmd : nullptr; } template <> MI_LOAD_REGISTER_IMM *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_LOAD_REGISTER_IMM::COMMAND_TYPE_MI_COMMAND == pCmd->TheStructure.Common.CommandType && MI_LOAD_REGISTER_IMM::MI_COMMAND_OPCODE_MI_LOAD_REGISTER_IMM == pCmd->TheStructure.Common.MiCommandOpcode ? pCmd : nullptr; } template <> MI_NOOP *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_NOOP::COMMAND_TYPE_MI_COMMAND == pCmd->TheStructure.Common.CommandType && MI_NOOP::MI_COMMAND_OPCODE_MI_NOOP == pCmd->TheStructure.Common.MiCommandOpcode ? pCmd : nullptr; } template <> MI_ATOMIC *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_ATOMIC::COMMAND_TYPE_MI_COMMAND == pCmd->TheStructure.Common.CommandType && MI_ATOMIC::MI_COMMAND_OPCODE_MI_ATOMIC == pCmd->TheStructure.Common.MiCommandOpcode ? pCmd : nullptr; } template <> MI_BATCH_BUFFER_END *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_BATCH_BUFFER_END::COMMAND_TYPE_MI_COMMAND == pCmd->TheStructure.Common.CommandType && MI_BATCH_BUFFER_END::MI_COMMAND_OPCODE_MI_BATCH_BUFFER_END == pCmd->TheStructure.Common.MiCommandOpcode ? pCmd : nullptr; } template <> MI_BATCH_BUFFER_START *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_BATCH_BUFFER_START::COMMAND_TYPE_MI_COMMAND == pCmd->TheStructure.Common.CommandType && MI_BATCH_BUFFER_START::MI_COMMAND_OPCODE_MI_BATCH_BUFFER_START == pCmd->TheStructure.Common.MiCommandOpcode ? pCmd : nullptr; } template <> MI_LOAD_REGISTER_MEM *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_LOAD_REGISTER_MEM::COMMAND_TYPE_MI_COMMAND == pCmd->TheStructure.Common.CommandType && MI_LOAD_REGISTER_MEM::MI_COMMAND_OPCODE_MI_LOAD_REGISTER_MEM == pCmd->TheStructure.Common.MiCommandOpcode ? pCmd : nullptr; } template <> MI_STORE_REGISTER_MEM *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_STORE_REGISTER_MEM::COMMAND_TYPE_MI_COMMAND == pCmd->TheStructure.Common.CommandType && MI_STORE_REGISTER_MEM::MI_COMMAND_OPCODE_MI_STORE_REGISTER_MEM == pCmd->TheStructure.Common.MiCommandOpcode ? pCmd : nullptr; } template <> MI_REPORT_PERF_COUNT *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_REPORT_PERF_COUNT::COMMAND_TYPE_MI_COMMAND == pCmd->TheStructure.Common.CommandType && MI_REPORT_PERF_COUNT::MI_COMMAND_OPCODE_MI_REPORT_PERF_COUNT == pCmd->TheStructure.Common.MiCommandOpcode ? pCmd : nullptr; } template <> MI_MATH *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_MATH::COMMAND_TYPE_MI_COMMAND == pCmd->DW0.BitField.InstructionType && MI_MATH::MI_COMMAND_OPCODE_MI_MATH == pCmd->DW0.BitField.InstructionOpcode ? pCmd : nullptr; } template <> MI_LOAD_REGISTER_REG *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_LOAD_REGISTER_REG::COMMAND_TYPE_MI_COMMAND == pCmd->TheStructure.Common.CommandType && MI_LOAD_REGISTER_REG::MI_COMMAND_OPCODE_MI_LOAD_REGISTER_REG == pCmd->TheStructure.Common.MiCommandOpcode ? pCmd : nullptr; } template <> MI_SEMAPHORE_WAIT *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_SEMAPHORE_WAIT::COMMAND_TYPE_MI_COMMAND == pCmd->TheStructure.Common.CommandType && MI_SEMAPHORE_WAIT::MI_COMMAND_OPCODE_MI_SEMAPHORE_WAIT == pCmd->TheStructure.Common.MiCommandOpcode ? pCmd : nullptr; } template <> MI_STORE_DATA_IMM *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_STORE_DATA_IMM::COMMAND_TYPE_MI_COMMAND == pCmd->TheStructure.Common.CommandType && MI_STORE_DATA_IMM::MI_COMMAND_OPCODE_MI_STORE_DATA_IMM == pCmd->TheStructure.Common.MiCommandOpcode ? pCmd : nullptr; } template <> MI_FLUSH_DW *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return MI_FLUSH_DW::COMMAND_TYPE_MI_COMMAND == pCmd->TheStructure.Common.CommandType && MI_FLUSH_DW::MI_COMMAND_OPCODE_MI_FLUSH_DW == pCmd->TheStructure.Common.MiCommandOpcode ? pCmd : nullptr; } template <> XY_COPY_BLT *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return XY_COPY_BLT::INSTRUCTIONTARGET_OPCODE_OPCODE == pCmd->TheStructure.Common.InstructionTarget_Opcode && XY_COPY_BLT::CLIENT_2D_PROCESSOR == pCmd->TheStructure.Common.Client ? pCmd : nullptr; } template <> XY_COLOR_BLT *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return XY_COLOR_BLT::INSTRUCTIONTARGET_OPCODE_OPCODE == pCmd->TheStructure.Common.InstructionTarget_Opcode && XY_COLOR_BLT::CLIENT_2D_PROCESSOR == pCmd->TheStructure.Common.Client ? pCmd : nullptr; } template <> MI_USER_INTERRUPT *genCmdCast(void *buffer) { auto pCmd = reinterpret_cast(buffer); return 0 == pCmd->TheStructure.Common.CommandType && MI_USER_INTERRUPT::MI_COMMAND_OPCODE_MI_USER_INTERRUPT == pCmd->TheStructure.Common.MICommandOpcode ? pCmd : nullptr; } template size_t CmdParse::getCommandLength(void *cmd) { { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->TheStructure.Common.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->TheStructure.Common.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return SIZE32(*pCmd); } { auto pCmd = genCmdCast(cmd); if (pCmd) return sizeof(MI_ATOMIC) / sizeof(uint32_t); } { auto pCmd = genCmdCast(cmd); if (pCmd) return SIZE32(*pCmd); } { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->TheStructure.Common.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->TheStructure.Common.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->TheStructure.Common.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->TheStructure.Common.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return SIZE32(*pCmd); } { auto pCmd = genCmdCast(cmd); if (pCmd) return SIZE32(*pCmd); } { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->TheStructure.Common.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->DW0.BitField.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->TheStructure.Common.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->TheStructure.Common.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return SIZE32(*pCmd); } { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->TheStructure.Common.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->TheStructure.Common.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return pCmd->TheStructure.Common.DwordLength + 2; } { auto pCmd = genCmdCast(cmd); if (pCmd) return sizeof(MI_USER_INTERRUPT) / sizeof(uint32_t); } auto commandLengthHwSpecific = getCommandLengthHwSpecific(cmd); if (commandLengthHwSpecific != 0) { return commandLengthHwSpecific; } return getAdditionalCommandLength(cmd); } template const char *CmdParse::getCommandName(void *cmd) { #define RETURN_NAME_IF(CMD_NAME) \ if (nullptr != genCmdCast(cmd)) \ return #CMD_NAME; RETURN_NAME_IF(STATE_BASE_ADDRESS); RETURN_NAME_IF(PIPE_CONTROL); RETURN_NAME_IF(MI_ARB_CHECK); RETURN_NAME_IF(MI_ATOMIC); RETURN_NAME_IF(MI_BATCH_BUFFER_END); RETURN_NAME_IF(MI_BATCH_BUFFER_START); RETURN_NAME_IF(MI_LOAD_REGISTER_IMM); RETURN_NAME_IF(MI_LOAD_REGISTER_MEM); RETURN_NAME_IF(MI_STORE_REGISTER_MEM); RETURN_NAME_IF(MI_NOOP); RETURN_NAME_IF(PIPELINE_SELECT); RETURN_NAME_IF(MI_REPORT_PERF_COUNT); RETURN_NAME_IF(MI_MATH); RETURN_NAME_IF(MI_LOAD_REGISTER_REG); RETURN_NAME_IF(MI_SEMAPHORE_WAIT); RETURN_NAME_IF(MI_STORE_DATA_IMM); RETURN_NAME_IF(MI_FLUSH_DW); RETURN_NAME_IF(XY_COPY_BLT); RETURN_NAME_IF(XY_COLOR_BLT); RETURN_NAME_IF(MI_USER_INTERRUPT); #undef RETURN_NAME_IF auto commandNameHwSpecific = getCommandNameHwSpecific(cmd); if (strcmp(commandNameHwSpecific, "UNKNOWN") != 0) { return commandNameHwSpecific; } return getAdditionalCommandName(cmd); } template size_t CmdParse::getAdditionalCommandLength(void *cmd) { return 0; } template const char *CmdParse::getAdditionalCommandName(void *cmd) { return "UNKNOWN"; }