Enable xe_hp_sdv i915 config

Related-To: NEO-6149

Source location of Linux kernel DRM/i915 interface headers:
9641c49adb


Signed-off-by: Szymon Morek <szymon.morek@intel.com>
This commit is contained in:
Szymon Morek
2021-09-06 11:12:39 +00:00
committed by Compute-Runtime-Automation
parent 90bf2b29cc
commit d1e38d2370
35 changed files with 6771 additions and 250 deletions

View File

@@ -0,0 +1,18 @@
#
# Copyright (C) 2021 Intel Corporation
#
# SPDX-License-Identifier: MIT
#
if(SUPPORT_DG1 AND "${BRANCH_TYPE}" STREQUAL "")
set(NEO_CORE_OS_INTERFACE_LINUX_LOCAL_DG1
${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt
${CMAKE_CURRENT_SOURCE_DIR}/local_memory_helper_dg1.cpp
${CMAKE_CURRENT_SOURCE_DIR}/drm_tip_helper.cpp
)
set(CORE_SRCS_LINK_LINUX_LOCAL_DG1
${CMAKE_CURRENT_SOURCE_DIR}/enable_local_memory_helper_dg1.cpp
)
set_property(GLOBAL APPEND PROPERTY NEO_CORE_OS_INTERFACE_LINUX ${NEO_CORE_OS_INTERFACE_LINUX_LOCAL_DG1})
set_property(GLOBAL APPEND PROPERTY NEO_CORE_SRCS_LINK ${CORE_SRCS_LINK_LINUX_LOCAL_DG1})
endif()

View File

@@ -0,0 +1,60 @@
/*
* Copyright (C) 2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/os_interface/linux/local_memory_helper.h"
#include "third_party/uapi/drm_tip/drm/i915_drm.h"
#include <memory>
namespace NEO {
uint32_t createGemExtMemoryRegions(Drm *drm, void *data, uint32_t dataSize, size_t allocSize, uint32_t &handle) {
drm_i915_gem_create_ext_memory_regions extRegions{};
extRegions.base.name = I915_GEM_CREATE_EXT_MEMORY_REGIONS;
extRegions.num_regions = dataSize;
extRegions.regions = reinterpret_cast<uintptr_t>(data);
drm_i915_gem_create_ext createExt{};
createExt.size = allocSize;
createExt.extensions = reinterpret_cast<uintptr_t>(&extRegions);
auto ret = LocalMemoryHelper::ioctl(drm, DRM_IOCTL_I915_GEM_CREATE_EXT, &createExt);
handle = createExt.handle;
return ret;
}
bool isQueryDrmTip(uint8_t *dataQuery, int32_t length) {
auto dataOnDrmTip = reinterpret_cast<drm_i915_query_memory_regions *>(dataQuery);
auto lengthOnDrmTip = static_cast<int32_t>(sizeof(drm_i915_query_memory_regions) + dataOnDrmTip->num_regions * sizeof(drm_i915_memory_region_info));
return length == lengthOnDrmTip;
}
namespace DG1_INTERNAL {
#undef DRM_IOCTL_I915_GEM_CREATE_EXT
#undef __I915_EXEC_UNKNOWN_FLAGS
#include "third_party/uapi/dg1/drm/i915_drm.h"
} // namespace DG1_INTERNAL
std::unique_ptr<uint8_t[]> translateToDrmTip(uint8_t *dataQuery, int32_t &length) {
auto dataOnInternalDrm = reinterpret_cast<DG1_INTERNAL::drm_i915_query_memory_regions *>(dataQuery);
auto lengthTranslated = static_cast<int32_t>(sizeof(drm_i915_query_memory_regions) + dataOnInternalDrm->num_regions * sizeof(drm_i915_memory_region_info));
auto dataQueryTranslated = std::make_unique<uint8_t[]>(lengthTranslated);
auto dataTranslated = reinterpret_cast<drm_i915_query_memory_regions *>(dataQueryTranslated.get());
dataTranslated->num_regions = dataOnInternalDrm->num_regions;
for (uint32_t i = 0; i < dataTranslated->num_regions; i++) {
dataTranslated->regions[i].region.memory_class = dataOnInternalDrm->regions[i].region.memory_class;
dataTranslated->regions[i].region.memory_instance = dataOnInternalDrm->regions[i].region.memory_instance;
dataTranslated->regions[i].probed_size = dataOnInternalDrm->regions[i].probed_size;
dataTranslated->regions[i].unallocated_size = dataOnInternalDrm->regions[i].unallocated_size;
}
length = lengthTranslated;
return dataQueryTranslated;
}
} // namespace NEO

View File

@@ -0,0 +1,14 @@
/*
* Copyright (C) 2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/os_interface/linux/local_memory_helper.h"
namespace NEO {
static EnableProductLocalMemoryHelper<IGFX_DG1> enableLocalMemHelperDG1;
} // namespace NEO

View File

@@ -0,0 +1,68 @@
/*
* Copyright (C) 2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/debug_settings/debug_settings_manager.h"
#include "shared/source/os_interface/linux/local_memory_helper.h"
#include "third_party/uapi/dg1/drm/i915_drm.h"
namespace NEO {
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);
template <>
uint32_t LocalMemoryHelperImpl<gfxProduct>::createGemExt(Drm *drm, void *data, uint32_t dataSize, size_t allocSize, uint32_t &handle) {
printDebugString(DebugManager.flags.PrintBOCreateDestroyResult.get(), stdout, "Performing GEM_CREATE_EXT with { size: %lu", allocSize);
if (DebugManager.flags.PrintBOCreateDestroyResult.get()) {
for (uint32_t i = 0; i < dataSize; i++) {
auto region = reinterpret_cast<drm_i915_gem_memory_class_instance *>(data)[i];
printDebugString(DebugManager.flags.PrintBOCreateDestroyResult.get(), stdout, ", memory class: %d, memory instance: %d",
region.memory_class, region.memory_instance);
}
printDebugString(DebugManager.flags.PrintBOCreateDestroyResult.get(), stdout, "%s", " }\n");
}
if (createGemExtMemoryRegions(drm, data, dataSize, allocSize, handle) == 0) {
printDebugString(DebugManager.flags.PrintBOCreateDestroyResult.get(), stdout, "GEM_CREATE_EXT with EXT_MEMORY_REGIONS has returned: %d BO-%u with size: %lu\n", 0, handle, allocSize);
return 0;
}
handle = 0u;
drm_i915_gem_object_param regionParam{};
regionParam.size = dataSize;
regionParam.data = reinterpret_cast<uintptr_t>(data);
regionParam.param = I915_OBJECT_PARAM | I915_PARAM_MEMORY_REGIONS;
drm_i915_gem_create_ext_setparam setparamRegion{};
setparamRegion.base.name = I915_GEM_CREATE_EXT_SETPARAM;
setparamRegion.param = regionParam;
drm_i915_gem_create_ext createExt{};
createExt.size = allocSize;
createExt.extensions = reinterpret_cast<uintptr_t>(&setparamRegion);
auto ret = LocalMemoryHelper::ioctl(drm, DRM_IOCTL_I915_GEM_CREATE_EXT, &createExt);
handle = createExt.handle;
printDebugString(DebugManager.flags.PrintBOCreateDestroyResult.get(), stdout, "GEM_CREATE_EXT with EXT_SETPARAM has returned: %d BO-%u with size: %lu\n", ret, createExt.handle, createExt.size);
return ret;
}
template <>
std::unique_ptr<uint8_t[]> LocalMemoryHelperImpl<gfxProduct>::translateIfRequired(uint8_t *dataQuery, int32_t length) {
if (isQueryDrmTip(dataQuery, length)) {
return std::unique_ptr<uint8_t[]>(dataQuery);
}
auto data = std::unique_ptr<uint8_t[]>(dataQuery);
return translateToDrmTip(data.get(), length);
}
} // namespace NEO