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