diff --git a/level_zero/core/source/kernel/kernel.h b/level_zero/core/source/kernel/kernel.h index 68c71b90e5..bf99627e7f 100644 --- a/level_zero/core/source/kernel/kernel.h +++ b/level_zero/core/source/kernel/kernel.h @@ -106,6 +106,7 @@ struct Kernel : _ze_kernel_handle_t, virtual NEO::DispatchKernelEncoderI { ~Kernel() override = default; virtual ze_result_t destroy() = 0; + virtual ze_result_t getBaseAddress(uint64_t *baseAddress) = 0; virtual ze_result_t setIndirectAccess(ze_kernel_indirect_access_flags_t flags) = 0; virtual ze_result_t getIndirectAccess(ze_kernel_indirect_access_flags_t *flags) = 0; virtual ze_result_t getSourceAttributes(uint32_t *pSize, char **pString) = 0; diff --git a/level_zero/core/source/kernel/kernel_imp.cpp b/level_zero/core/source/kernel/kernel_imp.cpp index f7f43e1cb5..5960d6a78b 100644 --- a/level_zero/core/source/kernel/kernel_imp.cpp +++ b/level_zero/core/source/kernel/kernel_imp.cpp @@ -213,6 +213,13 @@ void KernelImmutableData::createRelocatedDebugData(NEO::GraphicsAllocation *glob } } +ze_result_t KernelImp::getBaseAddress(uint64_t *baseAddress) { + if (baseAddress) { + *baseAddress = NEO::GmmHelper::decanonize(this->kernelImmData->getKernelInfo()->kernelAllocation->getGpuAddress()); + } + return ZE_RESULT_SUCCESS; +} + uint32_t KernelImmutableData::getIsaSize() const { return static_cast(isaGraphicsAllocation->getUnderlyingBufferSize()); } diff --git a/level_zero/core/source/kernel/kernel_imp.h b/level_zero/core/source/kernel/kernel_imp.h index 7b92baea93..4db2eaac46 100644 --- a/level_zero/core/source/kernel/kernel_imp.h +++ b/level_zero/core/source/kernel/kernel_imp.h @@ -33,6 +33,7 @@ struct KernelImp : Kernel { return ZE_RESULT_SUCCESS; } + ze_result_t getBaseAddress(uint64_t *baseAddress) override; ze_result_t setIndirectAccess(ze_kernel_indirect_access_flags_t flags) override; ze_result_t getIndirectAccess(ze_kernel_indirect_access_flags_t *flags) override; ze_result_t getSourceAttributes(uint32_t *pSize, char **pString) override; diff --git a/level_zero/core/test/unit_tests/fixtures/module_fixture.h b/level_zero/core/test/unit_tests/fixtures/module_fixture.h index 146fff415a..182660c2c3 100644 --- a/level_zero/core/test/unit_tests/fixtures/module_fixture.h +++ b/level_zero/core/test/unit_tests/fixtures/module_fixture.h @@ -68,6 +68,8 @@ struct ModuleImmutableDataFixture : public DeviceFixture { 0, sizeof(uint32_t), MemoryPool::System4KBPages)); + + kernelInfo->kernelAllocation = isaGraphicsAllocation.get(); } void setDevice(L0::Device *inDevice) { diff --git a/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp b/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp index dd49679ede..b1a111592b 100644 --- a/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp +++ b/level_zero/core/test/unit_tests/sources/kernel/test_kernel.cpp @@ -62,6 +62,31 @@ TEST_F(KernelInitTest, givenKernelToInitWhenItHasUnknownArgThenUnknowKernelArgHa EXPECT_EQ(mockKernelImmData->getDescriptor().payloadMappings.explicitArgs[0].type, NEO::ArgDescriptor::ArgTUnknown); } +using KernelBaseAddressTests = Test; +TEST_F(KernelBaseAddressTests, whenQueryingKernelBaseAddressThenCorrectAddressIsReturned) { + uint32_t perHwThreadPrivateMemorySizeRequested = 32u; + + std::unique_ptr mockKernelImmData = + std::make_unique(perHwThreadPrivateMemorySizeRequested); + + createModuleFromBinary(perHwThreadPrivateMemorySizeRequested, false, mockKernelImmData.get()); + std::unique_ptr kernel; + kernel = std::make_unique(module.get()); + ze_kernel_desc_t desc = {}; + desc.pKernelName = kernelName.c_str(); + mockKernelImmData->resizeExplicitArgs(1); + kernel->initialize(&desc); + + uint64_t baseAddress = 0; + ze_result_t res = kernel->getBaseAddress(nullptr); + EXPECT_EQ(ZE_RESULT_SUCCESS, res); + + res = kernel->getBaseAddress(&baseAddress); + EXPECT_EQ(ZE_RESULT_SUCCESS, res); + EXPECT_NE(baseAddress, 0u); + EXPECT_EQ(baseAddress, kernel->getImmutableData()->getKernelInfo()->kernelAllocation->getGpuAddress()); +} + TEST(KernelArgTest, givenKernelWhenSetArgUnknownCalledThenSuccessRteurned) { Mock mockKernel; EXPECT_EQ(mockKernel.setArgUnknown(0, 0, nullptr), ZE_RESULT_SUCCESS);