1// Copyright 2018 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#pragma once
6
7#include <ddk/debug.h>
8#include <ddk/device.h>
9#include <ddk/driver.h>
10#include <ddk/mmio-buffer.h>
11#include <ddk/protocol/mailbox.h>
12#include <ddk/protocol/platform-bus.h>
13#include <ddk/protocol/platform-defs.h>
14#include <ddk/protocol/platform-device.h>
15#include <hw/reg.h>
16#include <lib/sync/completion.h>
17#include <threads.h>
18
19#define MAILBOX_ERROR(fmt, ...) zxlogf(ERROR, "[%s %d]" fmt, __func__, __LINE__, ##__VA_ARGS__)
20#define MAILBOX_INFO(fmt, ...) zxlogf(INFO, "[%s %d]" fmt, __func__, __LINE__, ##__VA_ARGS__)
21
22#define NUM_MAILBOXES 6
23#define GET_NUM_WORDS(x) ((x) / 4 + (((x) % 4) ? 1 : 0))
24
25typedef struct {
26    uint32_t set_offset;
27    uint32_t stat_offset;
28    uint32_t clr_offset;
29    uint32_t payload_offset;
30} aml_mailbox_block_t;
31
32typedef struct {
33    zx_device_t* zxdev;
34    platform_device_protocol_t pdev;
35
36    mmio_buffer_t mmio_mailbox;
37    mmio_buffer_t mmio_mailbox_payload;
38
39    zx_handle_t inth[NUM_MAILBOXES];
40
41    mtx_t mailbox_chan_lock[NUM_MAILBOXES];
42} aml_mailbox_t;
43
44// MMIO Indexes
45enum {
46    MMIO_MAILBOX,
47    MMIO_MAILBOX_PAYLOAD,
48};
49
50// IRQ Indexes
51enum {
52    MAILBOX_IRQ_RECEIV0,
53    MAILBOX_IRQ_RECEIV1,
54    MAILBOX_IRQ_RECEIV2,
55    MAILBOX_IRQ_SEND3,
56    MAILBOX_IRQ_SEND4,
57    MAILBOX_IRQ_SEND5,
58};
59
60// Mailboxes
61enum {
62    SCP_SECURE_MAILBOX,
63    SCP_NS_LOW_PRIORITY_MAILBOX,
64    SCP_NS_HIGH_PRIORITY_MAILBOX,
65    AP_SECURE_MAILBOX,
66    AP_NS_LOW_PRIORITY_MAILBOX,
67    AP_NS_HIGH_PRIORITY_MAILBOX,
68    INVALID_MAILBOX,
69};
70