blob: e69ea7e6ac6acdc846fbfaed1d7c70ef871036c0 [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>
Prithvi Pai6f9e7a72025-03-14 13:05:02 +05305#include <xyz/openbmc_project/Inventory/Item/server.hpp>
Prithvi Paiac4cb322025-06-10 10:45:55 +05306#include <xyz/openbmc_project/Software/Asset/server.hpp>
Prithvi Pai6f9e7a72025-03-14 13:05:02 +05307#include <xyz/openbmc_project/Software/ExtendedVersion/server.hpp>
8#include <xyz/openbmc_project/Software/Version/server.hpp>
9
10#include <vector>
11
12namespace phosphor
13{
14
15namespace smbios
16{
17namespace utils
18{
19std::vector<std::string> getExistingVersionPaths(sdbusplus::bus_t& bus);
20}
21
Prithvi Paiac4cb322025-06-10 10:45:55 +053022using softwareAsset = sdbusplus::server::xyz::openbmc_project::software::Asset;
Prithvi Pai6f9e7a72025-03-14 13:05:02 +053023using item = sdbusplus::server::xyz::openbmc_project::inventory::Item;
24using softwareVersion =
25 sdbusplus::server::xyz::openbmc_project::software::Version;
26using softwareExtendedVersion =
27 sdbusplus::server::xyz::openbmc_project::software::ExtendedVersion;
28
29class FirmwareInventory :
Prithvi Paiac4cb322025-06-10 10:45:55 +053030 sdbusplus::server::object_t<softwareAsset, item, softwareVersion,
Prithvi Pai6f9e7a72025-03-14 13:05:02 +053031 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
41 FirmwareInventory(sdbusplus::bus_t& bus, const std::string& objPath,
42 const uint8_t index, uint8_t* smbiosTableStorage) :
Prithvi Paiac4cb322025-06-10 10:45:55 +053043 sdbusplus::server::object_t<softwareAsset, item, softwareVersion,
Prithvi Pai6f9e7a72025-03-14 13:05:02 +053044 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