mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-09 22:43:00 +08:00
Add support for gem create extension to create VM_PRIVATE BOs
Add support for PRELIM_I915_GEM_CREATE_EXT_VM_PRIVATE extension to create VM_PRIVATE BOs. Related-to: NEO-6730 Signed-off-by: Naklicki, Mateusz <mateusz.naklicki@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
dc2e1dfdb0
commit
58ec879c46
@@ -156,6 +156,14 @@ int DrmMockPrelimContext::handlePrelimRequest(DrmIoctl request, void *arg) {
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
prelim_drm_i915_gem_create_ext_vm_private *vmPrivateExt = nullptr;
|
||||
if (extension->base.next_extension != 0) {
|
||||
vmPrivateExt = reinterpret_cast<prelim_drm_i915_gem_create_ext_vm_private *>(extension->base.next_extension);
|
||||
if (vmPrivateExt->base.name != PRELIM_I915_GEM_CREATE_EXT_VM_PRIVATE) {
|
||||
return EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
auto data = reinterpret_cast<MemoryClassInstance *>(extension->param.data);
|
||||
if (!data) {
|
||||
return EINVAL;
|
||||
@@ -165,6 +173,9 @@ int DrmMockPrelimContext::handlePrelimRequest(DrmIoctl request, void *arg) {
|
||||
createExt->handle = createExtHandle;
|
||||
receivedCreateGemExt = CreateGemExt{createExt->size, createExtHandle};
|
||||
receivedCreateGemExt->setParamExt = CreateGemExt::SetParam{extension->param.handle, extension->param.size, extension->param.param};
|
||||
if (vmPrivateExt != nullptr) {
|
||||
receivedCreateGemExt->vmPrivateExt = CreateGemExt::VmPrivate{vmPrivateExt->vm_id};
|
||||
}
|
||||
|
||||
receivedCreateGemExt->memoryRegions.clear();
|
||||
for (uint32_t i = 0; i < extension->param.size; i++) {
|
||||
|
||||
@@ -43,6 +43,11 @@ struct CreateGemExt {
|
||||
uint16_t memoryInstance{0};
|
||||
};
|
||||
std::vector<MemoryClassInstance> memoryRegions{};
|
||||
|
||||
struct VmPrivate {
|
||||
uint32_t vmId{std::numeric_limits<uint32_t>::max()};
|
||||
};
|
||||
VmPrivate vmPrivateExt{};
|
||||
};
|
||||
|
||||
struct GemContextParamAcc {
|
||||
|
||||
@@ -156,7 +156,7 @@ struct MockedMemoryInfo : public NEO::MemoryInfo {
|
||||
size_t getMemoryRegionSize(uint32_t memoryBank) override {
|
||||
return 1024u;
|
||||
}
|
||||
uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle) override {
|
||||
uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, uint32_t vmId) override {
|
||||
if (allocSize == 0) {
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
@@ -427,3 +427,4 @@ EnableDebuggerMmapMemoryAccess = 0
|
||||
FailBuildProgramWithStatefulAccess = -1
|
||||
ForceUncachedGmmUsageType = 0
|
||||
OverrideDeviceName = unk
|
||||
EnablePrivateBO = 0
|
||||
|
||||
@@ -373,7 +373,7 @@ TEST(MemoryInfo, givenMemoryInfoWithRegionsWhenCreatingGemWithExtensionsThenRetu
|
||||
auto drm = std::make_unique<DrmQueryMock>(*executionEnvironment->rootDeviceEnvironments[0]);
|
||||
uint32_t handle = 0;
|
||||
MemRegionsVec memClassInstance = {regionInfo[0].region, regionInfo[1].region};
|
||||
auto ret = memoryInfo->createGemExt(drm.get(), memClassInstance, 1024, handle);
|
||||
auto ret = memoryInfo->createGemExt(drm.get(), memClassInstance, 1024, handle, std::numeric_limits<uint32_t>::max());
|
||||
EXPECT_EQ(1u, handle);
|
||||
EXPECT_EQ(0u, ret);
|
||||
EXPECT_EQ(1u, drm->ioctlCallsCount);
|
||||
@@ -409,3 +409,94 @@ TEST(MemoryInfo, givenMemoryInfoWithRegionsWhenCreatingGemExtWithSingleRegionThe
|
||||
EXPECT_EQ(I915_MEMORY_CLASS_DEVICE, createExt->memoryRegions[0].memoryClass);
|
||||
EXPECT_EQ(1024u, drm->context.receivedCreateGemExt->size);
|
||||
}
|
||||
|
||||
TEST(MemoryInfo, givenMemoryInfoWithRegionsAndPrivateBOSupportWhenCreatingGemExtWithSingleRegionThenValidVmIdIsSet) {
|
||||
DebugManagerStateRestore restorer;
|
||||
DebugManager.flags.EnableLocalMemory.set(1);
|
||||
DebugManager.flags.EnablePrivateBO.set(true);
|
||||
|
||||
std::vector<MemoryRegion> regionInfo(2);
|
||||
regionInfo[0].region = {I915_MEMORY_CLASS_SYSTEM, 0};
|
||||
regionInfo[0].probedSize = 8 * GB;
|
||||
regionInfo[1].region = {I915_MEMORY_CLASS_DEVICE, 0};
|
||||
regionInfo[1].probedSize = 16 * GB;
|
||||
|
||||
auto memoryInfo = std::make_unique<MemoryInfo>(regionInfo);
|
||||
ASSERT_NE(nullptr, memoryInfo);
|
||||
|
||||
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
|
||||
executionEnvironment->prepareRootDeviceEnvironments(1);
|
||||
auto drm = std::make_unique<DrmQueryMock>(*executionEnvironment->rootDeviceEnvironments[0]);
|
||||
drm->setPerContextVMRequired(false);
|
||||
|
||||
uint32_t handle = 0;
|
||||
auto ret = memoryInfo->createGemExtWithSingleRegion(drm.get(), 1, 1024, handle);
|
||||
EXPECT_EQ(1u, handle);
|
||||
EXPECT_EQ(0u, ret);
|
||||
EXPECT_EQ(1u, drm->ioctlCallsCount);
|
||||
|
||||
const auto &createExt = drm->context.receivedCreateGemExt;
|
||||
ASSERT_TRUE(createExt);
|
||||
auto validVmId = drm->getVirtualMemoryAddressSpace(0);
|
||||
EXPECT_EQ(validVmId, createExt->vmPrivateExt.vmId);
|
||||
}
|
||||
|
||||
TEST(MemoryInfo, givenMemoryInfoWithRegionsAndNoPrivateBOSupportWhenCreatingGemExtWithSingleRegionThenVmIdIsNotSet) {
|
||||
DebugManagerStateRestore restorer;
|
||||
DebugManager.flags.EnableLocalMemory.set(1);
|
||||
DebugManager.flags.EnablePrivateBO.set(false);
|
||||
|
||||
std::vector<MemoryRegion> regionInfo(2);
|
||||
regionInfo[0].region = {I915_MEMORY_CLASS_SYSTEM, 0};
|
||||
regionInfo[0].probedSize = 8 * GB;
|
||||
regionInfo[1].region = {I915_MEMORY_CLASS_DEVICE, 0};
|
||||
regionInfo[1].probedSize = 16 * GB;
|
||||
|
||||
auto memoryInfo = std::make_unique<MemoryInfo>(regionInfo);
|
||||
ASSERT_NE(nullptr, memoryInfo);
|
||||
|
||||
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
|
||||
executionEnvironment->prepareRootDeviceEnvironments(1);
|
||||
auto drm = std::make_unique<DrmQueryMock>(*executionEnvironment->rootDeviceEnvironments[0]);
|
||||
drm->setPerContextVMRequired(false);
|
||||
|
||||
uint32_t handle = 0;
|
||||
auto ret = memoryInfo->createGemExtWithSingleRegion(drm.get(), 1, 1024, handle);
|
||||
EXPECT_EQ(1u, handle);
|
||||
EXPECT_EQ(0u, ret);
|
||||
EXPECT_EQ(1u, drm->ioctlCallsCount);
|
||||
|
||||
const auto &createExt = drm->context.receivedCreateGemExt;
|
||||
ASSERT_TRUE(createExt);
|
||||
EXPECT_EQ(std::numeric_limits<uint32_t>::max(), createExt->vmPrivateExt.vmId);
|
||||
}
|
||||
|
||||
TEST(MemoryInfo, givenMemoryInfoWithRegionsAndPrivateBOSupportedAndIsPerContextVMRequiredIsTrueWhenCreatingGemExtWithSingleRegionThenVmIdIsNotSet) {
|
||||
DebugManagerStateRestore restorer;
|
||||
DebugManager.flags.EnableLocalMemory.set(1);
|
||||
DebugManager.flags.EnablePrivateBO.set(true);
|
||||
|
||||
std::vector<MemoryRegion> regionInfo(2);
|
||||
regionInfo[0].region = {I915_MEMORY_CLASS_SYSTEM, 0};
|
||||
regionInfo[0].probedSize = 8 * GB;
|
||||
regionInfo[1].region = {I915_MEMORY_CLASS_DEVICE, 0};
|
||||
regionInfo[1].probedSize = 16 * GB;
|
||||
|
||||
auto memoryInfo = std::make_unique<MemoryInfo>(regionInfo);
|
||||
ASSERT_NE(nullptr, memoryInfo);
|
||||
|
||||
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
|
||||
executionEnvironment->prepareRootDeviceEnvironments(1);
|
||||
auto drm = std::make_unique<DrmQueryMock>(*executionEnvironment->rootDeviceEnvironments[0]);
|
||||
drm->setPerContextVMRequired(true);
|
||||
|
||||
uint32_t handle = 0;
|
||||
auto ret = memoryInfo->createGemExtWithSingleRegion(drm.get(), 1, 1024, handle);
|
||||
EXPECT_EQ(1u, handle);
|
||||
EXPECT_EQ(0u, ret);
|
||||
EXPECT_EQ(1u, drm->ioctlCallsCount);
|
||||
|
||||
const auto &createExt = drm->context.receivedCreateGemExt;
|
||||
ASSERT_TRUE(createExt);
|
||||
EXPECT_EQ(std::numeric_limits<uint32_t>::max(), createExt->vmPrivateExt.vmId);
|
||||
}
|
||||
|
||||
@@ -226,7 +226,7 @@ HWTEST2_F(MemoryInfoTest, givenMemoryInfoWithRegionsWhenCreatingGemWithExtension
|
||||
|
||||
uint32_t handle = 0;
|
||||
MemRegionsVec memClassInstance = {regionInfo[0].region, regionInfo[1].region};
|
||||
auto ret = memoryInfo->createGemExt(drm.get(), memClassInstance, 1024, handle);
|
||||
auto ret = memoryInfo->createGemExt(drm.get(), memClassInstance, 1024, handle, std::numeric_limits<uint32_t>::max());
|
||||
EXPECT_EQ(1u, handle);
|
||||
EXPECT_EQ(0u, ret);
|
||||
EXPECT_EQ(1u, drm->ioctlCallsCount);
|
||||
|
||||
@@ -112,7 +112,7 @@ TEST_F(IoctlHelperPrelimFixture, givenPrelimsWhenCreateGemExtThenReturnSuccess)
|
||||
auto ioctlHelper = drm->getIoctlHelper();
|
||||
uint32_t handle = 0;
|
||||
MemRegionsVec memClassInstance = {{I915_MEMORY_CLASS_DEVICE, 0}};
|
||||
auto ret = ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle);
|
||||
auto ret = ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle, std::numeric_limits<uint32_t>::max());
|
||||
|
||||
EXPECT_EQ(1u, handle);
|
||||
EXPECT_EQ(0u, ret);
|
||||
@@ -127,7 +127,7 @@ TEST_F(IoctlHelperPrelimFixture, givenPrelimsWhenCreateGemExtWithDebugFlagThenPr
|
||||
auto ioctlHelper = drm->getIoctlHelper();
|
||||
uint32_t handle = 0;
|
||||
MemRegionsVec memClassInstance = {{I915_MEMORY_CLASS_DEVICE, 0}};
|
||||
ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle);
|
||||
ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle, std::numeric_limits<uint32_t>::max());
|
||||
|
||||
std::string output = testing::internal::GetCapturedStdout();
|
||||
std::string expectedOutput("Performing GEM_CREATE_EXT with { size: 1024, param: 0x1000000010001, memory class: 1, memory instance: 0 }\nGEM_CREATE_EXT has returned: 0 BO-1 with size: 1024\n");
|
||||
|
||||
@@ -25,7 +25,7 @@ DG1TEST_F(IoctlHelperTestsDg1, givenDg1WhenCreateGemExtThenReturnCorrectValue) {
|
||||
auto ioctlHelper = drm->getIoctlHelper();
|
||||
uint32_t handle = 0;
|
||||
MemRegionsVec memClassInstance = {{I915_MEMORY_CLASS_DEVICE, 0}};
|
||||
auto ret = ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle);
|
||||
auto ret = ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle, std::numeric_limits<uint32_t>::max());
|
||||
|
||||
EXPECT_EQ(0u, ret);
|
||||
EXPECT_EQ(1u, handle);
|
||||
@@ -47,7 +47,7 @@ DG1TEST_F(IoctlHelperTestsDg1, givenDg1WithDrmTipWhenCreateGemExtWithDebugFlagTh
|
||||
auto ioctlHelper = drm->getIoctlHelper();
|
||||
uint32_t handle = 0;
|
||||
MemRegionsVec memClassInstance = {{I915_MEMORY_CLASS_DEVICE, 0}};
|
||||
auto ret = ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle);
|
||||
auto ret = ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle, std::numeric_limits<uint32_t>::max());
|
||||
|
||||
std::string output = testing::internal::GetCapturedStdout();
|
||||
std::string expectedOutput("Performing GEM_CREATE_EXT with { size: 1024, memory class: 1, memory instance: 0 }\nGEM_CREATE_EXT with EXT_MEMORY_REGIONS has returned: 0 BO-1 with size: 1024\n");
|
||||
@@ -68,7 +68,7 @@ DG1TEST_F(IoctlHelperTestsDg1, givenDg1WhenCreateGemExtWithDebugFlagThenPrintDeb
|
||||
auto ioctlHelper = drm->getIoctlHelper();
|
||||
uint32_t handle = 0;
|
||||
MemRegionsVec memClassInstance = {{I915_MEMORY_CLASS_DEVICE, 0}};
|
||||
auto ret = ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle);
|
||||
auto ret = ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle, std::numeric_limits<uint32_t>::max());
|
||||
|
||||
std::string output = testing::internal::GetCapturedStdout();
|
||||
std::string expectedOutput("Performing GEM_CREATE_EXT with { size: 1024, memory class: 1, memory instance: 0 }\nGEM_CREATE_EXT with EXT_MEMORY_REGIONS has returned: -1 BO-0 with size: 1024\nGEM_CREATE_EXT with EXT_SETPARAM has returned: 0 BO-1 with size: 1024\n");
|
||||
|
||||
@@ -112,7 +112,7 @@ TEST(IoctlHelperTestsUpstream, givenUpstreamWhenCreateGemExtThenReturnCorrectVal
|
||||
auto ioctlHelper = drm->getIoctlHelper();
|
||||
uint32_t handle = 0;
|
||||
MemRegionsVec memClassInstance = {{I915_MEMORY_CLASS_DEVICE, 0}};
|
||||
auto ret = ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle);
|
||||
auto ret = ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle, std::numeric_limits<uint32_t>::max());
|
||||
|
||||
EXPECT_EQ(0u, ret);
|
||||
EXPECT_EQ(1u, handle);
|
||||
@@ -133,7 +133,7 @@ TEST(IoctlHelperTestsUpstream, givenUpstreamWhenCreateGemExtWithDebugFlagThenPri
|
||||
auto ioctlHelper = drm->getIoctlHelper();
|
||||
uint32_t handle = 0;
|
||||
MemRegionsVec memClassInstance = {{I915_MEMORY_CLASS_DEVICE, 0}};
|
||||
ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle);
|
||||
ioctlHelper->createGemExt(drm.get(), memClassInstance, 1024, handle, std::numeric_limits<uint32_t>::max());
|
||||
|
||||
std::string output = testing::internal::GetCapturedStdout();
|
||||
std::string expectedOutput("Performing GEM_CREATE_EXT with { size: 1024, memory class: 1, memory instance: 0 }\nGEM_CREATE_EXT with EXT_MEMORY_REGIONS has returned: 0 BO-1 with size: 1024\n");
|
||||
|
||||
@@ -35,6 +35,12 @@ int handlePrelimRequests(DrmIoctl request, void *arg, int ioctlRetVal, int query
|
||||
(setparamRegion.param.param != (PRELIM_I915_OBJECT_PARAM | PRELIM_I915_PARAM_MEMORY_REGIONS))) {
|
||||
return EINVAL;
|
||||
}
|
||||
if (setparamRegion.base.next_extension != 0) {
|
||||
auto vmPrivate = reinterpret_cast<prelim_drm_i915_gem_create_ext_vm_private *>(setparamRegion.base.next_extension);
|
||||
if (vmPrivate->base.name != PRELIM_I915_GEM_CREATE_EXT_VM_PRIVATE) {
|
||||
return EINVAL;
|
||||
}
|
||||
}
|
||||
auto data = reinterpret_cast<MemoryClassInstance *>(setparamRegion.param.data);
|
||||
if (data == nullptr) {
|
||||
return EINVAL;
|
||||
|
||||
Reference in New Issue
Block a user