blob: 10247d24f43d4103d645dca842c881c87d91018e [file] [log] [blame]
Tamas Ban3331d892022-01-10 17:04:03 +01001/*
2 * Copyright (c) 2020-2022, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef MHU_V2_X_H
8#define MHU_V2_X_H
9
10#include <stdbool.h>
11#include <stdint.h>
12
13#define MHU_2_X_INTR_NR2R_OFF (0x0u)
14#define MHU_2_X_INTR_R2NR_OFF (0x1u)
15#define MHU_2_1_INTR_CHCOMB_OFF (0x2u)
16
17#define MHU_2_X_INTR_NR2R_MASK (0x1u << MHU_2_X_INTR_NR2R_OFF)
18#define MHU_2_X_INTR_R2NR_MASK (0x1u << MHU_2_X_INTR_R2NR_OFF)
19#define MHU_2_1_INTR_CHCOMB_MASK (0x1u << MHU_2_1_INTR_CHCOMB_OFF)
20
21enum mhu_v2_x_frame_t {
22 MHU_V2_X_SENDER_FRAME = 0x0u,
23 MHU_V2_X_RECEIVER_FRAME = 0x1u,
24};
25
26enum mhu_v2_x_supported_revisions {
27 MHU_REV_READ_FROM_HW = 0,
28 MHU_REV_2_0,
29 MHU_REV_2_1,
30};
31
32struct mhu_v2_x_dev_t {
33 uintptr_t base;
34 enum mhu_v2_x_frame_t frame;
35 uint32_t subversion; /*!< Hardware subversion: v2.X */
36 bool is_initialized; /*!< Indicates if the MHU driver
37 * is initialized and enabled
38 */
39};
40
41/**
42 * MHU v2 error enumeration types.
43 */
44enum mhu_v2_x_error_t {
45 MHU_V_2_X_ERR_NONE = 0,
46 MHU_V_2_X_ERR_NOT_INIT = -1,
47 MHU_V_2_X_ERR_ALREADY_INIT = -2,
48 MHU_V_2_X_ERR_UNSUPPORTED_VERSION = -3,
49 MHU_V_2_X_ERR_INVALID_ARG = -4,
50 MHU_V_2_X_ERR_GENERAL = -5
51};
52
53/**
54 * Initializes the driver.
55 *
56 * dev MHU device struct mhu_v2_x_dev_t.
57 * rev MHU revision (if can't be identified from HW).
58 *
59 * Reads the MHU hardware version.
60 *
61 * Returns mhu_v2_x_error_t error code.
62 *
63 * MHU revision only has to be specified when versions can't be read
64 * from HW (ARCH_MAJOR_REV reg reads as 0x0).
65 *
66 * This function doesn't check if dev is NULL.
67 */
68enum mhu_v2_x_error_t mhu_v2_x_driver_init(struct mhu_v2_x_dev_t *dev,
69 enum mhu_v2_x_supported_revisions rev);
70
71/**
72 * Returns the number of channels implemented.
73 *
74 * dev MHU device struct mhu_v2_x_dev_t.
75 *
76 * This function doesn't check if dev is NULL.
77 */
78uint32_t mhu_v2_x_get_num_channel_implemented(
79 const struct mhu_v2_x_dev_t *dev);
80
81/**
82 * Sends the value over a channel.
83 *
84 * dev MHU device struct mhu_v2_x_dev_t.
85 * channel Channel to send the value over.
86 * val Value to send.
87 *
88 * Sends the value over a channel.
89 *
90 * Returns mhu_v2_x_error_t error code.
91 *
92 * This function doesn't check if dev is NULL.
93 * This function doesn't check if channel is implemented.
94 */
95enum mhu_v2_x_error_t mhu_v2_x_channel_send(const struct mhu_v2_x_dev_t *dev,
96 uint32_t channel, uint32_t val);
97
98/**
99 * Polls sender channel status.
100 *
101 * dev MHU device struct mhu_v2_x_dev_t.
102 * channel Channel to poll the status of.
103 * value Pointer to variable that will store the value.
104 *
105 * Polls sender channel status.
106 *
107 * Returns mhu_v2_x_error_t error code.
108 *
109 * This function doesn't check if dev is NULL.
110 * This function doesn't check if channel is implemented.
111 */
112enum mhu_v2_x_error_t mhu_v2_x_channel_poll(const struct mhu_v2_x_dev_t *dev,
113 uint32_t channel, uint32_t *value);
114
115/**
116 * Clears the channel after the value is send over it.
117 *
118 * dev MHU device struct mhu_v2_x_dev_t.
119 * channel Channel to clear.
120 *
121 * Clears the channel after the value is send over it.
122 *
123 * Returns mhu_v2_x_error_t error code..
124 *
125 * This function doesn't check if dev is NULL.
126 * This function doesn't check if channel is implemented.
127 */
128enum mhu_v2_x_error_t mhu_v2_x_channel_clear(const struct mhu_v2_x_dev_t *dev,
129 uint32_t channel);
130
131/**
132 * Receives the value over a channel.
133 *
134 * dev MHU device struct mhu_v2_x_dev_t.
135 * channel Channel to receive the value from.
136 * value Pointer to variable that will store the value.
137 *
138 * Receives the value over a channel.
139 *
140 * Returns mhu_v2_x_error_t error code.
141 *
142 * This function doesn't check if dev is NULL.
143 * This function doesn't check if channel is implemented.
144 */
145enum mhu_v2_x_error_t mhu_v2_x_channel_receive(
146 const struct mhu_v2_x_dev_t *dev, uint32_t channel, uint32_t *value);
147
148/**
149 * Sets bits in the Channel Mask.
150 *
151 * dev MHU device struct mhu_v2_x_dev_t.
152 * channel Which channel's mask to set.
153 * mask Mask to be set over a receiver frame.
154 *
155 * Sets bits in the Channel Mask.
156 *
157 * Returns mhu_v2_x_error_t error code..
158 *
159 * This function doesn't check if dev is NULL.
160 * This function doesn't check if channel is implemented.
161 */
162enum mhu_v2_x_error_t mhu_v2_x_channel_mask_set(
163 const struct mhu_v2_x_dev_t *dev, uint32_t channel, uint32_t mask);
164
165/**
166 * Clears bits in the Channel Mask.
167 *
168 * dev MHU device struct mhu_v2_x_dev_t.
169 * channel Which channel's mask to clear.
170 * mask Mask to be clear over a receiver frame.
171 *
172 * Clears bits in the Channel Mask.
173 *
174 * Returns mhu_v2_x_error_t error code.
175 *
176 * This function doesn't check if dev is NULL.
177 * This function doesn't check if channel is implemented.
178 */
179enum mhu_v2_x_error_t mhu_v2_x_channel_mask_clear(
180 const struct mhu_v2_x_dev_t *dev, uint32_t channel, uint32_t mask);
181
182/**
183 * Initiates a MHU transfer with the handshake signals.
184 *
185 * dev MHU device struct mhu_v2_x_dev_t.
186 *
187 * Initiates a MHU transfer with the handshake signals in a blocking mode.
188 *
189 * Returns mhu_v2_x_error_t error code.
190 *
191 * This function doesn't check if dev is NULL.
192 */
193enum mhu_v2_x_error_t mhu_v2_x_initiate_transfer(
194 const struct mhu_v2_x_dev_t *dev);
195
196/**
197 * Closes a MHU transfer with the handshake signals.
198 *
199 * dev MHU device struct mhu_v2_x_dev_t.
200 *
201 * Closes a MHU transfer with the handshake signals in a blocking mode.
202 *
203 * Returns mhu_v2_x_error_t error code.
204 *
205 * This function doesn't check if dev is NULL.
206 */
207enum mhu_v2_x_error_t mhu_v2_x_close_transfer(
208 const struct mhu_v2_x_dev_t *dev);
209
210#endif /* MHU_V2_X_H */