Software APIs
dt_soc_proxy.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 soc_proxy and top darjeeling.
10 */
11
12#include "dt/dt_soc_proxy.h"
13
14
15
16/**
17 * Description of instances.
18 */
19typedef struct dt_desc_soc_proxy {
20 dt_instance_id_t inst_id; /**< Instance ID */
21 uint32_t base_addr[kDtSocProxyRegBlockCount]; /**< Base address of each register block */
22 /**
23 * PLIC ID of the first IRQ of this instance
24 *
25 * This can be `kDtPlicIrqIdNone` if the block is not connected to the PLIC.
26 */
28 /**
29 * Alert ID of the first Alert of this instance.
30 *
31 * This value is undefined if the block is not connected to the Alert Handler.
32 */
34 dt_clock_t clock[kDtSocProxyClockCount]; /**< Clock signal connected to each clock port */
35 dt_reset_t reset[kDtSocProxyResetCount]; /**< Reset signal connected to each reset port */
36 dt_periph_io_t periph_io[kDtSocProxyPeriphIoCount]; /**< Description of each peripheral I/O */
38
39
40
41
42static const dt_desc_soc_proxy_t soc_proxy_desc[kDtSocProxyCount] = {
43 [kDtSocProxy] = {
44 .inst_id = kDtInstanceIdSocProxy,
45 .base_addr = {
46 [kDtSocProxyRegBlockCore] = 0x22030000,
47 [kDtSocProxyRegBlockCtn] = 0x40000000,
48 },
51 .clock = {
54 },
55 .reset = {
58 },
59 .periph_io = {
60 [kDtSocProxyPeriphIoSocGpi0] = {
61 .__internal = {
62 .type = kDtPeriphIoTypeDio,
63 .dir = kDtPeriphIoDirIn,
64 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi0,
65 .outsel_or_dt_pad = kDtPadSocProxySocGpi0,
66 },
67 },
68 [kDtSocProxyPeriphIoSocGpi1] = {
69 .__internal = {
70 .type = kDtPeriphIoTypeDio,
71 .dir = kDtPeriphIoDirIn,
72 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi1,
73 .outsel_or_dt_pad = kDtPadSocProxySocGpi1,
74 },
75 },
76 [kDtSocProxyPeriphIoSocGpi2] = {
77 .__internal = {
78 .type = kDtPeriphIoTypeDio,
79 .dir = kDtPeriphIoDirIn,
80 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi2,
81 .outsel_or_dt_pad = kDtPadSocProxySocGpi2,
82 },
83 },
84 [kDtSocProxyPeriphIoSocGpi3] = {
85 .__internal = {
86 .type = kDtPeriphIoTypeDio,
87 .dir = kDtPeriphIoDirIn,
88 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi3,
89 .outsel_or_dt_pad = kDtPadSocProxySocGpi3,
90 },
91 },
92 [kDtSocProxyPeriphIoSocGpi4] = {
93 .__internal = {
94 .type = kDtPeriphIoTypeDio,
95 .dir = kDtPeriphIoDirIn,
96 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi4,
97 .outsel_or_dt_pad = kDtPadSocProxySocGpi4,
98 },
99 },
100 [kDtSocProxyPeriphIoSocGpi5] = {
101 .__internal = {
102 .type = kDtPeriphIoTypeDio,
103 .dir = kDtPeriphIoDirIn,
104 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi5,
105 .outsel_or_dt_pad = kDtPadSocProxySocGpi5,
106 },
107 },
108 [kDtSocProxyPeriphIoSocGpi6] = {
109 .__internal = {
110 .type = kDtPeriphIoTypeDio,
111 .dir = kDtPeriphIoDirIn,
112 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi6,
113 .outsel_or_dt_pad = kDtPadSocProxySocGpi6,
114 },
115 },
116 [kDtSocProxyPeriphIoSocGpi7] = {
117 .__internal = {
118 .type = kDtPeriphIoTypeDio,
119 .dir = kDtPeriphIoDirIn,
120 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi7,
121 .outsel_or_dt_pad = kDtPadSocProxySocGpi7,
122 },
123 },
124 [kDtSocProxyPeriphIoSocGpi8] = {
125 .__internal = {
126 .type = kDtPeriphIoTypeDio,
127 .dir = kDtPeriphIoDirIn,
128 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi8,
129 .outsel_or_dt_pad = kDtPadSocProxySocGpi8,
130 },
131 },
132 [kDtSocProxyPeriphIoSocGpi9] = {
133 .__internal = {
134 .type = kDtPeriphIoTypeDio,
135 .dir = kDtPeriphIoDirIn,
136 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi9,
137 .outsel_or_dt_pad = kDtPadSocProxySocGpi9,
138 },
139 },
140 [kDtSocProxyPeriphIoSocGpi10] = {
141 .__internal = {
142 .type = kDtPeriphIoTypeDio,
143 .dir = kDtPeriphIoDirIn,
144 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi10,
145 .outsel_or_dt_pad = kDtPadSocProxySocGpi10,
146 },
147 },
148 [kDtSocProxyPeriphIoSocGpi11] = {
149 .__internal = {
150 .type = kDtPeriphIoTypeDio,
151 .dir = kDtPeriphIoDirIn,
152 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi11,
153 .outsel_or_dt_pad = kDtPadSocProxySocGpi11,
154 },
155 },
156 [kDtSocProxyPeriphIoSocGpi12] = {
157 .__internal = {
158 .type = kDtPeriphIoTypeMio,
159 .dir = kDtPeriphIoDirIn,
160 .periph_input_or_direct_pad = kTopDarjeelingPinmuxPeripheralInSocProxySocGpi12,
161 .outsel_or_dt_pad = 0,
162 },
163 },
164 [kDtSocProxyPeriphIoSocGpi13] = {
165 .__internal = {
166 .type = kDtPeriphIoTypeMio,
167 .dir = kDtPeriphIoDirIn,
168 .periph_input_or_direct_pad = kTopDarjeelingPinmuxPeripheralInSocProxySocGpi13,
169 .outsel_or_dt_pad = 0,
170 },
171 },
172 [kDtSocProxyPeriphIoSocGpi14] = {
173 .__internal = {
174 .type = kDtPeriphIoTypeMio,
175 .dir = kDtPeriphIoDirIn,
176 .periph_input_or_direct_pad = kTopDarjeelingPinmuxPeripheralInSocProxySocGpi14,
177 .outsel_or_dt_pad = 0,
178 },
179 },
180 [kDtSocProxyPeriphIoSocGpi15] = {
181 .__internal = {
182 .type = kDtPeriphIoTypeMio,
183 .dir = kDtPeriphIoDirIn,
184 .periph_input_or_direct_pad = kTopDarjeelingPinmuxPeripheralInSocProxySocGpi15,
185 .outsel_or_dt_pad = 0,
186 },
187 },
188 [kDtSocProxyPeriphIoSocGpo0] = {
189 .__internal = {
190 .type = kDtPeriphIoTypeDio,
191 .dir = kDtPeriphIoDirOut,
192 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo0,
193 .outsel_or_dt_pad = kDtPadSocProxySocGpo0,
194 },
195 },
196 [kDtSocProxyPeriphIoSocGpo1] = {
197 .__internal = {
198 .type = kDtPeriphIoTypeDio,
199 .dir = kDtPeriphIoDirOut,
200 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo1,
201 .outsel_or_dt_pad = kDtPadSocProxySocGpo1,
202 },
203 },
204 [kDtSocProxyPeriphIoSocGpo2] = {
205 .__internal = {
206 .type = kDtPeriphIoTypeDio,
207 .dir = kDtPeriphIoDirOut,
208 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo2,
209 .outsel_or_dt_pad = kDtPadSocProxySocGpo2,
210 },
211 },
212 [kDtSocProxyPeriphIoSocGpo3] = {
213 .__internal = {
214 .type = kDtPeriphIoTypeDio,
215 .dir = kDtPeriphIoDirOut,
216 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo3,
217 .outsel_or_dt_pad = kDtPadSocProxySocGpo3,
218 },
219 },
220 [kDtSocProxyPeriphIoSocGpo4] = {
221 .__internal = {
222 .type = kDtPeriphIoTypeDio,
223 .dir = kDtPeriphIoDirOut,
224 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo4,
225 .outsel_or_dt_pad = kDtPadSocProxySocGpo4,
226 },
227 },
228 [kDtSocProxyPeriphIoSocGpo5] = {
229 .__internal = {
230 .type = kDtPeriphIoTypeDio,
231 .dir = kDtPeriphIoDirOut,
232 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo5,
233 .outsel_or_dt_pad = kDtPadSocProxySocGpo5,
234 },
235 },
236 [kDtSocProxyPeriphIoSocGpo6] = {
237 .__internal = {
238 .type = kDtPeriphIoTypeDio,
239 .dir = kDtPeriphIoDirOut,
240 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo6,
241 .outsel_or_dt_pad = kDtPadSocProxySocGpo6,
242 },
243 },
244 [kDtSocProxyPeriphIoSocGpo7] = {
245 .__internal = {
246 .type = kDtPeriphIoTypeDio,
247 .dir = kDtPeriphIoDirOut,
248 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo7,
249 .outsel_or_dt_pad = kDtPadSocProxySocGpo7,
250 },
251 },
252 [kDtSocProxyPeriphIoSocGpo8] = {
253 .__internal = {
254 .type = kDtPeriphIoTypeDio,
255 .dir = kDtPeriphIoDirOut,
256 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo8,
257 .outsel_or_dt_pad = kDtPadSocProxySocGpo8,
258 },
259 },
260 [kDtSocProxyPeriphIoSocGpo9] = {
261 .__internal = {
262 .type = kDtPeriphIoTypeDio,
263 .dir = kDtPeriphIoDirOut,
264 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo9,
265 .outsel_or_dt_pad = kDtPadSocProxySocGpo9,
266 },
267 },
268 [kDtSocProxyPeriphIoSocGpo10] = {
269 .__internal = {
270 .type = kDtPeriphIoTypeDio,
271 .dir = kDtPeriphIoDirOut,
272 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo10,
273 .outsel_or_dt_pad = kDtPadSocProxySocGpo10,
274 },
275 },
276 [kDtSocProxyPeriphIoSocGpo11] = {
277 .__internal = {
278 .type = kDtPeriphIoTypeDio,
279 .dir = kDtPeriphIoDirOut,
280 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo11,
281 .outsel_or_dt_pad = kDtPadSocProxySocGpo11,
282 },
283 },
284 [kDtSocProxyPeriphIoSocGpo12] = {
285 .__internal = {
286 .type = kDtPeriphIoTypeMio,
287 .dir = kDtPeriphIoDirOut,
288 .periph_input_or_direct_pad = 0,
290 },
291 },
292 [kDtSocProxyPeriphIoSocGpo13] = {
293 .__internal = {
294 .type = kDtPeriphIoTypeMio,
295 .dir = kDtPeriphIoDirOut,
296 .periph_input_or_direct_pad = 0,
298 },
299 },
300 [kDtSocProxyPeriphIoSocGpo14] = {
301 .__internal = {
302 .type = kDtPeriphIoTypeMio,
303 .dir = kDtPeriphIoDirOut,
304 .periph_input_or_direct_pad = 0,
306 },
307 },
308 [kDtSocProxyPeriphIoSocGpo15] = {
309 .__internal = {
310 .type = kDtPeriphIoTypeMio,
311 .dir = kDtPeriphIoDirOut,
312 .periph_input_or_direct_pad = 0,
314 },
315 },
316 },
317 },
318};
319
320/**
321 * Return a pointer to the `dt_soc_proxy_desc_t` structure of the requested
322 * `dt` if it's a valid index. Otherwise, this macro will `return` (i.e. exit
323 * the function) with the provided default value.
324 */
325#define TRY_GET_DT(dt, default) ({ if ((dt) < (dt_soc_proxy_t)0 || (dt) >= kDtSocProxyCount) return (default); &soc_proxy_desc[dt]; })
326
328 if (inst_id >= kDtInstanceIdSocProxy && inst_id <= kDtInstanceIdSocProxy) {
329 return (dt_soc_proxy_t)(inst_id - kDtInstanceIdSocProxy);
330 }
331 return (dt_soc_proxy_t)0;
332}
333
338
341 dt_soc_proxy_reg_block_t reg_block) {
342 // Return a recognizable address in case of wrong argument.
343 return TRY_GET_DT(dt, 0xdeadbeef)->base_addr[reg_block];
344}
345
348 dt_soc_proxy_irq_t irq) {
349 dt_plic_irq_id_t first_irq = TRY_GET_DT(dt, kDtPlicIrqIdNone)->first_irq;
350 if (first_irq == kDtPlicIrqIdNone) {
351 return kDtPlicIrqIdNone;
352 }
353 return (dt_plic_irq_id_t)((uint32_t)first_irq + (uint32_t)irq);
354}
355
358 dt_plic_irq_id_t irq) {
359 dt_soc_proxy_irq_t count = kDtSocProxyIrqCount;
360 dt_plic_irq_id_t first_irq = TRY_GET_DT(dt, count)->first_irq;
361 if (first_irq == kDtPlicIrqIdNone) {
362 return count;
363 }
364 if (irq < first_irq || irq >= first_irq + (dt_plic_irq_id_t)count) {
365 return count;
366 }
367 return (dt_soc_proxy_irq_t)(irq - first_irq);
368}
369
370
373 dt_soc_proxy_alert_t alert) {
374 return (dt_alert_id_t)((uint32_t)soc_proxy_desc[dt].first_alert + (uint32_t)alert);
375}
376
379 dt_alert_id_t alert) {
380 dt_soc_proxy_alert_t count = kDtSocProxyAlertCount;
381 if (alert < soc_proxy_desc[dt].first_alert || alert >= soc_proxy_desc[dt].first_alert + (dt_alert_id_t)count) {
382 return count;
383 }
384 return (dt_soc_proxy_alert_t)(alert - soc_proxy_desc[dt].first_alert);
385}
386
387
391 // Return a harmless value in case of wrong argument.
392 return TRY_GET_DT(dt, kDtPeriphIoConstantHighZ)->periph_io[sig];
393}
394
398 // Return the first clock in case of invalid argument.
399 return TRY_GET_DT(dt, (dt_clock_t)0)->clock[clk];
400}
401
405 const dt_soc_proxy_reset_t count = kDtSocProxyResetCount;
406 if (rst >= count) {
407 return kDtResetUnknown;
408 }
409 return TRY_GET_DT(dt, kDtResetUnknown)->reset[rst];
410}
411
412