blob: a3a19503b0a65f86e7a27ef60ef66f9cf17c6461 [file] [log] [blame]
Aziz IDOMARd3fbce72023-12-19 19:43:52 +00001/*
2 * Copyright (c) 2024, Arm Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef MHU_V3_X_H
8#define MHU_V3_X_H
9
10#include <stdbool.h>
11#include <stdint.h>
12
13/* MHU Architecture Major Revision 3 */
14#define MHU_MAJOR_REV_V3 U(0x2)
15/* MHU Architecture Minor Revision 0 */
16#define MHU_MINOR_REV_3_0 U(0x0)
17
18/* MHU Architecture Major Revision offset */
19#define MHU_ARCH_MAJOR_REV_OFF U(0x4)
20/* MHU Architecture Major Revision mask */
21#define MHU_ARCH_MAJOR_REV_MASK (U(0xf) << MHU_ARCH_MAJOR_REV_OFF)
22
23/* MHU Architecture Minor Revision offset */
24#define MHU_ARCH_MINOR_REV_OFF U(0x0)
25/* MHU Architecture Minor Revision mask */
26#define MHU_ARCH_MINOR_REV_MASK (U(0xf) << MHU_ARCH_MINOR_REV_OFF)
27
28/* MHUv3 PBX/MBX Operational Request offset */
29#define MHU_V3_OP_REQ_OFF U(0)
30/* MHUv3 PBX/MBX Operational Request */
31#define MHU_V3_OP_REQ (U(1) << MHU_V3_OP_REQ_OFF)
32
33/**
34 * MHUv3 error enumeration types
35 */
36enum mhu_v3_x_error_t {
37 /* No error */
38 MHU_V_3_X_ERR_NONE,
39 /* MHU driver not initialized */
40 MHU_V_3_X_ERR_NOT_INIT,
41 /* MHU driver alreary initialized */
42 MHU_V_3_X_ERR_ALREADY_INIT,
43 /* MHU Revision not supported error */
44 MHU_V_3_X_ERR_UNSUPPORTED_VERSION,
45 /* Operation not supported */
46 MHU_V_3_X_ERR_UNSUPPORTED,
47 /* Invalid parameter */
48 MHU_V_3_X_ERR_INVALID_PARAM,
49 /* General MHU driver error */
50 MHU_V_3_X_ERR_GENERAL,
51};
52
53/**
54 * MHUv3 channel types
55 */
56enum mhu_v3_x_channel_type_t {
57 /* Doorbell channel */
58 MHU_V3_X_CHANNEL_TYPE_DBCH,
59 /* Channel type count */
60 MHU_V3_X_CHANNEL_TYPE_COUNT,
61};
62
63/**
64 * MHUv3 frame types
65 */
66enum mhu_v3_x_frame_t {
67 /* MHUv3 postbox frame */
68 MHU_V3_X_PBX_FRAME,
69 /* MHUv3 mailbox frame */
70 MHU_V3_X_MBX_FRAME,
71};
72
73/**
74 * MHUv3 device structure
75 */
76struct mhu_v3_x_dev_t {
77 /* Base address of the MHUv3 frame */
78 uintptr_t base;
79 /* Type of the MHUv3 frame */
80 enum mhu_v3_x_frame_t frame;
81 /* Minor revision of the MHUv3 */
82 uint32_t subversion;
83 /* Flag to indicate if the MHUv3 is initialized */
84 bool is_initialized;
85};
86
87/**
88 * Initializes the MHUv3
89 *
90 * dev MHU device struct mhu_v3_x_dev_t
91 *
92 * Returns mhu_v3_x_error_t error code
93 */
94enum mhu_v3_x_error_t mhu_v3_x_driver_init(struct mhu_v3_x_dev_t *dev);
95
96/**
97 * Returns the number of channels implemented
98 *
99 * dev MHU device struct mhu_v3_x_dev_t
100 * ch_type MHU channel type mhu_v3_x_channel_type_t
101 * num_ch Pointer to the variable that will store the value
102 *
103 * Returns mhu_v3_x_error_t error code
104 */
105enum mhu_v3_x_error_t mhu_v3_x_get_num_channel_implemented(
106 const struct mhu_v3_x_dev_t *dev, enum mhu_v3_x_channel_type_t ch_type,
107 uint8_t *num_ch);
108
109/**
110 * Clear flags from a doorbell channel
111 *
112 * dev MHU device struct mhu_v3_x_dev_t
113 * channel Doorbell channel number
114 * flags Flags to be cleared from the channel
115 *
116 * Returns mhu_v3_x_error_t error code
117 */
118enum mhu_v3_x_error_t mhu_v3_x_doorbell_clear(const struct mhu_v3_x_dev_t *dev,
119 const uint32_t channel, uint32_t flags);
120
121/**
122 * Write flags to a doorbell channel
123 *
124 * dev MHU device struct mhu_v3_x_dev_t
125 * channel Doorbell channel number
126 * flags Flags to be written to the channel
127 *
128 * Returns mhu_v3_x_error_t error code
129 */
130enum mhu_v3_x_error_t mhu_v3_x_doorbell_write(const struct mhu_v3_x_dev_t *dev,
131 const uint32_t channel, uint32_t flags);
132
133/**
134 * Read value from a doorbell channel
135 *
136 * dev MHU device struct mhu_v3_x_dev_t
137 * channel Doorbell channel number
138 * flags Pointer to the variable that will store the flags read from the
139 * channel
140 *
141 * Returns mhu_v3_x_error_t error code
142 */
143enum mhu_v3_x_error_t mhu_v3_x_doorbell_read(const struct mhu_v3_x_dev_t *dev,
144 const uint32_t channel, uint32_t *flags);
145
146/**
147 * Set bits in a doorbell channel mask which is used to disable interrupts for
148 * received flags corresponding to the mask
149 *
150 * dev MHU device struct mhu_v3_x_dev_t
151 * channel Doorbell channel number
152 * flags Flags to set mask bits in this doorbell channel
153 *
154 * Returns mhu_v3_x_error_t error code
155 */
156enum mhu_v3_x_error_t mhu_v3_x_doorbell_mask_set(
157 const struct mhu_v3_x_dev_t *dev, const uint32_t channel,
158 uint32_t flags);
159
160/**
161 * Clear bits in a doorbell channel mask which is used to disable interrupts
162 * for received flags corresponding to the mask
163 *
164 * dev MHU device struct mhu_v3_x_dev_t
165 * channel Doorbell channel number
166 * flags Flags to clear mask bits in this doorbell channel
167 *
168 * Returns mhu_v3_x_error_t error code
169 */
170enum mhu_v3_x_error_t mhu_v3_x_doorbell_mask_clear(
171 const struct mhu_v3_x_dev_t *dev, const uint32_t channel, uint32_t flags);
172
173/**
174 * Get the mask of a doorbell channel which is used to disable interrupts for
175 * received flags corresponding to the mask
176 *
177 * dev MHU device struct mhu_v3_x_dev_t
178 * channel Doorbell channel number
179 * flags Pointer to the variable that will store the flags read from the
180 * mask value
181 *
182 * Returns mhu_v3_x_error_t error code
183 */
184enum mhu_v3_x_error_t mhu_v3_x_doorbell_mask_get(
185 const struct mhu_v3_x_dev_t *dev, const uint32_t channel, uint32_t *flags);
186
187/**
188 * Enable the channel interrupt
189 *
190 * dev MHU device struct mhu_v3_x_dev_t
191 * channel Doorbell channel number
192 * ch_type MHU channel type mhu_v3_x_channel_type_t
193 *
194 * Returns mhu_v3_x_error_t error code
195 */
196enum mhu_v3_x_error_t mhu_v3_x_channel_interrupt_enable(
197 const struct mhu_v3_x_dev_t *dev, const uint32_t channel,
198 enum mhu_v3_x_channel_type_t ch_type);
199
200/**
201 * Disable the channel interrupt
202 *
203 * dev MHU device struct mhu_v3_x_dev_t
204 * channel Doorbell channel number
205 * ch_type MHU channel type mhu_v3_x_channel_type_t
206 *
207 * Returns mhu_v3_x_error_t error code
208 */
209enum mhu_v3_x_error_t mhu_v3_x_channel_interrupt_disable(
210 const struct mhu_v3_x_dev_t *dev, const uint32_t channel,
211 enum mhu_v3_x_channel_type_t ch_type);
212
213/**
214 * Clear the channel interrupt
215 *
216 * dev MHU device struct mhu_v3_x_dev_t
217 * channel Doorbell channel number
218 * ch_type MHU channel type mhu_v3_x_channel_type_t
219 *
220 * Returns mhu_v3_x_error_t error code
221 */
222enum mhu_v3_x_error_t mhu_v3_x_channel_interrupt_clear(
223 const struct mhu_v3_x_dev_t *dev, const uint32_t channel,
224 enum mhu_v3_x_channel_type_t ch_type);
225
226#endif /* MHU_V3_X_H */