Line data Source code
1 0 : /*
2 : * Copyright (c) 2024 Nordic Semiconductor ASA
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_DRIVERS_MISC_CORESIGHT_STMESP_H_
8 : #define ZEPHYR_INCLUDE_DRIVERS_MISC_CORESIGHT_STMESP_H_
9 :
10 : #include <zephyr/devicetree.h>
11 :
12 : /**
13 : * @brief Coresight STMESP (STM Extended Stimulus Port) Interface
14 : * @defgroup stmsp_interface Coresight STMESP interface
15 : * @ingroup misc_interfaces
16 : * @{
17 : */
18 :
19 : #ifdef __cplusplus
20 : extern "C" {
21 : #endif
22 :
23 : /** @cond INTERNAL_HIDDEN
24 : * @brief STMESP register structure.
25 : */
26 : typedef struct {
27 : volatile uint32_t G_DMTS[2];
28 : volatile uint32_t G_DM[2];
29 : volatile uint32_t G_DTS[2];
30 : volatile uint32_t G_D[2];
31 : volatile uint32_t RESERVED0[16];
32 : volatile uint32_t G_FLAGTS[2];
33 : volatile uint32_t G_FLAG[2];
34 : volatile uint32_t G_TRIGTS[2];
35 : volatile uint32_t G_TRIG[2];
36 : volatile uint32_t I_DMTS[2];
37 : volatile uint32_t I_DM[2];
38 : volatile uint32_t I_DTS[2];
39 : volatile uint32_t I_D[2];
40 : volatile uint32_t RESERVED1[16];
41 : volatile uint32_t I_FLAGTS[2];
42 : volatile uint32_t I_FLAG[2];
43 : volatile uint32_t I_TRIGTS[2];
44 : volatile uint32_t I_TRIG[2];
45 : } STMESP_Type;
46 :
47 : /** @brief Helper function for getting target register.
48 : *
49 : * @param reg STMESP register set.
50 : * @param ts Use timestamp.
51 : * @param marked Use marked register.
52 : * @param guaranteed True to use guaranteed access.
53 : *
54 : * @return Address of the register.
55 : */
56 : static inline volatile void *_stmesp_get_data_reg(STMESP_Type *reg, bool ts,
57 : bool marked, bool guaranteed)
58 : {
59 : if (ts) {
60 : if (guaranteed) {
61 : if (marked) {
62 : return ®->G_DMTS[0];
63 : } else {
64 : return ®->G_DTS[0];
65 : }
66 : } else {
67 : if (marked) {
68 : return ®->I_DMTS[0];
69 : } else {
70 : return ®->I_DTS[0];
71 : }
72 : }
73 : } else {
74 : if (guaranteed) {
75 : if (marked) {
76 : return ®->G_DM[0];
77 : } else {
78 : return ®->G_D[0];
79 : }
80 : } else {
81 : if (marked) {
82 : return ®->I_DM[0];
83 : } else {
84 : return ®->I_D[0];
85 : }
86 : }
87 : }
88 : }
89 :
90 : /** @endcond */
91 :
92 : /** @brief Write flag to STMESP
93 : *
94 : * @param reg STMESP register set.
95 : * @param data Data written to the flag register.
96 : * @param ts If true add timestamp.
97 : * @param guaranteed If true guaranteed write and invariant if false.
98 : */
99 1 : static inline void stmesp_flag(STMESP_Type *reg, uint32_t data, bool ts, bool guaranteed)
100 : {
101 : if (ts) {
102 : if (guaranteed) {
103 : reg->G_FLAGTS[0] = data;
104 : } else {
105 : reg->I_FLAGTS[0] = data;
106 : }
107 : } else {
108 : if (guaranteed) {
109 : reg->G_FLAG[0] = data;
110 : } else {
111 : reg->I_FLAG[0] = data;
112 : }
113 : }
114 : }
115 :
116 : /** @brief Write 8 bit data to STMESP
117 : *
118 : * @param reg STMESP register set.
119 : * @param data Byte to write.
120 : * @param ts If true add timestamp.
121 : * @param marked If true marked write.
122 : * @param guaranteed If true guaranteed write and invariant if false.
123 : */
124 1 : static inline void stmesp_data8(STMESP_Type *reg, uint8_t data, bool ts,
125 : bool marked, bool guaranteed)
126 : {
127 : *(volatile uint8_t *)_stmesp_get_data_reg(reg, ts, marked, guaranteed) = data;
128 : }
129 :
130 : /** @brief Write 16 bit data to STMESP
131 : *
132 : * @param reg STMESP register set.
133 : * @param data Half word to write.
134 : * @param ts If true add timestamp.
135 : * @param marked If true marked write.
136 : * @param guaranteed If true guaranteed write and invariant if false.
137 : */
138 1 : static inline void stmesp_data16(STMESP_Type *reg, uint16_t data, bool ts,
139 : bool marked, bool guaranteed)
140 : {
141 : *(volatile uint16_t *)_stmesp_get_data_reg(reg, ts, marked, guaranteed) = data;
142 : }
143 :
144 : /** @brief Write 32 bit data to STMESP
145 : *
146 : * @param reg STMESP register set.
147 : * @param data Word to write.
148 : * @param ts If true add timestamp.
149 : * @param marked If true marked write.
150 : * @param guaranteed If true guaranteed write and invariant if false.
151 : */
152 1 : static inline void stmesp_data32(STMESP_Type *reg, uint32_t data, bool ts,
153 : bool marked, bool guaranteed)
154 : {
155 : *(volatile uint32_t *)_stmesp_get_data_reg(reg, ts, marked, guaranteed) = data;
156 : }
157 :
158 : /**
159 : * @brief Return address of a STM extended stimulus port.
160 : *
161 : * Function return a port from the local STMESP instance.
162 : *
163 : * @param[in] idx Index of the requested stimulus port.
164 : * @param[out] port Location where pointer to the port is written.
165 : *
166 : * @retval -EINVAL if @p idx or @p port is invalid.
167 : * @retval 0 on success.
168 : */
169 1 : static inline int stmesp_get_port(uint32_t idx, STMESP_Type **port)
170 :
171 : {
172 : /* Check if index is within STM ports */
173 : if ((port == NULL) ||
174 : (idx >= (DT_REG_SIZE(DT_NODELABEL(stmesp)) / sizeof(STMESP_Type)))) {
175 : return -EINVAL;
176 : }
177 :
178 : STMESP_Type *const base = (STMESP_Type *const)DT_REG_ADDR(DT_NODELABEL(stmesp));
179 :
180 : *port = &base[idx];
181 :
182 : return 0;
183 : }
184 :
185 : #ifdef __cplusplus
186 : }
187 : #endif
188 :
189 : /**
190 : * @}
191 : */
192 :
193 : #endif /* ZEPHYR_INCLUDE_DRIVERS_MISC_CORESIGHT_STMESP_H_ */
|