Skip to content

Commit 083f8ae

Browse files
Add immediate extension to new residency model
Signed-off-by: Lukasz Jobczyk <[email protected]>
1 parent a414a35 commit 083f8ae

File tree

8 files changed

+42
-5
lines changed

8 files changed

+42
-5
lines changed

shared/source/direct_submission/linux/drm_direct_submission.inl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2020 Intel Corporation
2+
* Copyright (C) 2020-2021 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -24,7 +24,11 @@ inline std::unique_ptr<DirectSubmissionHw<GfxFamily, Dispatcher>> DirectSubmissi
2424
template <typename GfxFamily, typename Dispatcher>
2525
DrmDirectSubmission<GfxFamily, Dispatcher>::DrmDirectSubmission(Device &device,
2626
OsContext &osContext)
27-
: DirectSubmissionHw<GfxFamily, Dispatcher>(device, osContext){};
27+
: DirectSubmissionHw<GfxFamily, Dispatcher>(device, osContext) {
28+
29+
auto osContextLinux = static_cast<OsContextLinux *>(&this->osContext);
30+
osContextLinux->getDrm().setDirectSubmissionActive(true);
31+
};
2832

2933
template <typename GfxFamily, typename Dispatcher>
3034
inline DrmDirectSubmission<GfxFamily, Dispatcher>::~DrmDirectSubmission() {
@@ -55,6 +59,8 @@ bool DrmDirectSubmission<GfxFamily, Dispatcher>::submit(uint64_t gpuAddress, siz
5559

5660
drm_i915_gem_exec_object2 execObject{};
5761

62+
this->handleResidency();
63+
5864
bool ret = false;
5965
uint32_t drmContextId = 0u;
6066
for (auto drmIterator = 0u; drmIterator < osContextLinux->getDeviceBitfield().size(); drmIterator++) {
@@ -78,6 +84,8 @@ bool DrmDirectSubmission<GfxFamily, Dispatcher>::submit(uint64_t gpuAddress, siz
7884

7985
template <typename GfxFamily, typename Dispatcher>
8086
bool DrmDirectSubmission<GfxFamily, Dispatcher>::handleResidency() {
87+
auto osContextLinux = static_cast<OsContextLinux *>(&this->osContext);
88+
osContextLinux->waitForPagingFence();
8189
return true;
8290
}
8391

shared/source/os_interface/linux/drm_neo.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ constexpr const char *getIoctlParamString(int param) {
6060
} // namespace IoctlHelper
6161

6262
Drm::Drm(std::unique_ptr<HwDeviceId> hwDeviceIdIn, RootDeviceEnvironment &rootDeviceEnvironment) : hwDeviceId(std::move(hwDeviceIdIn)), rootDeviceEnvironment(rootDeviceEnvironment) {
63+
pagingFence.fill(0u);
64+
fenceVal.fill(0u);
6365
}
6466

6567
int Drm::ioctl(unsigned long request, void *arg) {

shared/source/os_interface/linux/drm_neo.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "shared/source/utilities/stackvec.h"
1616

1717
#include "drm/i915_drm.h"
18+
#include "engine_limits.h"
1819
#include "engine_node.h"
1920
#include "igfxfmid.h"
2021

@@ -125,6 +126,9 @@ class Drm {
125126
bool isContextDebugSupported() { return contextDebugSupported; }
126127
MOCKABLE_VIRTUAL void setContextDebugFlag(uint32_t drmContextId);
127128

129+
void setDirectSubmissionActive(bool value) { this->directSubmissionActive = value; }
130+
bool isDirectSubmissionActive() { return this->directSubmissionActive; }
131+
128132
MOCKABLE_VIRTUAL bool isVmBindAvailable();
129133
MOCKABLE_VIRTUAL bool registerResourceClasses();
130134

@@ -169,6 +173,10 @@ class Drm {
169173
return hwDeviceId->getPciPath();
170174
}
171175

176+
void waitForBind(uint32_t vmHandleId);
177+
uint64_t getNextFenceVal(uint32_t vmHandleId) { return ++fenceVal[vmHandleId]; }
178+
uint64_t *getFenceAddr(uint32_t vmHandleId) { return &pagingFence[vmHandleId]; }
179+
172180
protected:
173181
int getQueueSliceCount(drm_i915_gem_context_param_sseu *sseu);
174182
bool translateTopologyInfo(const drm_i915_query_topology_info *queryTopologyInfo, int &sliceCount, int &subSliceCount, int &euCount);
@@ -180,6 +188,7 @@ class Drm {
180188
bool nonPersistentContextsSupported = false;
181189
bool requirePerContextVM = false;
182190
bool bindAvailable = false;
191+
bool directSubmissionActive = false;
183192
bool contextDebugSupported = false;
184193
std::once_flag checkBindOnce;
185194
std::unique_ptr<HwDeviceId> hwDeviceId;
@@ -196,6 +205,9 @@ class Drm {
196205
std::unique_ptr<MemoryInfo> memoryInfo;
197206
std::vector<uint32_t> virtualMemoryIds;
198207

208+
std::array<uint64_t, EngineLimits::maxHandleCount> pagingFence;
209+
std::array<uint64_t, EngineLimits::maxHandleCount> fenceVal;
210+
199211
std::string getSysFsPciPath();
200212
std::unique_ptr<uint8_t[]> query(uint32_t queryId, uint32_t queryItemFlags, int32_t &length);
201213

shared/source/os_interface/linux/drm_query.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ int Drm::unbindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObj
6363
return 0;
6464
}
6565

66+
void Drm::waitForBind(uint32_t vmHandleId) {
67+
}
68+
6669
bool Drm::isVmBindAvailable() {
6770
return this->bindAvailable;
6871
}

shared/source/os_interface/linux/drm_query_dg1.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ int Drm::unbindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObj
7272
return 0;
7373
}
7474

75+
void Drm::waitForBind(uint32_t vmHandleId) {
76+
}
77+
7578
bool Drm::isVmBindAvailable() {
7679
return this->bindAvailable;
7780
}

shared/source/os_interface/linux/os_context_linux.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ Drm &OsContextLinux::getDrm() const {
6464
return this->drm;
6565
}
6666

67+
void OsContextLinux::waitForPagingFence() {
68+
for (auto drmIterator = 0u; drmIterator < this->deviceBitfield.size(); drmIterator++) {
69+
if (this->deviceBitfield.test(drmIterator)) {
70+
drm.waitForBind(drmIterator);
71+
}
72+
}
73+
}
74+
6775
OsContextLinux::~OsContextLinux() {
6876
for (auto drmContextId : drmContextIds) {
6977
drm.destroyDrmContext(drmContextId);

shared/source/os_interface/linux/os_context_linux.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2018-2020 Intel Corporation
2+
* Copyright (C) 2018-2021 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
@@ -26,6 +26,7 @@ class OsContextLinux : public OsContext {
2626
const std::vector<uint32_t> &getDrmContextIds() const { return drmContextIds; }
2727
const std::vector<uint32_t> &getDrmVmIds() const { return drmVmIds; }
2828
Drm &getDrm() const;
29+
void waitForPagingFence();
2930

3031
protected:
3132
unsigned int engineFlag = 0;

shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,9 @@ HWTEST_F(DrmDirectSubmissionTest, givenDrmDirectSubmissionWhenDestructObjectThen
8888
auto drmDirectSubmission = std::make_unique<MockDrmDirectSubmission<FamilyType, RenderDispatcher<FamilyType>>>(*device.get(),
8989
*osContext.get());
9090
auto drm = static_cast<DrmMock *>(executionEnvironment.rootDeviceEnvironments[0]->osInterface->get()->getDrm());
91-
drm->ioctlCallsCount = 0u;
9291
drmDirectSubmission->initialize(true);
92+
drm->ioctlCallsCount = 0u;
9393
drmDirectSubmission.reset();
9494

95-
EXPECT_EQ(drm->ioctlCallsCount, 11u);
95+
EXPECT_EQ(drm->ioctlCallsCount, 7u);
9696
}

0 commit comments

Comments
 (0)