| // Copyright 2019 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 SRC_CAMERA_DRIVERS_ISP_MODULES_DMA_MGR_H_ |
| #define SRC_CAMERA_DRIVERS_ISP_MODULES_DMA_MGR_H_ |
| |
| #include <fuchsia/camera/common/c/fidl.h> |
| #include <fuchsia/sysmem/c/fidl.h> |
| #include <lib/fit/function.h> |
| #include <lib/fzl/vmo-pool.h> |
| |
| #include <deque> |
| |
| #include "../mali-009/pingpong_regs.h" |
| #include "dma-format.h" |
| |
| namespace camera { |
| |
| class DmaManager { |
| public: |
| enum class Stream : bool { FullResolution = false, Downscaled }; |
| |
| DmaManager(Stream stream_type, const ddk::MmioView& isp_mmio_local) |
| : isp_mmio_local_(isp_mmio_local), stream_type_(stream_type) {} |
| |
| // Initialize the format and buffers of the DMA Writer. |
| // |buffer_collection| contains the vmos that the DMA will write to, and |
| // the image format that dictates the DMA's configuration. |
| // |frame_available_callback| will be called when the DMA is done writing |
| // to a buffer. |
| // A note on making multiple Configure() calls: |
| // It is possible to transition the DMA manager to another format by calling |
| // Configure() with a different buffer collection. However, doing so will |
| // remove all knowledge of the locked status of frames of the previous |
| // BufferCollection. |
| // This has the following effects: |
| // - Frames that are currently being written will be dropped. Calls to |
| // On*FrameWritten() |
| // will only relate to frames written in the new BufferCollection. |
| // TODO(CAM-54): Provide a way to dump the previous set of write locked |
| // buffers. |
| // - ReleaseFrame calls with currently used indices (relating to the old |
| // BufferCollection) |
| // will return errors. |
| zx_status_t Configure( |
| fuchsia_sysmem_BufferCollectionInfo buffer_collection, |
| fit::function<void(fuchsia_camera_common_FrameAvailableEvent)> frame_available_callback); |
| |
| static zx_status_t Create(const zx::bti& bti, const ddk::MmioView& isp_mmio_local, |
| Stream stream_type, std::unique_ptr<DmaManager>* out); |
| |
| // Updates the dma writer with the address of a free buffer from the pool. |
| // Returns true iff a new frame was actually written. |
| bool OnNewFrame(); |
| |
| // Signal that all consumers are done with this frame. |
| zx_status_t ReleaseFrame(uint32_t buffer_index); |
| |
| // Releases the write lock on the frame and calls the |
| // frame_available_callback. |
| void OnFrameWritten(); |
| |
| // Prints status registers. Used for debugging. |
| void PrintStatus(ddk::MmioBuffer* mmio); |
| |
| // Allow the streaming of frames to a consumer. |
| void Enable(); |
| |
| // Stop writing frames and sending them to the consumer. |
| // If frames are currently being written, they will be dropped. |
| void Disable(); |
| |
| bool enabled() { return enabled_; } |
| |
| private: |
| bool enabled_ = false; |
| ddk::MmioView isp_mmio_local_; |
| fzl::VmoPool buffers_; |
| std::deque<fzl::VmoPool::Buffer> write_locked_buffers_; |
| std::optional<DmaFormat> current_format_; |
| Stream stream_type_; |
| fit::function<void(fuchsia_camera_common_FrameAvailableEvent)> frame_available_callback_; |
| zx::bti bti_; |
| |
| // Get the Registers used by the DMA Writer. |
| auto GetPrimaryMisc(); |
| auto GetUvMisc(); |
| auto GetPrimaryBank0(); |
| auto GetUvBank0(); |
| auto GetPrimaryActiveDim(); |
| auto GetUvActiveDim(); |
| auto GetPrimaryLineOffset(); |
| auto GetUvLineOffset(); |
| auto GetPrimaryFrameCount(); |
| auto GetUvFrameCount(); |
| auto GetPrimaryFailures(); |
| auto GetUvFailures(); |
| |
| // Writes the dma format to the registers |
| void WriteFormat(); |
| }; |
| |
| } // namespace camera |
| |
| #endif // SRC_CAMERA_DRIVERS_ISP_MODULES_DMA_MGR_H_ |