Skip to content

Commit 2a4545a

Browse files
Make calls to igsc from Sysman thread safe
Related-To: LOCI-4325 Signed-off-by: Mayank Raghuwanshi <mayank.raghuwanshi@intel.com> Source: b733d56
1 parent a810be3 commit 2a4545a

File tree

8 files changed

+28
-0
lines changed

8 files changed

+28
-0
lines changed

level_zero/sysman/source/firmware_util/firmware_util_imp.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ ze_result_t FirmwareUtilImp::fwDeviceInit() {
106106
}
107107

108108
ze_result_t FirmwareUtilImp::fwGetVersion(std::string &fwVersion) {
109+
const std::lock_guard<std::mutex> lock(this->fwLock);
109110
igsc_fw_version deviceFwVersion;
110111
memset(&deviceFwVersion, 0, sizeof(deviceFwVersion));
111112
int ret = deviceGetFwVersion(&fwDeviceHandle, &deviceFwVersion);
@@ -121,6 +122,7 @@ ze_result_t FirmwareUtilImp::fwGetVersion(std::string &fwVersion) {
121122
}
122123

123124
ze_result_t FirmwareUtilImp::opromGetVersion(std::string &fwVersion) {
125+
const std::lock_guard<std::mutex> lock(this->fwLock);
124126
igsc_oprom_version opromVersion;
125127
memset(&opromVersion, 0, sizeof(opromVersion));
126128
int ret = deviceOpromVersion(&fwDeviceHandle, IGSC_OPROM_CODE, &opromVersion);
@@ -145,6 +147,7 @@ ze_result_t FirmwareUtilImp::opromGetVersion(std::string &fwVersion) {
145147
}
146148

147149
ze_result_t FirmwareUtilImp::fwFlashGSC(void *pImage, uint32_t size) {
150+
const std::lock_guard<std::mutex> lock(this->fwLock);
148151
int ret = deviceFwUpdate(&fwDeviceHandle, static_cast<const uint8_t *>(pImage), size, progressFunc, nullptr);
149152
if (ret != IGSC_SUCCESS) {
150153
return ZE_RESULT_ERROR_UNINITIALIZED;
@@ -153,6 +156,7 @@ ze_result_t FirmwareUtilImp::fwFlashGSC(void *pImage, uint32_t size) {
153156
}
154157

155158
ze_result_t FirmwareUtilImp::fwFlashOprom(void *pImage, uint32_t size) {
159+
const std::lock_guard<std::mutex> lock(this->fwLock);
156160
struct igsc_oprom_image *opromImg = nullptr;
157161
uint32_t opromImgType = 0;
158162
int retData = 0, retCode = 0;
@@ -180,6 +184,7 @@ FirmwareUtilImp::FirmwareUtilImp(uint16_t domain, uint8_t bus, uint8_t device, u
180184
}
181185

182186
FirmwareUtilImp::~FirmwareUtilImp() {
187+
const std::lock_guard<std::mutex> lock(this->fwLock);
183188
if (nullptr != libraryHandle) {
184189
deviceClose(&fwDeviceHandle);
185190
delete libraryHandle;

level_zero/sysman/source/firmware_util/firmware_util_imp_helper.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ ze_result_t FirmwareUtilImp::fwIfrApplied(bool &ifrStatus) {
5151

5252
// fwCallGetstatusExt() is a helper function to get the status of IFR after the diagnostics tests are run
5353
ze_result_t FirmwareUtilImp::fwCallGetstatusExt(uint32_t &supportedTests, uint32_t &ifrApplied, uint32_t &prevErrors, uint32_t &pendingReset) {
54+
const std::lock_guard<std::mutex> lock(this->fwLock);
5455
uint32_t hwCapabilities = 0;
5556
ifrApplied = 0;
5657
prevErrors = 0;
@@ -113,6 +114,7 @@ ze_result_t FirmwareUtilImp::fwGetMemoryErrorCount(zes_ras_error_type_t type, ui
113114
}
114115

115116
void FirmwareUtilImp::fwGetMemoryHealthIndicator(zes_mem_health_t *health) {
117+
const std::lock_guard<std::mutex> lock(this->fwLock);
116118
gfspGetHealthIndicator = reinterpret_cast<pIgscGfspGetHealthIndicator>(libraryHandle->getProcAddress(fwGfspGetHealthIndicator));
117119
if (gfspGetHealthIndicator != nullptr) {
118120
uint8_t healthIndicator = 0;
@@ -142,6 +144,7 @@ void FirmwareUtilImp::fwGetMemoryHealthIndicator(zes_mem_health_t *health) {
142144
}
143145

144146
ze_result_t FirmwareUtilImp::fwGetEccConfig(uint8_t *currentState, uint8_t *pendingState) {
147+
const std::lock_guard<std::mutex> lock(this->fwLock);
145148
getEccConfig = reinterpret_cast<pIgscGetEccConfig>(libraryHandle->getProcAddress(fwEccConfigGet));
146149
if (getEccConfig != nullptr) {
147150
int ret = getEccConfig(&fwDeviceHandle, currentState, pendingState);
@@ -154,6 +157,7 @@ ze_result_t FirmwareUtilImp::fwGetEccConfig(uint8_t *currentState, uint8_t *pend
154157
}
155158

156159
ze_result_t FirmwareUtilImp::fwSetEccConfig(uint8_t newState, uint8_t *currentState, uint8_t *pendingState) {
160+
const std::lock_guard<std::mutex> lock(this->fwLock);
157161
setEccConfig = reinterpret_cast<pIgscSetEccConfig>(libraryHandle->getProcAddress(fwEccConfigSet));
158162
if (setEccConfig != nullptr) {
159163
int ret = setEccConfig(&fwDeviceHandle, newState, currentState, pendingState);
@@ -188,6 +192,7 @@ ze_result_t FirmwareUtilImp::fwSupportedDiagTests(std::vector<std::string> &supp
188192
}
189193

190194
ze_result_t FirmwareUtilImp::fwRunDiagTests(std::string &osDiagType, zes_diag_result_t *pDiagResult) {
195+
const std::lock_guard<std::mutex> lock(this->fwLock);
191196
uint32_t status = 0;
192197
uint32_t extendedStatus = 0;
193198
uint32_t pendingReset = 0;
@@ -244,6 +249,7 @@ ze_result_t FirmwareUtilImp::pscGetVersion(std::string &fwVersion) {
244249
}
245250

246251
ze_result_t FirmwareUtilImp::fwFlashIafPsc(void *pImage, uint32_t size) {
252+
const std::lock_guard<std::mutex> lock(this->fwLock);
247253
iafPscUpdate = reinterpret_cast<pIgscIafPscUpdate>(libraryHandle->getProcAddress(fwIafPscUpdate));
248254

249255
if (iafPscUpdate == nullptr) {

level_zero/sysman/source/linux/os_sysman_imp.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ void LinuxSysmanImp::createFwUtilInterface() {
197197
}
198198

199199
FirmwareUtil *LinuxSysmanImp::getFwUtilInterface() {
200+
const std::lock_guard<std::mutex> lock(this->fwLock);
200201
if (pFwUtilInterface == nullptr) {
201202
createFwUtilInterface();
202203
}

level_zero/sysman/source/linux/os_sysman_imp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "level_zero/sysman/source/sysman_device_imp.h"
1616

1717
#include <map>
18+
#include <mutex>
1819

1920
namespace NEO {
2021
class Drm;
@@ -87,6 +88,7 @@ class LinuxSysmanImp : public OsSysman, NEO::NonCopyableOrMovableClass {
8788
static const std::string deviceDir;
8889
void createFwUtilInterface();
8990
void clearHPIE(int fd);
91+
std::mutex fwLock;
9092
};
9193

9294
} // namespace Sysman

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ ze_result_t FirmwareUtilImp::fwDeviceInit() {
105105
}
106106

107107
ze_result_t FirmwareUtilImp::fwGetVersion(std::string &fwVersion) {
108+
const std::lock_guard<std::mutex> lock(this->fwLock);
108109
igsc_fw_version deviceFwVersion;
109110
memset(&deviceFwVersion, 0, sizeof(deviceFwVersion));
110111
int ret = deviceGetFwVersion(&fwDeviceHandle, &deviceFwVersion);
@@ -120,6 +121,7 @@ ze_result_t FirmwareUtilImp::fwGetVersion(std::string &fwVersion) {
120121
}
121122

122123
ze_result_t FirmwareUtilImp::opromGetVersion(std::string &fwVersion) {
124+
const std::lock_guard<std::mutex> lock(this->fwLock);
123125
igsc_oprom_version opromVersion;
124126
memset(&opromVersion, 0, sizeof(opromVersion));
125127
int ret = deviceOpromVersion(&fwDeviceHandle, IGSC_OPROM_CODE, &opromVersion);
@@ -144,6 +146,7 @@ ze_result_t FirmwareUtilImp::opromGetVersion(std::string &fwVersion) {
144146
}
145147

146148
ze_result_t FirmwareUtilImp::fwFlashGSC(void *pImage, uint32_t size) {
149+
const std::lock_guard<std::mutex> lock(this->fwLock);
147150
int ret = deviceFwUpdate(&fwDeviceHandle, static_cast<const uint8_t *>(pImage), size, progressFunc, nullptr);
148151
if (ret != IGSC_SUCCESS) {
149152
return ZE_RESULT_ERROR_UNINITIALIZED;
@@ -152,6 +155,7 @@ ze_result_t FirmwareUtilImp::fwFlashGSC(void *pImage, uint32_t size) {
152155
}
153156

154157
ze_result_t FirmwareUtilImp::fwFlashOprom(void *pImage, uint32_t size) {
158+
const std::lock_guard<std::mutex> lock(this->fwLock);
155159
struct igsc_oprom_image *opromImg = nullptr;
156160
uint32_t opromImgType = 0;
157161
int retData = 0, retCode = 0;
@@ -179,6 +183,7 @@ FirmwareUtilImp::FirmwareUtilImp(uint16_t domain, uint8_t bus, uint8_t device, u
179183
}
180184

181185
FirmwareUtilImp::~FirmwareUtilImp() {
186+
const std::lock_guard<std::mutex> lock(this->fwLock);
182187
if (nullptr != libraryHandle) {
183188
deviceClose(&fwDeviceHandle);
184189
delete libraryHandle;

level_zero/tools/source/sysman/firmware_util/firmware_util_imp_helper.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ ze_result_t FirmwareUtilImp::fwIfrApplied(bool &ifrStatus) {
5050

5151
// fwCallGetstatusExt() is a helper function to get the status of IFR after the diagnostics tests are run
5252
ze_result_t FirmwareUtilImp::fwCallGetstatusExt(uint32_t &supportedTests, uint32_t &ifrApplied, uint32_t &prevErrors, uint32_t &pendingReset) {
53+
const std::lock_guard<std::mutex> lock(this->fwLock);
5354
uint32_t hwCapabilities = 0;
5455
ifrApplied = 0;
5556
prevErrors = 0;
@@ -112,6 +113,7 @@ ze_result_t FirmwareUtilImp::fwGetMemoryErrorCount(zes_ras_error_type_t type, ui
112113
}
113114

114115
void FirmwareUtilImp::fwGetMemoryHealthIndicator(zes_mem_health_t *health) {
116+
const std::lock_guard<std::mutex> lock(this->fwLock);
115117
gfspGetHealthIndicator = reinterpret_cast<pIgscGfspGetHealthIndicator>(libraryHandle->getProcAddress(fwGfspGetHealthIndicator));
116118
if (gfspGetHealthIndicator != nullptr) {
117119
uint8_t healthIndicator = 0;
@@ -141,6 +143,7 @@ void FirmwareUtilImp::fwGetMemoryHealthIndicator(zes_mem_health_t *health) {
141143
}
142144

143145
ze_result_t FirmwareUtilImp::fwGetEccConfig(uint8_t *currentState, uint8_t *pendingState) {
146+
const std::lock_guard<std::mutex> lock(this->fwLock);
144147
getEccConfig = reinterpret_cast<pIgscGetEccConfig>(libraryHandle->getProcAddress(fwEccConfigGet));
145148
if (getEccConfig != nullptr) {
146149
int ret = getEccConfig(&fwDeviceHandle, currentState, pendingState);
@@ -153,6 +156,7 @@ ze_result_t FirmwareUtilImp::fwGetEccConfig(uint8_t *currentState, uint8_t *pend
153156
}
154157

155158
ze_result_t FirmwareUtilImp::fwSetEccConfig(uint8_t newState, uint8_t *currentState, uint8_t *pendingState) {
159+
const std::lock_guard<std::mutex> lock(this->fwLock);
156160
setEccConfig = reinterpret_cast<pIgscSetEccConfig>(libraryHandle->getProcAddress(fwEccConfigSet));
157161
if (setEccConfig != nullptr) {
158162
int ret = setEccConfig(&fwDeviceHandle, newState, currentState, pendingState);
@@ -187,6 +191,7 @@ ze_result_t FirmwareUtilImp::fwSupportedDiagTests(std::vector<std::string> &supp
187191
}
188192

189193
ze_result_t FirmwareUtilImp::fwRunDiagTests(std::string &osDiagType, zes_diag_result_t *pDiagResult) {
194+
const std::lock_guard<std::mutex> lock(this->fwLock);
190195
uint32_t status = 0;
191196
uint32_t extendedStatus = 0;
192197
uint32_t pendingReset = 0;
@@ -243,6 +248,7 @@ ze_result_t FirmwareUtilImp::pscGetVersion(std::string &fwVersion) {
243248
}
244249

245250
ze_result_t FirmwareUtilImp::fwFlashIafPsc(void *pImage, uint32_t size) {
251+
const std::lock_guard<std::mutex> lock(this->fwLock);
246252
iafPscUpdate = reinterpret_cast<pIgscIafPscUpdate>(libraryHandle->getProcAddress(fwIafPscUpdate));
247253

248254
if (iafPscUpdate == nullptr) {

level_zero/tools/source/sysman/linux/os_sysman_imp.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ PmuInterface *LinuxSysmanImp::getPmuInterface() {
8282
}
8383

8484
FirmwareUtil *LinuxSysmanImp::getFwUtilInterface() {
85+
const std::lock_guard<std::mutex> lock(this->fwLock);
8586
if (pFwUtilInterface == nullptr) {
8687
createFwUtilInterface();
8788
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include <linux/pci_regs.h>
2222
#include <map>
23+
#include <mutex>
2324

2425
namespace L0 {
2526

@@ -100,6 +101,7 @@ class LinuxSysmanImp : public OsSysman, NEO::NonCopyableOrMovableClass {
100101
SysmanDeviceImp *pParentSysmanDeviceImp = nullptr;
101102
static const std::string deviceDir;
102103
void clearHPIE(int fd);
104+
std::mutex fwLock;
103105
};
104106

105107
} // namespace L0

0 commit comments

Comments
 (0)