10
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
13
#define IOAPI_PREFIX_arm
15
#define IOAPI_PREFIX_arm __arm_
19
* Memory space mappings
27
* Physical<->Bus address mappings
31
static inline __always_inline unsigned long
32
IOAPI_INLINE ( arm, phys_to_bus ) ( unsigned long phys_addr ) {
36
static inline __always_inline unsigned long
37
IOAPI_INLINE ( arm, bus_to_phys ) ( unsigned long bus_addr ) {
42
* MMIO reads and writes up to native word size
46
#define ARM_READX( _api_func, _type, _insn_suffix, _reg_prefix ) \
47
static inline __always_inline _type \
48
IOAPI_INLINE ( arm, _api_func ) ( volatile _type *io_addr ) { \
50
__asm__ __volatile__ ( "ldr" _insn_suffix " %" _reg_prefix "0, %1" \
51
: "=r" ( data ) : "Qo" ( *io_addr ) ); \
55
ARM_READX ( readb, uint8_t, "b", "w" );
56
ARM_READX ( readw, uint16_t, "h", "w" );
57
ARM_READX ( readl, uint32_t, "", "w" );
58
ARM_READX ( readq, uint64_t, "", "" );
60
ARM_READX ( readb, uint8_t, "b", "" );
61
ARM_READX ( readw, uint16_t, "h", "" );
62
ARM_READX ( readl, uint32_t, "", "" );
65
#define ARM_WRITEX( _api_func, _type, _insn_suffix, _reg_prefix ) \
66
static inline __always_inline void \
67
IOAPI_INLINE ( arm, _api_func ) ( _type data, volatile _type *io_addr ) { \
68
__asm__ __volatile__ ( "str" _insn_suffix " %" _reg_prefix "0, %1" \
69
: : "r" ( data ), "Qo" ( *io_addr ) ); \
72
ARM_WRITEX ( writeb, uint8_t, "b", "w" );
73
ARM_WRITEX ( writew, uint16_t, "h", "w" );
74
ARM_WRITEX ( writel, uint32_t, "", "w" );
75
ARM_WRITEX ( writeq, uint64_t, "", "" );
77
ARM_WRITEX ( writeb, uint8_t, "b", "" );
78
ARM_WRITEX ( writew, uint16_t, "h", "" );
79
ARM_WRITEX ( writel, uint32_t, "", "" );
86
static inline __always_inline void
87
IOAPI_INLINE ( arm, iodelay ) ( void ) {
95
static inline __always_inline void
96
IOAPI_INLINE ( arm, mb ) ( void ) {
99
__asm__ __volatile__ ( "dmb sy" );
101
__asm__ __volatile__ ( "dmb" );
105
#endif /* _IPXE_ARM_IO_H */