Software APIs
dt_rstmgr.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 rstmgr and top englishbreakfast.
10 */
11
12#include "hw/top/dt/dt_rstmgr.h"
13
14
15#include "dt_aon_timer.h"
16
17
18
19/**
20 * Description of instances.
21 */
22typedef struct dt_desc_rstmgr {
23 dt_instance_id_t inst_id; /**< Instance ID */
24 uint32_t reg_addr[kDtRstmgrRegBlockCount]; /**< Base address of each register block */
25 uint32_t mem_addr[kDtRstmgrMemoryCount]; /**< Base address of each memory */
26 uint32_t mem_size[kDtRstmgrMemoryCount]; /**< Size in bytes of each memory */
27 dt_clock_t clock[kDtRstmgrClockCount]; /**< Clock signal connected to each clock port */
28 dt_reset_t reset[kDtRstmgrResetCount]; /**< Reset signal connected to each reset port */
29 struct {
30 dt_reset_t sw_rst[3]; /**< List of software resets, in the order of the register fields */
31 dt_rstmgr_reset_req_src_t hw_req[4]; /**< List of hardware reset requests, in the order of the register fields */
32 } rstmgr_ext; /**< Extension */
34
35
36
37
38static const dt_desc_rstmgr_t rstmgr_desc[kDtRstmgrCount] = {
39 [kDtRstmgrAon] = {
40 .inst_id = kDtInstanceIdRstmgrAon,
41 .reg_addr = {
42 [kDtRstmgrRegBlockCore] = 0x40410000,
43 },
44 .mem_addr = {
45 },
46 .mem_size = {
47 },
48 .clock = {
57 },
58 .reset = {
61 },
62 .rstmgr_ext = {
63 .sw_rst = {
65 [1] = kDtResetSpiHost0,
66 [2] = kDtResetUsb,
67 },
68 .hw_req = {
69 [0] = {
70 .inst_id = kDtInstanceIdAonTimerAon,
71 .reset_req = kDtAonTimerResetReqAonTimer,
72 },
73 [1] = {
74 .inst_id = kDtInstanceIdPwrmgrAon,
75 .reset_req = 0,
76 },
77 [2] = {
78 .inst_id = kDtInstanceIdUnknown,
79 .reset_req = 0,
80 },
81 [3] = {
82 .inst_id = kDtInstanceIdUnknown,
83 .reset_req = 0,
84 },
85 },
86 },
87 },
88};
89
90/**
91 * Return a pointer to the `dt_rstmgr_desc_t` structure of the requested
92 * `dt` if it's a valid index. Otherwise, this macro will `return` (i.e. exit
93 * the function) with the provided default value.
94 */
95#define TRY_GET_DT(dt, default) ({ if ((dt) < (dt_rstmgr_t)0 || (dt) >= kDtRstmgrCount) return (default); &rstmgr_desc[dt]; })
96
98 if (inst_id >= kDtInstanceIdRstmgrAon && inst_id <= kDtInstanceIdRstmgrAon) {
99 return (dt_rstmgr_t)(inst_id - kDtInstanceIdRstmgrAon);
100 }
101 return (dt_rstmgr_t)0;
102}
103
108
110 dt_rstmgr_t dt,
111 dt_rstmgr_reg_block_t reg_block) {
112 // Return a recognizable address in case of wrong argument.
113 return TRY_GET_DT(dt, 0xdeadbeef)->reg_addr[reg_block];
114}
115
117 dt_rstmgr_t dt,
118 dt_rstmgr_memory_t mem) {
119 // Return a recognizable address in case of wrong argument.
120 return TRY_GET_DT(dt, 0xdeadbeef)->mem_addr[mem];
121}
122
124 dt_rstmgr_t dt,
125 dt_rstmgr_memory_t mem) {
126 // Return an empty size in case of wrong argument.
127 return TRY_GET_DT(dt, 0)->mem_size[mem];
128}
129
130
131
132
134 dt_rstmgr_t dt,
135 dt_rstmgr_clock_t clk) {
136 // Return the first clock in case of invalid argument.
137 return TRY_GET_DT(dt, (dt_clock_t)0)->clock[clk];
138}
139
141 dt_rstmgr_t dt,
142 dt_rstmgr_reset_t rst) {
143 const dt_rstmgr_reset_t count = kDtRstmgrResetCount;
144 if (rst >= count) {
145 return kDtResetUnknown;
146 }
147 return TRY_GET_DT(dt, kDtResetUnknown)->reset[rst];
148}
149
150
151
153 return 3;
154}
155
157 if (idx >= 3) {
158 return kDtResetUnknown;
159 }
160 return TRY_GET_DT(dt, kDtResetUnknown)->rstmgr_ext.sw_rst[idx];
161}
162
164 return 4;
165}
166
168 dt_rstmgr_reset_req_src_t invalid_req = {
169 .inst_id = kDtInstanceIdUnknown,
170 .reset_req = kDtResetUnknown,
171 };
172 if (idx >= 4) {
173 return invalid_req;
174 }
175 return TRY_GET_DT(dt, invalid_req)->rstmgr_ext.hw_req[idx];
176}
177
178