From 541735d932d9190ea44c4ad4b338bc2a27d4f622 Mon Sep 17 00:00:00 2001 From: Maciej Dziuban Date: Tue, 8 May 2018 13:51:31 +0200 Subject: [PATCH] L3 programming refactor 3/n - Add L3UltHelper to be able to tell if L3 config is programmable - Run L3 config kernel tests according to its output Change-Id: I55b76e2da325d28f62b0bde20250b68f02154ae2 --- .../enqueue_copy_buffer_rect_tests.cpp | 36 ++----------------- .../enqueue_copy_buffer_tests.cpp | 18 +--------- .../enqueue_copy_buffer_to_image_tests.cpp | 18 +--------- .../enqueue_copy_image_tests.cpp | 18 +--------- .../enqueue_copy_image_to_buffer_tests.cpp | 18 +--------- .../enqueue_fill_buffer_tests.cpp | 18 +--------- .../enqueue_fill_image_tests.cpp | 18 +--------- .../command_queue/enqueue_kernel_tests.cpp | 20 ++--------- .../enqueue_read_buffer_rect_tests.cpp | 18 +--------- .../enqueue_read_buffer_tests.cpp | 18 +--------- .../enqueue_read_image_tests.cpp | 18 +--------- .../enqueue_write_buffer_rect_tests.cpp | 18 +--------- .../enqueue_write_buffer_tests.cpp | 18 +--------- .../enqueue_write_image_tests.cpp | 18 +--------- .../gen_commands_common_validation.h | 26 ++++++++++++++ unit_tests/helpers/CMakeLists.txt | 2 ++ unit_tests/helpers/l3_helper.h | 31 ++++++++++++++++ unit_tests/helpers/l3_helper.inl | 31 ++++++++++++++++ 18 files changed, 106 insertions(+), 256 deletions(-) create mode 100644 unit_tests/helpers/l3_helper.h create mode 100644 unit_tests/helpers/l3_helper.inl diff --git a/unit_tests/command_queue/enqueue_copy_buffer_rect_tests.cpp b/unit_tests/command_queue/enqueue_copy_buffer_rect_tests.cpp index f873c51588..843914a47e 100644 --- a/unit_tests/command_queue/enqueue_copy_buffer_rect_tests.cpp +++ b/unit_tests/command_queue/enqueue_copy_buffer_rect_tests.cpp @@ -199,24 +199,8 @@ HWTEST_F(EnqueueCopyBufferRectTest, 2D_addsIndirectData) { } HWTEST_F(EnqueueCopyBufferRectTest, 2D_LoadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - enqueueCopyBufferRect2D(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueCopyBufferRectTest, When2DEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { @@ -348,24 +332,8 @@ HWTEST_F(EnqueueCopyBufferRectTest, 3D_addsIndirectData) { } HWTEST_F(EnqueueCopyBufferRectTest, 3D_LoadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - enqueueCopyBufferRect3D(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueCopyBufferRectTest, When3DEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_copy_buffer_tests.cpp b/unit_tests/command_queue/enqueue_copy_buffer_tests.cpp index 31aa4e6393..bc03bd8883 100644 --- a/unit_tests/command_queue/enqueue_copy_buffer_tests.cpp +++ b/unit_tests/command_queue/enqueue_copy_buffer_tests.cpp @@ -167,24 +167,8 @@ HWTEST_F(EnqueueCopyBufferTest, addsIndirectData) { } HWTEST_F(EnqueueCopyBufferTest, LoadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - enqueueCopyBuffer(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueCopyBufferTest, WhenEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_copy_buffer_to_image_tests.cpp b/unit_tests/command_queue/enqueue_copy_buffer_to_image_tests.cpp index 17719ba8ee..b4936be652 100644 --- a/unit_tests/command_queue/enqueue_copy_buffer_to_image_tests.cpp +++ b/unit_tests/command_queue/enqueue_copy_buffer_to_image_tests.cpp @@ -98,24 +98,8 @@ HWTEST_F(EnqueueCopyBufferToImageTest, addsIndirectData) { } HWTEST_F(EnqueueCopyBufferToImageTest, loadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - enqueueCopyBufferToImage(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueCopyBufferToImageTest, WhenEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_copy_image_tests.cpp b/unit_tests/command_queue/enqueue_copy_image_tests.cpp index bd35e2c773..3e22dc44b1 100644 --- a/unit_tests/command_queue/enqueue_copy_image_tests.cpp +++ b/unit_tests/command_queue/enqueue_copy_image_tests.cpp @@ -101,24 +101,8 @@ HWTEST_F(EnqueueCopyImageTest, addsIndirectData) { } HWTEST_F(EnqueueCopyImageTest, loadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - enqueueCopyImage(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueCopyImageTest, WhenEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_copy_image_to_buffer_tests.cpp b/unit_tests/command_queue/enqueue_copy_image_to_buffer_tests.cpp index 9ac6c0e47b..e0d974ca05 100644 --- a/unit_tests/command_queue/enqueue_copy_image_to_buffer_tests.cpp +++ b/unit_tests/command_queue/enqueue_copy_image_to_buffer_tests.cpp @@ -99,24 +99,8 @@ HWTEST_F(EnqueueCopyImageToBufferTest, addsIndirectData) { } HWTEST_F(EnqueueCopyImageToBufferTest, loadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - enqueueCopyImageToBuffer(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueCopyImageToBufferTest, WhenEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_fill_buffer_tests.cpp b/unit_tests/command_queue/enqueue_fill_buffer_tests.cpp index a03e3b95c4..4369f34746 100644 --- a/unit_tests/command_queue/enqueue_fill_buffer_tests.cpp +++ b/unit_tests/command_queue/enqueue_fill_buffer_tests.cpp @@ -218,24 +218,8 @@ HWTEST_F(EnqueueFillBufferCmdTests, FillBufferLeftLeftover) { } HWTEST_F(EnqueueFillBufferCmdTests, LoadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::PARSE PARSE; - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; enqueueFillBuffer(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueFillBufferCmdTests, WhenEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_fill_image_tests.cpp b/unit_tests/command_queue/enqueue_fill_image_tests.cpp index aca9169882..1be599c2e2 100644 --- a/unit_tests/command_queue/enqueue_fill_image_tests.cpp +++ b/unit_tests/command_queue/enqueue_fill_image_tests.cpp @@ -108,24 +108,8 @@ HWTEST_F(EnqueueFillImageTest, addsIndirectData) { } HWTEST_F(EnqueueFillImageTest, loadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - enqueueFillImage(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueFillImageTest, WhenEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_kernel_tests.cpp b/unit_tests/command_queue/enqueue_kernel_tests.cpp index 232502fa97..707234e7f5 100644 --- a/unit_tests/command_queue/enqueue_kernel_tests.cpp +++ b/unit_tests/command_queue/enqueue_kernel_tests.cpp @@ -275,8 +275,8 @@ struct EnqueueKernelTypeTest : public HelloWorldFixture { typedef HelloWorldFixture ParentClass; - using ParentClass::pCS; using ParentClass::pCmdBuffer; + using ParentClass::pCS; EnqueueKernelTypeTest() { } @@ -424,24 +424,8 @@ HWTEST_P(EnqueueWorkItemTests, addsIndirectData) { } HWTEST_P(EnqueueWorkItemTests, LoadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::PARSE PARSE; - typedef typename PARSE::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; enqueueKernel(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_P(EnqueueWorkItemTests, WhenEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_read_buffer_rect_tests.cpp b/unit_tests/command_queue/enqueue_read_buffer_rect_tests.cpp index ac7b1ea99a..a729b51580 100644 --- a/unit_tests/command_queue/enqueue_read_buffer_rect_tests.cpp +++ b/unit_tests/command_queue/enqueue_read_buffer_rect_tests.cpp @@ -211,24 +211,8 @@ HWTEST_F(EnqueueReadBufferRectTest, 2D_addsIndirectData) { } HWTEST_F(EnqueueReadBufferRectTest, 2D_LoadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - enqueueReadBufferRect2D(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueReadBufferRectTest, When2DEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_read_buffer_tests.cpp b/unit_tests/command_queue/enqueue_read_buffer_tests.cpp index 0f32bf5ba7..490785866e 100644 --- a/unit_tests/command_queue/enqueue_read_buffer_tests.cpp +++ b/unit_tests/command_queue/enqueue_read_buffer_tests.cpp @@ -174,25 +174,9 @@ HWTEST_F(EnqueueReadBufferTypeTest, addsIndirectData) { } HWTEST_F(EnqueueReadBufferTypeTest, LoadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - srcBuffer->forceDisallowCPUCopy = true; enqueueReadBuffer(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueReadBufferTypeTest, WhenEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_read_image_tests.cpp b/unit_tests/command_queue/enqueue_read_image_tests.cpp index f383dcb940..0f20c681d2 100644 --- a/unit_tests/command_queue/enqueue_read_image_tests.cpp +++ b/unit_tests/command_queue/enqueue_read_image_tests.cpp @@ -109,24 +109,8 @@ HWTEST_F(EnqueueReadImageTest, addsIndirectData) { } HWTEST_F(EnqueueReadImageTest, loadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - enqueueReadImage(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueReadImageTest, WhenEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_write_buffer_rect_tests.cpp b/unit_tests/command_queue/enqueue_write_buffer_rect_tests.cpp index 0e802f2d40..046bbe5df8 100644 --- a/unit_tests/command_queue/enqueue_write_buffer_rect_tests.cpp +++ b/unit_tests/command_queue/enqueue_write_buffer_rect_tests.cpp @@ -185,24 +185,8 @@ HWTEST_F(EnqueueWriteBufferRectTest, 2D_addsIndirectData) { } HWTEST_F(EnqueueWriteBufferRectTest, 2D_LoadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - enqueueWriteBufferRect2D(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueWriteBufferRectTest, When2DEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_write_buffer_tests.cpp b/unit_tests/command_queue/enqueue_write_buffer_tests.cpp index c248658493..340043fb42 100644 --- a/unit_tests/command_queue/enqueue_write_buffer_tests.cpp +++ b/unit_tests/command_queue/enqueue_write_buffer_tests.cpp @@ -169,25 +169,9 @@ HWTEST_F(EnqueueWriteBufferTypeTest, addsIndirectData) { } HWTEST_F(EnqueueWriteBufferTypeTest, LoadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - srcBuffer->forceDisallowCPUCopy = true; enqueueWriteBuffer(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueWriteBufferTypeTest, WhenEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/command_queue/enqueue_write_image_tests.cpp b/unit_tests/command_queue/enqueue_write_image_tests.cpp index 1d1ea4d26d..8df3bc2811 100644 --- a/unit_tests/command_queue/enqueue_write_image_tests.cpp +++ b/unit_tests/command_queue/enqueue_write_image_tests.cpp @@ -110,24 +110,8 @@ HWTEST_F(EnqueueWriteImageTest, addsIndirectData) { } HWTEST_F(EnqueueWriteImageTest, loadRegisterImmediateL3CNTLREG) { - typedef typename FamilyType::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; - enqueueWriteImage(); - - // All state should be programmed before walker - auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); - ASSERT_NE(itorWalker, itorCmd); - - auto *cmd = genCmdCast(*itorCmd); - ASSERT_NE(nullptr, cmd); - - auto RegisterOffset = L3CNTLRegisterOffset::registerOffset; - EXPECT_EQ(RegisterOffset, cmd->getRegisterOffset()); - auto l3Cntlreg = cmd->getDataDword(); - auto numURBWays = (l3Cntlreg >> 1) & 0x7f; - auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; - EXPECT_NE(0u, numURBWays); - EXPECT_NE(0u, L3ClientPool); + validateL3Programming(cmdList, itorWalker); } HWTEST_F(EnqueueWriteImageTest, WhenEnqueueIsDoneThenStateBaseAddressIsProperlyProgrammed) { diff --git a/unit_tests/gen_common/gen_commands_common_validation.h b/unit_tests/gen_common/gen_commands_common_validation.h index 04c407a86a..09f535cdc1 100644 --- a/unit_tests/gen_common/gen_commands_common_validation.h +++ b/unit_tests/gen_common/gen_commands_common_validation.h @@ -27,6 +27,7 @@ #include "runtime/indirect_heap/indirect_heap.h" #include "unit_tests/gen_common/gen_cmd_parse.h" #include "unit_tests/gen_common/gen_commands_common_validation.h" +#include "unit_tests/helpers/l3_helper.inl" #include "test.h" namespace OCLRT { @@ -73,4 +74,29 @@ void validateStateBaseAddress(uint64_t internalHeapBase, IndirectHeap *pDSH, // Generically validate this command FamilyType::PARSE::template validateCommand(cmdList.begin(), itorCmd); } + +template +void validateL3Programming(GenCmdList &cmdList, GenCmdList::iterator &itorWalker) { + typedef typename FamilyType::PARSE PARSE; + typedef typename PARSE::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; + + auto itorCmd = findMmio(cmdList.begin(), itorWalker, L3CNTLRegisterOffset::registerOffset); + if (L3Helper::isL3ConfigProgrammable()) { + // All state should be programmed before walker + ASSERT_NE(itorWalker, itorCmd); + + auto *cmd = genCmdCast(*itorCmd); + ASSERT_NE(nullptr, cmd); + + auto registerOffset = L3CNTLRegisterOffset::registerOffset; + EXPECT_EQ(registerOffset, cmd->getRegisterOffset()); + auto l3Cntlreg = cmd->getDataDword(); + auto numURBWays = (l3Cntlreg >> 1) & 0x7f; + auto L3ClientPool = (l3Cntlreg >> 25) & 0x7f; + EXPECT_NE(0u, numURBWays); + EXPECT_NE(0u, L3ClientPool); + } else { + ASSERT_EQ(itorWalker, itorCmd); + } +} } // namespace OCLRT diff --git a/unit_tests/helpers/CMakeLists.txt b/unit_tests/helpers/CMakeLists.txt index dca977a6b2..8ecfb34569 100644 --- a/unit_tests/helpers/CMakeLists.txt +++ b/unit_tests/helpers/CMakeLists.txt @@ -41,6 +41,8 @@ set(IGDRCL_SRCS_tests_helpers ${CMAKE_CURRENT_SOURCE_DIR}/kernel_commands_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/kernel_filename_helper.h ${CMAKE_CURRENT_SOURCE_DIR}/kmd_notify_tests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/l3_helper.h + ${CMAKE_CURRENT_SOURCE_DIR}/l3_helper.inl ${CMAKE_CURRENT_SOURCE_DIR}/memory_management_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mipmap_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/per_thread_data_tests.cpp diff --git a/unit_tests/helpers/l3_helper.h b/unit_tests/helpers/l3_helper.h new file mode 100644 index 0000000000..7f725615ec --- /dev/null +++ b/unit_tests/helpers/l3_helper.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018, 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. + */ + +#pragma once + +namespace OCLRT { + +template +struct L3Helper { + static bool isL3ConfigProgrammable(); +}; +} // namespace OCLRT diff --git a/unit_tests/helpers/l3_helper.inl b/unit_tests/helpers/l3_helper.inl new file mode 100644 index 0000000000..153ceee51e --- /dev/null +++ b/unit_tests/helpers/l3_helper.inl @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018, 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. + */ + +#include "unit_tests/helpers/l3_helper.h" + +namespace OCLRT { + +template +bool L3Helper::isL3ConfigProgrammable() { + return true; +}; +} // namespace OCLRT