aboutsummaryrefslogtreecommitdiff
path: root/src/arch/arm
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/arm')
-rw-r--r--src/arch/arm/core/arm_io.c5
-rw-r--r--src/arch/arm/include/bits/xen.h9
-rw-r--r--src/arch/arm/include/ipxe/arm_io.h44
3 files changed, 44 insertions, 14 deletions
diff --git a/src/arch/arm/core/arm_io.c b/src/arch/arm/core/arm_io.c
index 4bc47a5..1ef571f 100644
--- a/src/arch/arm/core/arm_io.c
+++ b/src/arch/arm/core/arm_io.c
@@ -84,5 +84,10 @@ PROVIDE_IOAPI_INLINE ( arm, writew );
PROVIDE_IOAPI_INLINE ( arm, writel );
PROVIDE_IOAPI_INLINE ( arm, iodelay );
PROVIDE_IOAPI_INLINE ( arm, mb );
+#ifdef __aarch64__
+PROVIDE_IOAPI_INLINE ( arm, readq );
+PROVIDE_IOAPI_INLINE ( arm, writeq );
+#else
PROVIDE_IOAPI ( arm, readq, arm32_readq );
PROVIDE_IOAPI ( arm, writeq, arm32_writeq );
+#endif
diff --git a/src/arch/arm/include/bits/xen.h b/src/arch/arm/include/bits/xen.h
index c3808a7..34f6479 100644
--- a/src/arch/arm/include/bits/xen.h
+++ b/src/arch/arm/include/bits/xen.h
@@ -10,12 +10,21 @@
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
/* Hypercall registers */
+#ifdef __aarch64__
+#define XEN_HC "x16"
+#define XEN_REG1 "x0"
+#define XEN_REG2 "x1"
+#define XEN_REG3 "x2"
+#define XEN_REG4 "x3"
+#define XEN_REG5 "x4"
+#else
#define XEN_HC "r12"
#define XEN_REG1 "r0"
#define XEN_REG2 "r1"
#define XEN_REG3 "r2"
#define XEN_REG4 "r3"
#define XEN_REG5 "r4"
+#endif
/**
* Issue hypercall with one argument
diff --git a/src/arch/arm/include/ipxe/arm_io.h b/src/arch/arm/include/ipxe/arm_io.h
index e13de15..f8765af 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 */