xref: /openbmc/smbios-mdr/include/firmware_inventory.hpp (revision ac4cb328365c7073a54da815c7f2362f1c64bf01)
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