1 /*
2  * Copyright (c) 2023 - 2025, Nordic Semiconductor ASA
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice, this
11  *    list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * 3. Neither the name of the copyright holder nor the names of its
18  *    contributors may be used to endorse or promote products derived from this
19  *    software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #ifndef NRFY_BELLBOARD_H__
35 #define NRFY_BELLBOARD_H__
36 
37 #include <nrfx.h>
38 #include <hal/nrf_bellboard.h>
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 NRFY_STATIC_INLINE void __nrfy_internal_bellboard_event_enabled_clear(NRF_BELLBOARD_Type *  p_reg,
45                                                                       uint32_t              mask,
46                                                                       nrf_bellboard_event_t event);
47 
48 NRFY_STATIC_INLINE bool __nrfy_internal_bellboard_event_handle(NRF_BELLBOARD_Type *  p_reg,
49                                                                uint32_t              mask,
50                                                                nrf_bellboard_event_t event,
51                                                                uint32_t *            p_evt_mask);
52 
53 NRFY_STATIC_INLINE uint32_t __nrfy_internal_bellboard_events_process(NRF_BELLBOARD_Type * p_reg,
54                                                                      uint32_t             mask);
55 
56 /**
57  * @defgroup nrfy_bellboard BELLBOARD HALY
58  * @{
59  * @ingroup nrf_bellboard
60  * @brief   Hardware access layer with cache and barrier support for managing the BELLBOARD peripheral.
61  */
62 
63 /* BELLBOARD0_IRQn is not defined for RISC-V targets, so the interrupt (un)init functions need to be excluded from compilation.
64  * RISC-V targets should use (and initialize) VEVIF for receiving inter-core signals.
65  */
66 #if defined(ISA_ARM) || defined(__NRFX_DOXYGEN__)
67 /**
68  * @brief Function for initializing the specified BELLBOARD interupts.
69  *
70  * @param[in] p_reg        Pointer to the structure of registers of the peripheral.
71  * @param[in] mask         Mask of interrupts to be initialized.
72  * @param[in] irq_priority Interrupt priority.
73  * @param[in] enable       True if the interrupts are to be enabled, false otherwise.
74  * @param[in] group_idx    Index of interrupts group to be enabled.
75  */
nrfy_bellboard_int_init(NRF_BELLBOARD_Type * p_reg,uint32_t mask,uint8_t irq_priority,bool enable,uint8_t group_idx)76 NRFY_STATIC_INLINE void nrfy_bellboard_int_init(NRF_BELLBOARD_Type * p_reg,
77                                                 uint32_t             mask,
78                                                 uint8_t              irq_priority,
79                                                 bool                 enable,
80                                                 uint8_t              group_idx)
81 {
82     IRQn_Type interrupt_index = (IRQn_Type)((uint32_t)BELLBOARD_0_IRQn + group_idx);
83 
84     for (uint8_t i = 0; i < NRF_BELLBOARD_EVENTS_TRIGGERED_COUNT; i++)
85     {
86          nrf_bellboard_event_t event = nrf_bellboard_triggered_event_get(i);
87          __nrfy_internal_bellboard_event_enabled_clear(p_reg, mask, event);
88     }
89 
90     nrf_barrier_w();
91 
92     NRFX_IRQ_PRIORITY_SET(interrupt_index, irq_priority);
93     NRFX_IRQ_ENABLE(interrupt_index);
94 
95     if (enable)
96     {
97         nrf_bellboard_int_enable(p_reg, group_idx, mask);
98     }
99 
100     nrf_barrier_w();
101 }
102 
103 /**
104  * @brief Function for uninitializing the specified BELLBOARD interrupts.
105  *
106  * @param[in] group_idx Index for interrupt group to be uninitialized.
107  */
nrfy_bellboard_int_uninit(uint8_t group_idx)108 NRFY_STATIC_INLINE void nrfy_bellboard_int_uninit(uint8_t group_idx)
109 {
110     IRQn_Type interrupt_index = (IRQn_Type)((uint32_t)BELLBOARD_0_IRQn + group_idx);
111 
112     NRFX_IRQ_DISABLE(interrupt_index);
113     nrf_barrier_w();
114 }
115 #endif // // defined(ISA_ARM) || defined(__NRFX_DOXYGEN__)
116 
117 /**
118  * @brief Function for processing the specified BELLBOARD events.
119  *
120  * @param[in] p_reg Pointer to the structure of registers of the peripheral.
121  * @param[in] mask  Mask of events to be processed, created by @ref NRFY_EVENT_TO_INT_BITMASK.
122  *
123  * @return Mask of events that were generated and processed.
124  *         To be checked against the result of @ref NRFY_EVENT_TO_INT_BITMASK().
125  */
126 
nrfy_bellboard_events_process(NRF_BELLBOARD_Type * p_reg,uint32_t mask)127 NRFY_STATIC_INLINE uint32_t nrfy_bellboard_events_process(NRF_BELLBOARD_Type * p_reg, uint32_t mask)
128 {
129     uint32_t evt_mask = __nrfy_internal_bellboard_events_process(p_reg, mask);
130     nrf_barrier_w();
131 
132     return evt_mask;
133 }
134 
135 /** @refhal{nrf_bellboard_task_trigger} */
nrfy_bellboard_task_trigger(NRF_BELLBOARD_Type * p_reg,nrf_bellboard_task_t task)136 NRFY_STATIC_INLINE void nrfy_bellboard_task_trigger(NRF_BELLBOARD_Type * p_reg,
137                                                     nrf_bellboard_task_t task)
138 {
139     nrf_bellboard_task_trigger(p_reg, task);
140     nrf_barrier_w();
141 }
142 
143 /** @refhal{nrf_bellboard_task_address_get} */
nrfy_bellboard_task_address_get(NRF_BELLBOARD_Type const * p_reg,nrf_bellboard_task_t task)144 NRFY_STATIC_INLINE uint32_t nrfy_bellboard_task_address_get(NRF_BELLBOARD_Type const * p_reg,
145                                                             nrf_bellboard_task_t       task)
146 {
147     return nrf_bellboard_task_address_get(p_reg, task);
148 }
149 
150 /** @refhal{nrf_bellboard_event_clear} */
nrfy_bellboard_event_clear(NRF_BELLBOARD_Type * p_reg,nrf_bellboard_event_t event)151 NRFY_STATIC_INLINE void nrfy_bellboard_event_clear(NRF_BELLBOARD_Type *  p_reg,
152                                                    nrf_bellboard_event_t event)
153 {
154     nrf_bellboard_event_clear(p_reg, event);
155     nrf_barrier_w();
156 }
157 
158 /** @refhal{nrf_bellboard_event_check} */
nrfy_bellboard_event_check(NRF_BELLBOARD_Type const * p_reg,nrf_bellboard_event_t event)159 NRFY_STATIC_INLINE bool nrfy_bellboard_event_check(NRF_BELLBOARD_Type const * p_reg,
160                                                    nrf_bellboard_event_t      event)
161 {
162     bool ret = nrf_bellboard_event_check(p_reg, event);
163     nrf_barrier_r();
164 
165     return ret;
166 }
167 
168 /** @refhal{nrf_bellboard_event_address_get} */
nrfy_bellboard_event_address_get(NRF_BELLBOARD_Type const * p_reg,nrf_bellboard_event_t event)169 NRFY_STATIC_INLINE uint32_t nrfy_bellboard_event_address_get(NRF_BELLBOARD_Type const * p_reg,
170                                                              nrf_bellboard_event_t      event)
171 {
172     return nrf_bellboard_event_address_get(p_reg, event);
173 }
174 
175 /** @refhal{nrf_bellboard_int_enable} */
nrfy_bellboard_int_enable(NRF_BELLBOARD_Type * p_reg,uint8_t group_idx,uint32_t mask)176 NRFY_STATIC_INLINE void nrfy_bellboard_int_enable(NRF_BELLBOARD_Type * p_reg,
177                                                   uint8_t              group_idx,
178                                                   uint32_t             mask)
179 {
180     nrf_bellboard_int_enable(p_reg, group_idx, mask);
181     nrf_barrier_w();
182 }
183 
184 /** @refhal{nrf_bellboard_int_disable} */
nrfy_bellboard_int_disable(NRF_BELLBOARD_Type * p_reg,uint8_t group_idx,uint32_t mask)185 NRFY_STATIC_INLINE void nrfy_bellboard_int_disable(NRF_BELLBOARD_Type * p_reg,
186                                                    uint8_t              group_idx,
187                                                    uint32_t             mask)
188 {
189     nrf_bellboard_int_disable(p_reg, group_idx, mask);
190     nrf_barrier_w();
191 }
192 
193 /** @refhal{nrf_bellboard_int_enable_check} */
nrfy_bellboard_int_enable_check(NRF_BELLBOARD_Type const * p_reg,uint8_t group_idx,uint32_t mask)194 NRFY_STATIC_INLINE uint32_t nrfy_bellboard_int_enable_check(NRF_BELLBOARD_Type const * p_reg,
195                                                             uint8_t                    group_idx,
196                                                             uint32_t                   mask)
197 {
198     uint32_t ret = nrf_bellboard_int_enable_check(p_reg, group_idx, mask);
199     nrf_barrier_r();
200 
201     return ret;
202 }
203 
204 /** @refhal{nrf_bellboard_int_pending_get} */
nrfy_bellboard_int_pending_get(NRF_BELLBOARD_Type const * p_reg,uint8_t group_idx)205 NRFY_STATIC_INLINE uint32_t nrfy_bellboard_int_pending_get(NRF_BELLBOARD_Type const * p_reg,
206                                                            uint8_t                    group_idx)
207 {
208     nrf_barrier_r();
209     uint32_t int_ret = nrf_bellboard_int_pending_get(p_reg, group_idx);
210     nrf_barrier_r();
211 
212     return int_ret;
213 }
214 
215 /** @} */
216 
__nrfy_internal_bellboard_events_process(NRF_BELLBOARD_Type * p_reg,uint32_t mask)217 NRFY_STATIC_INLINE uint32_t  __nrfy_internal_bellboard_events_process(NRF_BELLBOARD_Type * p_reg, uint32_t mask)
218 {
219     uint32_t evt_mask = 0;
220 
221     nrf_barrier_r();
222     for (uint8_t i = 0; i < NRF_BELLBOARD_EVENTS_TRIGGERED_COUNT; i++)
223     {
224         nrf_bellboard_event_t event = nrf_bellboard_triggered_event_get(i);
225         (void)__nrfy_internal_bellboard_event_handle(p_reg, mask, event, &evt_mask);
226     }
227 
228     return evt_mask;
229 }
230 
__nrfy_internal_bellboard_event_handle(NRF_BELLBOARD_Type * p_reg,uint32_t mask,nrf_bellboard_event_t event,uint32_t * p_evt_mask)231 NRFY_STATIC_INLINE bool __nrfy_internal_bellboard_event_handle(NRF_BELLBOARD_Type *  p_reg,
232                                                                uint32_t              mask,
233                                                                nrf_bellboard_event_t event,
234                                                                uint32_t *            p_evt_mask)
235 {
236     if ((mask & NRFY_EVENT_TO_INT_BITMASK(event)) && nrf_bellboard_event_check(p_reg, event))
237     {
238         nrf_bellboard_event_clear(p_reg, event);
239 
240         if (p_evt_mask)
241         {
242             *p_evt_mask |= NRFY_EVENT_TO_INT_BITMASK(event);
243         }
244 
245         return true;
246     }
247 
248     return false;
249 }
250 
__nrfy_internal_bellboard_event_enabled_clear(NRF_BELLBOARD_Type * p_reg,uint32_t mask,nrf_bellboard_event_t event)251 NRFY_STATIC_INLINE void __nrfy_internal_bellboard_event_enabled_clear(NRF_BELLBOARD_Type *  p_reg,
252                                                                       uint32_t              mask,
253                                                                       nrf_bellboard_event_t event)
254 {
255     if ((mask & NRFY_EVENT_TO_INT_BITMASK(event)))
256     {
257         nrf_bellboard_event_clear(p_reg, event);
258     }
259 }
260 
261 #ifdef __cplusplus
262 }
263 #endif
264 
265 #endif // NRFY_BELLBOARD_H__
266