sysman: add support to handle multiple firmwares

Signed-off-by: T J Vivek Vilvaraj <t.j.vivek.vilvaraj@intel.com>
This commit is contained in:
T J Vivek Vilvaraj
2021-01-23 03:13:00 +00:00
committed by Compute-Runtime-Automation
parent 718e4149a8
commit 31a04b4708
13 changed files with 304 additions and 65 deletions

View File

@@ -27,7 +27,9 @@ class FirmwareUtil {
virtual ze_result_t fwDeviceInit() = 0;
virtual ze_result_t getFirstDevice(igsc_device_info *) = 0;
virtual ze_result_t fwGetVersion(std::string &fwVersion) = 0;
virtual ze_result_t opromGetVersion(std::string &fwVersion) = 0;
virtual ze_result_t fwFlashGSC(void *pImage, uint32_t size) = 0;
virtual ze_result_t fwFlashOprom(void *pImage, uint32_t size) = 0;
virtual ~FirmwareUtil() = default;
};
} // namespace L0

View File

@@ -16,6 +16,10 @@ const std::string FirmwareUtilImp::fwDeviceIteratorCreate = "igsc_device_iterato
const std::string FirmwareUtilImp::fwDeviceIteratorNext = "igsc_device_iterator_next";
const std::string FirmwareUtilImp::fwDeviceIteratorDestroy = "igsc_device_iterator_destroy";
const std::string FirmwareUtilImp::fwDeviceFwUpdate = "igsc_device_fw_update";
const std::string FirmwareUtilImp::fwImageOpromInit = "igsc_image_oprom_init";
const std::string FirmwareUtilImp::fwImageOpromType = "igsc_image_oprom_type";
const std::string FirmwareUtilImp::fwDeviceOpromUpdate = "igsc_device_oprom_update";
const std::string FirmwareUtilImp::fwDeviceOpromVersion = "igsc_device_oprom_version";
template <class T>
bool FirmwareUtilImp::getSymbolAddr(const std::string name, T &proc) {
@@ -32,6 +36,10 @@ bool FirmwareUtilImp::loadEntryPoints() {
ok = ok && getSymbolAddr(fwDeviceIteratorNext, deviceItreatorNext);
ok = ok && getSymbolAddr(fwDeviceIteratorDestroy, deviceItreatorDestroy);
ok = ok && getSymbolAddr(fwDeviceFwUpdate, deviceFwUpdate);
ok = ok && getSymbolAddr(fwImageOpromInit, imageOpromInit);
ok = ok && getSymbolAddr(fwImageOpromType, imageOpromType);
ok = ok && getSymbolAddr(fwDeviceOpromUpdate, deviceOpromUpdate);
ok = ok && getSymbolAddr(fwDeviceOpromVersion, deviceOpromVersion);
return ok;
}
@@ -90,6 +98,30 @@ ze_result_t FirmwareUtilImp::fwGetVersion(std::string &fwVersion) {
return ZE_RESULT_SUCCESS;
}
ze_result_t FirmwareUtilImp::opromGetVersion(std::string &fwVersion) {
igsc_oprom_version opromVersion;
memset(&opromVersion, 0, sizeof(opromVersion));
int ret = deviceOpromVersion(&fwDeviceHandle, IGSC_OPROM_CODE, &opromVersion);
if (ret != IGSC_SUCCESS) {
return ZE_RESULT_ERROR_UNINITIALIZED;
}
fwVersion.append("OPROM CODE VERSION:");
for (int i = 0; i < IGSC_OPROM_VER_SIZE; i++) {
fwVersion.append(std::to_string(static_cast<unsigned int>(opromVersion.version[i])));
}
fwVersion.append("_");
memset(&opromVersion, 0, sizeof(opromVersion));
ret = deviceOpromVersion(&fwDeviceHandle, IGSC_OPROM_DATA, &opromVersion);
if (ret != IGSC_SUCCESS) {
return ZE_RESULT_ERROR_UNINITIALIZED;
}
fwVersion.append("OPROM DATA VERSION:");
for (int i = 0; i < IGSC_OPROM_VER_SIZE; i++) {
fwVersion.append(std::to_string(static_cast<unsigned int>(opromVersion.version[i])));
}
return ZE_RESULT_SUCCESS;
}
ze_result_t FirmwareUtilImp::fwFlashGSC(void *pImage, uint32_t size) {
int ret = deviceFwUpdate(&fwDeviceHandle, static_cast<const uint8_t *>(pImage), size, progressFunc, nullptr);
if (ret != IGSC_SUCCESS) {
@@ -97,6 +129,31 @@ ze_result_t FirmwareUtilImp::fwFlashGSC(void *pImage, uint32_t size) {
}
return ZE_RESULT_SUCCESS;
}
ze_result_t FirmwareUtilImp::fwFlashOprom(void *pImage, uint32_t size) {
struct igsc_oprom_image *opromImg = nullptr;
uint32_t opromImgType = 0;
int retData = 0, retCode = 0;
int ret = imageOpromInit(&opromImg, static_cast<const uint8_t *>(pImage), size);
if (ret != IGSC_SUCCESS) {
return ZE_RESULT_ERROR_UNINITIALIZED;
}
ret = imageOpromType(opromImg, &opromImgType);
if (ret != IGSC_SUCCESS) {
return ZE_RESULT_ERROR_UNINITIALIZED;
}
if (opromImgType & IGSC_OPROM_DATA) {
retData = deviceOpromUpdate(&fwDeviceHandle, IGSC_OPROM_DATA, opromImg, progressFunc, nullptr);
}
if (opromImgType & IGSC_OPROM_CODE) {
retCode = deviceOpromUpdate(&fwDeviceHandle, IGSC_OPROM_CODE, opromImg, progressFunc, nullptr);
}
if ((retData != IGSC_SUCCESS) && (retCode != IGSC_SUCCESS)) {
return ZE_RESULT_ERROR_UNINITIALIZED;
}
return ZE_RESULT_SUCCESS;
}
FirmwareUtilImp::FirmwareUtilImp(){};
FirmwareUtilImp::~FirmwareUtilImp() {

View File

@@ -26,7 +26,24 @@ typedef int (*pIgscDeviceIteratorCreate)(struct igsc_device_iterator **iter);
typedef int (*pIgscDeviceIteratorNext)(struct igsc_device_iterator *iter,
struct igsc_device_info *info);
typedef void (*pIgscDeviceIteratorDestroy)(struct igsc_device_iterator *iter);
typedef int (*pIgscDeviceFwUpdate)(struct igsc_device_handle *handle, const uint8_t *buffer, const uint32_t buffer_len, igsc_progress_func_t progress_f, void *ctx);
typedef int (*pIgscDeviceFwUpdate)(struct igsc_device_handle *handle,
const uint8_t *buffer,
const uint32_t buffer_len,
igsc_progress_func_t progress_f,
void *ctx);
typedef int (*pIgscImageOpromInit)(struct igsc_oprom_image **img,
const uint8_t *buffer,
uint32_t buffer_len);
typedef int (*pIgscImageOpromType)(struct igsc_oprom_image *img,
uint32_t *oprom_type);
typedef int (*pIgscDeviceOpromUpdate)(struct igsc_device_handle *handle,
uint32_t oprom_type,
struct igsc_oprom_image *img,
igsc_progress_func_t progress_f,
void *ctx);
typedef int (*pIgscDeviceOpromVersion)(struct igsc_device_handle *handle,
uint32_t oprom_type,
struct igsc_oprom_version *version);
class FirmwareUtilImp : public FirmwareUtil, NEO::NonCopyableOrMovableClass {
public:
@@ -35,7 +52,9 @@ class FirmwareUtilImp : public FirmwareUtil, NEO::NonCopyableOrMovableClass {
ze_result_t fwDeviceInit() override;
ze_result_t getFirstDevice(igsc_device_info *) override;
ze_result_t fwGetVersion(std::string &fwVersion) override;
ze_result_t opromGetVersion(std::string &fwVersion) override;
ze_result_t fwFlashGSC(void *pImage, uint32_t size) override;
ze_result_t fwFlashOprom(void *pImage, uint32_t size) override;
template <class T>
bool getSymbolAddr(const std::string name, T &proc);
@@ -53,6 +72,10 @@ class FirmwareUtilImp : public FirmwareUtil, NEO::NonCopyableOrMovableClass {
static const std::string fwDeviceIteratorNext;
static const std::string fwDeviceIteratorDestroy;
static const std::string fwDeviceFwUpdate;
static const std::string fwImageOpromInit;
static const std::string fwImageOpromType;
static const std::string fwDeviceOpromUpdate;
static const std::string fwDeviceOpromVersion;
pIgscDeviceInitByDevice deviceInitByDevice = nullptr;
pIgscDeviceGetDeviceInfo deviceGetDeviceInfo = nullptr;
@@ -61,5 +84,9 @@ class FirmwareUtilImp : public FirmwareUtil, NEO::NonCopyableOrMovableClass {
pIgscDeviceIteratorNext deviceItreatorNext = nullptr;
pIgscDeviceIteratorDestroy deviceItreatorDestroy = nullptr;
pIgscDeviceFwUpdate deviceFwUpdate = nullptr;
pIgscImageOpromInit imageOpromInit = nullptr;
pIgscImageOpromType imageOpromType = nullptr;
pIgscDeviceOpromUpdate deviceOpromUpdate = nullptr;
pIgscDeviceOpromVersion deviceOpromVersion = nullptr;
};
} // namespace L0