blob: a95f824e65c9c3ab5612a1d21d9e43f2337d00d1 [file] [log] [blame]
Kristofer Jonsson49bdee82020-04-06 13:21:21 +02001/*
2 * Copyright (c) 2019-2020 Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Licensed under the Apache License, Version 2.0 (the License); you may
7 * not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
Kristofer Jonsson49bdee82020-04-06 13:21:21 +020019#ifndef PMU_ETHOSU_H
20#define PMU_ETHOSU_H
21
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020022#include <stdint.h>
23
24#ifdef __cplusplus
25extern "C" {
26#endif
27
Kristofer Jonsson49bdee82020-04-06 13:21:21 +020028#define ETHOSU_PMU_NCOUNTERS 4
29
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020030typedef volatile struct
Kristofer Jonsson49bdee82020-04-06 13:21:21 +020031{
Kristofer Jonsson537c71c2020-05-05 14:17:22 +020032 uint32_t PMCR;
33 uint32_t PMCNTENSET;
34 uint32_t PMCNTENCLR;
35 uint32_t PMOVSSET;
36 uint32_t PMOVSCLR;
37 uint32_t PMINTSET;
38 uint32_t PMINTCLR;
39 uint64_t PMCCNTR;
40 uint32_t PMCCNTR_CFG;
Kristofer Jonsson49bdee82020-04-06 13:21:21 +020041} PMU_Ethosu_ctrl_Type;
42
43typedef uint32_t PMU_Ethosu_cntr_Type[ETHOSU_PMU_NCOUNTERS];
44typedef uint32_t PMU_Ethosu_evnt_Type[ETHOSU_PMU_NCOUNTERS];
45
46/** \brief HW Supported ETHOSU PMU Events
47 *
48 * Note: These values are symbolic. Actual HW-values may change. I.e. always use API
49 * to set/get actual event-type value.
50 * */
51enum ethosu_pmu_event_type
52{
Diqing Zhong25e2c812020-04-27 13:47:25 +020053 ETHOSU_PMU_NO_EVENT = 0,
54 ETHOSU_PMU_CYCLE,
Kristofer Jonsson49bdee82020-04-06 13:21:21 +020055 ETHOSU_PMU_NPU_IDLE,
Douglas Trohaf6a85da2020-05-11 11:45:28 +020056 ETHOSU_PMU_CC_STALLED_ON_BLOCKDEP,
57 ETHOSU_PMU_CC_STALLED_ON_SHRAM_RECONFIG,
Kristofer Jonsson49bdee82020-04-06 13:21:21 +020058 ETHOSU_PMU_MAC_ACTIVE,
59 ETHOSU_PMU_MAC_ACTIVE_8BIT,
60 ETHOSU_PMU_MAC_ACTIVE_16BIT,
61 ETHOSU_PMU_MAC_DPU_ACTIVE,
62 ETHOSU_PMU_MAC_STALLED_BY_WD_ACC,
63 ETHOSU_PMU_MAC_STALLED_BY_WD,
64 ETHOSU_PMU_MAC_STALLED_BY_ACC,
65 ETHOSU_PMU_MAC_STALLED_BY_IB,
Diqing Zhong25e2c812020-04-27 13:47:25 +020066 ETHOSU_PMU_MAC_ACTIVE_32BIT,
Douglas Trohaf6a85da2020-05-11 11:45:28 +020067 ETHOSU_PMU_MAC_STALLED_BY_INT_W,
68 ETHOSU_PMU_MAC_STALLED_BY_INT_ACC,
Kristofer Jonsson49bdee82020-04-06 13:21:21 +020069 ETHOSU_PMU_AO_ACTIVE,
70 ETHOSU_PMU_AO_ACTIVE_8BIT,
71 ETHOSU_PMU_AO_ACTIVE_16BIT,
72 ETHOSU_PMU_AO_STALLED_BY_OFMP_OB,
73 ETHOSU_PMU_AO_STALLED_BY_OFMP,
74 ETHOSU_PMU_AO_STALLED_BY_OB,
75 ETHOSU_PMU_AO_STALLED_BY_ACC_IB,
76 ETHOSU_PMU_AO_STALLED_BY_ACC,
77 ETHOSU_PMU_AO_STALLED_BY_IB,
78 ETHOSU_PMU_WD_ACTIVE,
79 ETHOSU_PMU_WD_STALLED,
80 ETHOSU_PMU_WD_STALLED_BY_WS,
81 ETHOSU_PMU_WD_STALLED_BY_WD_BUF,
82 ETHOSU_PMU_WD_PARSE_ACTIVE,
83 ETHOSU_PMU_WD_PARSE_STALLED,
84 ETHOSU_PMU_WD_PARSE_STALLED_IN,
85 ETHOSU_PMU_WD_PARSE_STALLED_OUT,
Diqing Zhong25e2c812020-04-27 13:47:25 +020086 ETHOSU_PMU_WD_TRANS_WS,
87 ETHOSU_PMU_WD_TRANS_WB,
88 ETHOSU_PMU_WD_TRANS_DW0,
89 ETHOSU_PMU_WD_TRANS_DW1,
Kristofer Jonsson49bdee82020-04-06 13:21:21 +020090 ETHOSU_PMU_AXI0_RD_TRANS_ACCEPTED,
91 ETHOSU_PMU_AXI0_RD_TRANS_COMPLETED,
92 ETHOSU_PMU_AXI0_RD_DATA_BEAT_RECEIVED,
93 ETHOSU_PMU_AXI0_RD_TRAN_REQ_STALLED,
94 ETHOSU_PMU_AXI0_WR_TRANS_ACCEPTED,
95 ETHOSU_PMU_AXI0_WR_TRANS_COMPLETED_M,
96 ETHOSU_PMU_AXI0_WR_TRANS_COMPLETED_S,
97 ETHOSU_PMU_AXI0_WR_DATA_BEAT_WRITTEN,
98 ETHOSU_PMU_AXI0_WR_TRAN_REQ_STALLED,
99 ETHOSU_PMU_AXI0_WR_DATA_BEAT_STALLED,
100 ETHOSU_PMU_AXI0_ENABLED_CYCLES,
101 ETHOSU_PMU_AXI0_RD_STALL_LIMIT,
102 ETHOSU_PMU_AXI0_WR_STALL_LIMIT,
103 ETHOSU_PMU_AXI1_RD_TRANS_ACCEPTED,
104 ETHOSU_PMU_AXI1_RD_TRANS_COMPLETED,
105 ETHOSU_PMU_AXI1_RD_DATA_BEAT_RECEIVED,
106 ETHOSU_PMU_AXI1_RD_TRAN_REQ_STALLED,
107 ETHOSU_PMU_AXI1_WR_TRANS_ACCEPTED,
108 ETHOSU_PMU_AXI1_WR_TRANS_COMPLETED_M,
109 ETHOSU_PMU_AXI1_WR_TRANS_COMPLETED_S,
110 ETHOSU_PMU_AXI1_WR_DATA_BEAT_WRITTEN,
111 ETHOSU_PMU_AXI1_WR_TRAN_REQ_STALLED,
112 ETHOSU_PMU_AXI1_WR_DATA_BEAT_STALLED,
113 ETHOSU_PMU_AXI1_ENABLED_CYCLES,
114 ETHOSU_PMU_AXI1_RD_STALL_LIMIT,
115 ETHOSU_PMU_AXI1_WR_STALL_LIMIT,
116 ETHOSU_PMU_AXI_LATENCY_ANY,
117 ETHOSU_PMU_AXI_LATENCY_32,
118 ETHOSU_PMU_AXI_LATENCY_64,
119 ETHOSU_PMU_AXI_LATENCY_128,
120 ETHOSU_PMU_AXI_LATENCY_256,
121 ETHOSU_PMU_AXI_LATENCY_512,
122 ETHOSU_PMU_AXI_LATENCY_1024,
123
124 ETHOSU_PMU_SENTINEL // End-marker (not event)
125};
126
127extern PMU_Ethosu_ctrl_Type *ethosu_pmu_ctrl;
128extern PMU_Ethosu_cntr_Type *ethosu_pmu_cntr;
129extern PMU_Ethosu_evnt_Type *ethosu_pmu_evnt;
130
131#define ETHOSU_PMU_CTRL_ENABLE_Msk (0x0001)
132#define ETHOSU_PMU_CTRL_EVENTCNT_RESET_Msk (0x0002)
133#define ETHOSU_PMU_CTRL_CYCCNT_RESET_Msk (0x0004)
134#define ETHOSU_PMU_CNT1_Msk (1UL << 0)
135#define ETHOSU_PMU_CNT2_Msk (1UL << 1)
136#define ETHOSU_PMU_CNT3_Msk (1UL << 2)
137#define ETHOSU_PMU_CNT4_Msk (1UL << 3)
138#define ETHOSU_PMU_CCNT_Msk (1UL << 31)
139
140/* Transpose functions between HW-event-type and event-id*/
141enum ethosu_pmu_event_type pmu_event_type(uint32_t);
142uint32_t pmu_event_value(enum ethosu_pmu_event_type);
143
144// CMSIS ref API
145/** \brief PMU Functions */
146
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200147static inline void ETHOSU_PMU_Enable(void);
148static inline void ETHOSU_PMU_Disable(void);
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200149
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200150static inline void ETHOSU_PMU_Set_EVTYPER(uint32_t num, enum ethosu_pmu_event_type type);
151static inline enum ethosu_pmu_event_type ETHOSU_PMU_Get_EVTYPER(uint32_t num);
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200152
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200153static inline void ETHOSU_PMU_CYCCNT_Reset(void);
154static inline void ETHOSU_PMU_EVCNTR_ALL_Reset(void);
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200155
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200156static inline void ETHOSU_PMU_CNTR_Enable(uint32_t mask);
157static inline void ETHOSU_PMU_CNTR_Disable(uint32_t mask);
158static inline uint32_t ETHOSU_PMU_CNTR_Status();
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200159
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200160static inline uint64_t ETHOSU_PMU_Get_CCNTR(void);
161static inline void ETHOSU_PMU_Set_CCNTR(uint64_t val);
162static inline uint32_t ETHOSU_PMU_Get_EVCNTR(uint32_t num);
163static inline void ETHOSU_PMU_Set_EVCNTR(uint32_t num, uint32_t val);
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200164
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200165static inline uint32_t ETHOSU_PMU_Get_CNTR_OVS(void);
166static inline void ETHOSU_PMU_Set_CNTR_OVS(uint32_t mask);
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200167
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200168static inline void ETHOSU_PMU_Set_CNTR_IRQ_Enable(uint32_t mask);
169static inline void ETHOSU_PMU_Set_CNTR_IRQ_Disable(uint32_t mask);
170static inline uint32_t ETHOSU_PMU_Get_IRQ_Enable();
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200171
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200172static inline void ETHOSU_PMU_CNTR_Increment(uint32_t mask);
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200173
174/**
175 \brief Enable the PMU
176*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200177static inline void ETHOSU_PMU_Enable(void)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200178{
179 ethosu_pmu_ctrl->PMCR |= ETHOSU_PMU_CTRL_ENABLE_Msk;
180}
181
182/**
183 \brief Disable the PMU
184*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200185static inline void ETHOSU_PMU_Disable(void)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200186{
187 ethosu_pmu_ctrl->PMCR &= ~ETHOSU_PMU_CTRL_ENABLE_Msk;
188}
189
190/**
191 \brief Set event to count for PMU eventer counter
192 \param [in] num Event counter (0-ETHOSU_PMU_NCOUNTERS) to configure
193 \param [in] type Event to count
194*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200195static inline void ETHOSU_PMU_Set_EVTYPER(uint32_t num, enum ethosu_pmu_event_type type)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200196{
197 (*ethosu_pmu_evnt)[num] = pmu_event_value(type);
198}
199
200/**
201 \brief Get event to count for PMU eventer counter
202 \param [in] num Event counter (0-ETHOSU_PMU_NCOUNTERS) to configure
203 \return type Event to count
204*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200205static inline enum ethosu_pmu_event_type ETHOSU_PMU_Get_EVTYPER(uint32_t num)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200206{
207 return pmu_event_type((*ethosu_pmu_evnt)[num]);
208}
209
210/**
211 \brief Reset cycle counter
212*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200213static inline void ETHOSU_PMU_CYCCNT_Reset(void)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200214{
215 ethosu_pmu_ctrl->PMCR |= ETHOSU_PMU_CTRL_CYCCNT_RESET_Msk;
216}
217
218/**
219 \brief Reset all event counters
220*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200221static inline void ETHOSU_PMU_EVCNTR_ALL_Reset(void)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200222{
223 ethosu_pmu_ctrl->PMCR |= ETHOSU_PMU_CTRL_EVENTCNT_RESET_Msk;
224}
225
226/**
227 \brief Enable counters
228 \param [in] mask Counters to enable
229 \note Enables one or more of the following:
230 - event counters (bit 0-ETHOSU_PMU_NCOUNTERS)
231 - cycle counter (bit 31)
232*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200233static inline void ETHOSU_PMU_CNTR_Enable(uint32_t mask)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200234{
235 ethosu_pmu_ctrl->PMCNTENSET = mask;
236}
237
238/**
239 \brief Disable counters
240 \param [in] mask Counters to disable
241 \note Disables one or more of the following:
242 - event counters (bit 0-ETHOSU_PMU_NCOUNTERS)
243 - cycle counter (bit 31)
244*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200245static inline void ETHOSU_PMU_CNTR_Disable(uint32_t mask)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200246{
247 ethosu_pmu_ctrl->PMCNTENCLR = mask;
248}
249
250/**
251 \brief Determine counters activation
252
253 \return Event count
254 \param [in] mask Counters to enable
255 \return a bitmask where bit-set means:
256 - event counters activated (bit 0-ETHOSU_PMU_NCOUNTERS)
257 - cycle counter activate (bit 31)
258 \note ETHOSU specific. Usage breaks CMSIS complience
259*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200260static inline uint32_t ETHOSU_PMU_CNTR_Status()
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200261{
262 return ethosu_pmu_ctrl->PMCNTENSET;
263}
264
265/**
266 \brief Read cycle counter (64 bit)
267 \return Cycle count
268 \note Two HW 32-bit registers that can increment independently in-between reads.
269 To work-around raciness yet still avoid turning
270 off the event both are read as one value twice. If the latter read
271 is not greater than the former, it means overflow of LSW without
272 incrementing MSW has occurred, in which case the former value is used.
273*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200274static inline uint64_t ETHOSU_PMU_Get_CCNTR(void)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200275{
276 uint64_t val1 = ethosu_pmu_ctrl->PMCCNTR;
277 uint64_t val2 = ethosu_pmu_ctrl->PMCCNTR;
278
279 if (val2 > val1)
280 {
281 return val2;
282 }
283 return val1;
284}
285
286/**
287 \brief Set cycle counter (64 bit)
288 \param [in] val Conter value
289 \note Two HW 32-bit registers that can increment independently in-between reads.
290 To work-around raciness, counter is temporary disabled if enabled.
291 \note ETHOSU specific. Usage breaks CMSIS complience
292*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200293static inline void ETHOSU_PMU_Set_CCNTR(uint64_t val)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200294{
295 uint32_t mask = ETHOSU_PMU_CNTR_Status();
296
297 if (mask & ETHOSU_PMU_CCNT_Msk)
298 {
299 ETHOSU_PMU_CNTR_Disable(ETHOSU_PMU_CCNT_Msk);
300 }
301
302 ethosu_pmu_ctrl->PMCCNTR = val;
303
304 if (mask & ETHOSU_PMU_CCNT_Msk)
305 {
306 ETHOSU_PMU_CNTR_Enable(ETHOSU_PMU_CCNT_Msk);
307 }
308}
309
310/**
311 \brief Read event counter
312 \param [in] num Event counter (0-ETHOSU_PMU_NCOUNTERS)
313 \return Event count
314*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200315static inline uint32_t ETHOSU_PMU_Get_EVCNTR(uint32_t num)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200316{
317 return (*ethosu_pmu_cntr)[num];
318}
319
320/**
321 \brief Set event counter value
322 \param [in] num Event counter (0-ETHOSU_PMU_NCOUNTERS)
323 \param [in] val Conter value
324 \note ETHOSU specific. Usage breaks CMSIS complience
325*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200326static inline void ETHOSU_PMU_Set_EVCNTR(uint32_t num, uint32_t val)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200327{
328 (*ethosu_pmu_cntr)[num] = val;
329}
330/**
331 \brief Read counter overflow status
332 \return Counter overflow status bits for the following:
333 - event counters (bit 0-ETHOSU_PMU_NCOUNTERS))
334 - cycle counter (bit 31)
335*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200336static inline uint32_t ETHOSU_PMU_Get_CNTR_OVS(void)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200337{
338 return ethosu_pmu_ctrl->PMOVSSET;
339}
340
341/**
342 \brief Clear counter overflow status
343 \param [in] mask Counter overflow status bits to clear
344 \note Clears overflow status bits for one or more of the following:
345 - event counters (bit 0-ETHOSU_PMU_NCOUNTERS)
346 - cycle counter (bit 31)
347*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200348static inline void ETHOSU_PMU_Set_CNTR_OVS(uint32_t mask)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200349{
350 ethosu_pmu_ctrl->PMOVSCLR = mask;
351}
352
353/**
354 \brief Enable counter overflow interrupt request
355 \param [in] mask Counter overflow interrupt request bits to set
356 \note Sets overflow interrupt request bits for one or more of the following:
357 - event counters (bit 0-ETHOSU_PMU_NCOUNTERS)
358 - cycle counter (bit 31)
359*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200360static inline void ETHOSU_PMU_Set_CNTR_IRQ_Enable(uint32_t mask)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200361{
362 ethosu_pmu_ctrl->PMINTSET = mask;
363}
364
365/**
366 \brief Disable counter overflow interrupt request
367 \param [in] mask Counter overflow interrupt request bits to clear
368 \note Clears overflow interrupt request bits for one or more of the following:
369 - event counters (bit 0-ETHOSU_PMU_NCOUNTERS)
370 - cycle counter (bit 31)
371*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200372static inline void ETHOSU_PMU_Set_CNTR_IRQ_Disable(uint32_t mask)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200373{
374 ethosu_pmu_ctrl->PMINTCLR = mask;
375}
376
377/**
378 \brief Get counters overflow interrupt request stiinings
379 \return mask Counter overflow interrupt request bits
380 \note Sets overflow interrupt request bits for one or more of the following:
381 - event counters (bit 0-ETHOSU_PMU_NCOUNTERS)
382 - cycle counter (bit 31)
383 \note ETHOSU specific. Usage breaks CMSIS complience
384*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200385static inline uint32_t ETHOSU_PMU_Get_IRQ_Enable()
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200386{
387 return ethosu_pmu_ctrl->PMINTSET;
388}
389
390/**
391 \brief Software increment event counter
392 \param [in] mask Counters to increment
393 - event counters (bit 0-ETHOSU_PMU_NCOUNTERS)
394 - cycle counter (bit 31)
395 \note Software increment bits for one or more event counters.
396*/
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200397static inline void ETHOSU_PMU_CNTR_Increment(uint32_t mask)
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200398{
399 uint32_t cntrs_active = ETHOSU_PMU_CNTR_Status();
400
401 if (mask & ETHOSU_PMU_CCNT_Msk)
402 {
403 if (mask & ETHOSU_PMU_CCNT_Msk)
404 {
405 ETHOSU_PMU_CNTR_Disable(ETHOSU_PMU_CCNT_Msk);
406 ethosu_pmu_ctrl->PMCCNTR = ETHOSU_PMU_Get_CCNTR() + 1;
407 if (cntrs_active & ETHOSU_PMU_CCNT_Msk)
408 {
409 ETHOSU_PMU_CNTR_Enable(ETHOSU_PMU_CCNT_Msk);
410 }
411 }
412 }
413 for (int i = 0; i < ETHOSU_PMU_NCOUNTERS; i++)
414 {
415 uint32_t cntr = (0x0001 << i);
416
417 if (mask & cntr)
418 {
419 ETHOSU_PMU_CNTR_Disable(cntr);
420 (*ethosu_pmu_cntr)[i]++;
421 if (cntrs_active & cntr)
422 {
423 ETHOSU_PMU_CNTR_Enable(cntr);
424 }
425 }
426 }
427}
428
Kristofer Jonsson537c71c2020-05-05 14:17:22 +0200429#ifdef __cplusplus
430}
431#endif
432
Kristofer Jonsson49bdee82020-04-06 13:21:21 +0200433#endif /* PMU_ETHOSU_H */