Skip to content

Commit 31a04b4

Browse files
sysman: add support to handle multiple firmwares
Signed-off-by: T J Vivek Vilvaraj <t.j.vivek.vilvaraj@intel.com>
1 parent 718e414 commit 31a04b4

File tree

13 files changed

+304
-65
lines changed

13 files changed

+304
-65
lines changed

level_zero/tools/source/sysman/firmware/firmware.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,40 @@
11
/*
2-
* Copyright (C) 2020 Intel Corporation
2+
* Copyright (C) 2020-2021 Intel Corporation
33
*
44
* SPDX-License-Identifier: MIT
55
*
66
*/
77

8-
#include "firmware.h"
9-
108
#include "shared/source/helpers/basic_math.h"
119

12-
#include "firmware_imp.h"
10+
#include "level_zero/tools/source/sysman/firmware/firmware_imp.h"
1311

1412
namespace L0 {
15-
13+
class OsFirmware;
1614
FirmwareHandleContext::~FirmwareHandleContext() {
1715
for (Firmware *pFirmware : handleList) {
1816
delete pFirmware;
1917
}
2018
handleList.clear();
2119
}
2220

23-
void FirmwareHandleContext::init() {
24-
Firmware *pFirmware = new FirmwareImp(pOsSysman);
21+
void FirmwareHandleContext::createHandle(const std::string &fwType) {
22+
Firmware *pFirmware = new FirmwareImp(pOsSysman, fwType);
2523
if (pFirmware->isFirmwareEnabled == true) {
2624
handleList.push_back(pFirmware);
2725
} else {
2826
delete pFirmware;
2927
}
3028
}
3129

30+
void FirmwareHandleContext::init() {
31+
std::vector<std::string> supportedFwTypes = {};
32+
OsFirmware::getSupportedFwTypes(supportedFwTypes, pOsSysman);
33+
for (const std::string &fwType : supportedFwTypes) {
34+
createHandle(fwType);
35+
}
36+
}
37+
3238
ze_result_t FirmwareHandleContext::firmwareGet(uint32_t *pCount, zes_firmware_handle_t *phFirmware) {
3339
uint32_t handleListSize = static_cast<uint32_t>(handleList.size());
3440
uint32_t numToCopy = std::min(*pCount, handleListSize);

level_zero/tools/source/sysman/firmware/firmware.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#pragma once
99
#include <level_zero/zes_api.h>
1010

11+
#include <string>
1112
#include <vector>
1213

1314
struct _zes_firmware_handle_t {
@@ -42,6 +43,9 @@ struct FirmwareHandleContext {
4243

4344
OsSysman *pOsSysman = nullptr;
4445
std::vector<Firmware *> handleList = {};
46+
47+
private:
48+
void createHandle(const std::string &fwType);
4549
};
4650

4751
} // namespace L0

level_zero/tools/source/sysman/firmware/firmware_imp.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ namespace L0 {
1717

1818
ze_result_t FirmwareImp::firmwareGetProperties(zes_firmware_properties_t *pProperties) {
1919
pOsFirmware->osGetFwProperties(pProperties);
20+
strncpy_s(pProperties->name, ZES_STRING_PROPERTY_SIZE, fwType.c_str(), fwType.size());
2021
return ZE_RESULT_SUCCESS;
2122
}
2223

@@ -28,17 +29,14 @@ void FirmwareImp::init() {
2829
this->isFirmwareEnabled = pOsFirmware->isFirmwareSupported();
2930
}
3031

31-
FirmwareImp::FirmwareImp(OsSysman *pOsSysman) {
32-
pOsFirmware = OsFirmware::create(pOsSysman);
32+
FirmwareImp::FirmwareImp(OsSysman *pOsSysman, const std::string &initalizedFwType) {
33+
pOsFirmware = OsFirmware::create(pOsSysman, initalizedFwType);
34+
fwType = initalizedFwType;
3335
UNRECOVERABLE_IF(nullptr == pOsFirmware);
3436
init();
3537
}
3638

3739
FirmwareImp::~FirmwareImp() {
38-
if (pOsFirmware != nullptr) {
39-
delete pOsFirmware;
40-
pOsFirmware = nullptr;
41-
}
4240
}
4341

4442
} // namespace L0

level_zero/tools/source/sysman/firmware/firmware_imp.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@
77

88
#pragma once
99
#include "shared/source/helpers/non_copyable_or_moveable.h"
10+
#include "shared/source/helpers/string.h"
1011

12+
#include "level_zero/tools/source/sysman/firmware/firmware.h"
13+
#include "level_zero/tools/source/sysman/firmware/os_firmware.h"
1114
#include <level_zero/zes_api.h>
1215

13-
#include "firmware.h"
14-
1516
namespace L0 {
1617

1718
class OsFirmware;
@@ -21,9 +22,10 @@ class FirmwareImp : public Firmware, NEO::NonCopyableOrMovableClass {
2122
ze_result_t firmwareGetProperties(zes_firmware_properties_t *pProperties) override;
2223
ze_result_t firmwareFlash(void *pImage, uint32_t size) override;
2324
FirmwareImp() = default;
24-
FirmwareImp(OsSysman *pOsSysman);
25+
FirmwareImp(OsSysman *pOsSysman, const std::string &fwType);
2526
~FirmwareImp() override;
26-
OsFirmware *pOsFirmware = nullptr;
27+
std::unique_ptr<OsFirmware> pOsFirmware = nullptr;
28+
std::string fwType = "Unknown";
2729

2830
void init();
2931
};

level_zero/tools/source/sysman/firmware/linux/os_firmware_imp.cpp

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,77 @@
1111

1212
namespace L0 {
1313

14-
bool LinuxFirmwareImp::isFirmwareSupported(void) {
15-
if (pFwInterface != nullptr) {
16-
isFWInitalized = ((ZE_RESULT_SUCCESS == pFwInterface->fwDeviceInit()) ? true : false);
14+
static const std::string mtdDescriptor("/proc/mtd");
15+
16+
std::vector<std ::string> deviceSupportedFwTypes = {"GSC", "OptionROM"};
17+
18+
ze_result_t OsFirmware::getSupportedFwTypes(std::vector<std::string> &supportedFwTypes, OsSysman *pOsSysman) {
19+
LinuxSysmanImp *pLinuxSysmanImp = static_cast<LinuxSysmanImp *>(pOsSysman);
20+
21+
FsAccess *pFsAccess = &pLinuxSysmanImp->getFsAccess();
22+
std::vector<std::string> mtdDescriptorStrings;
23+
ze_result_t result = pFsAccess->read(mtdDescriptor, mtdDescriptorStrings);
24+
if (result != ZE_RESULT_SUCCESS) {
25+
return result;
1726
}
18-
return isFWInitalized;
27+
for (std::string readByteLine : mtdDescriptorStrings) {
28+
for (std::string fwType : deviceSupportedFwTypes) {
29+
if (std::string::npos != readByteLine.find(fwType)) {
30+
supportedFwTypes.push_back(fwType);
31+
}
32+
}
33+
}
34+
return ZE_RESULT_SUCCESS;
35+
}
36+
bool LinuxFirmwareImp::isFirmwareSupported(void) {
37+
isFWInitalized = ((ZE_RESULT_SUCCESS == pFwInterface->fwDeviceInit()) ? true : false);
38+
return this->isFWInitalized;
1939
}
2040

2141
void LinuxFirmwareImp::osGetFwProperties(zes_firmware_properties_t *pProperties) {
22-
if (isFWInitalized) {
23-
getFirmwareVersion(pProperties->name);
42+
if (osFwType == deviceSupportedFwTypes[0]) { //GSC
2443
getFirmwareVersion(pProperties->version);
25-
} else {
26-
strncpy_s(pProperties->name, ZES_STRING_PROPERTY_SIZE, unknown.c_str(), ZES_STRING_PROPERTY_SIZE);
27-
strncpy_s(pProperties->version, ZES_STRING_PROPERTY_SIZE, unknown.c_str(), ZES_STRING_PROPERTY_SIZE);
44+
}
45+
if (osFwType == deviceSupportedFwTypes[1]) { //oprom
46+
getOpromVersion(pProperties->version);
2847
}
2948
}
30-
3149
ze_result_t LinuxFirmwareImp::osFirmwareFlash(void *pImage, uint32_t size) {
32-
return pFwInterface->fwFlashGSC(pImage, size);
50+
if (osFwType == deviceSupportedFwTypes[0]) { //GSC
51+
return pFwInterface->fwFlashGSC(pImage, size);
52+
}
53+
if (osFwType == deviceSupportedFwTypes[1]) { //oprom
54+
return pFwInterface->fwFlashOprom(pImage, size);
55+
}
56+
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
3357
}
3458

3559
void LinuxFirmwareImp::getFirmwareVersion(char *firmwareVersion) {
3660
std::string fwVersion;
37-
pFwInterface->fwGetVersion(fwVersion);
38-
strncpy_s(firmwareVersion, ZES_STRING_PROPERTY_SIZE, fwVersion.c_str(), ZES_STRING_PROPERTY_SIZE);
61+
if (ZE_RESULT_SUCCESS == pFwInterface->fwGetVersion(fwVersion)) {
62+
strncpy_s(firmwareVersion, ZES_STRING_PROPERTY_SIZE, fwVersion.c_str(), ZES_STRING_PROPERTY_SIZE);
63+
} else {
64+
strncpy_s(firmwareVersion, ZES_STRING_PROPERTY_SIZE, unknown.c_str(), ZES_STRING_PROPERTY_SIZE);
65+
}
66+
}
67+
68+
void LinuxFirmwareImp::getOpromVersion(char *firmwareVersion) {
69+
std::string fwVersion;
70+
if (ZE_RESULT_SUCCESS == pFwInterface->opromGetVersion(fwVersion)) {
71+
strncpy_s(firmwareVersion, ZES_STRING_PROPERTY_SIZE, fwVersion.c_str(), ZES_STRING_PROPERTY_SIZE);
72+
} else {
73+
strncpy_s(firmwareVersion, ZES_STRING_PROPERTY_SIZE, unknown.c_str(), ZES_STRING_PROPERTY_SIZE);
74+
}
3975
}
4076

41-
LinuxFirmwareImp::LinuxFirmwareImp(OsSysman *pOsSysman) {
77+
LinuxFirmwareImp::LinuxFirmwareImp(OsSysman *pOsSysman, const std::string &fwType) : osFwType(fwType) {
4278
LinuxSysmanImp *pLinuxSysmanImp = static_cast<LinuxSysmanImp *>(pOsSysman);
4379
pFwInterface = pLinuxSysmanImp->getFwUtilInterface();
4480
}
4581

46-
OsFirmware *OsFirmware::create(OsSysman *pOsSysman) {
47-
LinuxFirmwareImp *pLinuxFirmwareImp = new LinuxFirmwareImp(pOsSysman);
48-
return static_cast<OsFirmware *>(pLinuxFirmwareImp);
82+
std::unique_ptr<OsFirmware> OsFirmware::create(OsSysman *pOsSysman, const std::string &fwType) {
83+
std::unique_ptr<LinuxFirmwareImp> pLinuxFirmwareImp = std::make_unique<LinuxFirmwareImp>(pOsSysman, fwType);
84+
return pLinuxFirmwareImp;
4985
}
5086

5187
} // namespace L0

level_zero/tools/source/sysman/firmware/linux/os_firmware_imp.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,17 @@ class LinuxFirmwareImp : public OsFirmware, NEO::NonCopyableOrMovableClass {
2020
void osGetFwProperties(zes_firmware_properties_t *pProperties) override;
2121
ze_result_t osFirmwareFlash(void *pImage, uint32_t size) override;
2222
LinuxFirmwareImp() = default;
23-
LinuxFirmwareImp(OsSysman *pOsSysman);
23+
LinuxFirmwareImp(OsSysman *pOsSysman, const std::string &fwType);
2424
~LinuxFirmwareImp() override = default;
2525

2626
protected:
2727
FirmwareUtil *pFwInterface = nullptr;
2828
bool isFWInitalized = false;
29+
std::string osFwType;
2930

3031
private:
3132
void getFirmwareVersion(char *);
33+
void getOpromVersion(char *);
3234
};
3335

3436
} // namespace L0

level_zero/tools/source/sysman/firmware/os_firmware.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,19 @@
1010
#include "level_zero/tools/source/sysman/os_sysman.h"
1111
#include <level_zero/zes_api.h>
1212

13+
#include <memory>
14+
#include <string>
15+
#include <vector>
16+
1317
namespace L0 {
1418

1519
class OsFirmware {
1620
public:
1721
virtual bool isFirmwareSupported(void) = 0;
1822
virtual void osGetFwProperties(zes_firmware_properties_t *pProperties) = 0;
1923
virtual ze_result_t osFirmwareFlash(void *pImage, uint32_t size) = 0;
20-
static OsFirmware *create(OsSysman *pOsSysman);
24+
static std::unique_ptr<OsFirmware> create(OsSysman *pOsSysman, const std::string &fwType);
25+
static ze_result_t getSupportedFwTypes(std::vector<std::string> &supportedFwTypes, OsSysman *pOsSysman);
2126
virtual ~OsFirmware() {}
2227
};
2328

level_zero/tools/source/sysman/firmware/windows/os_firmware_imp.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,13 @@ ze_result_t WddmFirmwareImp::osFirmwareFlash(void *pImage, uint32_t size) {
1818
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
1919
};
2020

21-
OsFirmware *OsFirmware::create(OsSysman *pOsSysman) {
22-
WddmFirmwareImp *pWddmFirmwareImp = new WddmFirmwareImp();
23-
return static_cast<OsFirmware *>(pWddmFirmwareImp);
21+
std::unique_ptr<OsFirmware> OsFirmware::create(OsSysman *pOsSysman, const std::string &fwType) {
22+
std::unique_ptr<WddmFirmwareImp> pWddmFirmwareImp = std::make_unique<WddmFirmwareImp>();
23+
return pWddmFirmwareImp;
24+
}
25+
26+
ze_result_t OsFirmware::getSupportedFwTypes(std::vector<std::string> &supportedFwTypes, OsSysman *pOsSysman) {
27+
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
2428
}
2529

2630
} // namespace L0

level_zero/tools/source/sysman/linux/firmware_util/firmware_util.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ class FirmwareUtil {
2727
virtual ze_result_t fwDeviceInit() = 0;
2828
virtual ze_result_t getFirstDevice(igsc_device_info *) = 0;
2929
virtual ze_result_t fwGetVersion(std::string &fwVersion) = 0;
30+
virtual ze_result_t opromGetVersion(std::string &fwVersion) = 0;
3031
virtual ze_result_t fwFlashGSC(void *pImage, uint32_t size) = 0;
32+
virtual ze_result_t fwFlashOprom(void *pImage, uint32_t size) = 0;
3133
virtual ~FirmwareUtil() = default;
3234
};
3335
} // namespace L0

level_zero/tools/source/sysman/linux/firmware_util/firmware_util_imp.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ const std::string FirmwareUtilImp::fwDeviceIteratorCreate = "igsc_device_iterato
1616
const std::string FirmwareUtilImp::fwDeviceIteratorNext = "igsc_device_iterator_next";
1717
const std::string FirmwareUtilImp::fwDeviceIteratorDestroy = "igsc_device_iterator_destroy";
1818
const std::string FirmwareUtilImp::fwDeviceFwUpdate = "igsc_device_fw_update";
19+
const std::string FirmwareUtilImp::fwImageOpromInit = "igsc_image_oprom_init";
20+
const std::string FirmwareUtilImp::fwImageOpromType = "igsc_image_oprom_type";
21+
const std::string FirmwareUtilImp::fwDeviceOpromUpdate = "igsc_device_oprom_update";
22+
const std::string FirmwareUtilImp::fwDeviceOpromVersion = "igsc_device_oprom_version";
1923

2024
template <class T>
2125
bool FirmwareUtilImp::getSymbolAddr(const std::string name, T &proc) {
@@ -32,6 +36,10 @@ bool FirmwareUtilImp::loadEntryPoints() {
3236
ok = ok && getSymbolAddr(fwDeviceIteratorNext, deviceItreatorNext);
3337
ok = ok && getSymbolAddr(fwDeviceIteratorDestroy, deviceItreatorDestroy);
3438
ok = ok && getSymbolAddr(fwDeviceFwUpdate, deviceFwUpdate);
39+
ok = ok && getSymbolAddr(fwImageOpromInit, imageOpromInit);
40+
ok = ok && getSymbolAddr(fwImageOpromType, imageOpromType);
41+
ok = ok && getSymbolAddr(fwDeviceOpromUpdate, deviceOpromUpdate);
42+
ok = ok && getSymbolAddr(fwDeviceOpromVersion, deviceOpromVersion);
3543
return ok;
3644
}
3745

@@ -90,13 +98,62 @@ ze_result_t FirmwareUtilImp::fwGetVersion(std::string &fwVersion) {
9098
return ZE_RESULT_SUCCESS;
9199
}
92100

101+
ze_result_t FirmwareUtilImp::opromGetVersion(std::string &fwVersion) {
102+
igsc_oprom_version opromVersion;
103+
memset(&opromVersion, 0, sizeof(opromVersion));
104+
int ret = deviceOpromVersion(&fwDeviceHandle, IGSC_OPROM_CODE, &opromVersion);
105+
if (ret != IGSC_SUCCESS) {
106+
return ZE_RESULT_ERROR_UNINITIALIZED;
107+
}
108+
fwVersion.append("OPROM CODE VERSION:");
109+
for (int i = 0; i < IGSC_OPROM_VER_SIZE; i++) {
110+
fwVersion.append(std::to_string(static_cast<unsigned int>(opromVersion.version[i])));
111+
}
112+
fwVersion.append("_");
113+
memset(&opromVersion, 0, sizeof(opromVersion));
114+
ret = deviceOpromVersion(&fwDeviceHandle, IGSC_OPROM_DATA, &opromVersion);
115+
if (ret != IGSC_SUCCESS) {
116+
return ZE_RESULT_ERROR_UNINITIALIZED;
117+
}
118+
fwVersion.append("OPROM DATA VERSION:");
119+
for (int i = 0; i < IGSC_OPROM_VER_SIZE; i++) {
120+
fwVersion.append(std::to_string(static_cast<unsigned int>(opromVersion.version[i])));
121+
}
122+
return ZE_RESULT_SUCCESS;
123+
}
124+
93125
ze_result_t FirmwareUtilImp::fwFlashGSC(void *pImage, uint32_t size) {
94126
int ret = deviceFwUpdate(&fwDeviceHandle, static_cast<const uint8_t *>(pImage), size, progressFunc, nullptr);
95127
if (ret != IGSC_SUCCESS) {
96128
return ZE_RESULT_ERROR_UNINITIALIZED;
97129
}
98130
return ZE_RESULT_SUCCESS;
99131
}
132+
133+
ze_result_t FirmwareUtilImp::fwFlashOprom(void *pImage, uint32_t size) {
134+
struct igsc_oprom_image *opromImg = nullptr;
135+
uint32_t opromImgType = 0;
136+
int retData = 0, retCode = 0;
137+
int ret = imageOpromInit(&opromImg, static_cast<const uint8_t *>(pImage), size);
138+
if (ret != IGSC_SUCCESS) {
139+
return ZE_RESULT_ERROR_UNINITIALIZED;
140+
}
141+
ret = imageOpromType(opromImg, &opromImgType);
142+
if (ret != IGSC_SUCCESS) {
143+
return ZE_RESULT_ERROR_UNINITIALIZED;
144+
}
145+
if (opromImgType & IGSC_OPROM_DATA) {
146+
retData = deviceOpromUpdate(&fwDeviceHandle, IGSC_OPROM_DATA, opromImg, progressFunc, nullptr);
147+
}
148+
if (opromImgType & IGSC_OPROM_CODE) {
149+
retCode = deviceOpromUpdate(&fwDeviceHandle, IGSC_OPROM_CODE, opromImg, progressFunc, nullptr);
150+
}
151+
if ((retData != IGSC_SUCCESS) && (retCode != IGSC_SUCCESS)) {
152+
return ZE_RESULT_ERROR_UNINITIALIZED;
153+
}
154+
return ZE_RESULT_SUCCESS;
155+
}
156+
100157
FirmwareUtilImp::FirmwareUtilImp(){};
101158

102159
FirmwareUtilImp::~FirmwareUtilImp() {

0 commit comments

Comments
 (0)