Software APIs
dt_mbx.c
Go to the documentation of this file.
1// Copyright lowRISC contributors (OpenTitan project).
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4//
5// Device table API auto-generated by `dtgen`
6
7/**
8 * @file
9 * @brief Device Tables (DT) for IP mbx and top darjeeling.
10 */
11
12#include "hw/top/dt/dt_mbx.h"
13
14
15
16/**
17 * Description of instances.
18 */
19typedef struct dt_desc_mbx {
20 dt_instance_id_t inst_id; /**< Instance ID */
21 uint32_t reg_addr[kDtMbxRegBlockCount]; /**< Base address of each register block */
22 uint32_t mem_addr[kDtMbxMemoryCount]; /**< Base address of each memory */
23 uint32_t mem_size[kDtMbxMemoryCount]; /**< Size in bytes of each memory */
24 /**
25 * PLIC ID of the first IRQ of this instance
26 *
27 * This can be `kDtPlicIrqIdNone` if the block is not connected to the PLIC.
28 */
30 /**
31 * Alert ID of the first Alert of this instance.
32 *
33 * This value is undefined if the block is not connected to the Alert Handler.
34 */
36 dt_clock_t clock[kDtMbxClockCount]; /**< Clock signal connected to each clock port */
37 dt_reset_t reset[kDtMbxResetCount]; /**< Reset signal connected to each reset port */
39
40
41
42
43static const dt_desc_mbx_t mbx_desc[kDtMbxCount] = {
44 [kDtMbx0] = {
45 .inst_id = kDtInstanceIdMbx0,
46 .reg_addr = {
47 [kDtMbxRegBlockCore] = 0x22000000,
48 [kDtMbxRegBlockSoc] = 0xffffffff,
49 },
50 .mem_addr = {
51 },
52 .mem_size = {
53 },
56 .clock = {
58 },
59 .reset = {
61 },
62 },
63 [kDtMbx1] = {
64 .inst_id = kDtInstanceIdMbx1,
65 .reg_addr = {
66 [kDtMbxRegBlockCore] = 0x22000100,
67 [kDtMbxRegBlockSoc] = 0xffffffff,
68 },
69 .mem_addr = {
70 },
71 .mem_size = {
72 },
75 .clock = {
77 },
78 .reset = {
80 },
81 },
82 [kDtMbx2] = {
83 .inst_id = kDtInstanceIdMbx2,
84 .reg_addr = {
85 [kDtMbxRegBlockCore] = 0x22000200,
86 [kDtMbxRegBlockSoc] = 0xffffffff,
87 },
88 .mem_addr = {
89 },
90 .mem_size = {
91 },
94 .clock = {
96 },
97 .reset = {
99 },
100 },
101 [kDtMbx3] = {
102 .inst_id = kDtInstanceIdMbx3,
103 .reg_addr = {
104 [kDtMbxRegBlockCore] = 0x22000300,
105 [kDtMbxRegBlockSoc] = 0xffffffff,
106 },
107 .mem_addr = {
108 },
109 .mem_size = {
110 },
113 .clock = {
115 },
116 .reset = {
118 },
119 },
120 [kDtMbx4] = {
121 .inst_id = kDtInstanceIdMbx4,
122 .reg_addr = {
123 [kDtMbxRegBlockCore] = 0x22000400,
124 [kDtMbxRegBlockSoc] = 0xffffffff,
125 },
126 .mem_addr = {
127 },
128 .mem_size = {
129 },
132 .clock = {
134 },
135 .reset = {
137 },
138 },
139 [kDtMbx5] = {
140 .inst_id = kDtInstanceIdMbx5,
141 .reg_addr = {
142 [kDtMbxRegBlockCore] = 0x22000500,
143 [kDtMbxRegBlockSoc] = 0xffffffff,
144 },
145 .mem_addr = {
146 },
147 .mem_size = {
148 },
151 .clock = {
153 },
154 .reset = {
156 },
157 },
158 [kDtMbx6] = {
159 .inst_id = kDtInstanceIdMbx6,
160 .reg_addr = {
161 [kDtMbxRegBlockCore] = 0x22000600,
162 [kDtMbxRegBlockSoc] = 0xffffffff,
163 },
164 .mem_addr = {
165 },
166 .mem_size = {
167 },
170 .clock = {
172 },
173 .reset = {
175 },
176 },
177 [kDtMbxJtag] = {
178 .inst_id = kDtInstanceIdMbxJtag,
179 .reg_addr = {
180 [kDtMbxRegBlockCore] = 0x22000800,
181 [kDtMbxRegBlockSoc] = 0xffffffff,
182 },
183 .mem_addr = {
184 },
185 .mem_size = {
186 },
189 .clock = {
191 },
192 .reset = {
194 },
195 },
196 [kDtMbxPcie0] = {
197 .inst_id = kDtInstanceIdMbxPcie0,
198 .reg_addr = {
199 [kDtMbxRegBlockCore] = 0x22040000,
200 [kDtMbxRegBlockSoc] = 0xffffffff,
201 },
202 .mem_addr = {
203 },
204 .mem_size = {
205 },
208 .clock = {
210 },
211 .reset = {
213 },
214 },
215 [kDtMbxPcie1] = {
216 .inst_id = kDtInstanceIdMbxPcie1,
217 .reg_addr = {
218 [kDtMbxRegBlockCore] = 0x22040100,
219 [kDtMbxRegBlockSoc] = 0xffffffff,
220 },
221 .mem_addr = {
222 },
223 .mem_size = {
224 },
227 .clock = {
229 },
230 .reset = {
232 },
233 },
234};
235
236/**
237 * Return a pointer to the `dt_mbx_desc_t` structure of the requested
238 * `dt` if it's a valid index. Otherwise, this macro will `return` (i.e. exit
239 * the function) with the provided default value.
240 */
241#define TRY_GET_DT(dt, default) ({ if ((dt) < (dt_mbx_t)0 || (dt) >= kDtMbxCount) return (default); &mbx_desc[dt]; })
242
244 if (inst_id >= kDtInstanceIdMbx0 && inst_id <= kDtInstanceIdMbxPcie1) {
245 return (dt_mbx_t)(inst_id - kDtInstanceIdMbx0);
246 }
247 return (dt_mbx_t)0;
248}
249
254
256 dt_mbx_t dt,
257 dt_mbx_reg_block_t reg_block) {
258 // Return a recognizable address in case of wrong argument.
259 return TRY_GET_DT(dt, 0xdeadbeef)->reg_addr[reg_block];
260}
261
263 dt_mbx_t dt,
264 dt_mbx_memory_t mem) {
265 // Return a recognizable address in case of wrong argument.
266 return TRY_GET_DT(dt, 0xdeadbeef)->mem_addr[mem];
267}
268
270 dt_mbx_t dt,
271 dt_mbx_memory_t mem) {
272 // Return an empty size in case of wrong argument.
273 return TRY_GET_DT(dt, 0)->mem_size[mem];
274}
275
277 dt_mbx_t dt,
278 dt_mbx_irq_t irq) {
279 dt_plic_irq_id_t first_irq = TRY_GET_DT(dt, kDtPlicIrqIdNone)->first_irq;
280 if (first_irq == kDtPlicIrqIdNone) {
281 return kDtPlicIrqIdNone;
282 }
283 return (dt_plic_irq_id_t)((uint32_t)first_irq + (uint32_t)irq);
284}
285
287 dt_mbx_t dt,
288 dt_plic_irq_id_t irq) {
289 dt_mbx_irq_t count = kDtMbxIrqCount;
290 dt_plic_irq_id_t first_irq = TRY_GET_DT(dt, count)->first_irq;
291 if (first_irq == kDtPlicIrqIdNone) {
292 return count;
293 }
294 if (irq < first_irq || irq >= first_irq + (dt_plic_irq_id_t)count) {
295 return count;
296 }
297 return (dt_mbx_irq_t)(irq - first_irq);
298}
299
300
302 dt_mbx_t dt,
303 dt_mbx_alert_t alert) {
304 return (dt_alert_id_t)((uint32_t)mbx_desc[dt].first_alert + (uint32_t)alert);
305}
306
308 dt_mbx_t dt,
309 dt_alert_id_t alert) {
310 dt_mbx_alert_t count = kDtMbxAlertCount;
311 if (alert < mbx_desc[dt].first_alert || alert >= mbx_desc[dt].first_alert + (dt_alert_id_t)count) {
312 return count;
313 }
314 return (dt_mbx_alert_t)(alert - mbx_desc[dt].first_alert);
315}
316
317
318
320 dt_mbx_t dt,
321 dt_mbx_clock_t clk) {
322 // Return the first clock in case of invalid argument.
323 return TRY_GET_DT(dt, (dt_clock_t)0)->clock[clk];
324}
325
327 dt_mbx_t dt,
328 dt_mbx_reset_t rst) {
329 const dt_mbx_reset_t count = kDtMbxResetCount;
330 if (rst >= count) {
331 return kDtResetUnknown;
332 }
333 return TRY_GET_DT(dt, kDtResetUnknown)->reset[rst];
334}
335
336