blob: ee2705021ba6d45c848745577b891778259b6edf [file] [log] [blame]
#pragma once
#include "smbios_mdrv2.hpp"
#include <sdbusplus/asio/connection.hpp>
#include <xyz/openbmc_project/Association/Definitions/server.hpp>
#include <xyz/openbmc_project/Inventory/Decorator/Asset/server.hpp>
#include <xyz/openbmc_project/Inventory/Item/server.hpp>
#include <xyz/openbmc_project/Software/ExtendedVersion/server.hpp>
#include <xyz/openbmc_project/Software/Version/server.hpp>
#include <vector>
namespace phosphor
{
namespace smbios
{
namespace utils
{
std::vector<std::string> getExistingVersionPaths(sdbusplus::bus_t& bus);
}
using association =
sdbusplus::server::xyz::openbmc_project::association::Definitions;
using asset =
sdbusplus::server::xyz::openbmc_project::inventory::decorator::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<asset, item, association, softwareVersion,
softwareExtendedVersion>
{
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<asset, item, association, softwareVersion,
softwareExtendedVersion>(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<std::string>& 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