summaryrefslogtreecommitdiffstats
path: root/src/arch/arm/include/ipxe
diff options
context:
space:
mode:
authorMichael Brown2016-05-08 01:20:20 +0200
committerMichael Brown2016-05-08 01:20:20 +0200
commit17c6f322eef5e0a2250a89b140486cf07598d2fa (patch)
treec67442d1e56245b42f9e7b98f9fa0e7b9cc24b1d /src/arch/arm/include/ipxe
parent[arm] Split out 32-bit-specific code to arch/arm32 (diff)
downloadipxe-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.h44
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 */