XenevaOS
Loading...
Searching...
No Matches
bordoisila_io.h
Go to the documentation of this file.
1
32#ifndef __BORDOISILA_IO_H__
33#define __BORDOISILA_IO_H__
34
35#include <stdint.h>
37#include <bordoisila_bits.h>
38#include <Board/board.h>
39
40#define _bordoisila_readb(addr) (*(volatile uint8_t*)(addr))
41#define _bordoisila_writeb(val, addr) \
42 (*(volatile uint8_t*)(addr) = (val));\
43 dsb_sy_barrier(); \
44 dsb_ish();\
45 isb_flush();
46
47#define _bordoisila_readw(addr) (*(volatile uint16_t*)(addr))
48#define _bordoisila_writew(addr) \
49 (*(volatile uint16_t*)(addr) = (val));\
50 dsb_sy_barrier(); \
51 dsb_ish();\
52 isb_flush();
53
54#define _bordoisila_readl(addr) (*(volatile uint32_t*)(addr))
55#define _bordoisila_writel(val,addr) (*(volatile uint32_t*)(addr) = (val));\
56 dsb_sy_barrier(); \
57 dsb_ish();\
58 isb_flush();
59
60
61static inline int _bordoisila_readl_poll_timeout(uintptr_t addr, uint32_t* val,
62 uint32_t sleep_us, uint32_t timeout_us) {
63 uint32_t elapsed = 0;
64 volatile uint32_t* reg = (volatile uint32_t*)addr;
65 for (;;) {
66 *val = *reg;
67 if (timeout_us && elapsed >= timeout_us) {
68 return -1;
69 }
70
71 if (sleep_us) {
72 AuAA64BoardSleepUS(sleep_us);
73 elapsed += sleep_us;
74 }
75 else {
76 elapsed++;
77 }
78 }
79}
80
81static inline void _bordoisila_update_bits(uintptr_t addr, uint32_t mask, uint32_t val) {
82 uint32_t current_val = *(volatile uint32_t*)addr;
83 current_val &= ~mask;
84 current_val |= (val & mask);
85 *(volatile uint32_t*)addr = current_val;
86}
87
88
89#define _bordoisila_read_poll_timeout(addr, val, cond, sleep_us, timeout_us) ({\
90 uint32_t __timeout_us = (timeout_us);\
91 uint32_t __elapsed_us = 0; \
92 int __ret = 0; \
93 while(1){ \
94 (val) = *(volatile uint32_t*)(addr);\
95 if (cond)\
96 break;\
97 if (__elapsed_us >= __timeout_us) {\
98 __ret = -1; \
99 break;\
100 } \
101 if (sleep_us) { \
102 AuAA64BoardSleepUS(sleep_us); \
103 __elapsed_us += (sleep_us); \
104 }else {\
105 __elapsed_us++; \
106 }\
107 }\
108 __ret; \
109})
110
111
112
113#endif
unsigned int uintptr_t
Definition stdint.h:94
unsigned int uint32_t
Definition acefiex.h:163
void AuAA64BoardSleepUS(uint32_t us)
AuAA64BoardSleepUS – calls board specific sleep function.
Definition board.c:72