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 "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 base_addr[kDtRstmgrRegBlockCount]; /**< Base address of each register block */
25 dt_clock_t clock[kDtRstmgrClockCount]; /**< Clock signal connected to each clock port */
26 dt_reset_t reset[kDtRstmgrResetCount]; /**< Reset signal connected to each reset port */
27 struct {
28 dt_reset_t sw_rst[3]; /**< List of software resets, in the order of the register fields */
29 dt_rstmgr_reset_req_src_t hw_req[4]; /**< List of hardware reset requests, in the order of the register fields */
30 } rstmgr_ext; /**< Extension */
32
33
34
35
36static const dt_desc_rstmgr_t rstmgr_desc[kDtRstmgrCount] = {
37 [kDtRstmgrAon] = {
38 .inst_id = kDtInstanceIdRstmgrAon,
39 .base_addr = {
40 [kDtRstmgrRegBlockCore] = 0x40410000,
41 },
42 .clock = {
51 },
52 .reset = {
55 },
56 .rstmgr_ext = {
57 .sw_rst = {
59 [1] = kDtResetSpiHost0,
60 [2] = kDtResetUsb,
61 },
62 .hw_req = {
63 [0] = {
64 .inst_id = kDtInstanceIdAonTimerAon,
65 .reset_req = kDtAonTimerResetReqAonTimer,
66 },
67 [1] = {
68 .inst_id = kDtInstanceIdPwrmgrAon,
69 .reset_req = 0,
70 },
71 [2] = {
72 .inst_id = kDtInstanceIdUnknown,
73 .reset_req = 0,
74 },
75 [3] = {
76 .inst_id = kDtInstanceIdUnknown,
77 .reset_req = 0,
78 },
79 },
80 },
81 },
82};
83
84/**
85 * Return a pointer to the `dt_rstmgr_desc_t` structure of the requested
86 * `dt` if it's a valid index. Otherwise, this macro will `return` (i.e. exit
87 * the function) with the provided default value.
88 */
89#define TRY_GET_DT(dt, default) ({ if ((dt) < (dt_rstmgr_t)0 || (dt) >= kDtRstmgrCount) return (default); &rstmgr_desc[dt]; })
90
92 if (inst_id >= kDtInstanceIdRstmgrAon && inst_id <= kDtInstanceIdRstmgrAon) {
93 return (dt_rstmgr_t)(inst_id - kDtInstanceIdRstmgrAon);
94 }
95 return (dt_rstmgr_t)0;
96}
97
102
104 dt_rstmgr_t dt,
105 dt_rstmgr_reg_block_t reg_block) {
106 // Return a recognizable address in case of wrong argument.
107 return TRY_GET_DT(dt, 0xdeadbeef)->base_addr[reg_block];
108}
109
110
111
112
114 dt_rstmgr_t dt,
115 dt_rstmgr_clock_t clk) {
116 // Return the first clock in case of invalid argument.
117 return TRY_GET_DT(dt, (dt_clock_t)0)->clock[clk];
118}
119
121 dt_rstmgr_t dt,
122 dt_rstmgr_reset_t rst) {
123 const dt_rstmgr_reset_t count = kDtRstmgrResetCount;
124 if (rst >= count) {
125 return kDtResetUnknown;
126 }
127 return TRY_GET_DT(dt, kDtResetUnknown)->reset[rst];
128}
129
130
131
133 return 3;
134}
135
137 if (idx >= 3) {
138 return kDtResetUnknown;
139 }
140 return TRY_GET_DT(dt, kDtResetUnknown)->rstmgr_ext.sw_rst[idx];
141}
142
143