blob: 41cfae9ac97ac6ef9bd1aa4697e970c4b2bedf7c [file] [log] [blame]
// Copyright 2018 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_GRAPHICS_DISPLAY_DRIVERS_AML_CANVAS_AML_CANVAS_H_
#define SRC_GRAPHICS_DISPLAY_DRIVERS_AML_CANVAS_AML_CANVAS_H_
#include <fuchsia/hardware/amlogiccanvas/cpp/banjo.h>
#include <fuchsia/hardware/platform/device/c/banjo.h>
#include <lib/device-protocol/pdev.h>
#include <lib/mmio/mmio.h>
#include <array>
#include <ddk/mmio-buffer.h>
#include <ddk/platform-defs.h>
#include <ddktl/device.h>
#include <fbl/mutex.h>
#define IS_ALIGNED(a, b) (!(((uintptr_t)(a)) & (((uintptr_t)(b)) - 1)))
#define CANVAS_ERROR(fmt, ...) zxlogf(ERROR, "[%s %d]" fmt, __func__, __LINE__, ##__VA_ARGS__)
#define CANVAS_INFO(fmt, ...) zxlogf(INFO, "[%s %d]" fmt, __func__, __LINE__, ##__VA_ARGS__)
namespace aml_canvas {
constexpr size_t kNumCanvasEntries = 256;
class AmlCanvas;
using DeviceType = ddk::Device<AmlCanvas, ddk::Unbindable>;
class AmlCanvas : public DeviceType,
public ddk::AmlogicCanvasProtocol<AmlCanvas, ddk::base_protocol> {
public:
AmlCanvas(zx_device_t* parent, ddk::MmioBuffer mmio, zx::bti bti)
: DeviceType(parent), dmc_regs_(std::move(mmio)), bti_(std::move(bti)) {}
// This function is called from the c-bind function upon driver matching
static zx_status_t Setup(zx_device_t* parent);
// Required by ddk::AmlogicCanvasProtocol
zx_status_t AmlogicCanvasConfig(zx::vmo vmo, size_t offset, const canvas_info_t* info,
uint8_t* canvas_idx);
zx_status_t AmlogicCanvasFree(uint8_t canvas_idx);
// Required by ddk::Device
void DdkRelease();
void DdkUnbind(ddk::UnbindTxn txn);
private:
fbl::Mutex lock_;
ddk::MmioBuffer dmc_regs_ __TA_GUARDED(lock_);
zx::bti bti_ __TA_GUARDED(lock_);
std::array<zx::pmt, kNumCanvasEntries> pmts_ __TA_GUARDED(lock_);
}; // class AmlCanvas
} // namespace aml_canvas
#endif // SRC_GRAPHICS_DISPLAY_DRIVERS_AML_CANVAS_AML_CANVAS_H_