From 8a2917dd2c0bd0ebce2c9c83446cd5edf70a3bbb Mon Sep 17 00:00:00 2001 From: "Dunajski, Bartosz" Date: Thu, 4 Apr 2019 10:32:08 +0200 Subject: [PATCH] Add parsing logic for MI_FLUSH_DW and XY_COPY_BLT Related-To: NEO-3020 Change-Id: Id665fb10ea2871f513932c5c82e3b833e715fec0 Signed-off-by: Dunajski, Bartosz --- runtime/gen10/hw_cmds_generated.h | 8 +++++ runtime/gen8/hw_cmds_generated.h | 8 +++++ runtime/gen9/hw_cmds_generated.h | 8 +++++ unit_tests/command_stream/cmd_parse_tests.cpp | 8 ++--- unit_tests/gen_common/cmd_parse_base.inl | 34 +++++++++++++++++++ 5 files changed, 62 insertions(+), 4 deletions(-) diff --git a/runtime/gen10/hw_cmds_generated.h b/runtime/gen10/hw_cmds_generated.h index 14b60684e4..f19cfd2418 100644 --- a/runtime/gen10/hw_cmds_generated.h +++ b/runtime/gen10/hw_cmds_generated.h @@ -4407,6 +4407,12 @@ typedef struct tagXY_SRC_COPY_BLT { CLIPPING_ENABLED_DISABLED = 0x0, CLIPPING_ENABLED_ENABLED = 0x1, } CLIPPING_ENABLED; + typedef enum tagINSTRUCTIONTARGET_OPCODE { + INSTRUCTIONTARGET_OPCODE_OPCODE = 0x53, + } INSTRUCTIONTARGET_OPCODE; + typedef enum tagDWORD_LENGTH { + DWORD_LENGTH_EXCLUDES_DWORD_0_1 = 0x8, + } DWORD_LENGTH; inline void init(void) { memset(&TheStructure, 0, sizeof(TheStructure)); TheStructure.Common.DestTilingEnable = DEST_TILING_ENABLE_TILING_DISABLED_LINEAR_BLIT; @@ -4414,6 +4420,8 @@ typedef struct tagXY_SRC_COPY_BLT { TheStructure.Common.Client = CLIENT_2D_PROCESSOR; TheStructure.Common.ColorDepth = COLOR_DEPTH_8_BIT_COLOR; TheStructure.Common.ClippingEnabled = CLIPPING_ENABLED_DISABLED; + TheStructure.Common.InstructionTarget_Opcode = INSTRUCTIONTARGET_OPCODE_OPCODE; + TheStructure.Common.DwordLength = DWORD_LENGTH_EXCLUDES_DWORD_0_1; } static tagXY_SRC_COPY_BLT sInit(void) { XY_SRC_COPY_BLT state; diff --git a/runtime/gen8/hw_cmds_generated.h b/runtime/gen8/hw_cmds_generated.h index 8a21722617..f8dc91eb4e 100644 --- a/runtime/gen8/hw_cmds_generated.h +++ b/runtime/gen8/hw_cmds_generated.h @@ -3954,6 +3954,12 @@ typedef struct tagXY_SRC_COPY_BLT { CLIPPING_ENABLED_DISABLED = 0x0, CLIPPING_ENABLED_ENABLED = 0x1, } CLIPPING_ENABLED; + typedef enum tagINSTRUCTIONTARGET_OPCODE { + INSTRUCTIONTARGET_OPCODE_OPCODE = 0x53, + } INSTRUCTIONTARGET_OPCODE; + typedef enum tagDWORD_LENGTH { + DWORD_LENGTH_EXCLUDES_DWORD_0_1 = 0x8, + } DWORD_LENGTH; inline void init(void) { memset(&TheStructure, 0, sizeof(TheStructure)); TheStructure.Common.DestTilingEnable = DEST_TILING_ENABLE_TILING_DISABLED_LINEAR_BLIT; @@ -3961,6 +3967,8 @@ typedef struct tagXY_SRC_COPY_BLT { TheStructure.Common.Client = CLIENT_2D_PROCESSOR; TheStructure.Common.ColorDepth = COLOR_DEPTH_8_BIT_COLOR; TheStructure.Common.ClippingEnabled = CLIPPING_ENABLED_DISABLED; + TheStructure.Common.InstructionTarget_Opcode = INSTRUCTIONTARGET_OPCODE_OPCODE; + TheStructure.Common.DwordLength = DWORD_LENGTH_EXCLUDES_DWORD_0_1; } static tagXY_SRC_COPY_BLT sInit(void) { XY_SRC_COPY_BLT state; diff --git a/runtime/gen9/hw_cmds_generated.h b/runtime/gen9/hw_cmds_generated.h index c8a6f12705..d02887a60e 100644 --- a/runtime/gen9/hw_cmds_generated.h +++ b/runtime/gen9/hw_cmds_generated.h @@ -4155,6 +4155,12 @@ typedef struct tagXY_SRC_COPY_BLT { CLIPPING_ENABLED_DISABLED = 0x0, CLIPPING_ENABLED_ENABLED = 0x1, } CLIPPING_ENABLED; + typedef enum tagINSTRUCTIONTARGET_OPCODE { + INSTRUCTIONTARGET_OPCODE_OPCODE = 0x53, + } INSTRUCTIONTARGET_OPCODE; + typedef enum tagDWORD_LENGTH { + DWORD_LENGTH_EXCLUDES_DWORD_0_1 = 0x8, + } DWORD_LENGTH; inline void init(void) { memset(&TheStructure, 0, sizeof(TheStructure)); TheStructure.Common.DestTilingEnable = DEST_TILING_ENABLE_TILING_DISABLED_LINEAR_BLIT; @@ -4162,6 +4168,8 @@ typedef struct tagXY_SRC_COPY_BLT { TheStructure.Common.Client = CLIENT_2D_PROCESSOR; TheStructure.Common.ColorDepth = COLOR_DEPTH_8_BIT_COLOR; TheStructure.Common.ClippingEnabled = CLIPPING_ENABLED_DISABLED; + TheStructure.Common.InstructionTarget_Opcode = INSTRUCTIONTARGET_OPCODE_OPCODE; + TheStructure.Common.DwordLength = DWORD_LENGTH_EXCLUDES_DWORD_0_1; } static tagXY_SRC_COPY_BLT sInit(void) { XY_SRC_COPY_BLT state; diff --git a/unit_tests/command_stream/cmd_parse_tests.cpp b/unit_tests/command_stream/cmd_parse_tests.cpp index 7d4e2507f9..d0b0b7d149 100644 --- a/unit_tests/command_stream/cmd_parse_tests.cpp +++ b/unit_tests/command_stream/cmd_parse_tests.cpp @@ -31,17 +31,17 @@ HWTEST_F(CommandParse, parseCommandBufferWithNULLBuffer) { HWTEST_F(CommandParse, parseCommandBufferWithGarbage) { typedef typename FamilyType::PARSE PARSE; - uint32_t buffer = 0xbaadf00d; + uint32_t buffer[30] = {0xbaadf00d}; GenCmdList cmds; - EXPECT_FALSE(PARSE::parseCommandBuffer(cmds, &buffer, sizeof(buffer))); + EXPECT_FALSE(PARSE::parseCommandBuffer(cmds, buffer, sizeof(uint32_t))); } HWTEST_F(CommandParse, getCommandLengthWithGarbage) { typedef typename FamilyType::PARSE PARSE; - uint32_t buffer = 0xbaadf00d; + uint32_t buffer[30] = {0xbaadf00d}; - EXPECT_EQ(0u, PARSE::getCommandLength(&buffer)); + EXPECT_EQ(0u, PARSE::getCommandLength(buffer)); } HWTEST_F(CommandParse, parseCommandBufferWithLength) { diff --git a/unit_tests/gen_common/cmd_parse_base.inl b/unit_tests/gen_common/cmd_parse_base.inl index 2085f40a2a..514d118e29 100644 --- a/unit_tests/gen_common/cmd_parse_base.inl +++ b/unit_tests/gen_common/cmd_parse_base.inl @@ -23,6 +23,8 @@ 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 XY_COPY_BLT = GenGfxFamily::XY_COPY_BLT; // clang-format on template <> @@ -181,6 +183,26 @@ MI_STORE_DATA_IMM *genCmdCast(void *buffer) { : 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 size_t CmdParse::getCommandLength(void *cmd) { { @@ -263,6 +285,16 @@ size_t CmdParse::getCommandLength(void *cmd) { if (pCmd) return pCmd->TheStructure.Common.DwordLength + 3; } + { + auto pCmd = genCmdCast(cmd); + if (pCmd) + return pCmd->TheStructure.Common.DwordLength + 2; + } + { + auto pCmd = genCmdCast(cmd); + if (pCmd) + return pCmd->TheStructure.Common.DwordLength + 2; + } return getCommandLengthHwSpecific(cmd); } @@ -288,6 +320,8 @@ const char *CmdParse::getCommandName(void *cmd) { 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); #undef RETURN_NAME_IF