From f27f430429f2790597566bb8c4fe2ca76b2e9c55 Mon Sep 17 00:00:00 2001 From: T J Vivek Vilvaraj Date: Sun, 3 Oct 2021 12:55:19 +0000 Subject: [PATCH] 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 --- .../linux/firmware_util/firmware_util.h | 2 +- .../linux/firmware_util/firmware_util_imp.cpp | 32 ++++++++++++------- .../linux/firmware_util/firmware_util_imp.h | 11 +++++-- .../firmware_util/firmware_util_imp_stub.cpp | 4 +-- .../source/sysman/linux/os_sysman_imp.cpp | 5 ++- .../sources/sysman/linux/test_sysman.cpp | 3 +- 6 files changed, 39 insertions(+), 18 deletions(-) diff --git a/level_zero/tools/source/sysman/linux/firmware_util/firmware_util.h b/level_zero/tools/source/sysman/linux/firmware_util/firmware_util.h index d63eeb5ebe..569b5a70aa 100644 --- a/level_zero/tools/source/sysman/linux/firmware_util/firmware_util.h +++ b/level_zero/tools/source/sysman/linux/firmware_util/firmware_util.h @@ -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; diff --git a/level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp.cpp b/level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp.cpp index e8f04d004a..f336cc224c 100644 --- a/level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp.cpp +++ b/level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp.cpp @@ -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) { diff --git a/level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp.h b/level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp.h index 014b645135..9efc30722a 100644 --- a/level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp.h +++ b/level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp.h @@ -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 #include #include @@ -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 \ No newline at end of file +} // namespace L0 diff --git a/level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp_stub.cpp b/level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp_stub.cpp index 8d550b824a..88d7034577 100644 --- a/level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp_stub.cpp +++ b/level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp_stub.cpp @@ -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 diff --git a/level_zero/tools/source/sysman/linux/os_sysman_imp.cpp b/level_zero/tools/source/sysman/linux/os_sysman_imp.cpp index 9929780848..ce54802544 100644 --- a/level_zero/tools/source/sysman/linux/os_sysman_imp.cpp +++ b/level_zero/tools/source/sysman/linux/os_sysman_imp.cpp @@ -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; } diff --git a/level_zero/tools/test/unit_tests/sources/sysman/linux/test_sysman.cpp b/level_zero/tools/test/unit_tests/sources/sysman/linux/test_sysman.cpp index 0f9916adfa..93ec187fee 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/linux/test_sysman.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/linux/test_sysman.cpp @@ -294,7 +294,8 @@ TEST_F(SysmanDeviceFixture, GivenFwUtilInterfaceHandleWhenCallinggetFwUtilInterf delete pLinuxSysmanImp->pFwUtilInterface; pLinuxSysmanImp->pFwUtilInterface = nullptr; } - pLinuxSysmanImp->pFwUtilInterface = FirmwareUtil::create(); + const std::string mockBdf = "0000:00:02.0"; + pLinuxSysmanImp->pFwUtilInterface = FirmwareUtil::create(mockBdf); EXPECT_EQ(pLinuxSysmanImp->getFwUtilInterface(), pLinuxSysmanImp->pFwUtilInterface); }