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
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 reg_addr[kDtSocProxyRegBlockCount]; /**< Base address of each register block */
22 uint32_t mem_addr[kDtSocProxyMemoryCount]; /**< Base address of each memory */
23 uint32_t mem_size[kDtSocProxyMemoryCount]; /**< 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[kDtSocProxyClockCount]; /**< Clock signal connected to each clock port */
37 dt_reset_t reset[kDtSocProxyResetCount]; /**< Reset signal connected to each reset port */
38 dt_periph_io_t periph_io[kDtSocProxyPeriphIoCount]; /**< Description of each peripheral I/O */
40
41
42
43
44static const dt_desc_soc_proxy_t soc_proxy_desc[kDtSocProxyCount] = {
45 [kDtSocProxy] = {
46 .inst_id = kDtInstanceIdSocProxy,
47 .reg_addr = {
48 [kDtSocProxyRegBlockCore] = 0x22030000,
49 },
50 .mem_addr = {
51 [kDtSocProxyMemoryCtn] = 0x40000000,
52 },
53 .mem_size = {
54 [kDtSocProxyMemoryCtn] = 0x80000000,
55 },
58 .clock = {
61 },
62 .reset = {
65 },
66 .periph_io = {
67 [kDtSocProxyPeriphIoSocGpi0] = {
68 .__internal = {
69 .type = kDtPeriphIoTypeDio,
70 .dir = kDtPeriphIoDirIn,
71 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi0,
72 .outsel_or_dt_pad = kDtPadSocProxySocGpi0,
73 },
74 },
75 [kDtSocProxyPeriphIoSocGpi1] = {
76 .__internal = {
77 .type = kDtPeriphIoTypeDio,
78 .dir = kDtPeriphIoDirIn,
79 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi1,
80 .outsel_or_dt_pad = kDtPadSocProxySocGpi1,
81 },
82 },
83 [kDtSocProxyPeriphIoSocGpi2] = {
84 .__internal = {
85 .type = kDtPeriphIoTypeDio,
86 .dir = kDtPeriphIoDirIn,
87 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi2,
88 .outsel_or_dt_pad = kDtPadSocProxySocGpi2,
89 },
90 },
91 [kDtSocProxyPeriphIoSocGpi3] = {
92 .__internal = {
93 .type = kDtPeriphIoTypeDio,
94 .dir = kDtPeriphIoDirIn,
95 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi3,
96 .outsel_or_dt_pad = kDtPadSocProxySocGpi3,
97 },
98 },
99 [kDtSocProxyPeriphIoSocGpi4] = {
100 .__internal = {
101 .type = kDtPeriphIoTypeDio,
102 .dir = kDtPeriphIoDirIn,
103 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi4,
104 .outsel_or_dt_pad = kDtPadSocProxySocGpi4,
105 },
106 },
107 [kDtSocProxyPeriphIoSocGpi5] = {
108 .__internal = {
109 .type = kDtPeriphIoTypeDio,
110 .dir = kDtPeriphIoDirIn,
111 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi5,
112 .outsel_or_dt_pad = kDtPadSocProxySocGpi5,
113 },
114 },
115 [kDtSocProxyPeriphIoSocGpi6] = {
116 .__internal = {
117 .type = kDtPeriphIoTypeDio,
118 .dir = kDtPeriphIoDirIn,
119 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi6,
120 .outsel_or_dt_pad = kDtPadSocProxySocGpi6,
121 },
122 },
123 [kDtSocProxyPeriphIoSocGpi7] = {
124 .__internal = {
125 .type = kDtPeriphIoTypeDio,
126 .dir = kDtPeriphIoDirIn,
127 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi7,
128 .outsel_or_dt_pad = kDtPadSocProxySocGpi7,
129 },
130 },
131 [kDtSocProxyPeriphIoSocGpi8] = {
132 .__internal = {
133 .type = kDtPeriphIoTypeDio,
134 .dir = kDtPeriphIoDirIn,
135 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi8,
136 .outsel_or_dt_pad = kDtPadSocProxySocGpi8,
137 },
138 },
139 [kDtSocProxyPeriphIoSocGpi9] = {
140 .__internal = {
141 .type = kDtPeriphIoTypeDio,
142 .dir = kDtPeriphIoDirIn,
143 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi9,
144 .outsel_or_dt_pad = kDtPadSocProxySocGpi9,
145 },
146 },
147 [kDtSocProxyPeriphIoSocGpi10] = {
148 .__internal = {
149 .type = kDtPeriphIoTypeDio,
150 .dir = kDtPeriphIoDirIn,
151 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi10,
152 .outsel_or_dt_pad = kDtPadSocProxySocGpi10,
153 },
154 },
155 [kDtSocProxyPeriphIoSocGpi11] = {
156 .__internal = {
157 .type = kDtPeriphIoTypeDio,
158 .dir = kDtPeriphIoDirIn,
159 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpi11,
160 .outsel_or_dt_pad = kDtPadSocProxySocGpi11,
161 },
162 },
163 [kDtSocProxyPeriphIoSocGpi12] = {
164 .__internal = {
165 .type = kDtPeriphIoTypeMio,
166 .dir = kDtPeriphIoDirIn,
167 .periph_input_or_direct_pad = kTopDarjeelingPinmuxPeripheralInSocProxySocGpi12,
168 .outsel_or_dt_pad = 0,
169 },
170 },
171 [kDtSocProxyPeriphIoSocGpi13] = {
172 .__internal = {
173 .type = kDtPeriphIoTypeMio,
174 .dir = kDtPeriphIoDirIn,
175 .periph_input_or_direct_pad = kTopDarjeelingPinmuxPeripheralInSocProxySocGpi13,
176 .outsel_or_dt_pad = 0,
177 },
178 },
179 [kDtSocProxyPeriphIoSocGpi14] = {
180 .__internal = {
181 .type = kDtPeriphIoTypeMio,
182 .dir = kDtPeriphIoDirIn,
183 .periph_input_or_direct_pad = kTopDarjeelingPinmuxPeripheralInSocProxySocGpi14,
184 .outsel_or_dt_pad = 0,
185 },
186 },
187 [kDtSocProxyPeriphIoSocGpi15] = {
188 .__internal = {
189 .type = kDtPeriphIoTypeMio,
190 .dir = kDtPeriphIoDirIn,
191 .periph_input_or_direct_pad = kTopDarjeelingPinmuxPeripheralInSocProxySocGpi15,
192 .outsel_or_dt_pad = 0,
193 },
194 },
195 [kDtSocProxyPeriphIoSocGpo0] = {
196 .__internal = {
197 .type = kDtPeriphIoTypeDio,
198 .dir = kDtPeriphIoDirOut,
199 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo0,
200 .outsel_or_dt_pad = kDtPadSocProxySocGpo0,
201 },
202 },
203 [kDtSocProxyPeriphIoSocGpo1] = {
204 .__internal = {
205 .type = kDtPeriphIoTypeDio,
206 .dir = kDtPeriphIoDirOut,
207 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo1,
208 .outsel_or_dt_pad = kDtPadSocProxySocGpo1,
209 },
210 },
211 [kDtSocProxyPeriphIoSocGpo2] = {
212 .__internal = {
213 .type = kDtPeriphIoTypeDio,
214 .dir = kDtPeriphIoDirOut,
215 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo2,
216 .outsel_or_dt_pad = kDtPadSocProxySocGpo2,
217 },
218 },
219 [kDtSocProxyPeriphIoSocGpo3] = {
220 .__internal = {
221 .type = kDtPeriphIoTypeDio,
222 .dir = kDtPeriphIoDirOut,
223 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo3,
224 .outsel_or_dt_pad = kDtPadSocProxySocGpo3,
225 },
226 },
227 [kDtSocProxyPeriphIoSocGpo4] = {
228 .__internal = {
229 .type = kDtPeriphIoTypeDio,
230 .dir = kDtPeriphIoDirOut,
231 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo4,
232 .outsel_or_dt_pad = kDtPadSocProxySocGpo4,
233 },
234 },
235 [kDtSocProxyPeriphIoSocGpo5] = {
236 .__internal = {
237 .type = kDtPeriphIoTypeDio,
238 .dir = kDtPeriphIoDirOut,
239 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo5,
240 .outsel_or_dt_pad = kDtPadSocProxySocGpo5,
241 },
242 },
243 [kDtSocProxyPeriphIoSocGpo6] = {
244 .__internal = {
245 .type = kDtPeriphIoTypeDio,
246 .dir = kDtPeriphIoDirOut,
247 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo6,
248 .outsel_or_dt_pad = kDtPadSocProxySocGpo6,
249 },
250 },
251 [kDtSocProxyPeriphIoSocGpo7] = {
252 .__internal = {
253 .type = kDtPeriphIoTypeDio,
254 .dir = kDtPeriphIoDirOut,
255 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo7,
256 .outsel_or_dt_pad = kDtPadSocProxySocGpo7,
257 },
258 },
259 [kDtSocProxyPeriphIoSocGpo8] = {
260 .__internal = {
261 .type = kDtPeriphIoTypeDio,
262 .dir = kDtPeriphIoDirOut,
263 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo8,
264 .outsel_or_dt_pad = kDtPadSocProxySocGpo8,
265 },
266 },
267 [kDtSocProxyPeriphIoSocGpo9] = {
268 .__internal = {
269 .type = kDtPeriphIoTypeDio,
270 .dir = kDtPeriphIoDirOut,
271 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo9,
272 .outsel_or_dt_pad = kDtPadSocProxySocGpo9,
273 },
274 },
275 [kDtSocProxyPeriphIoSocGpo10] = {
276 .__internal = {
277 .type = kDtPeriphIoTypeDio,
278 .dir = kDtPeriphIoDirOut,
279 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo10,
280 .outsel_or_dt_pad = kDtPadSocProxySocGpo10,
281 },
282 },
283 [kDtSocProxyPeriphIoSocGpo11] = {
284 .__internal = {
285 .type = kDtPeriphIoTypeDio,
286 .dir = kDtPeriphIoDirOut,
287 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsSocProxySocGpo11,
288 .outsel_or_dt_pad = kDtPadSocProxySocGpo11,
289 },
290 },
291 [kDtSocProxyPeriphIoSocGpo12] = {
292 .__internal = {
293 .type = kDtPeriphIoTypeMio,
294 .dir = kDtPeriphIoDirOut,
295 .periph_input_or_direct_pad = 0,
297 },
298 },
299 [kDtSocProxyPeriphIoSocGpo13] = {
300 .__internal = {
301 .type = kDtPeriphIoTypeMio,
302 .dir = kDtPeriphIoDirOut,
303 .periph_input_or_direct_pad = 0,
305 },
306 },
307 [kDtSocProxyPeriphIoSocGpo14] = {
308 .__internal = {
309 .type = kDtPeriphIoTypeMio,
310 .dir = kDtPeriphIoDirOut,
311 .periph_input_or_direct_pad = 0,
313 },
314 },
315 [kDtSocProxyPeriphIoSocGpo15] = {
316 .__internal = {
317 .type = kDtPeriphIoTypeMio,
318 .dir = kDtPeriphIoDirOut,
319 .periph_input_or_direct_pad = 0,
321 },
322 },
323 },
324 },
325};
326
327/**
328 * Return a pointer to the `dt_soc_proxy_desc_t` structure of the requested
329 * `dt` if it's a valid index. Otherwise, this macro will `return` (i.e. exit
330 * the function) with the provided default value.
331 */
332#define TRY_GET_DT(dt, default) ({ if ((dt) < (dt_soc_proxy_t)0 || (dt) >= kDtSocProxyCount) return (default); &soc_proxy_desc[dt]; })
333
335 if (inst_id >= kDtInstanceIdSocProxy && inst_id <= kDtInstanceIdSocProxy) {
336 return (dt_soc_proxy_t)(inst_id - kDtInstanceIdSocProxy);
337 }
338 return (dt_soc_proxy_t)0;
339}
340
345
348 dt_soc_proxy_reg_block_t reg_block) {
349 // Return a recognizable address in case of wrong argument.
350 return TRY_GET_DT(dt, 0xdeadbeef)->reg_addr[reg_block];
351}
352
356 // Return a recognizable address in case of wrong argument.
357 return TRY_GET_DT(dt, 0xdeadbeef)->mem_addr[mem];
358}
359
363 // Return an empty size in case of wrong argument.
364 return TRY_GET_DT(dt, 0)->mem_size[mem];
365}
366
369 dt_soc_proxy_irq_t irq) {
370 dt_plic_irq_id_t first_irq = TRY_GET_DT(dt, kDtPlicIrqIdNone)->first_irq;
371 if (first_irq == kDtPlicIrqIdNone) {
372 return kDtPlicIrqIdNone;
373 }
374 return (dt_plic_irq_id_t)((uint32_t)first_irq + (uint32_t)irq);
375}
376
379 dt_plic_irq_id_t irq) {
380 dt_soc_proxy_irq_t count = kDtSocProxyIrqCount;
381 dt_plic_irq_id_t first_irq = TRY_GET_DT(dt, count)->first_irq;
382 if (first_irq == kDtPlicIrqIdNone) {
383 return count;
384 }
385 if (irq < first_irq || irq >= first_irq + (dt_plic_irq_id_t)count) {
386 return count;
387 }
388 return (dt_soc_proxy_irq_t)(irq - first_irq);
389}
390
391
394 dt_soc_proxy_alert_t alert) {
395 return (dt_alert_id_t)((uint32_t)soc_proxy_desc[dt].first_alert + (uint32_t)alert);
396}
397
400 dt_alert_id_t alert) {
401 dt_soc_proxy_alert_t count = kDtSocProxyAlertCount;
402 if (alert < soc_proxy_desc[dt].first_alert || alert >= soc_proxy_desc[dt].first_alert + (dt_alert_id_t)count) {
403 return count;
404 }
405 return (dt_soc_proxy_alert_t)(alert - soc_proxy_desc[dt].first_alert);
406}
407
408
412 // Return a harmless value in case of wrong argument.
413 return TRY_GET_DT(dt, kDtPeriphIoConstantHighZ)->periph_io[sig];
414}
415
419 // Return the first clock in case of invalid argument.
420 return TRY_GET_DT(dt, (dt_clock_t)0)->clock[clk];
421}
422
426 const dt_soc_proxy_reset_t count = kDtSocProxyResetCount;
427 if (rst >= count) {
428 return kDtResetUnknown;
429 }
430 return TRY_GET_DT(dt, kDtResetUnknown)->reset[rst];
431}
432
433