mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-05 09:09:04 +08:00
Use common definition of UUID for Intel GPUs
This patch will eventaully allow matching UUIDs queried from NEO with UUIDs queried from other GPU APIs implementations for Intel GPUs Signed-off-by: Kamil Diedrich <kamil.diedrich@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
200734892b
commit
ad579be87c
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2018-2022 Intel Corporation
|
||||
* Copyright (C) 2018-2023 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
@@ -740,13 +740,47 @@ bool Device::getUuid(std::array<uint8_t, ProductHelper::uuidSize> &uuid) {
|
||||
|
||||
bool Device::generateUuidFromPciBusInfo(const PhysicalDevicePciBusInfo &pciBusInfo, std::array<uint8_t, ProductHelper::uuidSize> &uuid) {
|
||||
if (pciBusInfo.pciDomain != PhysicalDevicePciBusInfo::invalidValue) {
|
||||
|
||||
uuid.fill(0);
|
||||
memcpy_s(&uuid[0], 2, &pciBusInfo.pciDomain, 2);
|
||||
memcpy_s(&uuid[2], 1, &pciBusInfo.pciBus, 1);
|
||||
memcpy_s(&uuid[3], 1, &pciBusInfo.pciDevice, 1);
|
||||
memcpy_s(&uuid[4], 1, &pciBusInfo.pciFunction, 1);
|
||||
uuid[ProductHelper::uuidSize - 1] = isSubDevice() ? static_cast<SubDevice *>(this)->getSubDeviceIndex() + 1 : 0;
|
||||
|
||||
/* Device UUID uniquely identifies a device within a system.
|
||||
* We generate it based on device information along with PCI information
|
||||
* This guarantees uniqueness of UUIDs on a system even when multiple
|
||||
* identical Intel GPUs are present.
|
||||
*/
|
||||
|
||||
/* We want to have UUID matching between different GPU APIs (including outside
|
||||
* of compute_runtime project - i.e. other than L0 or OCL). This structure definition
|
||||
* has been agreed upon by various Intel driver teams.
|
||||
*
|
||||
* Consult other driver teams before changing this.
|
||||
*/
|
||||
|
||||
struct device_uuid {
|
||||
uint16_t vendor_id;
|
||||
uint16_t device_id;
|
||||
uint16_t revision_id;
|
||||
uint16_t pci_domain;
|
||||
uint8_t pci_bus;
|
||||
uint8_t pci_dev;
|
||||
uint8_t pci_func;
|
||||
uint8_t reserved[4];
|
||||
uint8_t sub_device_id;
|
||||
};
|
||||
|
||||
device_uuid deviceUUID = {};
|
||||
deviceUUID.vendor_id = 0x8086; // Intel
|
||||
deviceUUID.device_id = getHardwareInfo().platform.usDeviceID;
|
||||
deviceUUID.revision_id = getHardwareInfo().platform.usRevId;
|
||||
deviceUUID.pci_domain = static_cast<uint16_t>(pciBusInfo.pciDomain);
|
||||
deviceUUID.pci_bus = static_cast<uint8_t>(pciBusInfo.pciBus);
|
||||
deviceUUID.pci_dev = static_cast<uint8_t>(pciBusInfo.pciDevice);
|
||||
deviceUUID.pci_func = static_cast<uint8_t>(pciBusInfo.pciFunction);
|
||||
deviceUUID.sub_device_id = isSubDevice() ? static_cast<SubDevice *>(this)->getSubDeviceIndex() + 1 : 0;
|
||||
|
||||
static_assert(sizeof(device_uuid) == ProductHelper::uuidSize);
|
||||
|
||||
memcpy_s(uuid.data(), ProductHelper::uuidSize, &deviceUUID, sizeof(device_uuid));
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -57,12 +57,14 @@ class MockDevice : public RootDevice {
|
||||
using Device::engineInstanced;
|
||||
using Device::engineInstancedType;
|
||||
using Device::executionEnvironment;
|
||||
using Device::generateUuidFromPciBusInfo;
|
||||
using Device::getGlobalMemorySize;
|
||||
using Device::initializeCaps;
|
||||
using Device::isDebuggerActive;
|
||||
using Device::regularEngineGroups;
|
||||
using Device::rootCsrCreated;
|
||||
using Device::rtMemoryBackedBuffer;
|
||||
using Device::uuid;
|
||||
using RootDevice::createEngines;
|
||||
using RootDevice::defaultEngineIndex;
|
||||
using RootDevice::getDeviceBitfield;
|
||||
|
||||
@@ -149,6 +149,33 @@ TEST_F(DeviceTest, GivenDeviceWhenGenerateUuidThenValidValuesAreSet) {
|
||||
EXPECT_EQ(memcmp(&uuid, &expectedUuid, ProductHelper::uuidSize), 0);
|
||||
}
|
||||
|
||||
TEST_F(DeviceTest, GivenDeviceWhenGenerateUuidFromPciBusInfoThenValidValuesAreSet) {
|
||||
std::array<uint8_t, ProductHelper::uuidSize> uuid, expectedUuid;
|
||||
|
||||
PhysicalDevicePciBusInfo pciBusInfo = {1, 1, 1, 1};
|
||||
|
||||
pDevice->generateUuidFromPciBusInfo(pciBusInfo, uuid);
|
||||
|
||||
expectedUuid.fill(0);
|
||||
uint16_t vendorId = 0x8086; // Intel
|
||||
uint16_t deviceId = static_cast<uint16_t>(pDevice->getHardwareInfo().platform.usDeviceID);
|
||||
uint16_t revisionId = static_cast<uint16_t>(pDevice->getHardwareInfo().platform.usRevId);
|
||||
uint16_t pciDomain = static_cast<uint16_t>(pciBusInfo.pciDomain);
|
||||
uint8_t pciBus = static_cast<uint8_t>(pciBusInfo.pciBus);
|
||||
uint8_t pciDevice = static_cast<uint8_t>(pciBusInfo.pciDevice);
|
||||
uint8_t pciFunction = static_cast<uint8_t>(pciBusInfo.pciFunction);
|
||||
|
||||
memcpy_s(&expectedUuid[0], sizeof(uint16_t), &vendorId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[2], sizeof(uint16_t), &deviceId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[4], sizeof(uint16_t), &revisionId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[6], sizeof(uint16_t), &pciDomain, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[8], sizeof(uint8_t), &pciBus, sizeof(uint8_t));
|
||||
memcpy_s(&expectedUuid[9], sizeof(uint8_t), &pciDevice, sizeof(uint8_t));
|
||||
memcpy_s(&expectedUuid[10], sizeof(uint8_t), &pciFunction, sizeof(uint8_t));
|
||||
|
||||
EXPECT_EQ(memcmp(&uuid, &expectedUuid, ProductHelper::uuidSize), 0);
|
||||
}
|
||||
|
||||
using DeviceGetCapsTest = Test<DeviceFixture>;
|
||||
|
||||
TEST_F(DeviceGetCapsTest, givenMockCompilerInterfaceWhenInitializeCapsIsCalledThenMaxParameterSizeIsSetCorrectly) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2022 Intel Corporation
|
||||
* Copyright (C) 2022-2023 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
@@ -49,11 +49,24 @@ HWTEST2_F(MultipleDeviceBdfUuidTest, GivenValidBdfWithCombinationOfAffinityMaskT
|
||||
PhysicalDevicePciBusInfo pciBusInfo(0x00, 0x34, 0xab, 0xcd);
|
||||
const auto deviceFactory = createDevices(pciBusInfo, 4);
|
||||
|
||||
std::array<uint8_t, 16> uuid;
|
||||
uint8_t expectedUuid[16] = {0x00, 0x00, 0x34, 0xab,
|
||||
0xcd, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0};
|
||||
std::array<uint8_t, NEO::ProductHelper::uuidSize> uuid;
|
||||
uint8_t expectedUuid[NEO::ProductHelper::uuidSize] = {};
|
||||
|
||||
uint16_t vendorId = 0x8086; // Intel
|
||||
uint16_t deviceId = static_cast<uint16_t>(deviceFactory->rootDevices[0]->getHardwareInfo().platform.usDeviceID);
|
||||
uint16_t revisionId = static_cast<uint16_t>(deviceFactory->rootDevices[0]->getHardwareInfo().platform.usRevId);
|
||||
uint16_t pciDomain = static_cast<uint16_t>(pciBusInfo.pciDomain);
|
||||
uint8_t pciBus = static_cast<uint8_t>(pciBusInfo.pciBus);
|
||||
uint8_t pciDevice = static_cast<uint8_t>(pciBusInfo.pciDevice);
|
||||
uint8_t pciFunction = static_cast<uint8_t>(pciBusInfo.pciFunction);
|
||||
|
||||
memcpy_s(&expectedUuid[0], sizeof(uint16_t), &vendorId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[2], sizeof(uint16_t), &deviceId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[4], sizeof(uint16_t), &revisionId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[6], sizeof(uint16_t), &pciDomain, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[8], sizeof(uint8_t), &pciBus, sizeof(uint8_t));
|
||||
memcpy_s(&expectedUuid[9], sizeof(uint8_t), &pciDevice, sizeof(uint8_t));
|
||||
memcpy_s(&expectedUuid[10], sizeof(uint8_t), &pciFunction, sizeof(uint8_t));
|
||||
|
||||
EXPECT_EQ(true, deviceFactory->rootDevices[0]->getUuid(uuid));
|
||||
EXPECT_TRUE(0 == std::memcmp(uuid.data(), expectedUuid, sizeof(expectedUuid)));
|
||||
@@ -83,14 +96,27 @@ HWTEST2_F(MultipleDeviceBdfUuidTest, GivenDefaultAffinityMaskWhenRetrievingDevic
|
||||
VariableBackup<ProductHelper *> backupProductHelper(&productHelperFactory[productFamily], mockProductHelper.get());
|
||||
std::array<uint8_t, 16> uuid;
|
||||
const uint32_t numSubDevices = 2;
|
||||
uint8_t expectedUuid[16] = {0xad, 0x54, 0x34, 0xab,
|
||||
0xcd, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0};
|
||||
uint8_t expectedUuid[NEO::ProductHelper::uuidSize] = {};
|
||||
DebugManager.flags.ZE_AFFINITY_MASK.set("default");
|
||||
PhysicalDevicePciBusInfo pciBusInfo(0x54ad, 0x34, 0xab, 0xcd);
|
||||
const auto deviceFactory = createDevices(pciBusInfo, numSubDevices);
|
||||
|
||||
uint16_t vendorId = 0x8086; // Intel
|
||||
uint16_t deviceId = static_cast<uint16_t>(deviceFactory->rootDevices[0]->getHardwareInfo().platform.usDeviceID);
|
||||
uint16_t revisionId = static_cast<uint16_t>(deviceFactory->rootDevices[0]->getHardwareInfo().platform.usRevId);
|
||||
uint16_t pciDomain = static_cast<uint16_t>(pciBusInfo.pciDomain);
|
||||
uint8_t pciBus = static_cast<uint8_t>(pciBusInfo.pciBus);
|
||||
uint8_t pciDevice = static_cast<uint8_t>(pciBusInfo.pciDevice);
|
||||
uint8_t pciFunction = static_cast<uint8_t>(pciBusInfo.pciFunction);
|
||||
|
||||
memcpy_s(&expectedUuid[0], sizeof(uint16_t), &vendorId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[2], sizeof(uint16_t), &deviceId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[4], sizeof(uint16_t), &revisionId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[6], sizeof(uint16_t), &pciDomain, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[8], sizeof(uint8_t), &pciBus, sizeof(uint8_t));
|
||||
memcpy_s(&expectedUuid[9], sizeof(uint8_t), &pciDevice, sizeof(uint8_t));
|
||||
memcpy_s(&expectedUuid[10], sizeof(uint8_t), &pciFunction, sizeof(uint8_t));
|
||||
|
||||
EXPECT_EQ(true, deviceFactory->rootDevices[0]->getUuid(uuid));
|
||||
EXPECT_TRUE(0 == std::memcmp(uuid.data(), expectedUuid, sizeof(expectedUuid)));
|
||||
|
||||
@@ -120,16 +146,30 @@ HWTEST2_F(MultipleDeviceBdfUuidTest, GivenNoSubDevicesInAffinityMaskwhenRetrievi
|
||||
|
||||
setupMockProductHelper<productFamily>();
|
||||
VariableBackup<ProductHelper *> backupProductHelper(&productHelperFactory[productFamily], mockProductHelper.get());
|
||||
std::array<uint8_t, 16> uuid;
|
||||
uint8_t expectedUuid[16] = {0x00, 0x00, 0x34, 0xab,
|
||||
0xcd, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0};
|
||||
std::array<uint8_t, NEO::ProductHelper::uuidSize> uuid{};
|
||||
uint8_t expectedUuid[NEO::ProductHelper::uuidSize] = {};
|
||||
|
||||
PhysicalDevicePciBusInfo pciBusInfo(0x00, 0x34, 0xab, 0xcd);
|
||||
|
||||
DebugManager.flags.ZE_AFFINITY_MASK.set("0");
|
||||
PhysicalDevicePciBusInfo pciBusInfo(0x00, 0x34, 0xab, 0xcd);
|
||||
const auto deviceFactory = createDevices(pciBusInfo, 2);
|
||||
|
||||
uint16_t vendorId = 0x8086; // Intel
|
||||
uint16_t deviceId = static_cast<uint16_t>(deviceFactory->rootDevices[0]->getHardwareInfo().platform.usDeviceID);
|
||||
uint16_t revisionId = static_cast<uint16_t>(deviceFactory->rootDevices[0]->getHardwareInfo().platform.usRevId);
|
||||
uint16_t pciDomain = static_cast<uint16_t>(pciBusInfo.pciDomain);
|
||||
uint8_t pciBus = static_cast<uint8_t>(pciBusInfo.pciBus);
|
||||
uint8_t pciDevice = static_cast<uint8_t>(pciBusInfo.pciDevice);
|
||||
uint8_t pciFunction = static_cast<uint8_t>(pciBusInfo.pciFunction);
|
||||
|
||||
memcpy_s(&expectedUuid[0], sizeof(uint16_t), &vendorId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[2], sizeof(uint16_t), &deviceId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[4], sizeof(uint16_t), &revisionId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[6], sizeof(uint16_t), &pciDomain, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[8], sizeof(uint8_t), &pciBus, sizeof(uint8_t));
|
||||
memcpy_s(&expectedUuid[9], sizeof(uint8_t), &pciDevice, sizeof(uint8_t));
|
||||
memcpy_s(&expectedUuid[10], sizeof(uint8_t), &pciFunction, sizeof(uint8_t));
|
||||
|
||||
EXPECT_EQ(true, deviceFactory->rootDevices[0]->getUuid(uuid));
|
||||
EXPECT_TRUE(0 == std::memcmp(uuid.data(), expectedUuid, sizeof(expectedUuid)));
|
||||
}
|
||||
@@ -142,11 +182,24 @@ HWTEST2_F(MultipleDeviceBdfUuidTest, GivenValidBdfWithOneBitEnabledInAffinityMas
|
||||
PhysicalDevicePciBusInfo pciBusInfo(0x00, 0x34, 0xab, 0xcd);
|
||||
const auto deviceFactory = createDevices(pciBusInfo, 4);
|
||||
|
||||
std::array<uint8_t, 16> uuid;
|
||||
uint8_t expectedUuid[16] = {0x00, 0x00, 0x34, 0xab,
|
||||
0xcd, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0};
|
||||
std::array<uint8_t, NEO::ProductHelper::uuidSize> uuid;
|
||||
uint8_t expectedUuid[NEO::ProductHelper::uuidSize] = {};
|
||||
|
||||
uint16_t vendorId = 0x8086; // Intel
|
||||
uint16_t deviceId = static_cast<uint16_t>(deviceFactory->rootDevices[0]->getHardwareInfo().platform.usDeviceID);
|
||||
uint16_t revisionId = static_cast<uint16_t>(deviceFactory->rootDevices[0]->getHardwareInfo().platform.usRevId);
|
||||
uint16_t pciDomain = static_cast<uint16_t>(pciBusInfo.pciDomain);
|
||||
uint8_t pciBus = static_cast<uint8_t>(pciBusInfo.pciBus);
|
||||
uint8_t pciDevice = static_cast<uint8_t>(pciBusInfo.pciDevice);
|
||||
uint8_t pciFunction = static_cast<uint8_t>(pciBusInfo.pciFunction);
|
||||
|
||||
memcpy_s(&expectedUuid[0], sizeof(uint16_t), &vendorId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[2], sizeof(uint16_t), &deviceId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[4], sizeof(uint16_t), &revisionId, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[6], sizeof(uint16_t), &pciDomain, sizeof(uint16_t));
|
||||
memcpy_s(&expectedUuid[8], sizeof(uint8_t), &pciBus, sizeof(uint8_t));
|
||||
memcpy_s(&expectedUuid[9], sizeof(uint8_t), &pciDevice, sizeof(uint8_t));
|
||||
memcpy_s(&expectedUuid[10], sizeof(uint8_t), &pciFunction, sizeof(uint8_t));
|
||||
|
||||
EXPECT_EQ(true, deviceFactory->rootDevices[0]->getUuid(uuid));
|
||||
expectedUuid[15] = 4;
|
||||
|
||||
Reference in New Issue
Block a user