mirror of
https://github.com/intel/compute-runtime.git
synced 2025-09-15 13:01:45 +08:00
Drm create context with an implicit virtual memory address space
Related-To: NEO-4821 Change-Id: I18545d976788daacbb195e243f4049b7f83fd3a2
This commit is contained in:

committed by
sys_ocldev

parent
031ee61b5a
commit
3c4c7a0215
@ -103,7 +103,9 @@ Drm *Drm::create(std::unique_ptr<HwDeviceId> hwDeviceId, RootDeviceEnvironment &
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
drmObject->createVirtualMemoryAddressSpace(HwHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()));
|
if (!drmObject->createVirtualMemoryAddressSpace(HwHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()))) {
|
||||||
|
printDebugString(DebugManager.flags.PrintDebugMessages.get(), stderr, "%s", "INFO: Device doesn't support GEM Virtual Memory\n");
|
||||||
|
}
|
||||||
|
|
||||||
return drmObject.release();
|
return drmObject.release();
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
|
|
||||||
class DrmWrap : public NEO::Drm {
|
class DrmWrap : public NEO::Drm {
|
||||||
public:
|
public:
|
||||||
|
using Drm::virtualMemoryIds;
|
||||||
|
|
||||||
static std::unique_ptr<NEO::Drm> createDrm(RootDeviceEnvironment &rootDeviceEnvironment) {
|
static std::unique_ptr<NEO::Drm> createDrm(RootDeviceEnvironment &rootDeviceEnvironment) {
|
||||||
auto hwDeviceIds = OSInterface::discoverDevices(rootDeviceEnvironment.executionEnvironment);
|
auto hwDeviceIds = OSInterface::discoverDevices(rootDeviceEnvironment.executionEnvironment);
|
||||||
if (!hwDeviceIds.empty()) {
|
if (!hwDeviceIds.empty()) {
|
||||||
|
@ -430,11 +430,23 @@ TEST_F(DrmTests, whenDrmIsCreatedWithMultipleSubDevicesThenCreateMultipleVirtual
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(DrmTests, givenDrmIsCreatedWhenCreateVirtualMemoryFailsThenCallAbort) {
|
TEST_F(DrmTests, givenDrmIsCreatedWhenCreateVirtualMemoryFailsThenReturnVirtualMemoryIdZeroAndPrintDebugMessage) {
|
||||||
VariableBackup<decltype(failOnVirtualMemoryCreate)> backupFailOnVirtaualMemoryCreate(&failOnVirtualMemoryCreate);
|
DebugManagerStateRestore dbgRestorer;
|
||||||
|
DebugManager.flags.PrintDebugMessages.set(true);
|
||||||
|
|
||||||
|
VariableBackup<decltype(failOnVirtualMemoryCreate)> backupFailOnVirtualMemoryCreate(&failOnVirtualMemoryCreate);
|
||||||
|
|
||||||
failOnVirtualMemoryCreate = -1;
|
failOnVirtualMemoryCreate = -1;
|
||||||
EXPECT_THROW(DrmWrap::createDrm(*rootDeviceEnvironment), std::exception);
|
|
||||||
|
::testing::internal::CaptureStderr();
|
||||||
|
auto drm = DrmWrap::createDrm(*rootDeviceEnvironment);
|
||||||
|
EXPECT_NE(drm, nullptr);
|
||||||
|
|
||||||
|
EXPECT_EQ(0u, drm->getVirtualMemoryAddressSpace(0));
|
||||||
|
EXPECT_EQ(0u, static_cast<DrmWrap *>(drm.get())->virtualMemoryIds.size());
|
||||||
|
|
||||||
|
std::string errStr = ::testing::internal::GetCapturedStderr();
|
||||||
|
EXPECT_THAT(errStr, ::testing::HasSubstr(std::string("INFO: Device doesn't support GEM Virtual Memory")));
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
@ -215,11 +215,13 @@ void Drm::destroyDrmContext(uint32_t drmContextId) {
|
|||||||
UNRECOVERABLE_IF(retVal != 0);
|
UNRECOVERABLE_IF(retVal != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Drm::createDrmVirtualMemory() {
|
int Drm::createDrmVirtualMemory(uint32_t &drmVmId) {
|
||||||
drm_i915_gem_vm_control ctl = {};
|
drm_i915_gem_vm_control ctl = {};
|
||||||
auto ret = SysCalls::ioctl(getFileDescriptor(), DRM_IOCTL_I915_GEM_VM_CREATE, &ctl);
|
auto ret = SysCalls::ioctl(getFileDescriptor(), DRM_IOCTL_I915_GEM_VM_CREATE, &ctl);
|
||||||
UNRECOVERABLE_IF(ret != 0);
|
if (ret == 0) {
|
||||||
return ctl.vm_id;
|
drmVmId = ctl.vm_id;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drm::destroyDrmVirtualMemory(uint32_t drmVmId) {
|
void Drm::destroyDrmVirtualMemory(uint32_t drmVmId) {
|
||||||
@ -424,7 +426,10 @@ bool Drm::queryTopology(int &sliceCount, int &subSliceCount, int &euCount) {
|
|||||||
|
|
||||||
bool Drm::createVirtualMemoryAddressSpace(uint32_t vmCount) {
|
bool Drm::createVirtualMemoryAddressSpace(uint32_t vmCount) {
|
||||||
for (auto i = 0u; i < vmCount; i++) {
|
for (auto i = 0u; i < vmCount; i++) {
|
||||||
auto id = createDrmVirtualMemory();
|
uint32_t id = 0;
|
||||||
|
if (0 != createDrmVirtualMemory(id)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
virtualMemoryIds.push_back(id);
|
virtualMemoryIds.push_back(id);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -437,8 +442,10 @@ void Drm::destroyVirtualMemoryAddressSpace() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Drm::getVirtualMemoryAddressSpace(uint32_t vmId) {
|
uint32_t Drm::getVirtualMemoryAddressSpace(uint32_t vmId) {
|
||||||
UNRECOVERABLE_IF(vmId >= virtualMemoryIds.size())
|
if (vmId < virtualMemoryIds.size()) {
|
||||||
return virtualMemoryIds[vmId];
|
return virtualMemoryIds[vmId];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Drm::~Drm() {
|
Drm::~Drm() {
|
||||||
|
@ -67,7 +67,7 @@ class Drm {
|
|||||||
|
|
||||||
MOCKABLE_VIRTUAL void checkPreemptionSupport();
|
MOCKABLE_VIRTUAL void checkPreemptionSupport();
|
||||||
inline int getFileDescriptor() const { return hwDeviceId->getFileDescriptor(); }
|
inline int getFileDescriptor() const { return hwDeviceId->getFileDescriptor(); }
|
||||||
uint32_t createDrmVirtualMemory();
|
int createDrmVirtualMemory(uint32_t &drmVmId);
|
||||||
void destroyDrmVirtualMemory(uint32_t drmVmId);
|
void destroyDrmVirtualMemory(uint32_t drmVmId);
|
||||||
uint32_t createDrmContext(uint32_t drmVmId);
|
uint32_t createDrmContext(uint32_t drmVmId);
|
||||||
void destroyDrmContext(uint32_t drmContextId);
|
void destroyDrmContext(uint32_t drmContextId);
|
||||||
|
Reference in New Issue
Block a user