blob: a9552cf2624ec8c6f90e4669af9d530c98e44a43 [file] [log] [blame]
// 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_