mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-05 09:09:04 +08:00
Remove i915 structs from MemoryInfo
Use structs defined in ioctl_helper.h instead of i915 dependent ones to avoid conflicts between different kernels Related-To: NEO-6149 Signed-off-by: Szymon Morek <szymon.morek@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
dfe2be6e1a
commit
2647d563c7
@@ -58,10 +58,9 @@ bool Drm::queryMemoryInfo() {
|
||||
auto length = 0;
|
||||
auto dataQuery = this->query(DRM_I915_QUERY_MEMORY_REGIONS, DrmQueryItemFlags::empty, length);
|
||||
if (dataQuery) {
|
||||
auto ioctlHelper = IoctlHelper::get(this);
|
||||
auto data = ioctlHelper->translateIfRequired(dataQuery.release(), length);
|
||||
auto memRegions = reinterpret_cast<drm_i915_query_memory_regions *>(data.get());
|
||||
this->memoryInfo.reset(new MemoryInfo(memRegions->regions, memRegions->num_regions));
|
||||
auto numRegions = 0u;
|
||||
auto memRegions = IoctlHelper::get(this)->translateToMemoryRegions(dataQuery.get(), length, numRegions);
|
||||
this->memoryInfo.reset(new MemoryInfo(memRegions.get(), numRegions));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -19,6 +19,17 @@ enum class CacheRegion : uint16_t;
|
||||
|
||||
extern IoctlHelper *ioctlHelperFactory[IGFX_MAX_PRODUCT];
|
||||
|
||||
struct MemoryClassInstance {
|
||||
uint16_t memoryClass;
|
||||
uint16_t memoryInstance;
|
||||
};
|
||||
|
||||
struct MemoryRegion {
|
||||
MemoryClassInstance region;
|
||||
uint64_t probedSize;
|
||||
uint64_t unallocatedSize;
|
||||
};
|
||||
|
||||
class IoctlHelper {
|
||||
public:
|
||||
virtual ~IoctlHelper() {}
|
||||
@@ -26,7 +37,7 @@ class IoctlHelper {
|
||||
static uint32_t ioctl(Drm *drm, unsigned long request, void *arg);
|
||||
|
||||
virtual uint32_t createGemExt(Drm *drm, void *data, uint32_t dataSize, size_t allocSize, uint32_t &handle) = 0;
|
||||
virtual std::unique_ptr<uint8_t[]> translateIfRequired(uint8_t *dataQuery, int32_t length) = 0;
|
||||
virtual std::unique_ptr<MemoryRegion[]> translateToMemoryRegions(uint8_t *dataQuery, uint32_t length, uint32_t &numRegions) = 0;
|
||||
virtual CacheRegion closAlloc(Drm *drm) = 0;
|
||||
virtual uint16_t closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) = 0;
|
||||
virtual CacheRegion closFree(Drm *drm, CacheRegion closIndex) = 0;
|
||||
@@ -41,8 +52,8 @@ class IoctlHelper {
|
||||
|
||||
class IoctlHelperUpstream : public IoctlHelper {
|
||||
public:
|
||||
virtual uint32_t createGemExt(Drm *drm, void *data, uint32_t dataSize, size_t allocSize, uint32_t &handle) override;
|
||||
virtual std::unique_ptr<uint8_t[]> translateIfRequired(uint8_t *dataQuery, int32_t length) override;
|
||||
uint32_t createGemExt(Drm *drm, void *data, uint32_t dataSize, size_t allocSize, uint32_t &handle) override;
|
||||
std::unique_ptr<MemoryRegion[]> translateToMemoryRegions(uint8_t *dataQuery, uint32_t length, uint32_t &numRegions) override;
|
||||
CacheRegion closAlloc(Drm *drm) override;
|
||||
uint16_t closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) override;
|
||||
CacheRegion closFree(Drm *drm, CacheRegion closIndex) override;
|
||||
@@ -63,13 +74,13 @@ class IoctlHelperImpl : public IoctlHelperUpstream {
|
||||
return &instance;
|
||||
}
|
||||
uint32_t createGemExt(Drm *drm, void *data, uint32_t dataSize, size_t allocSize, uint32_t &handle) override;
|
||||
std::unique_ptr<uint8_t[]> translateIfRequired(uint8_t *dataQuery, int32_t length) override;
|
||||
std::unique_ptr<MemoryRegion[]> translateToMemoryRegions(uint8_t *dataQuery, uint32_t length, uint32_t &numRegions) override;
|
||||
};
|
||||
|
||||
class IoctlHelperPrelim20 : public IoctlHelper {
|
||||
public:
|
||||
uint32_t createGemExt(Drm *drm, void *data, uint32_t dataSize, size_t allocSize, uint32_t &handle) override;
|
||||
std::unique_ptr<uint8_t[]> translateIfRequired(uint8_t *dataQuery, int32_t length) override;
|
||||
std::unique_ptr<MemoryRegion[]> translateToMemoryRegions(uint8_t *dataQuery, uint32_t length, uint32_t &numRegions) override;
|
||||
CacheRegion closAlloc(Drm *drm) override;
|
||||
uint16_t closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) override;
|
||||
CacheRegion closFree(Drm *drm, CacheRegion closIndex) override;
|
||||
|
||||
@@ -51,8 +51,17 @@ uint32_t IoctlHelperPrelim20::createGemExt(Drm *drm, void *data, uint32_t dataSi
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::unique_ptr<uint8_t[]> IoctlHelperPrelim20::translateIfRequired(uint8_t *dataQuery, int32_t length) {
|
||||
return std::unique_ptr<uint8_t[]>(dataQuery);
|
||||
std::unique_ptr<MemoryRegion[]> IoctlHelperPrelim20::translateToMemoryRegions(uint8_t *dataQuery, uint32_t length, uint32_t &numRegions) {
|
||||
auto *data = reinterpret_cast<prelim_drm_i915_query_memory_regions *>(dataQuery);
|
||||
auto memRegions = std::make_unique<MemoryRegion[]>(data->num_regions);
|
||||
for (uint32_t i = 0; i < data->num_regions; i++) {
|
||||
memRegions[i].probedSize = data->regions[i].probed_size;
|
||||
memRegions[i].unallocatedSize = data->regions[i].unallocated_size;
|
||||
memRegions[i].region.memoryClass = data->regions[i].region.memory_class;
|
||||
memRegions[i].region.memoryInstance = data->regions[i].region.memory_instance;
|
||||
}
|
||||
numRegions = data->num_regions;
|
||||
return memRegions;
|
||||
}
|
||||
|
||||
CacheRegion IoctlHelperPrelim20::closAlloc(Drm *drm) {
|
||||
|
||||
@@ -42,8 +42,17 @@ uint32_t IoctlHelperUpstream::createGemExt(Drm *drm, void *data, uint32_t dataSi
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::unique_ptr<uint8_t[]> IoctlHelperUpstream::translateIfRequired(uint8_t *dataQuery, int32_t length) {
|
||||
return std::unique_ptr<uint8_t[]>(dataQuery);
|
||||
std::unique_ptr<MemoryRegion[]> IoctlHelperUpstream::translateToMemoryRegions(uint8_t *dataQuery, uint32_t length, uint32_t &numRegions) {
|
||||
auto *data = reinterpret_cast<drm_i915_query_memory_regions *>(dataQuery);
|
||||
auto memRegions = std::make_unique<MemoryRegion[]>(data->num_regions);
|
||||
for (uint32_t i = 0; i < data->num_regions; i++) {
|
||||
memRegions[i].probedSize = data->regions[i].probed_size;
|
||||
memRegions[i].unallocatedSize = data->regions[i].unallocated_size;
|
||||
memRegions[i].region.memoryClass = data->regions[i].region.memory_class;
|
||||
memRegions[i].region.memoryInstance = data->regions[i].region.memory_instance;
|
||||
}
|
||||
numRegions = data->num_regions;
|
||||
return memRegions;
|
||||
}
|
||||
|
||||
CacheRegion IoctlHelperUpstream::closAlloc(Drm *drm) {
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace PROD_DG1 {
|
||||
#include "third_party/uapi/dg1/drm/i915_drm.h"
|
||||
} // namespace PROD_DG1
|
||||
|
||||
std::unique_ptr<uint8_t[]> translateToDrmTip(uint8_t *dataQuery, int32_t &length) {
|
||||
std::unique_ptr<uint8_t[]> translateToDrmTip(uint8_t *dataQuery) {
|
||||
auto dataOnProdDrm = reinterpret_cast<PROD_DG1::drm_i915_query_memory_regions *>(dataQuery);
|
||||
auto lengthTranslated = static_cast<int32_t>(sizeof(drm_i915_query_memory_regions) + dataOnProdDrm->num_regions * sizeof(drm_i915_memory_region_info));
|
||||
auto dataQueryTranslated = std::make_unique<uint8_t[]>(lengthTranslated);
|
||||
@@ -53,7 +53,6 @@ std::unique_ptr<uint8_t[]> translateToDrmTip(uint8_t *dataQuery, int32_t &length
|
||||
dataTranslated->regions[i].probed_size = dataOnProdDrm->regions[i].probed_size;
|
||||
dataTranslated->regions[i].unallocated_size = dataOnProdDrm->regions[i].unallocated_size;
|
||||
}
|
||||
length = lengthTranslated;
|
||||
return dataQueryTranslated;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ constexpr static auto gfxProduct = IGFX_DG1;
|
||||
|
||||
extern uint32_t createGemExtMemoryRegions(Drm *drm, void *data, uint32_t dataSize, size_t allocSize, uint32_t &handle);
|
||||
extern bool isQueryDrmTip(uint8_t *dataQuery, int32_t length);
|
||||
extern std::unique_ptr<uint8_t[]> translateToDrmTip(uint8_t *dataQuery, int32_t &length);
|
||||
extern std::unique_ptr<uint8_t[]> translateToDrmTip(uint8_t *dataQuery);
|
||||
|
||||
template <>
|
||||
uint32_t IoctlHelperImpl<gfxProduct>::createGemExt(Drm *drm, void *data, uint32_t dataSize, size_t allocSize, uint32_t &handle) {
|
||||
@@ -58,13 +58,12 @@ uint32_t IoctlHelperImpl<gfxProduct>::createGemExt(Drm *drm, void *data, uint32_
|
||||
}
|
||||
|
||||
template <>
|
||||
std::unique_ptr<uint8_t[]> IoctlHelperImpl<gfxProduct>::translateIfRequired(uint8_t *dataQuery, int32_t length) {
|
||||
if (isQueryDrmTip(dataQuery, length)) {
|
||||
DEBUG_BREAK_IF(true);
|
||||
return std::unique_ptr<uint8_t[]>(dataQuery);
|
||||
std::unique_ptr<MemoryRegion[]> IoctlHelperImpl<gfxProduct>::translateToMemoryRegions(uint8_t *dataQuery, uint32_t length, uint32_t &numRegions) {
|
||||
if (!isQueryDrmTip(dataQuery, length)) {
|
||||
auto translated = translateToDrmTip(dataQuery);
|
||||
return IoctlHelperUpstream::translateToMemoryRegions(translated.get(), length, numRegions);
|
||||
}
|
||||
auto data = std::unique_ptr<uint8_t[]>(dataQuery);
|
||||
return translateToDrmTip(data.get(), length);
|
||||
return IoctlHelperUpstream::translateToMemoryRegions(dataQuery, length, numRegions);
|
||||
}
|
||||
|
||||
template class IoctlHelperImpl<gfxProduct>;
|
||||
|
||||
@@ -12,9 +12,6 @@
|
||||
#include "shared/source/helpers/debug_helpers.h"
|
||||
#include "shared/source/helpers/hw_helper.h"
|
||||
#include "shared/source/os_interface/linux/drm_neo.h"
|
||||
#include "shared/source/os_interface/linux/ioctl_helper.h"
|
||||
|
||||
#include "drm/i915_drm.h"
|
||||
|
||||
namespace NEO {
|
||||
|
||||
@@ -22,7 +19,7 @@ uint32_t MemoryInfo::createGemExt(Drm *drm, void *data, uint32_t dataSize, size_
|
||||
return IoctlHelper::get(drm)->createGemExt(drm, data, dataSize, allocSize, handle);
|
||||
}
|
||||
|
||||
drm_i915_gem_memory_class_instance MemoryInfo::getMemoryRegionClassAndInstance(uint32_t memoryBank, const HardwareInfo &hwInfo) {
|
||||
MemoryClassInstance MemoryInfo::getMemoryRegionClassAndInstance(uint32_t memoryBank, const HardwareInfo &hwInfo) {
|
||||
auto &hwHelper = HwHelper::get(hwInfo.platform.eRenderCoreFamily);
|
||||
if (!hwHelper.getEnableLocalMemory(hwInfo) || memoryBank == 0) {
|
||||
return systemMemoryRegion.region;
|
||||
@@ -46,13 +43,13 @@ size_t MemoryInfo::getMemoryRegionSize(uint32_t memoryBank) {
|
||||
printRegionSizes();
|
||||
}
|
||||
if (memoryBank == 0) {
|
||||
return systemMemoryRegion.probed_size;
|
||||
return systemMemoryRegion.probedSize;
|
||||
}
|
||||
|
||||
auto index = Math::log2(memoryBank);
|
||||
|
||||
if (index < localMemoryRegions.size()) {
|
||||
return localMemoryRegions[index].probed_size;
|
||||
return localMemoryRegions[index].probedSize;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -60,9 +57,9 @@ size_t MemoryInfo::getMemoryRegionSize(uint32_t memoryBank) {
|
||||
|
||||
void MemoryInfo::printRegionSizes() {
|
||||
for (auto region : drmQueryRegions) {
|
||||
std::cout << "Memory type: " << region.region.memory_class
|
||||
<< ", memory instance: " << region.region.memory_instance
|
||||
<< ", region size: " << region.probed_size << std::endl;
|
||||
std::cout << "Memory type: " << region.region.memoryClass
|
||||
<< ", memory instance: " << region.region.memoryInstance
|
||||
<< ", region size: " << region.probedSize << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "drm/i915_drm.h"
|
||||
#include "shared/source/os_interface/linux/ioctl_helper.h"
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
@@ -18,17 +18,17 @@ struct HardwareInfo;
|
||||
|
||||
class MemoryInfo {
|
||||
public:
|
||||
using RegionContainer = std::vector<drm_i915_memory_region_info>;
|
||||
using RegionContainer = std::vector<MemoryRegion>;
|
||||
|
||||
virtual ~MemoryInfo(){};
|
||||
|
||||
MemoryInfo(const drm_i915_memory_region_info *regionInfo, size_t count);
|
||||
MemoryInfo(const MemoryRegion *regionInfo, size_t count);
|
||||
|
||||
void assignRegionsFromDistances(const void *distanceInfosPtr, size_t size);
|
||||
|
||||
MOCKABLE_VIRTUAL uint32_t createGemExt(Drm *drm, void *data, uint32_t dataSize, size_t allocSize, uint32_t &handle);
|
||||
|
||||
drm_i915_gem_memory_class_instance getMemoryRegionClassAndInstance(uint32_t memoryBank, const HardwareInfo &hwInfo);
|
||||
MemoryClassInstance getMemoryRegionClassAndInstance(uint32_t memoryBank, const HardwareInfo &hwInfo);
|
||||
|
||||
MOCKABLE_VIRTUAL size_t getMemoryRegionSize(uint32_t memoryBank);
|
||||
|
||||
@@ -41,7 +41,7 @@ class MemoryInfo {
|
||||
protected:
|
||||
const RegionContainer drmQueryRegions;
|
||||
|
||||
const drm_i915_memory_region_info &systemMemoryRegion;
|
||||
const MemoryRegion &systemMemoryRegion;
|
||||
|
||||
RegionContainer localMemoryRegions;
|
||||
};
|
||||
|
||||
@@ -15,12 +15,12 @@
|
||||
|
||||
namespace NEO {
|
||||
|
||||
MemoryInfo::MemoryInfo(const drm_i915_memory_region_info *regionInfo, size_t count)
|
||||
MemoryInfo::MemoryInfo(const MemoryRegion *regionInfo, size_t count)
|
||||
: drmQueryRegions(regionInfo, regionInfo + count), systemMemoryRegion(drmQueryRegions[0]) {
|
||||
UNRECOVERABLE_IF(systemMemoryRegion.region.memory_class != I915_MEMORY_CLASS_SYSTEM);
|
||||
UNRECOVERABLE_IF(systemMemoryRegion.region.memoryClass != I915_MEMORY_CLASS_SYSTEM);
|
||||
std::copy_if(drmQueryRegions.begin(), drmQueryRegions.end(), std::back_inserter(localMemoryRegions),
|
||||
[](const drm_i915_memory_region_info &memoryRegionInfo) {
|
||||
return (memoryRegionInfo.region.memory_class == I915_MEMORY_CLASS_DEVICE);
|
||||
[](const MemoryRegion &memoryRegionInfo) {
|
||||
return (memoryRegionInfo.region.memoryClass == I915_MEMORY_CLASS_DEVICE);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -146,7 +146,7 @@ class DrmMemoryManagerWithLocalMemoryFixture : public DrmMemoryManagerFixture {
|
||||
};
|
||||
|
||||
struct MockedMemoryInfo : public NEO::MemoryInfo {
|
||||
MockedMemoryInfo(const drm_i915_memory_region_info *regionInfo, size_t count) : MemoryInfo(regionInfo, count) {}
|
||||
MockedMemoryInfo(const MemoryRegion *regionInfo, size_t count) : MemoryInfo(regionInfo, count) {}
|
||||
~MockedMemoryInfo() override{};
|
||||
|
||||
size_t getMemoryRegionSize(uint32_t memoryBank) override {
|
||||
@@ -191,11 +191,11 @@ class DrmMemoryManagerFixtureWithoutQuietIoctlExpectation {
|
||||
i++;
|
||||
}
|
||||
mock = static_cast<DrmMockCustom *>(executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->osInterface->getDriverModel()->as<Drm>());
|
||||
drm_i915_memory_region_info regionInfo[2] = {};
|
||||
MemoryRegion regionInfo[2] = {};
|
||||
regionInfo[0].region = {I915_MEMORY_CLASS_SYSTEM, 0};
|
||||
regionInfo[0].probed_size = 8 * GB;
|
||||
regionInfo[0].probedSize = 8 * GB;
|
||||
regionInfo[1].region = {I915_MEMORY_CLASS_DEVICE, 0};
|
||||
regionInfo[1].probed_size = 16 * GB;
|
||||
regionInfo[1].probedSize = 16 * GB;
|
||||
mock->memoryInfo.reset(new MockedMemoryInfo(regionInfo, 2));
|
||||
executionEnvironment->rootDeviceEnvironments[0]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*mock, 0u);
|
||||
memoryManager.reset(new TestedDrmMemoryManager(enableLocalMem, false, false, *executionEnvironment));
|
||||
|
||||
Reference in New Issue
Block a user