1 #pragma once 2 #include "smbios_mdrv2.hpp" 3 4 #include <sdbusplus/asio/connection.hpp> 5 #include <xyz/openbmc_project/Inventory/Item/server.hpp> 6 #include <xyz/openbmc_project/Software/Asset/server.hpp> 7 #include <xyz/openbmc_project/Software/ExtendedVersion/server.hpp> 8 #include <xyz/openbmc_project/Software/Version/server.hpp> 9 10 #include <vector> 11 12 namespace phosphor 13 { 14 15 namespace smbios 16 { 17 namespace utils 18 { 19 std::vector<std::string> getExistingVersionPaths(sdbusplus::bus_t& bus); 20 } 21 22 using softwareAsset = sdbusplus::server::xyz::openbmc_project::software::Asset; 23 using item = sdbusplus::server::xyz::openbmc_project::inventory::Item; 24 using softwareVersion = 25 sdbusplus::server::xyz::openbmc_project::software::Version; 26 using softwareExtendedVersion = 27 sdbusplus::server::xyz::openbmc_project::software::ExtendedVersion; 28 29 class FirmwareInventory : 30 sdbusplus::server::object_t<softwareAsset, item, softwareVersion, 31 softwareExtendedVersion> 32 { 33 public: 34 FirmwareInventory() = delete; 35 ~FirmwareInventory() = default; 36 FirmwareInventory(const FirmwareInventory&) = delete; 37 FirmwareInventory& operator=(const FirmwareInventory&) = delete; 38 FirmwareInventory(FirmwareInventory&&) = default; 39 FirmwareInventory& operator=(FirmwareInventory&&) = default; 40 FirmwareInventory(sdbusplus::bus_t & bus,const std::string & objPath,const uint8_t index,uint8_t * smbiosTableStorage)41 FirmwareInventory(sdbusplus::bus_t& bus, const std::string& objPath, 42 const uint8_t index, uint8_t* smbiosTableStorage) : 43 sdbusplus::server::object_t<softwareAsset, item, softwareVersion, 44 softwareExtendedVersion>(bus, 45 objPath.c_str()), 46 firmwareInventoryIndex(index), storage(smbiosTableStorage) 47 { 48 firmwareInfoUpdate(smbiosTableStorage); 49 } 50 51 void firmwareInfoUpdate(uint8_t* smbiosTableStorage); 52 53 static std::string checkAndCreateFirmwarePath( 54 uint8_t* dataIn, int index, 55 std::vector<std::string>& existingVersionPaths); 56 57 private: 58 int firmwareInventoryIndex; 59 60 uint8_t* storage; 61 62 struct FirmwareInfo 63 { 64 uint8_t type; 65 uint8_t length; 66 uint16_t handle; 67 uint8_t componentName; 68 uint8_t version; 69 uint8_t versionFormat; 70 uint8_t id; 71 uint8_t idFormat; 72 uint8_t releaseDate; 73 uint8_t manufacturer; 74 uint8_t lowestSupportedVersion; 75 uint64_t imageSize; 76 uint16_t characteristics; 77 uint8_t state; 78 uint8_t numOfAssociatedComponents; 79 uint16_t associatedComponentHandles[1]; 80 } __attribute__((packed)); 81 82 void firmwareId(const uint8_t positionNum, const uint8_t structLen, 83 uint8_t* dataIn); 84 void firmwareVersion(const uint8_t positionNum, const uint8_t structLen, 85 uint8_t* dataIn); 86 void firmwareReleaseDate(const uint8_t positionNum, const uint8_t structLen, 87 uint8_t* dataIn); 88 void firmwareManufacturer(const uint8_t positionNum, 89 const uint8_t structLen, uint8_t* dataIn); 90 void firmwareComponentName(const uint8_t positionNum, 91 const uint8_t structLen, uint8_t* dataIn); 92 static bool getFirmwareInventoryData(uint8_t*& dataIn, int inventoryIndex); 93 }; 94 } // namespace smbios 95 } // namespace phosphor 96