| #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); |
| } |