| // Copyright 2016 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef GARNET_LIB_MAGMA_SRC_SYS_DRIVER_MAGMA_DRIVER_H_ |
| #define GARNET_LIB_MAGMA_SRC_SYS_DRIVER_MAGMA_DRIVER_H_ |
| |
| #include <lib/fit/function.h> |
| |
| #include "magma_util/dlog.h" |
| #include "magma_util/macros.h" |
| #include "msd.h" |
| |
| #include "magma_system_device.h" |
| |
| using msd_driver_unique_ptr_t = std::unique_ptr<msd_driver_t, fit::function<void(msd_driver_t*)>>; |
| |
| static inline msd_driver_unique_ptr_t MsdDriverUniquePtr(msd_driver_t* driver) |
| { |
| return msd_driver_unique_ptr_t(driver, &msd_driver_destroy); |
| } |
| |
| class MagmaDriver { |
| public: |
| MagmaDriver(msd_driver_unique_ptr_t msd_drv) : msd_drv_(std::move(msd_drv)) {} |
| |
| std::unique_ptr<MagmaSystemDevice> CreateDevice(void* device) |
| { |
| msd_device_t* msd_dev = msd_driver_create_device(msd_drv_.get(), device); |
| if (!msd_dev) |
| return DRETP(nullptr, "msd_create_device failed"); |
| |
| return MagmaSystemDevice::Create(MsdDeviceUniquePtr(msd_dev)); |
| } |
| |
| static std::unique_ptr<MagmaDriver> Create() |
| { |
| msd_driver_t* msd_drv = msd_driver_create(); |
| if (!msd_drv) |
| return DRETP(nullptr, "msd_create returned null"); |
| |
| return std::make_unique<MagmaDriver>(MsdDriverUniquePtr(msd_drv)); |
| } |
| |
| private: |
| msd_driver_unique_ptr_t msd_drv_; |
| }; |
| |
| #endif // MAGMA_DRIVER_H |