diff options
| author | Michael Brown | 2016-05-08 01:20:20 +0200 |
|---|---|---|
| committer | Michael Brown | 2016-05-08 01:20:20 +0200 |
| commit | 17c6f322eef5e0a2250a89b140486cf07598d2fa (patch) | |
| tree | c67442d1e56245b42f9e7b98f9fa0e7b9cc24b1d /src/arch/arm/include/ipxe | |
| parent | [arm] Split out 32-bit-specific code to arch/arm32 (diff) | |
| download | ipxe-17c6f322eef5e0a2250a89b140486cf07598d2fa.tar.gz ipxe-17c6f322eef5e0a2250a89b140486cf07598d2fa.tar.xz ipxe-17c6f322eef5e0a2250a89b140486cf07598d2fa.zip | |
[arm] Add support for 64-bit ARM (Aarch64)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/arch/arm/include/ipxe')
| -rw-r--r-- | src/arch/arm/include/ipxe/arm_io.h | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/src/arch/arm/include/ipxe/arm_io.h b/src/arch/arm/include/ipxe/arm_io.h index e13de15f4..f8765af75 100644 --- a/src/arch/arm/include/ipxe/arm_io.h +++ b/src/arch/arm/include/ipxe/arm_io.h @@ -43,34 +43,46 @@ IOAPI_INLINE ( arm, bus_to_phys ) ( unsigned long bus_addr ) { * */ -#define ARM_READX( _api_func, _type, _insn_suffix ) \ +#define ARM_READX( _api_func, _type, _insn_suffix, _reg_prefix ) \ static inline __always_inline _type \ IOAPI_INLINE ( arm, _api_func ) ( volatile _type *io_addr ) { \ _type data; \ - __asm__ __volatile__ ( "ldr" _insn_suffix " %0, %1" \ + __asm__ __volatile__ ( "ldr" _insn_suffix " %" _reg_prefix "0, %1" \ : "=r" ( data ) : "Qo" ( *io_addr ) ); \ return data; \ } -ARM_READX ( readb, uint8_t, "b" ); -ARM_READX ( readw, uint16_t, "h" ); -ARM_READX ( readl, uint32_t, "" ); +#ifdef __aarch64__ +ARM_READX ( readb, uint8_t, "b", "w" ); +ARM_READX ( readw, uint16_t, "h", "w" ); +ARM_READX ( readl, uint32_t, "", "w" ); +ARM_READX ( readq, uint64_t, "", "" ); +#else +ARM_READX ( readb, uint8_t, "b", "" ); +ARM_READX ( readw, uint16_t, "h", "" ); +ARM_READX ( readl, uint32_t, "", "" ); +#endif -#define ARM_WRITEX( _api_func, _type, _insn_suffix ) \ +#define ARM_WRITEX( _api_func, _type, _insn_suffix, _reg_prefix ) \ static inline __always_inline void \ -IOAPI_INLINE ( arm, _api_func ) ( _type data, \ - volatile _type *io_addr ) { \ - __asm__ __volatile__ ( "str" _insn_suffix " %0, %1" \ +IOAPI_INLINE ( arm, _api_func ) ( _type data, volatile _type *io_addr ) { \ + __asm__ __volatile__ ( "str" _insn_suffix " %" _reg_prefix "0, %1" \ : : "r" ( data ), "Qo" ( *io_addr ) ); \ } -ARM_WRITEX ( writeb, uint8_t, "b" ); -ARM_WRITEX ( writew, uint16_t, "h" ); -ARM_WRITEX ( writel, uint32_t, "" ); +#ifdef __aarch64__ +ARM_WRITEX ( writeb, uint8_t, "b", "w" ); +ARM_WRITEX ( writew, uint16_t, "h", "w" ); +ARM_WRITEX ( writel, uint32_t, "", "w" ); +ARM_WRITEX ( writeq, uint64_t, "", "" ); +#else +ARM_WRITEX ( writeb, uint8_t, "b", "" ); +ARM_WRITEX ( writew, uint16_t, "h", "" ); +ARM_WRITEX ( writel, uint32_t, "", "" ); +#endif /* * Slow down I/O * */ - static inline __always_inline void IOAPI_INLINE ( arm, iodelay ) ( void ) { /* Nothing to do */ @@ -80,10 +92,14 @@ IOAPI_INLINE ( arm, iodelay ) ( void ) { * Memory barrier * */ - static inline __always_inline void IOAPI_INLINE ( arm, mb ) ( void ) { + +#ifdef __aarch64__ + __asm__ __volatile__ ( "dmb sy" ); +#else __asm__ __volatile__ ( "dmb" ); +#endif } #endif /* _IPXE_ARM_IO_H */ |
