#pragma once #include "smbios_mdrv2.hpp" #include #include #include #include #include #include namespace phosphor { namespace smbios { namespace utils { std::vector getExistingVersionPaths(sdbusplus::bus_t& bus); } using softwareAsset = sdbusplus::server::xyz::openbmc_project::software::Asset; using item = sdbusplus::server::xyz::openbmc_project::inventory::Item; using softwareVersion = sdbusplus::server::xyz::openbmc_project::software::Version; using softwareExtendedVersion = sdbusplus::server::xyz::openbmc_project::software::ExtendedVersion; class FirmwareInventory : sdbusplus::server::object_t { public: FirmwareInventory() = delete; ~FirmwareInventory() = default; FirmwareInventory(const FirmwareInventory&) = delete; FirmwareInventory& operator=(const FirmwareInventory&) = delete; FirmwareInventory(FirmwareInventory&&) = default; FirmwareInventory& operator=(FirmwareInventory&&) = default; FirmwareInventory(sdbusplus::bus_t& bus, const std::string& objPath, const uint8_t index, uint8_t* smbiosTableStorage) : sdbusplus::server::object_t(bus, objPath.c_str()), firmwareInventoryIndex(index), storage(smbiosTableStorage) { firmwareInfoUpdate(smbiosTableStorage); } void firmwareInfoUpdate(uint8_t* smbiosTableStorage); static std::string checkAndCreateFirmwarePath( uint8_t* dataIn, int index, std::vector& existingVersionPaths); private: int firmwareInventoryIndex; uint8_t* storage; struct FirmwareInfo { uint8_t type; uint8_t length; uint16_t handle; uint8_t componentName; uint8_t version; uint8_t versionFormat; uint8_t id; uint8_t idFormat; uint8_t releaseDate; uint8_t manufacturer; uint8_t lowestSupportedVersion; uint64_t imageSize; uint16_t characteristics; uint8_t state; uint8_t numOfAssociatedComponents; uint16_t associatedComponentHandles[1]; } __attribute__((packed)); void firmwareId(const uint8_t positionNum, const uint8_t structLen, uint8_t* dataIn); void firmwareVersion(const uint8_t positionNum, const uint8_t structLen, uint8_t* dataIn); void firmwareReleaseDate(const uint8_t positionNum, const uint8_t structLen, uint8_t* dataIn); void firmwareManufacturer(const uint8_t positionNum, const uint8_t structLen, uint8_t* dataIn); void firmwareComponentName(const uint8_t positionNum, const uint8_t structLen, uint8_t* dataIn); static bool getFirmwareInventoryData(uint8_t*& dataIn, int inventoryIndex); }; } // namespace smbios } // namespace phosphor