sysman: fix firmware device enumeration in firmware Utils

firmware Utils was always enumerating the same firmware
device handle for all sysman devices.

Related-To:LOCI-2609

Signed-off-by: T J Vivek Vilvaraj <t.j.vivek.vilvaraj@intel.com>
This commit is contained in:
T J Vivek Vilvaraj
2021-10-03 12:55:19 +00:00
committed by Compute-Runtime-Automation
parent 091b3ac4f6
commit f27f430429
6 changed files with 39 additions and 18 deletions

View File

@@ -23,7 +23,7 @@ typedef struct igsc_device_info {
namespace L0 {
class FirmwareUtil {
public:
static FirmwareUtil *create();
static FirmwareUtil *create(const std::string &pciBDF);
virtual ze_result_t fwDeviceInit() = 0;
virtual ze_result_t getFirstDevice(igsc_device_info *) = 0;
virtual ze_result_t fwGetVersion(std::string &fwVersion) = 0;

View File

@@ -68,13 +68,23 @@ ze_result_t FirmwareUtilImp::getFirstDevice(igsc_device_info *info) {
}
info->name[0] = '\0';
ret = deviceItreatorNext(iter, info);
if (ret == IGSC_SUCCESS) {
deviceItreatorDestroy(iter);
return ZE_RESULT_SUCCESS;
}
do {
ret = deviceItreatorNext(iter, info);
if (ret != IGSC_SUCCESS) {
deviceItreatorDestroy(iter);
return ZE_RESULT_ERROR_UNINITIALIZED;
}
if (info->domain == domain &&
info->bus == bus &&
info->dev == device &&
info->func == function) {
fwDevicePath.assign(info->name);
break;
}
} while (1);
deviceItreatorDestroy(iter);
return ZE_RESULT_ERROR_UNKNOWN;
return ZE_RESULT_SUCCESS;
}
ze_result_t FirmwareUtilImp::fwDeviceInit() {
@@ -84,8 +94,6 @@ ze_result_t FirmwareUtilImp::fwDeviceInit() {
if (result != ZE_RESULT_SUCCESS) {
return result;
}
fwDevicePath.assign(info.name);
ret = deviceInitByDevice(&fwDeviceHandle, fwDevicePath.c_str());
if (ret != 0) {
return ZE_RESULT_ERROR_UNINITIALIZED;
@@ -164,7 +172,9 @@ ze_result_t FirmwareUtilImp::fwFlashOprom(void *pImage, uint32_t size) {
return ZE_RESULT_SUCCESS;
}
FirmwareUtilImp::FirmwareUtilImp(){};
FirmwareUtilImp::FirmwareUtilImp(const std::string &pciBDF) {
sscanf(pciBDF.c_str(), "%04" SCNx16 ":%02" SCNx8 ":%02" SCNx8 ".%" SCNx8, &domain, &bus, &device, &function);
};
FirmwareUtilImp::~FirmwareUtilImp() {
if (nullptr != libraryHandle) {
@@ -173,8 +183,8 @@ FirmwareUtilImp::~FirmwareUtilImp() {
}
};
FirmwareUtil *FirmwareUtil::create() {
FirmwareUtilImp *pFwUtilImp = new FirmwareUtilImp();
FirmwareUtil *FirmwareUtil::create(const std::string &pciBDF) {
FirmwareUtilImp *pFwUtilImp = new FirmwareUtilImp(pciBDF);
UNRECOVERABLE_IF(nullptr == pFwUtilImp);
pFwUtilImp->libraryHandle = NEO::OsLibrary::load(fwUtilLibraryFile);
if (pFwUtilImp->libraryHandle == nullptr || pFwUtilImp->loadEntryPoints() == false) {

View File

@@ -12,6 +12,7 @@
#include "level_zero/core/source/device/device.h"
#include "level_zero/tools/source/sysman/linux/firmware_util/firmware_util.h"
#include <cinttypes>
#include <string>
#include <vector>
@@ -59,7 +60,7 @@ extern pIgscDeviceOpromVersion deviceOpromVersion;
class FirmwareUtilImp : public FirmwareUtil, NEO::NonCopyableOrMovableClass {
public:
FirmwareUtilImp();
FirmwareUtilImp(const std::string &pciBDF);
~FirmwareUtilImp();
ze_result_t fwDeviceInit() override;
ze_result_t getFirstDevice(igsc_device_info *) override;
@@ -79,5 +80,11 @@ class FirmwareUtilImp : public FirmwareUtil, NEO::NonCopyableOrMovableClass {
bool loadEntryPoints();
NEO::OsLibrary *libraryHandle = nullptr;
private:
uint16_t domain = 0;
uint8_t bus = 0;
uint8_t device = 0;
uint8_t function = 0;
};
} // namespace L0
} // namespace L0

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020 Intel Corporation
* Copyright (C) 2020-2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -7,7 +7,7 @@
#include "level_zero/tools/source/sysman/linux/firmware_util/firmware_util.h"
namespace L0 {
FirmwareUtil *FirmwareUtil::create() {
FirmwareUtil *FirmwareUtil::create(const std::string &pciBDF) {
return nullptr;
}
} // namespace L0

View File

@@ -12,7 +12,6 @@
namespace L0 {
ze_result_t LinuxSysmanImp::init() {
pFwUtilInterface = FirmwareUtil::create();
pFsAccess = FsAccess::create();
DEBUG_BREAK_IF(nullptr == pFsAccess);
@@ -49,7 +48,11 @@ ze_result_t LinuxSysmanImp::init() {
PlatformMonitoringTech::create(pParentSysmanDeviceImp->deviceHandles, pFsAccess, rootPciPathOfGpuDevice, mapOfSubDeviceIdToPmtObject);
pPmuInterface = PmuInterface::create(this);
DEBUG_BREAK_IF(nullptr == pPmuInterface);
auto loc = realRootPath.find_last_of('/');
std::string pciBDF = realRootPath.substr(loc + 1, std::string::npos);
pFwUtilInterface = FirmwareUtil::create(pciBDF);
return ZE_RESULT_SUCCESS;
}