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