blob: 15d40c29354ff9d2d48016322a521291e71e9b9e [file] [log] [blame]
#include "NVMeStorage.hpp"
#include "NVMeError.hpp"
RelPerf relativePerformanceFromRP(uint8_t rp)
{
switch (rp)
{
case 0:
return RelPerf::Best;
case 1:
return RelPerf::Better;
case 2:
return RelPerf::Good;
default:
return RelPerf::Degraded;
}
}
NVMeStorage::NVMeStorage(sdbusplus::asio::object_server& objServer,
sdbusplus::bus_t& bus, const char* path) :
StorageBase(bus, path), objServer(objServer), path(path)
{}
NVMeStorage::~NVMeStorage()
{
objServer.remove_interface(nvmeStorageInterface);
emit_removed();
}
void NVMeStorage::init(const std::shared_ptr<NVMeStorage>& self)
{
self->nvmeStorageInterface = self->objServer.add_interface(
self->path, "xyz.openbmc_project.Nvme.Storage");
self->nvmeStorageInterface->register_method(
"CreateVolume", [weak{std::weak_ptr<NVMeStorage>(self)}](
boost::asio::yield_context yield, uint64_t size,
size_t lbaFormat, bool metadataAtEnd) {
if (auto self = weak.lock())
{
return self->createVolume(std::move(yield), size, lbaFormat,
metadataAtEnd);
}
// TODO: (b/375054188) Exception handling to be refactored
// NOLINTNEXTLINE(cert-err09-cpp,cert-err60-cpp,cert-err61-cpp,misc-throw-by-value-catch-by-reference)
throw *makeLibNVMeError("storage removed");
});
std::vector<std::tuple<size_t, size_t, size_t, RelPerf>> prop;
self->nvmeStorageInterface->register_property("SupportedFormats", prop);
self->nvmeStorageInterface->initialize();
self->emit_added();
}
void NVMeStorage::setSupportedFormats(const std::vector<LBAFormat>& formats)
{
std::vector<std::tuple<size_t, size_t, size_t, RelPerf>> prop;
prop.reserve(formats.size());
for (const auto& f : formats)
{
prop.emplace_back(f.index, f.blockSize, f.metadataSize,
f.relativePerformance);
}
nvmeStorageInterface->set_property("SupportedFormats", prop);
}