// 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. #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define GET_NUM_WORDS(x) ((x) / 4 + (((x) % 4) ? 1 : 0)) namespace mailbox { class AmlMailbox; using DeviceType = ddk::Device; class AmlMailbox : public DeviceType, public ddk::MailboxProtocol { public: DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(AmlMailbox); explicit AmlMailbox(zx_device_t* parent) : DeviceType(parent), pdev_(parent) {} static zx_status_t Create(zx_device_t* parent); // DDK Hooks. void DdkRelease(); void DdkUnbind(); // ZX_PROTOCOL_MAILBOX protocol. zx_status_t MailboxSendCommand(const mailbox_channel_t* channel, const mailbox_data_buf_t* mdata); private: static constexpr uint32_t kNumMailboxes = 6; // MMIO Indexes enum { MMIO_MAILBOX, MMIO_MAILBOX_PAYLOAD, }; // IRQ Indexes enum { MAILBOX_IRQ_RECEIV0, MAILBOX_IRQ_RECEIV1, MAILBOX_IRQ_RECEIV2, MAILBOX_IRQ_SEND3, MAILBOX_IRQ_SEND4, MAILBOX_IRQ_SEND5, }; zx_status_t InitPdev(); zx_status_t Bind(); mailbox_type_t GetRxMailbox(mailbox_type_t tx_mailbox); size_t GetNumWords(size_t size); ddk::PDev pdev_; zx::interrupt inth_[kNumMailboxes]; mtx_t mailbox_chan_lock_[kNumMailboxes]; std::optional mailbox_mmio_; std::optional mailbox_payload_mmio_; }; } // namespace mailbox