Software APIs
dt_gpio.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 gpio and top darjeeling.
10 */
11
12#include "hw/top/dt/dt_gpio.h"
13
14
15
16
17
18/**
19 * Description of instances.
20 */
21typedef struct dt_desc_gpio {
22 dt_instance_id_t inst_id; /**< Instance ID */
23 uint32_t reg_addr[kDtGpioRegBlockCount]; /**< Base address of each register block */
24 uint32_t mem_addr[kDtGpioMemoryCount]; /**< Base address of each memory */
25 uint32_t mem_size[kDtGpioMemoryCount]; /**< Size in bytes of each memory */
26 /**
27 * PLIC ID of the first IRQ of this instance
28 *
29 * This can be `kDtPlicIrqIdNone` if the block is not connected to the PLIC.
30 */
32 /**
33 * Alert ID of the first Alert of this instance.
34 *
35 * This value is undefined if the block is not connected to the Alert Handler.
36 */
38 dt_clock_t clock[kDtGpioClockCount]; /**< Clock signal connected to each clock port */
39 dt_reset_t reset[kDtGpioResetCount]; /**< Reset signal connected to each reset port */
40 dt_periph_io_t periph_io[kDtGpioPeriphIoCount]; /**< Description of each peripheral I/O */
41 struct {
42 uint8_t input_period_counter_count; /**< number of input period counters */
43 } ipgen_ext; /**< Extension */
45
46
47
48
49static const dt_desc_gpio_t gpio_desc[kDtGpioCount] = {
50 [kDtGpio] = {
51 .inst_id = kDtInstanceIdGpio,
52 .reg_addr = {
53 [kDtGpioRegBlockCore] = 0x30000000,
54 },
55 .mem_addr = {
56 },
57 .mem_size = {
58 },
61 .clock = {
63 },
64 .reset = {
66 },
67 .periph_io = {
68 [kDtGpioPeriphIoGpio0] = {
69 .__internal = {
70 .type = kDtPeriphIoTypeDio,
72 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio0,
73 .outsel_or_dt_pad = kDtPadGpioGpio0,
74 },
75 },
76 [kDtGpioPeriphIoGpio1] = {
77 .__internal = {
78 .type = kDtPeriphIoTypeDio,
80 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio1,
81 .outsel_or_dt_pad = kDtPadGpioGpio1,
82 },
83 },
84 [kDtGpioPeriphIoGpio2] = {
85 .__internal = {
86 .type = kDtPeriphIoTypeDio,
88 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio2,
89 .outsel_or_dt_pad = kDtPadGpioGpio2,
90 },
91 },
92 [kDtGpioPeriphIoGpio3] = {
93 .__internal = {
94 .type = kDtPeriphIoTypeDio,
96 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio3,
97 .outsel_or_dt_pad = kDtPadGpioGpio3,
98 },
99 },
100 [kDtGpioPeriphIoGpio4] = {
101 .__internal = {
102 .type = kDtPeriphIoTypeDio,
103 .dir = kDtPeriphIoDirInout,
104 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio4,
105 .outsel_or_dt_pad = kDtPadGpioGpio4,
106 },
107 },
108 [kDtGpioPeriphIoGpio5] = {
109 .__internal = {
110 .type = kDtPeriphIoTypeDio,
111 .dir = kDtPeriphIoDirInout,
112 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio5,
113 .outsel_or_dt_pad = kDtPadGpioGpio5,
114 },
115 },
116 [kDtGpioPeriphIoGpio6] = {
117 .__internal = {
118 .type = kDtPeriphIoTypeDio,
119 .dir = kDtPeriphIoDirInout,
120 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio6,
121 .outsel_or_dt_pad = kDtPadGpioGpio6,
122 },
123 },
124 [kDtGpioPeriphIoGpio7] = {
125 .__internal = {
126 .type = kDtPeriphIoTypeDio,
127 .dir = kDtPeriphIoDirInout,
128 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio7,
129 .outsel_or_dt_pad = kDtPadGpioGpio7,
130 },
131 },
132 [kDtGpioPeriphIoGpio8] = {
133 .__internal = {
134 .type = kDtPeriphIoTypeDio,
135 .dir = kDtPeriphIoDirInout,
136 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio8,
137 .outsel_or_dt_pad = kDtPadGpioGpio8,
138 },
139 },
140 [kDtGpioPeriphIoGpio9] = {
141 .__internal = {
142 .type = kDtPeriphIoTypeDio,
143 .dir = kDtPeriphIoDirInout,
144 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio9,
145 .outsel_or_dt_pad = kDtPadGpioGpio9,
146 },
147 },
148 [kDtGpioPeriphIoGpio10] = {
149 .__internal = {
150 .type = kDtPeriphIoTypeDio,
151 .dir = kDtPeriphIoDirInout,
152 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio10,
153 .outsel_or_dt_pad = kDtPadGpioGpio10,
154 },
155 },
156 [kDtGpioPeriphIoGpio11] = {
157 .__internal = {
158 .type = kDtPeriphIoTypeDio,
159 .dir = kDtPeriphIoDirInout,
160 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio11,
161 .outsel_or_dt_pad = kDtPadGpioGpio11,
162 },
163 },
164 [kDtGpioPeriphIoGpio12] = {
165 .__internal = {
166 .type = kDtPeriphIoTypeDio,
167 .dir = kDtPeriphIoDirInout,
168 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio12,
169 .outsel_or_dt_pad = kDtPadGpioGpio12,
170 },
171 },
172 [kDtGpioPeriphIoGpio13] = {
173 .__internal = {
174 .type = kDtPeriphIoTypeDio,
175 .dir = kDtPeriphIoDirInout,
176 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio13,
177 .outsel_or_dt_pad = kDtPadGpioGpio13,
178 },
179 },
180 [kDtGpioPeriphIoGpio14] = {
181 .__internal = {
182 .type = kDtPeriphIoTypeDio,
183 .dir = kDtPeriphIoDirInout,
184 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio14,
185 .outsel_or_dt_pad = kDtPadGpioGpio14,
186 },
187 },
188 [kDtGpioPeriphIoGpio15] = {
189 .__internal = {
190 .type = kDtPeriphIoTypeDio,
191 .dir = kDtPeriphIoDirInout,
192 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio15,
193 .outsel_or_dt_pad = kDtPadGpioGpio15,
194 },
195 },
196 [kDtGpioPeriphIoGpio16] = {
197 .__internal = {
198 .type = kDtPeriphIoTypeDio,
199 .dir = kDtPeriphIoDirInout,
200 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio16,
201 .outsel_or_dt_pad = kDtPadGpioGpio16,
202 },
203 },
204 [kDtGpioPeriphIoGpio17] = {
205 .__internal = {
206 .type = kDtPeriphIoTypeDio,
207 .dir = kDtPeriphIoDirInout,
208 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio17,
209 .outsel_or_dt_pad = kDtPadGpioGpio17,
210 },
211 },
212 [kDtGpioPeriphIoGpio18] = {
213 .__internal = {
214 .type = kDtPeriphIoTypeDio,
215 .dir = kDtPeriphIoDirInout,
216 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio18,
217 .outsel_or_dt_pad = kDtPadGpioGpio18,
218 },
219 },
220 [kDtGpioPeriphIoGpio19] = {
221 .__internal = {
222 .type = kDtPeriphIoTypeDio,
223 .dir = kDtPeriphIoDirInout,
224 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio19,
225 .outsel_or_dt_pad = kDtPadGpioGpio19,
226 },
227 },
228 [kDtGpioPeriphIoGpio20] = {
229 .__internal = {
230 .type = kDtPeriphIoTypeDio,
231 .dir = kDtPeriphIoDirInout,
232 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio20,
233 .outsel_or_dt_pad = kDtPadGpioGpio20,
234 },
235 },
236 [kDtGpioPeriphIoGpio21] = {
237 .__internal = {
238 .type = kDtPeriphIoTypeDio,
239 .dir = kDtPeriphIoDirInout,
240 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio21,
241 .outsel_or_dt_pad = kDtPadGpioGpio21,
242 },
243 },
244 [kDtGpioPeriphIoGpio22] = {
245 .__internal = {
246 .type = kDtPeriphIoTypeDio,
247 .dir = kDtPeriphIoDirInout,
248 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio22,
249 .outsel_or_dt_pad = kDtPadGpioGpio22,
250 },
251 },
252 [kDtGpioPeriphIoGpio23] = {
253 .__internal = {
254 .type = kDtPeriphIoTypeDio,
255 .dir = kDtPeriphIoDirInout,
256 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio23,
257 .outsel_or_dt_pad = kDtPadGpioGpio23,
258 },
259 },
260 [kDtGpioPeriphIoGpio24] = {
261 .__internal = {
262 .type = kDtPeriphIoTypeDio,
263 .dir = kDtPeriphIoDirInout,
264 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio24,
265 .outsel_or_dt_pad = kDtPadGpioGpio24,
266 },
267 },
268 [kDtGpioPeriphIoGpio25] = {
269 .__internal = {
270 .type = kDtPeriphIoTypeDio,
271 .dir = kDtPeriphIoDirInout,
272 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio25,
273 .outsel_or_dt_pad = kDtPadGpioGpio25,
274 },
275 },
276 [kDtGpioPeriphIoGpio26] = {
277 .__internal = {
278 .type = kDtPeriphIoTypeDio,
279 .dir = kDtPeriphIoDirInout,
280 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio26,
281 .outsel_or_dt_pad = kDtPadGpioGpio26,
282 },
283 },
284 [kDtGpioPeriphIoGpio27] = {
285 .__internal = {
286 .type = kDtPeriphIoTypeDio,
287 .dir = kDtPeriphIoDirInout,
288 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio27,
289 .outsel_or_dt_pad = kDtPadGpioGpio27,
290 },
291 },
292 [kDtGpioPeriphIoGpio28] = {
293 .__internal = {
294 .type = kDtPeriphIoTypeDio,
295 .dir = kDtPeriphIoDirInout,
296 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio28,
297 .outsel_or_dt_pad = kDtPadGpioGpio28,
298 },
299 },
300 [kDtGpioPeriphIoGpio29] = {
301 .__internal = {
302 .type = kDtPeriphIoTypeDio,
303 .dir = kDtPeriphIoDirInout,
304 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio29,
305 .outsel_or_dt_pad = kDtPadGpioGpio29,
306 },
307 },
308 [kDtGpioPeriphIoGpio30] = {
309 .__internal = {
310 .type = kDtPeriphIoTypeDio,
311 .dir = kDtPeriphIoDirInout,
312 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio30,
313 .outsel_or_dt_pad = kDtPadGpioGpio30,
314 },
315 },
316 [kDtGpioPeriphIoGpio31] = {
317 .__internal = {
318 .type = kDtPeriphIoTypeDio,
319 .dir = kDtPeriphIoDirInout,
320 .periph_input_or_direct_pad = kTopDarjeelingDirectPadsGpioGpio31,
321 .outsel_or_dt_pad = kDtPadGpioGpio31,
322 },
323 },
324 },
325 .ipgen_ext = {
326 .input_period_counter_count = 8,
327 },
328 },
329};
330
331/**
332 * Return a pointer to the `dt_gpio_desc_t` structure of the requested
333 * `dt` if it's a valid index. Otherwise, this macro will `return` (i.e. exit
334 * the function) with the provided default value.
335 */
336#define TRY_GET_DT(dt, default) ({ if ((dt) < (dt_gpio_t)0 || (dt) >= kDtGpioCount) return (default); &gpio_desc[dt]; })
337
339 if (inst_id >= kDtInstanceIdGpio && inst_id <= kDtInstanceIdGpio) {
340 return (dt_gpio_t)(inst_id - kDtInstanceIdGpio);
341 }
342 return (dt_gpio_t)0;
343}
344
349
351 dt_gpio_t dt,
352 dt_gpio_reg_block_t reg_block) {
353 // Return a recognizable address in case of wrong argument.
354 return TRY_GET_DT(dt, 0xdeadbeef)->reg_addr[reg_block];
355}
356
358 dt_gpio_t dt,
359 dt_gpio_memory_t mem) {
360 // Return a recognizable address in case of wrong argument.
361 return TRY_GET_DT(dt, 0xdeadbeef)->mem_addr[mem];
362}
363
365 dt_gpio_t dt,
366 dt_gpio_memory_t mem) {
367 // Return an empty size in case of wrong argument.
368 return TRY_GET_DT(dt, 0)->mem_size[mem];
369}
370
372 dt_gpio_t dt,
373 dt_gpio_irq_t irq) {
374 dt_plic_irq_id_t first_irq = TRY_GET_DT(dt, kDtPlicIrqIdNone)->first_irq;
375 if (first_irq == kDtPlicIrqIdNone) {
376 return kDtPlicIrqIdNone;
377 }
378 return (dt_plic_irq_id_t)((uint32_t)first_irq + (uint32_t)irq);
379}
380
382 dt_gpio_t dt,
383 dt_plic_irq_id_t irq) {
384 dt_gpio_irq_t count = kDtGpioIrqCount;
385 dt_plic_irq_id_t first_irq = TRY_GET_DT(dt, count)->first_irq;
386 if (first_irq == kDtPlicIrqIdNone) {
387 return count;
388 }
389 if (irq < first_irq || irq >= first_irq + (dt_plic_irq_id_t)count) {
390 return count;
391 }
392 return (dt_gpio_irq_t)(irq - first_irq);
393}
394
395
397 dt_gpio_t dt,
398 dt_gpio_alert_t alert) {
399 return (dt_alert_id_t)((uint32_t)gpio_desc[dt].first_alert + (uint32_t)alert);
400}
401
403 dt_gpio_t dt,
404 dt_alert_id_t alert) {
405 dt_gpio_alert_t count = kDtGpioAlertCount;
406 if (alert < gpio_desc[dt].first_alert || alert >= gpio_desc[dt].first_alert + (dt_alert_id_t)count) {
407 return count;
408 }
409 return (dt_gpio_alert_t)(alert - gpio_desc[dt].first_alert);
410}
411
412
414 dt_gpio_t dt,
416 // Return a harmless value in case of wrong argument.
417 return TRY_GET_DT(dt, kDtPeriphIoConstantHighZ)->periph_io[sig];
418}
419
421 dt_gpio_t dt,
422 dt_gpio_clock_t clk) {
423 // Return the first clock in case of invalid argument.
424 return TRY_GET_DT(dt, (dt_clock_t)0)->clock[clk];
425}
426
428 dt_gpio_t dt,
429 dt_gpio_reset_t rst) {
430 const dt_gpio_reset_t count = kDtGpioResetCount;
431 if (rst >= count) {
432 return kDtResetUnknown;
433 }
434 return TRY_GET_DT(dt, kDtResetUnknown)->reset[rst];
435}
436
437
438
440 return TRY_GET_DT(dt, 0)->ipgen_ext.input_period_counter_count;
441}
442
443